* Return an array of integers at the given type size and signedness. */
| 669 | * Return an array of integers at the given type size and signedness. |
| 670 | */ |
| 671 | int |
| 672 | getenv_array(const char *name, void *pdata, int size, int *psize, |
| 673 | int type_size, bool allow_signed) |
| 674 | { |
| 675 | uint8_t shift; |
| 676 | int64_t value; |
| 677 | int64_t old; |
| 678 | const char *buf; |
| 679 | char *end; |
| 680 | const char *ptr; |
| 681 | int n; |
| 682 | int rc; |
| 683 | |
| 684 | rc = 0; /* assume failure */ |
| 685 | |
| 686 | buf = kenv_acquire(name); |
| 687 | if (buf == NULL) |
| 688 | goto error; |
| 689 | |
| 690 | /* get maximum number of elements */ |
| 691 | size /= type_size; |
| 692 | |
| 693 | n = 0; |
| 694 | |
| 695 | for (ptr = buf; *ptr != 0; ) { |
| 696 | value = strtoq(ptr, &end, 0); |
| 697 | |
| 698 | /* check if signed numbers are allowed */ |
| 699 | if (value < 0 && !allow_signed) |
| 700 | goto error; |
| 701 | |
| 702 | /* check for invalid value */ |
| 703 | if (ptr == end) |
| 704 | goto error; |
| 705 | |
| 706 | /* check for valid suffix */ |
| 707 | switch (*end) { |
| 708 | case 't': |
| 709 | case 'T': |
| 710 | shift = 40; |
| 711 | end++; |
| 712 | break; |
| 713 | case 'g': |
| 714 | case 'G': |
| 715 | shift = 30; |
| 716 | end++; |
| 717 | break; |
| 718 | case 'm': |
| 719 | case 'M': |
| 720 | shift = 20; |
| 721 | end++; |
| 722 | break; |
| 723 | case 'k': |
| 724 | case 'K': |
| 725 | shift = 10; |
| 726 | end++; |
| 727 | break; |
| 728 | case ' ': |
no test coverage detected