Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_environment.c
Show First 20 Lines • Show All 667 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
int | int | ||||
getenv_array(const char *name, void *pdata, int size, int *psize, | getenv_array(const char *name, void *pdata, int size, int *psize, | ||||
int type_size, bool allow_signed) | int type_size, bool allow_signed) | ||||
{ | { | ||||
uint8_t shift; | uint8_t shift; | ||||
int64_t value; | int64_t value; | ||||
int64_t old; | int64_t old; | ||||
char *buf; | const char *buf; | ||||
char *end; | char *end; | ||||
char *ptr; | const char *ptr; | ||||
int n; | int n; | ||||
int rc; | int rc; | ||||
if ((buf = getenv_string_buffer(name)) == NULL) | if (dynamic_kenv) { | ||||
return (0); | mtx_lock(&kenv_lock); | ||||
buf = _getenv_dynamic(name, NULL); | |||||
} else | |||||
buf = _getenv_static(name); | |||||
mjg: This should be folded into a helper similar to what getenv_string_buffer is right now.
Then… | |||||
rc = 0; /* assume failure */ | rc = 0; /* assume failure */ | ||||
if (buf == NULL) | |||||
goto error; | |||||
/* get maximum number of elements */ | /* get maximum number of elements */ | ||||
size /= type_size; | size /= type_size; | ||||
n = 0; | n = 0; | ||||
for (ptr = buf; *ptr != 0; ) { | for (ptr = buf; *ptr != 0; ) { | ||||
value = strtoq(ptr, &end, 0); | value = strtoq(ptr, &end, 0); | ||||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | for (ptr = buf; *ptr != 0; ) { | ||||
n++; | n++; | ||||
} | } | ||||
*psize = n * type_size; | *psize = n * type_size; | ||||
if (n != 0) | if (n != 0) | ||||
rc = 1; /* success */ | rc = 1; /* success */ | ||||
error: | error: | ||||
if (dynamic_kenv) | if (dynamic_kenv) | ||||
uma_zfree(kenv_zone, buf); | mtx_unlock(&kenv_lock); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
/* | /* | ||||
* Return an integer value from an environment variable. | * Return an integer value from an environment variable. | ||||
*/ | */ | ||||
int | int | ||||
getenv_int(const char *name, int *data) | getenv_int(const char *name, int *data) | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
/* | /* | ||||
* Return a quad_t value from an environment variable. | * Return a quad_t value from an environment variable. | ||||
*/ | */ | ||||
int | int | ||||
getenv_quad(const char *name, quad_t *data) | getenv_quad(const char *name, quad_t *data) | ||||
{ | { | ||||
char *value, *vtp; | const char *value; | ||||
char suffix, *vtp; | |||||
quad_t iv; | quad_t iv; | ||||
value = getenv_string_buffer(name); | if (dynamic_kenv) { | ||||
if (value == NULL) | mtx_lock(&kenv_lock); | ||||
return (0); | value = _getenv_dynamic(name, NULL); | ||||
} else | |||||
value = _getenv_static(name); | |||||
if (value == NULL) { | |||||
goto error; | |||||
} | |||||
iv = strtoq(value, &vtp, 0); | iv = strtoq(value, &vtp, 0); | ||||
if (vtp == value || (vtp[0] != '\0' && vtp[1] != '\0')) { | if (vtp == value || (vtp[0] != '\0' && vtp[1] != '\0')) { | ||||
freeenv(value); | goto error; | ||||
return (0); | |||||
} | } | ||||
switch (vtp[0]) { | suffix = vtp[0]; | ||||
if (dynamic_kenv) | |||||
mtx_unlock(&kenv_lock); | |||||
switch (suffix) { | |||||
case 't': case 'T': | case 't': case 'T': | ||||
iv *= 1024; | iv *= 1024; | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
case 'g': case 'G': | case 'g': case 'G': | ||||
iv *= 1024; | iv *= 1024; | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
case 'm': case 'M': | case 'm': case 'M': | ||||
iv *= 1024; | iv *= 1024; | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
case 'k': case 'K': | case 'k': case 'K': | ||||
iv *= 1024; | iv *= 1024; | ||||
case '\0': | case '\0': | ||||
break; | break; | ||||
default: | default: | ||||
freeenv(value); | |||||
return (0); | return (0); | ||||
} | } | ||||
freeenv(value); | |||||
*data = iv; | *data = iv; | ||||
return (1); | return (1); | ||||
error: | |||||
if (dynamic_kenv) | |||||
mtx_unlock(&kenv_lock); | |||||
return (0); | |||||
} | } | ||||
/* | /* | ||||
* Find the next entry after the one which (cp) falls within, return a | * Find the next entry after the one which (cp) falls within, return a | ||||
* pointer to its start or NULL if there are no more. | * pointer to its start or NULL if there are no more. | ||||
*/ | */ | ||||
static char * | static char * | ||||
kernenv_next(char *cp) | kernenv_next(char *cp) | ||||
▲ Show 20 Lines • Show All 67 Lines • Show Last 20 Lines |
This should be folded into a helper similar to what getenv_string_buffer is right now.
Then this and the other caller would be: