From 814343621dd1b74ab8c17accfdde99553db405fb Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 10 Jan 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-01-10 --- power/boot.c | 143 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 112 insertions(+), 31 deletions(-) diff --git a/power/boot.c b/power/boot.c index 88d65a7c7a558f7e47b17da69a6b925876d752e4..44d2e73630f343d6f03de776d00ce48eb4119068 100644 --- a/power/boot.c +++ b/power/boot.c @@ -15,9 +15,12 @@ char buf[4*1024]; char bootfile[5*NAMELEN]; char sys[NAMELEN]; +int printcol; /* so we can use the kernel's small print */ + int fd; int cfd; int efd; +int setkey; typedef struct address { @@ -26,7 +29,6 @@ struct address { } Address; Address addr[] = { - { "ross", "connect 020701005eff" }, { "bootes", "connect 0800690203f3" }, { "helix", "connect 080069020427" }, { "spindle", "connect 0800690202df" }, @@ -48,13 +50,16 @@ int bitdial(char *); int preamble(int); void srvcreate(char*, int); void settime(void); -void setpasswd(void); +void key(void); +int passwd(char*, int); +int passtokey(char*, char*, int); /* - * usage: 9b [-a] [server] [file] + * usage: 9b [-mp] [server] [file] * * default server is `bitbootes', default file is `/mips/9' */ +void main(int argc, char *argv[]) { int i; @@ -71,6 +76,8 @@ main(int argc, char *argv[]) if(argv[0][0] == '-'){ if(argv[0][1] == 'm') manual = 1; + else if(argv[0][1] == 'k') + setkey = 1; argc--; argv++; } else @@ -89,7 +96,7 @@ main(int argc, char *argv[]) break; } - setpasswd(); + key(); boot(manual); for(;;){ if(fd > 0) @@ -101,33 +108,6 @@ main(int argc, char *argv[]) } } -void -setpasswd(void) -{ - char key[7]; - int fd; - - fd = open("#r/nvram", OREAD); - if(fd < 0){ - prerror("can't open nvram"); - return; - } - if(seek(fd, 1024+900, 0) < 0 || read(fd, key, 7) != 7){ - close(fd); - prerror("can't read key from nvram"); - return; - } - close(fd); - fd = open("#c/key", OWRITE); - if(fd < 0){ - prerror("can't open key"); - return; - } - if(write(fd, key, 7) != 7) - prerror("can't write key"); - close(fd); -} - int bitdial(char *arg) { @@ -542,3 +522,104 @@ settime(void) write(f, dirbuf, strlen(dirbuf)); close(f); } + +void +key(void) +{ + char password[20], key[7]; + int prompt, fd; + + prompt = setkey; + fd = open("#r/nvram", ORDWR); + if(fd < 0){ + prompt = 1; + prerror("can't open nvram"); + } + if(prompt){ + do + if(passwd(password, sizeof password) < 0){ + prerror("can't read cons"); + return; + } + while(!passtokey(key, password, strlen(password))); + }else if(seek(fd, 1024+900, 0) < 0 || read(fd, key, 7) != 7){ + close(fd); + prerror("can't read key from nvram"); + } + if(setkey && seek(fd, 1024+900, 0) < 0 || write(fd, key, 7) != 7){ + close(fd); + prerror("can't write key to nvram"); + } + close(fd); + fd = open("#c/key", OWRITE); + if(fd < 0) + prerror("can't open key"); + else if(write(fd, key, 7) != 7) + prerror("can't write key"); + close(fd); +} + +int +passwd(char *p, int len) +{ + char c; + int i, n, fd; + + fd = open("#c/consctl", OWRITE); + if(fd < 0) + return -1; + write(fd, "rawon", 5); + Prompt: + print("password: "); + n = 0; + for(;;){ + do{ + i = read(0, &c, 1); + if(i < 0){ + close(fd); + return -1; + } + }while(i == 0); + switch(c){ + case '\n': + p[n] = '\0'; + close(fd); + print("\n"); + return 0; + case '\b': + if(n > 0) + n--; + break; + case 'u' - 'a' + 1: /* cntrl-u */ + print("\n"); + goto Prompt; + default: + if(n < len - 1) + p[n++] = c; + break; + } + } +} + +int +passtokey(char *key, char *p, int n) +{ + uchar t[10]; + int c; + + memset(t, ' ', sizeof t); + if(n > 10 || n < 5) + return 0; + strncpy((char*)t, p, n); + if(n >= 9){ + c = p[8] & 0xf; + if(n == 10) + c += p[9] << 4; + for(n = 0; n < 8; n++) + if(c & (1 << n)) + t[n] -= ' '; + } + for(n = 0; n < 7; n++) + key[n] = (t[n] >> n) + (t[n+1] << (8 - (n+1))); + return 1; +}