xref: /openbsd/distrib/special/sysctl/sysctl.c (revision 17df1aa7)
1 /*	$OpenBSD: sysctl.c,v 1.6 2010/04/03 21:32:53 miod Exp $	*/
2 
3 /*
4  * Copyright (c) 2009 Theo de Raadt <deraadt@openbsd.org>
5  * Copyright (c) 2007 Kenneth R. Westerback <krw@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 #include <sys/param.h>
20 #include <sys/sysctl.h>
21 #include <sys/uio.h>
22 
23 #include <unistd.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 struct var {
29 	char *name;
30 	int (*print)(struct var *);
31 	int nmib;
32 	int mib[3];
33 };
34 
35 int	pstring(struct var *);
36 int	pint(struct var *);
37 
38 struct var vars[] = {
39 	{ "kern.osrelease", pstring, 2,
40 	    { CTL_KERN, KERN_OSRELEASE }},
41 	{ "hw.machine", pstring, 2,
42 	    { CTL_HW, HW_MACHINE }},
43 	{ "hw.model", pstring, 2,
44 	    { CTL_HW, HW_MODEL }},
45 	{ "hw.product", pstring, 2,
46 	    { CTL_HW, HW_PRODUCT }},
47 	{ "hw.disknames", pstring, 2,
48 	    { CTL_HW, HW_DISKNAMES }},
49 	{ "hw.ncpufound", pint, 2,
50 	    { CTL_HW, HW_NCPUFOUND }},
51 };
52 
53 int	nflag;
54 char	*name;
55 
56 int
57 pint(struct var *v)
58 {
59 	int n;
60 	size_t len = sizeof(n);
61 
62 	if (sysctl(v->mib, v->nmib, &n, &len, NULL, 0) != -1) {
63 		if (nflag == 0)
64 			printf("%s=", v->name);
65 		printf("%d\n", n);
66 		return (0);
67 	}
68 	return (1);
69 }
70 
71 int
72 pstring(struct var *v)
73 {
74 	struct iovec iov[2];
75 	char *p;
76 	size_t len;
77 
78 	if (sysctl(v->mib, v->nmib, NULL, &len, NULL, 0) != -1)
79 		if ((p = malloc(len)) != NULL)
80 			if (sysctl(v->mib, v->nmib, p, &len, NULL, 0) != -1) {
81 				if (nflag == 0)
82 					printf("%s=", v->name);
83 				fwrite(p, len, 1, stdout);
84 				printf("\n");
85 				return (0);
86 			}
87 	return (1);
88 }
89 
90 int
91 main(int argc, char *argv[])
92 {
93 	int ch, i;
94 
95 	while ((ch = getopt(argc, argv, "n")) != -1) {
96 		switch (ch) {
97 		case 'n':
98 			nflag = 1;
99 			break;
100 		default:
101 			fprintf(stderr, "usage: sysctl [-n] name\n");
102 			exit(1);
103 		}
104 	}
105 
106 	argc -= optind;
107 	argv += optind;
108 
109 	if (argc == 0) {
110 		for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++)
111 			(vars[i].print)(&vars[i]);
112 		exit(0);
113 	}
114 
115 	while (argc--) {
116 		name = *argv++;
117 
118 		for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++) {
119 			if (strcmp(name, vars[i].name) == 0) {
120 				(vars[i].print)(&vars[i]);
121 				break;
122 			}
123 		}
124 	}
125 
126 	exit(0);
127 }
128