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