os-Posix.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <lib9.h>
  2. #include <bio.h>
  3. #include <sys/types.h>
  4. #include <termios.h>
  5. #undef getwd
  6. #undef getwd
  7. #include <unistd.h>
  8. #include "mach.h"
  9. #define Extern extern
  10. #include "acid.h"
  11. #include <signal.h>
  12. #include <sys/wait.h>
  13. static void
  14. setraw(int fd, int baud)
  15. {
  16. struct termios sg;
  17. switch(baud){
  18. case 1200: baud = B1200; break;
  19. case 2400: baud = B2400; break;
  20. case 4800: baud = B4800; break;
  21. case 9600: baud = B9600; break;
  22. case 19200: baud = B19200; break;
  23. case 38400: baud = B38400; break;
  24. default:
  25. werrstr("unknown speed %d", baud);
  26. return;
  27. }
  28. if(tcgetattr(fd, &sg) >= 0) {
  29. sg.c_iflag = sg.c_oflag = sg.c_lflag = 0;
  30. sg.c_cflag &= ~CSIZE;
  31. sg.c_cflag |= CS8 | CREAD;
  32. sg.c_cflag &= ~(PARENB|PARODD);
  33. sg.c_cc[VMIN] = 1;
  34. sg.c_cc[VTIME] = 0;
  35. if(baud) {
  36. cfsetispeed(&sg, baud);
  37. cfsetospeed(&sg, baud);
  38. }
  39. tcsetattr(fd, TCSANOW, &sg);
  40. }
  41. }
  42. int
  43. opentty(char *tty, int baud)
  44. {
  45. int fd;
  46. if(baud == 0)
  47. baud = 19200;
  48. fd = open(tty, 2);
  49. if(fd < 0)
  50. return -1;
  51. setraw(fd, baud);
  52. return fd;
  53. }
  54. void
  55. detach(void)
  56. {
  57. setpgid(0, 0);
  58. }
  59. char *
  60. waitfor(int pid)
  61. {
  62. int n, status;
  63. static char buf[32];
  64. for(;;) {
  65. n = wait(&status);
  66. if(n < 0)
  67. error("wait %r");
  68. if(n == pid) {
  69. sprint(buf, "%d", status);
  70. return buf;
  71. }
  72. }
  73. }
  74. char *
  75. runcmd(char *cmd)
  76. {
  77. char *argv[4];
  78. int pid;
  79. argv[0] = "/bin/sh";
  80. argv[1] = "-c";
  81. argv[2] = cmd;
  82. argv[3] = 0;
  83. pid = fork();
  84. switch(pid) {
  85. case -1:
  86. error("fork %r");
  87. case 0:
  88. execv("/bin/sh", argv);
  89. exits(0);
  90. default:
  91. return waitfor(pid);
  92. }
  93. return 0;
  94. }
  95. void (*notefunc)(int);
  96. void
  97. os_notify(void (*func)(int))
  98. {
  99. notefunc = func;
  100. signal(SIGINT, func);
  101. }
  102. void
  103. catcher(int sig)
  104. {
  105. if(sig==SIGINT) {
  106. gotint = 1;
  107. signal(SIGINT, notefunc);
  108. }
  109. }
  110. void
  111. setup_os_notify(void)
  112. {
  113. os_notify(catcher);
  114. }
  115. int
  116. nproc(char **argv)
  117. {
  118. char buf[128];
  119. int pid, i, fd;
  120. if(rdebug)
  121. error("can't newproc in remote mode");
  122. pid = fork();
  123. switch(pid) {
  124. case -1:
  125. error("new: fork %r");
  126. case 0:
  127. detach();
  128. sprint(buf, "/proc/%d/ctl", getpid());
  129. fd = open(buf, ORDWR);
  130. if(fd < 0)
  131. fatal("new: open %s: %r", buf);
  132. write(fd, "hang", 4);
  133. close(fd);
  134. close(0);
  135. close(1);
  136. close(2);
  137. for(i = 3; i < NFD; i++)
  138. close(i);
  139. open("/dev/cons", OREAD);
  140. open("/dev/cons", OWRITE);
  141. open("/dev/cons", OWRITE);
  142. execvp(argv[0], argv);
  143. fatal("new: execvp %s: %r");
  144. default:
  145. install(pid);
  146. msg(pid, "waitstop");
  147. notes(pid);
  148. sproc(pid);
  149. dostop(pid);
  150. break;
  151. }
  152. return pid;
  153. }
  154. int
  155. remote_read(int fd, char *buf, int bytes)
  156. {
  157. return read(fd, buf, bytes);
  158. }
  159. int remote_write(int fd, char *buf, int bytes)
  160. {
  161. return write(fd, buf, bytes);
  162. }