]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/init.c
rio, kbdfs: increase read buffer for high latency kbdfs support
[plan9front.git] / sys / src / cmd / init.c
index c6c5163fddba8a3827445de1fe691df27d3f1e5a..03291089ad6e1f8596d05b854bac43b5c54f5e9a 100644 (file)
@@ -1,16 +1,16 @@
 #include <u.h>
 #include <libc.h>
 #include <auth.h>
-#include <authsrv.h>
 
+char*  readfile(char*);
 char*  readenv(char*);
 void   setenv(char*, char*);
 void   cpenv(char*, char*);
 void   closefds(void);
+int    procopen(int, char*, int);
 void   fexec(void(*)(void));
 void   rcexec(void);
 void   cpustart(void);
-void   pass(int);
 
 char   *service;
 char   *cmd;
@@ -24,7 +24,6 @@ main(int argc, char *argv[])
 {
        char *user;
        int fd;
-       char ctl[128];
 
        closefds();
 
@@ -43,19 +42,18 @@ main(int argc, char *argv[])
        }ARGEND
        cmd = *argv;
 
-       snprint(ctl, sizeof(ctl), "#p/%d/ctl", getpid());
-       fd = open(ctl, OWRITE);
-       if(fd < 0)
-               print("init: warning: can't open %s: %r\n", ctl);
-       else
+       fd = procopen(getpid(), "ctl", OWRITE);
+       if(fd >= 0){
                if(write(fd, "pri 10", 6) != 6)
-                       print("init: warning: can't set priority: %r\n");
-       close(fd);
+                       fprint(2, "init: warning: can't set priority: %r\n");
+               close(fd);
+       }
 
        cpu = readenv("#e/cputype");
        setenv("#e/objtype", cpu);
        setenv("#e/service", service);
        cpenv("/adm/timezone/local", "#e/timezone");
+
        user = readenv("#c/user");
        systemname = readenv("#c/sysname");
 
@@ -66,7 +64,7 @@ main(int argc, char *argv[])
                fexec(cpustart);
 
        for(;;){
-               print("\ninit: starting /bin/rc\n");
+               fprint(2, "\ninit: starting /bin/rc\n");
                fexec(rcexec);
                manual = 1;
                cmd = 0;
@@ -74,51 +72,17 @@ main(int argc, char *argv[])
        }
 }
 
-void
-pass(int fd)
-{
-       char key[DESKEYLEN];
-       char typed[32];
-       char crypted[DESKEYLEN];
-       int i;
-
-       for(;;){
-               print("\n%s password:", systemname);
-               for(i=0; i<sizeof typed; i++){
-                       if(read(0, typed+i, 1) != 1){
-                               print("init: can't read password; insecure\n");
-                               return;
-                       }
-                       if(typed[i] == '\n'){
-                               typed[i] = 0;
-                               break;
-                       }
-               }
-               if(i == sizeof typed)
-                       continue;
-               if(passtokey(crypted, typed) == 0)
-                       continue;
-               seek(fd, 0, 0);
-               if(read(fd, key, DESKEYLEN) != DESKEYLEN){
-                       print("init: can't read key; insecure\n");
-                       return;
-               }
-               if(memcmp(crypted, key, sizeof key))
-                       continue;
-               /* clean up memory */
-               memset(crypted, 0, sizeof crypted);
-               memset(key, 0, sizeof key);
-               return;
-       }
-}
-
 static int gotnote;
+static int interrupted;
 
 void
 pinhead(void*, char *msg)
 {
        gotnote = 1;
-       fprint(2, "init got note '%s'\n", msg);
+       if(strcmp(msg, "interrupt") == 0)
+               interrupted = 1;
+       else
+               fprint(2, "init got note '%s'\n", msg);
        noted(NCONT);
 }
 
