]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/syscall/syscall.c
ip/ipconfig: default onlink and autoflag to 1
[plan9front.git] / sys / src / cmd / syscall / syscall.c
1 #include <u.h>
2 #include <libc.h>
3 #include <sys.h>
4 #include <fcall.h>
5
6 char    buf[1048576];
7 #define NARG    5
8 uintptr arg[NARG];
9
10 /* system calls not defined in libc.h */
11 int     sysr1(void);
12 int     _stat(char*, char*);
13 int     _fstat(int, char*);
14 int     _errstr(char*);
15 int     _wstat(char*, char*);
16 int     _fwstat(int, char*);
17 int     _read(int, void*, int);
18 int     _write(int, void*, int);
19 int     _read9p(int, void*, int);
20 int     _write9p(int, void*, int);
21 int     brk_(void*);
22 int     _nfstat(int, void*, int);
23 int     _nstat(char*, void*, int);
24 int     _nfwstat(int, void*, int);
25 int     _nwstat(char*, void*, int);
26 int     _fsession(char*, void*, int);
27 int     _mount(int, char*, int, char*);
28 int     _wait(void*);
29 int     _nsec(vlong*);
30
31 struct{
32         char    *name;
33         int     (*func)(...);
34 }tab[]={
35 #include "tab.h"
36         0,              0
37 };
38
39 uintptr parse(char *);
40 void catch(void*, char*);
41
42 char*
43 xctime(ulong t)
44 {
45         char *buf, *s;
46
47         s = ctime(t);
48         s[strlen(s)-1] = '\0';  /* remove newline */
49         buf = malloc(512);
50         if(buf == nil)
51                 sysfatal("can't malloc: %r");
52         snprint(buf, 512, "%s (%lud)", s, t);
53         return buf;
54 }
55
56
57 char*
58 lstime(long l)
59 {
60         static char buf[32];
61         char *t;
62         long clk;
63
64         clk = time(0);
65         t = ctime(l);
66         /* 6 months in the past or a day in the future */
67         if(l<clk-180L*24*60*60 || clk+24L*60*60<l){
68                 memmove(buf, t+4, 7);           /* month and day */
69                 memmove(buf+7, t+23, 5);                /* year */
70         }else
71                 memmove(buf, t+4, 12);          /* skip day of week */
72         buf[12] = 0;
73         return buf;
74 }
75
76 void
77 main(int argc, char *argv[])
78 {
79         int i, j, c;
80         int oflag, xflag, sflag;
81         vlong r;
82         Dir d;
83         char strs[1024];
84         char ebuf[1024];
85
86         fmtinstall('M', dirmodefmt);
87
88         oflag = 0;
89         xflag = 0;
90         sflag = 0;
91         ARGBEGIN{
92         case 'o':
93                 oflag++;
94                 break;
95         case 's':
96                 sflag++;
97                 break;
98         case 'x':
99                 xflag++;
100                 break;
101         default:
102                 goto Usage;
103         }ARGEND
104         if(argc<1 || argc>1+NARG){
105     Usage:
106                 fprint(2, "usage: syscall [-ox] entry [args; buf==1MB buffer]\n");
107                 fprint(2, "\tsyscall write 1 hello 5\n");
108                 fprint(2, "\tsyscall -o errstr buf 1024\n");
109                 fprint(2, "\tsyscall -[xs] stat file buf 1024\n");
110                 exits("usage");
111         }
112         for(i=1; i<argc; i++)
113                 arg[i-1] = parse(argv[i]);
114         notify(catch);
115         for(i=0; tab[i].name; i++)
116                 if(strcmp(tab[i].name, argv[0])==0){
117                         /* special case for seek, pread, pwrite; vlongs are problematic */
118                         if(strcmp(argv[0], "seek") == 0)
119                                 r=seek(arg[0], strtoll(argv[2], 0, 0), arg[2]);
120                         else if(strcmp(argv[0], "pread") == 0)
121                                 r=pread(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0));
122                         else if(strcmp(argv[0], "pwrite") == 0)
123                                 r=pwrite(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0));
124                         else
125                                 r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]);
126                         if(r == -1){
127                                 errstr(ebuf, sizeof ebuf);
128                                 fprint(2, "syscall: return %lld, error:%s\n", r, ebuf);
129                         }else{
130                                 ebuf[0] = 0;
131                                 fprint(2, "syscall: return %lld, no error\n", r);
132                         }
133                         if(oflag)
134                                 print("%s\n", buf);
135                         if(xflag){
136                                 for(j=0; j<r; j++){
137                                         if(j%16 == 0)
138                                                 print("%.4x\t", j);
139                                         c = buf[j]&0xFF;
140                                         if('!'<=c && c<='~')
141                                                 print(" %c ", c);
142                                         else
143                                                 print("%.2ux ", c);
144                                         if(j%16 == 15)
145                                                 print("\n");
146                                 }
147                                 print("\n");
148                         }
149                         if(sflag && r > 0){
150                                 r = convM2D((uchar*)buf, r, &d, strs);
151                                 if(r <= BIT16SZ)
152                                         print("short stat message\n");
153                                 else{
154                                         print("[%s] ", d.muid);
155                                         print("(%.16llux %lud %.2ux) ", d.qid.path, d.qid.vers, d.qid.type);
156                                         print("%M (%luo) ", d.mode, d.mode);
157                                         print("%c %d ", d.type, d.dev);
158                                         print("%s %s ", d.uid, d.gid);
159                                         print("%lld ", d.length);
160                                         print("%s ", lstime(d.mtime));
161                                         print("%s\n", d.name);
162                                         print("\tmtime: %s\n\tatime: %s\n", xctime(d.mtime), xctime(d.atime));
163                                 }
164                         }
165                         exits(ebuf);
166                 }
167         fprint(2, "syscall: %s not known\n", argv[0]);
168         exits("unknown");
169 }
170
171 uintptr
172 parse(char *s)
173 {
174         char *t;
175         uintptr l;
176
177         if(strcmp(s, "buf") == 0)
178                 return (uintptr)buf;
179         
180         l = strtoull(s, &t, 0);
181         if(t>s && *t==0)
182                 return l;
183         return (uintptr)s; 
184 }
185
186 void
187 catch(void *, char *msg)
188 {
189         fprint(2, "syscall: received note='%s'\n", msg);
190         noted(NDFLT);
191 }