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