Changeset View
Changeset View
Standalone View
Standalone View
bin/kenv/kenv.c
Show All 23 Lines | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <sys/sysctl.h> | #include <sys/sysctl.h> | ||||
#include <err.h> | #include <err.h> | ||||
#include <errno.h> | |||||
#include <kenv.h> | #include <kenv.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
static void usage(void); | static void usage(void); | ||||
static int kdumpenv(void); | static int kdumpenv(int dump_type); | ||||
static int kgetenv(const char *); | static int kgetenv(const char *); | ||||
static int ksetenv(const char *, char *); | static int ksetenv(const char *, char *); | ||||
static int kunsetenv(const char *); | static int kunsetenv(const char *); | ||||
static int hflag = 0; | static int hflag = 0; | ||||
static int lflag = 0; | |||||
static int Nflag = 0; | static int Nflag = 0; | ||||
static int qflag = 0; | static int qflag = 0; | ||||
static int sflag = 0; | |||||
static int uflag = 0; | static int uflag = 0; | ||||
static int vflag = 0; | static int vflag = 0; | ||||
static void | static void | ||||
usage(void) | usage(void) | ||||
{ | { | ||||
(void)fprintf(stderr, "%s\n%s\n%s\n", | (void)fprintf(stderr, "%s\n%s\n%s\n", | ||||
"usage: kenv [-hNq]", | "usage: kenv [-l|-s] [-hNq]", | ||||
" kenv [-qv] variable[=value]", | " kenv [-qv] variable[=value]", | ||||
" kenv [-q] -u variable"); | " kenv [-q] -u variable"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
int | int | ||||
main(int argc, char **argv) | main(int argc, char **argv) | ||||
{ | { | ||||
char *env, *eq, *val; | char *env, *eq, *val; | ||||
int ch, error; | int ch, error; | ||||
val = NULL; | val = NULL; | ||||
env = NULL; | env = NULL; | ||||
while ((ch = getopt(argc, argv, "hNquv")) != -1) { | while ((ch = getopt(argc, argv, "hlNqsuv")) != -1) { | ||||
switch (ch) { | switch (ch) { | ||||
case 'h': | case 'h': | ||||
hflag++; | hflag++; | ||||
break; | break; | ||||
case 'l': | |||||
lflag++; | |||||
break; | |||||
case 'N': | case 'N': | ||||
Nflag++; | Nflag++; | ||||
break; | break; | ||||
case 'q': | case 'q': | ||||
qflag++; | qflag++; | ||||
break; | break; | ||||
case 's': | |||||
sflag++; | |||||
break; | |||||
case 'u': | case 'u': | ||||
uflag++; | uflag++; | ||||
break; | break; | ||||
case 'v': | case 'v': | ||||
vflag++; | vflag++; | ||||
break; | break; | ||||
default: | default: | ||||
usage(); | usage(); | ||||
} | } | ||||
} | } | ||||
argc -= optind; | argc -= optind; | ||||
argv += optind; | argv += optind; | ||||
if (argc > 0) { | if (argc > 0) { | ||||
env = argv[0]; | env = argv[0]; | ||||
eq = strchr(env, '='); | eq = strchr(env, '='); | ||||
if (eq != NULL) { | if (eq != NULL) { | ||||
*eq++ = '\0'; | *eq++ = '\0'; | ||||
val = eq; | val = eq; | ||||
} | } | ||||
argv++; | argv++; | ||||
argc--; | argc--; | ||||
} | } | ||||
if ((hflag || Nflag) && env != NULL) | if ((hflag || Nflag) && env != NULL) | ||||
usage(); | usage(); | ||||
if (lflag && sflag) | |||||
usage(); | |||||
if (argc > 0 || ((uflag || vflag) && env == NULL)) | if (argc > 0 || ((uflag || vflag) && env == NULL)) | ||||
usage(); | usage(); | ||||
if (env == NULL) { | if (env == NULL) { | ||||
error = kdumpenv(); | if (lflag) | ||||
if (error && !qflag) | error = kdumpenv(KENV_DUMP_LOADER); | ||||
else if (sflag) | |||||
error = kdumpenv(KENV_DUMP_STATIC); | |||||
else | |||||
error = kdumpenv(KENV_DUMP); | |||||
if (error && !qflag) { | |||||
if (errno == ENOENT) | |||||
warnx("requested environment is unavailable"); | |||||
else | |||||
warn("kdumpenv"); | warn("kdumpenv"); | ||||
} | |||||
} else if (val == NULL) { | } else if (val == NULL) { | ||||
if (uflag) { | if (uflag) { | ||||
error = kunsetenv(env); | error = kunsetenv(env); | ||||
if (error && !qflag) | if (error && !qflag) | ||||
warnx("unable to unset %s", env); | warnx("unable to unset %s", env); | ||||
} else { | } else { | ||||
error = kgetenv(env); | error = kgetenv(env); | ||||
if (error && !qflag) | if (error && !qflag) | ||||
warnx("unable to get %s", env); | warnx("unable to get %s", env); | ||||
} | } | ||||
} else { | } else { | ||||
error = ksetenv(env, val); | error = ksetenv(env, val); | ||||
if (error && !qflag) | if (error && !qflag) | ||||
warnx("unable to set %s to %s", env, val); | warnx("unable to set %s to %s", env, val); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
kdumpenv(void) | kdumpenv(int dump_type) | ||||
{ | { | ||||
char *buf, *bp, *cp; | char *buf, *bp, *cp; | ||||
int buflen, envlen; | int buflen, envlen; | ||||
envlen = kenv(KENV_DUMP, NULL, NULL, 0); | envlen = kenv(dump_type, NULL, NULL, 0); | ||||
if (envlen < 0) | if (envlen < 0) | ||||
return (-1); | return (-1); | ||||
for (;;) { | for (;;) { | ||||
buflen = envlen * 120 / 100; | buflen = envlen * 120 / 100; | ||||
buf = calloc(1, buflen + 1); | buf = calloc(1, buflen + 1); | ||||
if (buf == NULL) | if (buf == NULL) | ||||
return (-1); | return (-1); | ||||
envlen = kenv(KENV_DUMP, NULL, buf, buflen); | envlen = kenv(dump_type, NULL, buf, buflen); | ||||
if (envlen < 0) { | if (envlen < 0) { | ||||
free(buf); | free(buf); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
if (envlen > buflen) | if (envlen > buflen) | ||||
free(buf); | free(buf); | ||||
else | else | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 57 Lines • Show Last 20 Lines |