xref: /plan9/sys/src/ape/cmd/uname.c (revision 027288c8a8763d34db13dc89d8bcd6514dbc2163)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/utsname.h>
4 
5 #define	ARGBEGIN	for((argv0=*argv),argv++,argc--;\
6 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
7 			    argc--, argv++) {\
8 				char *_args, *_argt, _argc;\
9 				_args = &argv[0][1];\
10 				if(_args[0]=='-' && _args[1]==0){\
11 					argc--; argv++; break;\
12 				}\
13 				while(*_args) switch(_argc=*_args++)
14 #define	ARGEND		}
15 #define	ARGF()		(_argt=_args, _args="",\
16 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
17 #define	ARGC()		_argc
18 
19 char *argv0;
20 
21 static int started;
22 
23 static void
prword(char * w)24 prword(char *w)
25 {
26 	if (started)
27 		putchar(' ');
28 	else
29 		started = 1;
30 	fputs(w, stdout);
31 }
32 
33 void
main(int argc,char ** argv)34 main(int argc, char **argv)
35 {
36 	struct utsname u;
37 
38 	uname(&u);
39 	if(argc == 1){
40 		printf("%s\n", u.sysname);
41 		exit(0);
42 	}
43 	ARGBEGIN {
44 	case 'a':
45 		prword(u.sysname);
46 		prword(u.nodename);
47 		prword(u.release);
48 		prword(u.version);
49 		prword(u.machine);
50 		break;
51 	case 'm':
52 		prword(u.machine);
53 		break;
54 	case 'n':
55 		prword(u.nodename);
56 		break;
57 	case 'r':
58 		prword(u.release);
59 		break;
60 	case 's':
61 		prword(u.sysname);
62 		break;
63 	case 'v':
64 		prword(u.version);
65 		break;
66 	} ARGEND
67 	printf("\n");
68 	exit(0);
69 }
70