@@ -126,26 +90,30 @@ void
 fexec(void (*execfn)(void))
 {
        Waitmsg *w;
-       int pid;
+       int fd, pid;
 
        switch(pid=fork()){
        case 0:
                rfork(RFNOTEG);
                (*execfn)();
-               print("init: exec error: %r\n");
+               fprint(2, "init: exec error: %r\n");
                exits("exec");
        case -1:
-               print("init: fork error: %r\n");
-               exits("fork");
+               fprint(2, "init: fork error: %r\n");
+               return;
        default:
+               fd = procopen(pid, "notepg", OWRITE);
        casedefault:
                notify(pinhead);
+               interrupted = 0;
                gotnote = 0;
                w = wait();
                if(w == nil){
+                       if(interrupted && fd >= 0)
+                               write(fd, "interrupt", 9);
                        if(gotnote)
                                goto casedefault;
-                       print("init: wait error: %r\n");
+                       fprint(2, "init: wait error: %r\n");
                        break;
                }
                if(w->pid != pid){
@@ -153,17 +121,18 @@ fexec(void (*execfn)(void))
                        goto casedefault;
                }
                if(strstr(w->msg, "exec error") != 0){
-                       print("init: exit string %s\n", w->msg);
-                       print("init: sleeping because exec failed\n");
-                       free(w);
+                       fprint(2, "init: exit string %s\n", w->msg);
+                       fprint(2, "init: sleeping because exec failed\n");
                        for(;;)
                                sleep(1000);
                }
                if(w->msg[0])
-                       print("init: rc exit status: %s\n", w->msg);
+                       fprint(2, "init: rc exit status: %s\n", w->msg);
                free(w);
                break;
        }
+       if(fd >= 0)
+               close(fd);
 }
 
 void
@@ -174,7 +143,7 @@ rcexec(void)
        else if(manual || iscpu)
                execl("/bin/rc", "rc", nil);
        else if(strcmp(service, "terminal") == 0)
-               execl("/bin/rc", "rc", "-c", ". /rc/bin/termrc; home=/usr/$user; cd; . lib/profile", nil);
+               execl("/bin/rc", "rc", "-c", ". /rc/bin/termrc; home=/usr/$user; cd && . ./lib/profile", nil);
        else
                execl("/bin/rc", "rc", nil);
 }
@@ -186,7 +155,7 @@ cpustart(void)
 }
 
 char*
-readenv(char *name)
+readfile(char *name)
 {
        int f, len;
        Dir *d;
@@ -194,13 +163,14 @@ readenv(char *name)
 
        f = open(name, OREAD);
        if(f < 0){
-               print("init: can't open %s: %r\n", name);
-               return "*unknown*";     
+               fprint(2, "init: can't open %s: %r\n", name);
+               return nil;     
        }
        d = dirfstat(f);
        if(d == nil){
-               print("init: can't stat %s: %r\n", name);
-               return "*unknown*";
+               fprint(2, "init: can't stat %s: %r\n", name);
+               close(f);
+               return nil;
        }
        len = d->length;
        free(d);
@@ -208,51 +178,54 @@ readenv(char *name)
                len = 64;
        val = malloc(len+1);
        if(val == nil){
-               print("init: can't malloc %s: %r\n", name);
-               return "*unknown*";
+               fprint(2, "init: can't malloc %s: %r\n", name);
+               close(f);
+               return nil;
        }
        len = read(f, val, len);
        close(f);
        if(len < 0){
-               print("init: can't read %s: %r\n", name);
-               return "*unknown*";
+               fprint(2, "init: can't read %s: %r\n", name);
+               return nil;
        }else
                val[len] = '\0';
        return val;
 }
 
+char*
+readenv(char *name)
+{
+       char *val;
+
+       val = readfile(name);
+       if(val == nil)
+               val = "*unknown*";
+       return val;
+}
+
 void
-setenv(char *var, char *val)
+setenv(char *name, char *val)
 {
        int fd;
 
-       fd = create(var, OWRITE, 0644);
+       fd = create(name, OWRITE, 0644);
        if(fd < 0)
-               print("init: can't open %s\n", var);
+               fprint(2, "init: can't create %s: %r\n", name);
        else{
-               fprint(fd, val);
+               write(fd, val, strlen(val));
                close(fd);
        }
 }
 
 void
-cpenv(char *file, char *var)
+cpenv(char *from, char *to)
 {
-       int i, fd;
-       char buf[8192];
+       char *val;
 
-       fd = open(file, OREAD);
-       if(fd < 0)
-               print("init: can't open %s\n", file);
-       else{
-               i = read(fd, buf, sizeof(buf)-1);
-               if(i <= 0)
-                       print("init: can't read %s: %r\n", file);
-               else{
-                       close(fd);
-                       buf[i] = 0;
-                       setenv(var, buf);
-               }
+       val = readfile(from);
+       if(val != nil){
+               setenv(to, val);
+               free(val);
        }
 }
 
@@ -267,3 +240,16 @@ closefds(void)
        for(i = 3; i < 30; i++)
                close(i);
 }
+
+int
+procopen(int pid, char *name, int mode)
+{
+       char buf[128];
+       int fd;
+
+       snprint(buf, sizeof(buf), "#p/%d/%s", pid, name);
+       fd = open(buf, mode);
+       if(fd < 0)
+               fprint(2, "init: warning: can't open %s: %r\n", name);
+       return fd;
+}