13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 39a747e4fSDavid du Colombier #include <sys.h> 49a747e4fSDavid du Colombier #include <fcall.h> 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier char buf[8192]; 73e12c5d1SDavid du Colombier #define NARG 5 89a747e4fSDavid du Colombier long arg[NARG]; 93e12c5d1SDavid du Colombier 109a747e4fSDavid du Colombier /* system calls not defined in libc.h */ 113e12c5d1SDavid du Colombier int sysr1(void); 129a747e4fSDavid du Colombier int _stat(char*, char*); 139a747e4fSDavid du Colombier int _fstat(int, char*); 149a747e4fSDavid du Colombier int _errstr(char*); 159a747e4fSDavid du Colombier int _wstat(char*, char*); 169a747e4fSDavid du Colombier int _fwstat(int, char*); 179a747e4fSDavid du Colombier int _read(int, void*, int); 189a747e4fSDavid du Colombier int _write(int, void*, int); 199a747e4fSDavid du Colombier int _read9p(int, void*, int); 209a747e4fSDavid du Colombier int _write9p(int, void*, int); 21*7b6fd1d2SDavid du Colombier int brk_(void*); 229a747e4fSDavid du Colombier int _nfstat(int, void*, int); 239a747e4fSDavid du Colombier int _nstat(char*, void*, int); 249a747e4fSDavid du Colombier int _nfwstat(int, void*, int); 259a747e4fSDavid du Colombier int _nwstat(char*, void*, int); 269a747e4fSDavid du Colombier int _fsession(char*, void*, int); 279a747e4fSDavid du Colombier int _mount(int, char*, int, char*); 289a747e4fSDavid du Colombier int _wait(void*); 293e12c5d1SDavid du Colombier 303e12c5d1SDavid du Colombier struct{ 313e12c5d1SDavid du Colombier char *name; 323e12c5d1SDavid du Colombier int (*func)(...); 333e12c5d1SDavid du Colombier }tab[]={ 343e12c5d1SDavid du Colombier #include "tab.h" 353e12c5d1SDavid du Colombier 0, 0 363e12c5d1SDavid du Colombier }; 373e12c5d1SDavid du Colombier 389a747e4fSDavid du Colombier long parse(char *); 399a747e4fSDavid du Colombier void catch(void*, char*); 409a747e4fSDavid du Colombier 419a747e4fSDavid du Colombier char* 429a747e4fSDavid du Colombier xctime(ulong t) 439a747e4fSDavid du Colombier { 449a747e4fSDavid du Colombier char *buf, *s; 459a747e4fSDavid du Colombier 469a747e4fSDavid du Colombier s = ctime(t); 479a747e4fSDavid du Colombier s[strlen(s)-1] = '\0'; /* remove newline */ 489a747e4fSDavid du Colombier buf = malloc(512); 499a747e4fSDavid du Colombier if(buf == nil) 509a747e4fSDavid du Colombier sysfatal("can't malloc: %r"); 519a747e4fSDavid du Colombier snprint(buf, 512, "%s (%lud)", s, t); 529a747e4fSDavid du Colombier return buf; 539a747e4fSDavid du Colombier } 549a747e4fSDavid du Colombier 559a747e4fSDavid du Colombier 569a747e4fSDavid du Colombier char* 579a747e4fSDavid du Colombier lstime(long l) 589a747e4fSDavid du Colombier { 599a747e4fSDavid du Colombier static char buf[32]; 609a747e4fSDavid du Colombier char *t; 619a747e4fSDavid du Colombier long clk; 629a747e4fSDavid du Colombier 639a747e4fSDavid du Colombier clk = time(0); 649a747e4fSDavid du Colombier t = ctime(l); 659a747e4fSDavid du Colombier /* 6 months in the past or a day in the future */ 669a747e4fSDavid du Colombier if(l<clk-180L*24*60*60 || clk+24L*60*60<l){ 679a747e4fSDavid du Colombier memmove(buf, t+4, 7); /* month and day */ 689a747e4fSDavid du Colombier memmove(buf+7, t+23, 5); /* year */ 699a747e4fSDavid du Colombier }else 709a747e4fSDavid du Colombier memmove(buf, t+4, 12); /* skip day of week */ 719a747e4fSDavid du Colombier buf[12] = 0; 729a747e4fSDavid du Colombier return buf; 739a747e4fSDavid du Colombier } 749a747e4fSDavid du Colombier 757dd7cddfSDavid du Colombier void 763e12c5d1SDavid du Colombier main(int argc, char *argv[]) 773e12c5d1SDavid du Colombier { 789a747e4fSDavid du Colombier int i, j, c; 799a747e4fSDavid du Colombier int oflag, xflag, sflag; 809a747e4fSDavid du Colombier vlong r; 819a747e4fSDavid du Colombier Dir d; 829a747e4fSDavid du Colombier char strs[1024]; 839a747e4fSDavid du Colombier char ebuf[1024]; 843e12c5d1SDavid du Colombier 859a747e4fSDavid du Colombier fmtinstall('M', dirmodefmt); 869a747e4fSDavid du Colombier 879a747e4fSDavid du Colombier oflag = 0; 889a747e4fSDavid du Colombier xflag = 0; 899a747e4fSDavid du Colombier sflag = 0; 903e12c5d1SDavid du Colombier ARGBEGIN{ 913e12c5d1SDavid du Colombier case 'o': 923e12c5d1SDavid du Colombier oflag++; 933e12c5d1SDavid du Colombier break; 949a747e4fSDavid du Colombier case 's': 959a747e4fSDavid du Colombier sflag++; 969a747e4fSDavid du Colombier break; 979a747e4fSDavid du Colombier case 'x': 989a747e4fSDavid du Colombier xflag++; 999a747e4fSDavid du Colombier break; 1003e12c5d1SDavid du Colombier default: 1013e12c5d1SDavid du Colombier goto Usage; 1023e12c5d1SDavid du Colombier }ARGEND 1033e12c5d1SDavid du Colombier if(argc<1 || argc>1+NARG){ 1043e12c5d1SDavid du Colombier Usage: 1059a747e4fSDavid du Colombier fprint(2, "usage: syscall [-ox] entry [args; buf==8192 byte buffer]\n"); 1063e12c5d1SDavid du Colombier fprint(2, "\tsyscall write 1 hello 5\n"); 1079a747e4fSDavid du Colombier fprint(2, "\tsyscall -o errstr buf 1024\n"); 1089a747e4fSDavid du Colombier fprint(2, "\tsyscall -[xs] stat file buf 1024\n"); 1097dd7cddfSDavid du Colombier exits("usage"); 1103e12c5d1SDavid du Colombier } 1113e12c5d1SDavid du Colombier for(i=1; i<argc; i++) 1123e12c5d1SDavid du Colombier arg[i-1] = parse(argv[i]); 1139a747e4fSDavid du Colombier notify(catch); 1143e12c5d1SDavid du Colombier for(i=0; tab[i].name; i++) 1153e12c5d1SDavid du Colombier if(strcmp(tab[i].name, argv[0])==0){ 1169a747e4fSDavid du Colombier /* special case for seek, pread, pwrite; vlongs are problematic */ 11780ee5cbfSDavid du Colombier if(strcmp(argv[0], "seek") == 0) 1189a747e4fSDavid du Colombier r=seek(arg[0], strtoll(argv[2], 0, 0), arg[2]); 1199a747e4fSDavid du Colombier else if(strcmp(argv[0], "pread") == 0) 1209a747e4fSDavid du Colombier r=pread(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0)); 1219a747e4fSDavid du Colombier else if(strcmp(argv[0], "pwrite") == 0) 1229a747e4fSDavid du Colombier r=pwrite(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0)); 12380ee5cbfSDavid du Colombier else 1243e12c5d1SDavid du Colombier r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]); 1253e12c5d1SDavid du Colombier if(r == -1){ 1269a747e4fSDavid du Colombier errstr(ebuf, sizeof ebuf); 1279a747e4fSDavid du Colombier fprint(2, "syscall: return %lld, error:%s\n", r, ebuf); 1283e12c5d1SDavid du Colombier }else{ 1293e12c5d1SDavid du Colombier ebuf[0] = 0; 1309a747e4fSDavid du Colombier fprint(2, "syscall: return %lld, no error\n", r); 1313e12c5d1SDavid du Colombier } 1323e12c5d1SDavid du Colombier if(oflag) 1333e12c5d1SDavid du Colombier print("%s\n", buf); 1349a747e4fSDavid du Colombier if(xflag){ 1359a747e4fSDavid du Colombier for(j=0; j<r; j++){ 1369a747e4fSDavid du Colombier if(j%16 == 0) 1379a747e4fSDavid du Colombier print("%.4x\t", j); 1389a747e4fSDavid du Colombier c = buf[j]&0xFF; 1399a747e4fSDavid du Colombier if('!'<=c && c<='~') 1409a747e4fSDavid du Colombier print(" %c ", c); 1419a747e4fSDavid du Colombier else 1429a747e4fSDavid du Colombier print("%.2ux ", c); 1439a747e4fSDavid du Colombier if(j%16 == 15) 1449a747e4fSDavid du Colombier print("\n"); 1459a747e4fSDavid du Colombier } 1469a747e4fSDavid du Colombier print("\n"); 1479a747e4fSDavid du Colombier } 1489a747e4fSDavid du Colombier if(sflag && r > 0){ 1499a747e4fSDavid du Colombier r = convM2D((uchar*)buf, r, &d, strs); 1509a747e4fSDavid du Colombier if(r <= BIT16SZ) 1519a747e4fSDavid du Colombier print("short stat message\n"); 1529a747e4fSDavid du Colombier else{ 1539a747e4fSDavid du Colombier print("[%s] ", d.muid); 1549a747e4fSDavid du Colombier print("(%.16llux %lud %.2ux) ", d.qid.path, d.qid.vers, d.qid.type); 155d9306527SDavid du Colombier print("%M (%luo) ", d.mode, d.mode); 1569a747e4fSDavid du Colombier print("%c %d ", d.type, d.dev); 1579a747e4fSDavid du Colombier print("%s %s ", d.uid, d.gid); 1589a747e4fSDavid du Colombier print("%lld ", d.length); 1599a747e4fSDavid du Colombier print("%s ", lstime(d.mtime)); 1609a747e4fSDavid du Colombier print("%s\n", d.name); 161d9306527SDavid du Colombier print("\tmtime: %s\n\tatime: %s\n", xctime(d.mtime), xctime(d.atime)); 1629a747e4fSDavid du Colombier } 1639a747e4fSDavid du Colombier } 1643e12c5d1SDavid du Colombier exits(ebuf); 1653e12c5d1SDavid du Colombier } 1663e12c5d1SDavid du Colombier fprint(2, "syscall: %s not known\n", argv[0]); 1673e12c5d1SDavid du Colombier exits("unknown"); 1683e12c5d1SDavid du Colombier } 1699a747e4fSDavid du Colombier 1709a747e4fSDavid du Colombier long 1713e12c5d1SDavid du Colombier parse(char *s) 1723e12c5d1SDavid du Colombier { 1733e12c5d1SDavid du Colombier char *t; 1743e12c5d1SDavid du Colombier long l; 1753e12c5d1SDavid du Colombier 1763e12c5d1SDavid du Colombier if(strcmp(s, "buf") == 0) 1773e12c5d1SDavid du Colombier return (int)buf; 1783e12c5d1SDavid du Colombier l = strtoul(s, &t, 0); 1793e12c5d1SDavid du Colombier if(t>s && *t==0) 1803e12c5d1SDavid du Colombier return l; 1819a747e4fSDavid du Colombier return (long)s; 1829a747e4fSDavid du Colombier } 1839a747e4fSDavid du Colombier 1849a747e4fSDavid du Colombier void 1859a747e4fSDavid du Colombier catch(void *, char *msg) 1869a747e4fSDavid du Colombier { 1879a747e4fSDavid du Colombier fprint(2, "syscall: received note='%s'\n", msg); 1889a747e4fSDavid du Colombier noted(NDFLT); 1893e12c5d1SDavid du Colombier } 190