13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier char buf[8192]; 53e12c5d1SDavid du Colombier #define NARG 5 63e12c5d1SDavid du Colombier int arg[NARG]; 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier int sysr1(void); 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier struct{ 113e12c5d1SDavid du Colombier char *name; 123e12c5d1SDavid du Colombier int (*func)(...); 133e12c5d1SDavid du Colombier }tab[]={ 143e12c5d1SDavid du Colombier #include "tab.h" 153e12c5d1SDavid du Colombier 0, 0 163e12c5d1SDavid du Colombier }; 173e12c5d1SDavid du Colombier 18*7dd7cddfSDavid du Colombier void 193e12c5d1SDavid du Colombier main(int argc, char *argv[]) 203e12c5d1SDavid du Colombier { 213e12c5d1SDavid du Colombier int i, r; 223e12c5d1SDavid du Colombier int oflag=0; 233e12c5d1SDavid du Colombier int parse(char *); 243e12c5d1SDavid du Colombier char ebuf[ERRLEN]; 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier ARGBEGIN{ 273e12c5d1SDavid du Colombier case 'o': 283e12c5d1SDavid du Colombier oflag++; 293e12c5d1SDavid du Colombier break; 303e12c5d1SDavid du Colombier default: 313e12c5d1SDavid du Colombier goto Usage; 323e12c5d1SDavid du Colombier }ARGEND 333e12c5d1SDavid du Colombier if(argc<1 || argc>1+NARG){ 343e12c5d1SDavid du Colombier Usage: 353e12c5d1SDavid du Colombier fprint(2, "usage: syscall [-o] entry [args; buf==1024 byte buffer]\n"); 363e12c5d1SDavid du Colombier fprint(2, "\tsyscall write 1 hello 5\n"); 37*7dd7cddfSDavid du Colombier fprint(2, "\tsyscall -o errstr buf\n"); 38*7dd7cddfSDavid du Colombier exits("usage"); 393e12c5d1SDavid du Colombier } 403e12c5d1SDavid du Colombier for(i=1; i<argc; i++) 413e12c5d1SDavid du Colombier arg[i-1]=parse(argv[i]); 423e12c5d1SDavid du Colombier for(i=0; tab[i].name; i++) 433e12c5d1SDavid du Colombier if(strcmp(tab[i].name, argv[0])==0){ 443e12c5d1SDavid du Colombier r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]); 453e12c5d1SDavid du Colombier if(r == -1){ 463e12c5d1SDavid du Colombier errstr(ebuf); 473e12c5d1SDavid du Colombier fprint(2, "syscall: return %d, error:%s\n", r, ebuf); 483e12c5d1SDavid du Colombier }else{ 493e12c5d1SDavid du Colombier ebuf[0] = 0; 503e12c5d1SDavid du Colombier fprint(2, "syscall: return %d, no error\n", r); 513e12c5d1SDavid du Colombier } 523e12c5d1SDavid du Colombier if(oflag) 533e12c5d1SDavid du Colombier print("%s\n", buf); 543e12c5d1SDavid du Colombier exits(ebuf); 553e12c5d1SDavid du Colombier } 563e12c5d1SDavid du Colombier fprint(2, "syscall: %s not known\n", argv[0]); 573e12c5d1SDavid du Colombier exits("unknown"); 583e12c5d1SDavid du Colombier } 593e12c5d1SDavid du Colombier int 603e12c5d1SDavid du Colombier parse(char *s) 613e12c5d1SDavid du Colombier { 623e12c5d1SDavid du Colombier char *t; 633e12c5d1SDavid du Colombier long l; 643e12c5d1SDavid du Colombier 653e12c5d1SDavid du Colombier if(strcmp(s, "buf") == 0) 663e12c5d1SDavid du Colombier return (int)buf; 673e12c5d1SDavid du Colombier l = strtoul(s, &t, 0); 683e12c5d1SDavid du Colombier if(t>s && *t==0) 693e12c5d1SDavid du Colombier return l; 703e12c5d1SDavid du Colombier return (int)s; 713e12c5d1SDavid du Colombier } 72