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 /* special case for seek; vlongs are problematic */ 45 if(strcmp(argv[0], "seek") == 0) 46 r=seek(arg[0], arg[1], arg[2]); 47 else 48 r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]); 49 if(r == -1){ 50 errstr(ebuf); 51 fprint(2, "syscall: return %d, error:%s\n", r, ebuf); 52 }else{ 53 ebuf[0] = 0; 54 fprint(2, "syscall: return %d, no error\n", r); 55 } 56 if(oflag) 57 print("%s\n", buf); 58 exits(ebuf); 59 } 60 fprint(2, "syscall: %s not known\n", argv[0]); 61 exits("unknown"); 62 } 63 int 64 parse(char *s) 65 { 66 char *t; 67 long l; 68 69 if(strcmp(s, "buf") == 0) 70 return (int)buf; 71 l = strtoul(s, &t, 0); 72 if(t>s && *t==0) 73 return l; 74 return (int)s; 75 } 76