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