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 187dd7cddfSDavid 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"); 377dd7cddfSDavid du Colombier fprint(2, "\tsyscall -o errstr buf\n"); 387dd7cddfSDavid 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){ 44*80ee5cbfSDavid du Colombier /* special case for seek; vlongs are problematic */ 45*80ee5cbfSDavid du Colombier if(strcmp(argv[0], "seek") == 0) 46*80ee5cbfSDavid du Colombier r=seek(arg[0], arg[1], arg[2]); 47*80ee5cbfSDavid du Colombier else 483e12c5d1SDavid du Colombier r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]); 493e12c5d1SDavid du Colombier if(r == -1){ 503e12c5d1SDavid du Colombier errstr(ebuf); 513e12c5d1SDavid du Colombier fprint(2, "syscall: return %d, error:%s\n", r, ebuf); 523e12c5d1SDavid du Colombier }else{ 533e12c5d1SDavid du Colombier ebuf[0] = 0; 543e12c5d1SDavid du Colombier fprint(2, "syscall: return %d, no error\n", r); 553e12c5d1SDavid du Colombier } 563e12c5d1SDavid du Colombier if(oflag) 573e12c5d1SDavid du Colombier print("%s\n", buf); 583e12c5d1SDavid du Colombier exits(ebuf); 593e12c5d1SDavid du Colombier } 603e12c5d1SDavid du Colombier fprint(2, "syscall: %s not known\n", argv[0]); 613e12c5d1SDavid du Colombier exits("unknown"); 623e12c5d1SDavid du Colombier } 633e12c5d1SDavid du Colombier int 643e12c5d1SDavid du Colombier parse(char *s) 653e12c5d1SDavid du Colombier { 663e12c5d1SDavid du Colombier char *t; 673e12c5d1SDavid du Colombier long l; 683e12c5d1SDavid du Colombier 693e12c5d1SDavid du Colombier if(strcmp(s, "buf") == 0) 703e12c5d1SDavid du Colombier return (int)buf; 713e12c5d1SDavid du Colombier l = strtoul(s, &t, 0); 723e12c5d1SDavid du Colombier if(t>s && *t==0) 733e12c5d1SDavid du Colombier return l; 743e12c5d1SDavid du Colombier return (int)s; 753e12c5d1SDavid du Colombier } 76