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 main(int argc, char **argv) 34 { 35 struct utsname u; 36 37 uname(&u); 38 if(argc == 1){ 39 printf("%s\n", u.sysname); 40 exit(0); 41 } 42 ARGBEGIN { 43 case 'a': 44 prword(u.sysname); 45 prword(u.nodename); 46 prword(u.release); 47 prword(u.version); 48 prword(u.machine); 49 break; 50 case 'm': 51 prword(u.machine); 52 break; 53 case 'n': 54 prword(u.nodename); 55 break; 56 case 'r': 57 prword(u.release); 58 break; 59 case 's': 60 prword(u.sysname); 61 break; 62 case 'v': 63 prword(u.version); 64 break; 65 } ARGEND 66 printf("\n"); 67 exit(0); 68 } 69