/* * Overrides. * * UNAME_x env variables have the highest priority * UNAME_x varsyms have the next highest priority * values retrieved from sysctls have the lowest priority */ static void CHECK_ENV(const char *envname, get_t *getp, get_t nativep, char **varp) { char buf[1024]; if ((*varp = getenv(envname)) == NULL) { if (varsym_get(VARSYM_ALL_MASK, envname, buf, sizeof(buf)) < 0) { *getp = nativep; return; } *varp = strdup(buf); } *getp = NULL; }
int main(int ac, char **av) { int i; int mask = VARSYM_ALL_MASK; int level = VARSYM_USER; int deleteOpt = 0; int verboseOpt = 1; int allOpt = 0; int execok = 0; int ret = 0; while ((i = getopt(ac, av, "adhpqsux")) != -1) { switch (i) { case 'a': allOpt = 1; break; case 'd': deleteOpt = 1; break; case 'p': mask = VARSYM_PROC_MASK; level = VARSYM_PROC; break; case 'q': verboseOpt = 0; break; case 's': mask = VARSYM_SYS_MASK; level = VARSYM_SYS; break; case 'u': mask = VARSYM_USER_MASK; level = VARSYM_USER; break; case 'x': mask = VARSYM_PROC_MASK; level = VARSYM_PROC; execok = 1; break; case 'h': default: usage(); return(-1); } } if (allOpt) { char buf[1024]; int marker = 0; int bytes; for (;;) { bytes = varsym_list(level, buf, sizeof(buf), &marker); if (bytes < 0) /* error occured */ break; dumpvars(buf, bytes); if (marker < 0) /* no more vars */ break; } if (bytes < 0) { fprintf(stderr, "varsym_list(): %s\n", strerror(errno)); return 1; } } for ( ; optind < ac; optind++) { char *name = av[optind]; char *data = strchr(name, '='); int error; char buf[MAXVARSYM_DATA]; if (data) *data++ = 0; if (execok) { if (deleteOpt) { usage(); exit(1); } if (data) { error = varsym_set(level, name, data); if (error) ret = 2; } else { error = doexec(av + optind); } } else if (deleteOpt) { error = varsym_set(level, name, NULL); if (error) ret = 2; } else if (data) { error = varsym_set(level, name, data); if (error) ret = 2; } else { error = varsym_get(mask, name, buf, sizeof(buf)); if (error >= 0 && error <= (int)sizeof(buf)) { if (verboseOpt) printf("%s=", name); printf("%s\n", buf); } else { ret = 1; } } if (error < 0 && verboseOpt) fprintf(stderr, "%s: %s\n", name, strerror(errno)); } return ret; }
int uname(struct utsname *name) { int mib[2], rval; size_t len; char *p; char buf[MAXVARSYM_DATA]; int oerrno; rval = 0; if ((p = getenv("UNAME_s"))) { strlcpy(name->sysname, p, sizeof(name->sysname)); } else if (varsym_get(VARSYM_ALL_MASK, "UNAME_s", buf, sizeof(buf)) == 0) { strlcpy(name->sysname, buf, sizeof(name->sysname)); } else { mib[0] = CTL_KERN; mib[1] = KERN_OSTYPE; len = sizeof(name->sysname); oerrno = errno; if (sysctl(mib, 2, &name->sysname, &len, NULL, 0) == -1) { if(errno == ENOMEM) errno = oerrno; else rval = -1; } name->sysname[sizeof(name->sysname) - 1] = '\0'; } mib[0] = CTL_KERN; mib[1] = KERN_HOSTNAME; len = sizeof(name->nodename); oerrno = errno; if (sysctl(mib, 2, &name->nodename, &len, NULL, 0) == -1) { if(errno == ENOMEM) errno = oerrno; else rval = -1; } name->nodename[sizeof(name->nodename) - 1] = '\0'; if ((p = getenv("UNAME_r"))) { strlcpy(name->release, p, sizeof(name->release)); } else if (varsym_get(VARSYM_ALL_MASK, "UNAME_r", buf, sizeof(buf)) == 0) { strlcpy(name->release, buf, sizeof(name->sysname)); } else { mib[0] = CTL_KERN; mib[1] = KERN_OSRELEASE; len = sizeof(name->release); oerrno = errno; if (sysctl(mib, 2, &name->release, &len, NULL, 0) == -1) { if(errno == ENOMEM) errno = oerrno; else rval = -1; } name->release[sizeof(name->release) - 1] = '\0'; } if ((p = getenv("UNAME_v"))) { strlcpy(name->version, p, sizeof(name->version)); } else if (varsym_get(VARSYM_ALL_MASK, "UNAME_v", buf, sizeof(buf)) == 0) { strlcpy(name->version, buf, sizeof(name->sysname)); } else { /* The version may contain newlines, turn them into spaces. */ mib[0] = CTL_KERN; mib[1] = KERN_VERSION; len = sizeof(name->version); oerrno = errno; if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1) { if (errno == ENOMEM) errno = oerrno; else rval = -1; } name->version[sizeof(name->version) - 1] = '\0'; for (p = name->version; len--; ++p) { if (*p == '\n' || *p == '\t') { if (len > 1) *p = ' '; else *p = '\0'; } } } if ((p = getenv("UNAME_m"))) { strlcpy(name->machine, p, sizeof(name->machine)); } else if (varsym_get(VARSYM_ALL_MASK, "UNAME_m", buf, sizeof(buf)) == 0) { strlcpy(name->machine, buf, sizeof(name->sysname)); } else { oerrno = errno; mib[1] = HW_MACHINE; mib[0] = CTL_HW; len = sizeof(name->machine); if (sysctl(mib, 2, &name->machine, &len, NULL, 0) == -1) { if (errno == ENOMEM) { errno = oerrno; } else { rval = -1; } } name->machine[sizeof(name->machine) - 1] = '\0'; } return (rval); }