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