syscall.c 3.9 KB

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