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 24 prword(char *w) 25 { 26 if (started) 27 putchar(' '); 28 else 29 started = 1; 30 fputs(w, stdout); 31 } 32 33 void 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