diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/syscall |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/syscall')
-rwxr-xr-x | sys/src/cmd/syscall/mkfile | 29 | ||||
-rwxr-xr-x | sys/src/cmd/syscall/syscall.c | 190 |
2 files changed, 219 insertions, 0 deletions
diff --git a/sys/src/cmd/syscall/mkfile b/sys/src/cmd/syscall/mkfile new file mode 100755 index 000000000..9da809b24 --- /dev/null +++ b/sys/src/cmd/syscall/mkfile @@ -0,0 +1,29 @@ +</$objtype/mkfile +CFLAGS=-I/sys/src/libc/9syscall $CFLAGS + +TARG=syscall +OFILES=syscall.$O\ + +HFILES=tab.h\ + +BIN=/$objtype/bin + +UPDATE=\ + mkfile\ + ${OFILES:%.$O=%.c}\ + ${TARG:%=/386/bin/%}\ + +</sys/src/cmd/mkone + +SYSCALL=/sys/src/libc/9syscall/sys.h + +tab.h: $SYSCALL + sed '/#define._X[0-9_]/d; + /#define.NSYSCALL/d; + s/#define.([A-Z0-9_][A-Z0-9_]*).*/ "\1", (int(*)(...))\1,/' $SYSCALL | + tr A-Z a-z > tab.h + echo ' "read", (int(*)(...))read,' >> tab.h + echo ' "write", (int(*)(...))write,' >> tab.h + +clean:V: + rm -f *.[$OS] [$OS].out $TARG $HFILES diff --git a/sys/src/cmd/syscall/syscall.c b/sys/src/cmd/syscall/syscall.c new file mode 100755 index 000000000..74e3afe2b --- /dev/null +++ b/sys/src/cmd/syscall/syscall.c @@ -0,0 +1,190 @@ +#include <u.h> +#include <libc.h> +#include <sys.h> +#include <fcall.h> + +char buf[1048576]; +#define NARG 5 +uintptr arg[NARG]; + +/* system calls not defined in libc.h */ +int sysr1(void); +int _stat(char*, char*); +int _fstat(int, char*); +int _errstr(char*); +int _wstat(char*, char*); +int _fwstat(int, char*); +int _read(int, void*, int); +int _write(int, void*, int); +int _read9p(int, void*, int); +int _write9p(int, void*, int); +int brk_(void*); +int _nfstat(int, void*, int); +int _nstat(char*, void*, int); +int _nfwstat(int, void*, int); +int _nwstat(char*, void*, int); +int _fsession(char*, void*, int); +int _mount(int, char*, int, char*); +int _wait(void*); + +struct{ + char *name; + int (*func)(...); +}tab[]={ +#include "tab.h" + 0, 0 +}; + +uintptr parse(char *); +void catch(void*, char*); + +char* +xctime(ulong t) +{ + char *buf, *s; + + s = ctime(t); + s[strlen(s)-1] = '\0'; /* remove newline */ + buf = malloc(512); + if(buf == nil) + sysfatal("can't malloc: %r"); + snprint(buf, 512, "%s (%lud)", s, t); + return buf; +} + + +char* +lstime(long l) +{ + static char buf[32]; + char *t; + long clk; + + clk = time(0); + t = ctime(l); + /* 6 months in the past or a day in the future */ + if(l<clk-180L*24*60*60 || clk+24L*60*60<l){ + memmove(buf, t+4, 7); /* month and day */ + memmove(buf+7, t+23, 5); /* year */ + }else + memmove(buf, t+4, 12); /* skip day of week */ + buf[12] = 0; + return buf; +} + +void +main(int argc, char *argv[]) +{ + int i, j, c; + int oflag, xflag, sflag; + vlong r; + Dir d; + char strs[1024]; + char ebuf[1024]; + + fmtinstall('M', dirmodefmt); + + oflag = 0; + xflag = 0; + sflag = 0; + ARGBEGIN{ + case 'o': + oflag++; + break; + case 's': + sflag++; + break; + case 'x': + xflag++; + break; + default: + goto Usage; + }ARGEND + if(argc<1 || argc>1+NARG){ + Usage: + fprint(2, "usage: syscall [-ox] entry [args; buf==1MB buffer]\n"); + fprint(2, "\tsyscall write 1 hello 5\n"); + fprint(2, "\tsyscall -o errstr buf 1024\n"); + fprint(2, "\tsyscall -[xs] stat file buf 1024\n"); + exits("usage"); + } + for(i=1; i<argc; i++) + arg[i-1] = parse(argv[i]); + notify(catch); + for(i=0; tab[i].name; i++) + if(strcmp(tab[i].name, argv[0])==0){ + /* special case for seek, pread, pwrite; vlongs are problematic */ + if(strcmp(argv[0], "seek") == 0) + r=seek(arg[0], strtoll(argv[2], 0, 0), arg[2]); + else if(strcmp(argv[0], "pread") == 0) + r=pread(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0)); + else if(strcmp(argv[0], "pwrite") == 0) + r=pwrite(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0)); + else + r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]); + if(r == -1){ + errstr(ebuf, sizeof ebuf); + fprint(2, "syscall: return %lld, error:%s\n", r, ebuf); + }else{ + ebuf[0] = 0; + fprint(2, "syscall: return %lld, no error\n", r); + } + if(oflag) + print("%s\n", buf); + if(xflag){ + for(j=0; j<r; j++){ + if(j%16 == 0) + print("%.4x\t", j); + c = buf[j]&0xFF; + if('!'<=c && c<='~') + print(" %c ", c); + else + print("%.2ux ", c); + if(j%16 == 15) + print("\n"); + } + print("\n"); + } + if(sflag && r > 0){ + r = convM2D((uchar*)buf, r, &d, strs); + if(r <= BIT16SZ) + print("short stat message\n"); + else{ + print("[%s] ", d.muid); + print("(%.16llux %lud %.2ux) ", d.qid.path, d.qid.vers, d.qid.type); + print("%M (%luo) ", d.mode, d.mode); + print("%c %d ", d.type, d.dev); + print("%s %s ", d.uid, d.gid); + print("%lld ", d.length); + print("%s ", lstime(d.mtime)); + print("%s\n", d.name); + print("\tmtime: %s\n\tatime: %s\n", xctime(d.mtime), xctime(d.atime)); + } + } + exits(ebuf); + } + fprint(2, "syscall: %s not known\n", argv[0]); + exits("unknown"); +} + +uintptr +parse(char *s) +{ + char *t; + uintptr l; + + if(strcmp(s, "buf") == 0) + return (uintptr)buf; + + l = strtoull(s, &t, 0); + if(t>s && *t==0) + return l; + return (uintptr)s; +} + +void +catch(void *, char *msg) +{ + fprint(2, "syscall: received note='%s'\n", msg); + noted(NDFLT); +} |