Beispiel #1
0
/*
 * 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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);
}