plan9.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "sam.h"
  2. Rune samname[] = L"~~sam~~";
  3. Rune *left[]= {
  4. L"{[(<«",
  5. L"\n",
  6. L"'\"`",
  7. 0
  8. };
  9. Rune *right[]= {
  10. L"}])>»",
  11. L"\n",
  12. L"'\"`",
  13. 0
  14. };
  15. char RSAM[] = "sam";
  16. char SAMTERM[] = "/bin/aux/samterm";
  17. char HOME[] = "home";
  18. char TMPDIR[] = "/tmp";
  19. char SH[] = "rc";
  20. char SHPATH[] = "/bin/rc";
  21. char RX[] = "rx";
  22. char RXPATH[] = "/bin/rx";
  23. char SAMSAVECMD[] = "/bin/rc\n/sys/lib/samsave";
  24. void
  25. dprint(char *z, ...)
  26. {
  27. char buf[BLOCKSIZE];
  28. va_list arg;
  29. va_start(arg, z);
  30. vseprint(buf, &buf[BLOCKSIZE], z, arg);
  31. va_end(arg);
  32. termwrite(buf);
  33. }
  34. void
  35. print_ss(char *s, String *a, String *b)
  36. {
  37. dprint("?warning: %s: `%.*S' and `%.*S'\n", s, a->n, a->s, b->n, b->s);
  38. }
  39. void
  40. print_s(char *s, String *a)
  41. {
  42. dprint("?warning: %s `%.*S'\n", s, a->n, a->s);
  43. }
  44. char*
  45. getuser(void)
  46. {
  47. static char user[64];
  48. int fd;
  49. if(user[0] == 0){
  50. fd = open("/dev/user", 0);
  51. if(fd<0 || read(fd, user, sizeof user-1)<=0)
  52. strcpy(user, "none");
  53. close(fd);
  54. }
  55. return user;
  56. }
  57. int
  58. statfile(char *name, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
  59. {
  60. Dir *dirb;
  61. dirb = dirstat(name);
  62. if(dirb == nil)
  63. return -1;
  64. if(dev)
  65. *dev = dirb->type|(dirb->dev<<16);
  66. if(id)
  67. *id = dirb->qid.path;
  68. if(time)
  69. *time = dirb->mtime;
  70. if(length)
  71. *length = dirb->length;
  72. if(appendonly)
  73. *appendonly = dirb->mode & DMAPPEND;
  74. free(dirb);
  75. return 1;
  76. }
  77. int
  78. statfd(int fd, ulong *dev, uvlong *id, long *time, long *length, long *appendonly)
  79. {
  80. Dir *dirb;
  81. dirb = dirfstat(fd);
  82. if(dirb == nil)
  83. return -1;
  84. if(dev)
  85. *dev = dirb->type|(dirb->dev<<16);
  86. if(id)
  87. *id = dirb->qid.path;
  88. if(time)
  89. *time = dirb->mtime;
  90. if(length)
  91. *length = dirb->length;
  92. if(appendonly)
  93. *appendonly = dirb->mode & DMAPPEND;
  94. free(dirb);
  95. return 1;
  96. }
  97. void
  98. notifyf(void *a, char *s)
  99. {
  100. USED(a);
  101. if(bpipeok && strcmp(s, "sys: write on closed pipe") == 0)
  102. noted(NCONT);
  103. if(strcmp(s, "interrupt") == 0)
  104. noted(NCONT);
  105. panicking = 1;
  106. rescue();
  107. noted(NDFLT);
  108. }
  109. int
  110. newtmp(int num)
  111. {
  112. int i, fd;
  113. static char tempnam[30];
  114. i = getpid();
  115. do
  116. snprint(tempnam, sizeof tempnam, "%s/%d%.4s%dsam", TMPDIR, num, getuser(), i++);
  117. while(access(tempnam, 0) == 0);
  118. fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000);
  119. if(fd < 0){
  120. remove(tempnam);
  121. fd = create(tempnam, ORDWR|OCEXEC|ORCLOSE, 0000);
  122. }
  123. return fd;
  124. }
  125. int
  126. waitfor(int pid)
  127. {
  128. int msg;
  129. Waitmsg *w;
  130. while((w = wait()) != nil){
  131. if(w->pid != pid){
  132. free(w);
  133. continue;
  134. }
  135. msg = (w->msg[0] != '\0');
  136. free(w);
  137. return msg;
  138. }
  139. return -1;
  140. }
  141. void
  142. samerr(char *buf)
  143. {
  144. sprint(buf, "%s/sam.err", TMPDIR);
  145. }
  146. void*
  147. emalloc(ulong n)
  148. {
  149. void *p;
  150. p = malloc(n);
  151. if(p == 0)
  152. panic("malloc fails");
  153. memset(p, 0, n);
  154. return p;
  155. }
  156. void*
  157. erealloc(void *p, ulong n)
  158. {
  159. p = realloc(p, n);
  160. if(p == 0)
  161. panic("realloc fails");
  162. return p;
  163. }