1 #include <u.h> 2 #include <libc.h> 3 4 char buf[8192]; 5 #define NARG 5 6 int arg[NARG]; 7 8 int sysr1(void); 9 10 struct{ 11 char *name; 12 int (*func)(...); 13 }tab[]={ 14 #include "tab.h" 15 0, 0 16 }; 17 18 void 19 main(int argc, char *argv[]) 20 { 21 int i, r; 22 int oflag=0; 23 int parse(char *); 24 char ebuf[ERRLEN]; 25 26 ARGBEGIN{ 27 case 'o': 28 oflag++; 29 break; 30 default: 31 goto Usage; 32 }ARGEND 33 if(argc<1 || argc>1+NARG){ 34 Usage: 35 fprint(2, "usage: syscall [-o] entry [args; buf==1024 byte buffer]\n"); 36 fprint(2, "\tsyscall write 1 hello 5\n"); 37 fprint(2, "\tsyscall -o errstr buf\n"); 38 exits("usage"); 39 } 40 for(i=1; i<argc; i++) 41 arg[i-1]=parse(argv[i]); 42 for(i=0; tab[i].name; i++) 43 if(strcmp(tab[i].name, argv[0])==0){ 44 r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]); 45 if(r == -1){ 46 errstr(ebuf); 47 fprint(2, "syscall: return %d, error:%s\n", r, ebuf); 48 }else{ 49 ebuf[0] = 0; 50 fprint(2, "syscall: return %d, no error\n", r); 51 } 52 if(oflag) 53 print("%s\n", buf); 54 exits(ebuf); 55 } 56 fprint(2, "syscall: %s not known\n", argv[0]); 57 exits("unknown"); 58 } 59 int 60 parse(char *s) 61 { 62 char *t; 63 long l; 64 65 if(strcmp(s, "buf") == 0) 66 return (int)buf; 67 l = strtoul(s, &t, 0); 68 if(t>s && *t==0) 69 return l; 70 return (int)s; 71 } 72