summaryrefslogtreecommitdiff
path: root/utils/acid/os-Plan9.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/acid/os-Plan9.c')
-rw-r--r--utils/acid/os-Plan9.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/utils/acid/os-Plan9.c b/utils/acid/os-Plan9.c
new file mode 100644
index 00000000..1ac60404
--- /dev/null
+++ b/utils/acid/os-Plan9.c
@@ -0,0 +1,157 @@
+/*
+ * Plan9
+ */
+
+#include <lib9.h>
+#include <bio.h>
+#include <ctype.h>
+#include "mach.h"
+#define Extern extern
+#include "acid.h"
+
+int
+opentty(char *tty, int baud)
+{
+ int fd, cfd;
+ char ctty[100];
+
+ if(tty == 0)
+ tty = "/dev/eia0";
+ sprint(ctty, "%sctl", tty);
+ fd = open(tty, 2);
+ if(fd < 0)
+ return -1;
+ if(baud){
+ cfd = open(ctty, 1);
+ if(cfd < 0)
+ return fd;
+ fprint(cfd, "b%d", baud);
+ close(cfd);
+ }
+ return fd;
+}
+
+void
+detach(void)
+{
+ rfork(RFNAMEG|RFNOTEG|RFREND);
+}
+
+char *
+waitfor(int pid)
+{
+ Waitmsg *w;
+ static char buf[ERRMAX];
+
+ for(;;) {
+ w = wait();
+ if(w == nil)
+ error("wait %r");
+ if(w->pid == pid){
+ strecpy(buf, buf+ERRMAX, w->msg);
+ free(w);
+ return buf;
+ }
+ free(w);
+ }
+ return nil;
+}
+
+char *
+runcmd(char *cmd)
+{
+ char *argv[4];
+ int pid;
+
+ argv[0] = "/bin/rc";
+ argv[1] = "-c";
+ argv[2] = cmd;
+ argv[3] = 0;
+
+ pid = fork();
+ switch(pid) {
+ case -1:
+ error("fork %r");
+ case 0:
+ exec("/bin/rc", argv);
+ exits(0);
+ default:
+ return waitfor(pid);
+ }
+ return 0;
+}
+
+void
+catcher(void *junk, char *s)
+{
+ USED(junk);
+
+ if(strstr(s, "interrupt")) {
+ gotint = 1;
+ noted(NCONT);
+ }
+ noted(NDFLT);
+}
+
+void (*notefunc)(void *, char *);
+
+void
+setup_os_notify(void)
+{
+ notify(catcher);
+}
+
+int
+nproc(char **argv)
+{
+ char buf[128];
+ int pid, i, fd;
+
+ pid = fork();
+ switch(pid) {
+ case -1:
+ error("new: fork %r");
+ case 0:
+ rfork(RFNAMEG|RFNOTEG);
+
+ sprint(buf, "/proc/%d/ctl", getpid());
+ fd = open(buf, ORDWR);
+ if(fd < 0)
+ fatal("new: open %s: %r", buf);
+ write(fd, "hang", 4);
+ close(fd);
+
+ close(0);
+ close(1);
+ close(2);
+ for(i = 3; i < NFD; i++)
+ close(i);
+
+ open("/dev/cons", OREAD);
+ open("/dev/cons", OWRITE);
+ open("/dev/cons", OWRITE);
+ exec(argv[0], argv);
+ fatal("new: exec %s: %r");
+ default:
+ install(pid);
+ msg(pid, "waitstop");
+ notes(pid);
+ sproc(pid);
+ dostop(pid);
+ break;
+ }
+
+ return pid;
+}
+
+int
+remote_read(int fd, char *buf, int bytes)
+{
+ return read(fd, buf, bytes);
+}
+
+int
+remote_write(int fd, char *buf, int bytes)
+{
+ return write(fd, buf, bytes);
+}