xref: /plan9/sys/src/cmd/syscall/syscall.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
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