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