From 5bd4b441a6ad608bc690880e493a6c192afd1a89 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 23 Mar 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-03-23 --- boot/boot.c | 10 ++++++++-- boot/key.c | 41 ++++++++++++++++++++++++++++++----------- boot/userpasswd.c | 8 ++++++++ pc/fns.h | 3 ++- pc/l.s | 3 ++- pc/main.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- port/devcons.c | 12 ++++++++++-- 7 files changed, 105 insertions(+), 18 deletions(-) diff --git a/boot/boot.c b/boot/boot.c index e75a66183353a8a8b029ed086866791472f8246a..cd590674ed2ec7d7d54c123c5a6d18da2b6b974e 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -12,11 +12,13 @@ char cputype[NAMELEN]; char terminal[NAMELEN]; char sys[2*NAMELEN]; char username[NAMELEN]; +char *sauth = ""; int mflag; int fflag; int kflag; int aflag; +int pflag; int cache(int); void swapproc(void); @@ -48,8 +50,12 @@ main(int argc, char *argv[]) kflag = 1; break; case 'm': + pflag = 1; mflag = 1; break; + case 'p': + pflag = 1; + break; case 'f': fflag = 1; break; @@ -89,7 +95,7 @@ main(int argc, char *argv[]) */ if(bind("/", "/", MREPL) < 0) fatal("bind"); - if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) + if(mount(fd, "/", MAFTER|MCREATE, "", sauth) < 0) fatal("mount"); close(fd); newkernel(); @@ -145,7 +151,7 @@ rootserver(char *arg) else strcpy(reply, method->name); for(notfirst = 0;; notfirst = 1){ - if(mflag || notfirst) + if(pflag || notfirst) outin(prompt, reply, sizeof(reply)); for(mp = method; mp->name; mp++) if(*reply == *mp->name){ diff --git a/boot/key.c b/boot/key.c index 7fd3983afce0c7916a9d2d397cfb7a38b2367488..c009fe6c67d131108a12b1dcedc0a825e5278b1b 100644 --- a/boot/key.c +++ b/boot/key.c @@ -3,10 +3,22 @@ #include #include <../boot/boot.h> +static uchar +cksum(char *key) +{ + int i, nvsum; + + nvsum = 0; + for(i=0; i char password[NAMELEN]; +extern char *sauth; /* * get/set user name and password. verify password with auth server. @@ -14,10 +15,17 @@ userpasswd(int islocal, Method *mp) char key[7]; char buf[8 + NAMELEN]; int fd, crfd; + char *p; if(*username == 0 || strcmp(username, "none") == 0){ strcpy(username, "none"); outin("user", username, sizeof(username)); + /* Hack to do authentication testing */ + p = utfrrune(username, '!'); + if(p && p > username) { + *p = '\0'; + sauth = "any"; + } } crfd = fd = -1; while(strcmp(username, "none") != 0 && !islocal){ diff --git a/pc/fns.h b/pc/fns.h index 190e708c77394d6777161cfd99803ad32e9628f0..7f1eb4a7509042be70e134925528becab6c47a36 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -2,6 +2,7 @@ void meminit(void); void bigcursor(void); +void bootargs(ulong); #define clearmmucache() /* 386 doesn't have one */ void clock(Ureg*); void clockinit(void); @@ -55,7 +56,7 @@ void screenputs(char*, int); int serial(int); void setvec(int, void (*)(Ureg*)); void systrap(void); -void touser(void); +void touser(void*); void trapinit(void); int tas(void*); void uartclock(void); diff --git a/pc/l.s b/pc/l.s index 8e4a8bf2902eb5408025cf50b9400e997f82adde..dc1e60b7704979d3574417b6342656833f1a29d5 100644 --- a/pc/l.s +++ b/pc/l.s @@ -563,7 +563,8 @@ TEXT setlabel(SB),$0 */ TEXT touser(SB),$0 PUSHL $(UDSEL) /* old ss */ - PUSHL $(USTKTOP) /* old sp */ + MOVL sp+0(FP),AX /* old sp */ + PUSHL AX PUSHFL /* old flags */ PUSHL $(UESEL) /* old cs */ PUSHL $(UTZERO+32) /* old pc */ diff --git a/pc/main.c b/pc/main.c index 09fb6cb8bb6484832ce410752d7da3a57936567c..bf76dd64aa8152d89dd2b40ef970797c9e58bd03 100644 --- a/pc/main.c +++ b/pc/main.c @@ -8,6 +8,7 @@ #include "init.h" int machtype; +uchar *sp; /* stack pointer for /boot */ void main(void) @@ -93,7 +94,7 @@ init0(void) ksetenv("cputype", "386"); poperror(); } - touser(); + touser(sp); } void @@ -103,6 +104,7 @@ userinit(void) Segment *s; User *up; KMap *k; + Page *pg; p = newproc(); p->pgrp = newpgrp(); @@ -138,6 +140,11 @@ userinit(void) */ s = newseg(SG_STACK, USTKTOP-BY2PG, 1); p->seg[SSEG] = s; + pg = newpage(1, 0, USTKTOP-BY2PG); + segpage(s, pg); + k = kmap(pg); + bootargs(VA(k)); + kunmap(k); /* * Text @@ -152,6 +159,43 @@ userinit(void) ready(p); } +uchar * +pusharg(char *p) +{ + int n; + + n = strlen(p)+1; + sp -= n; + memmove(sp, p, n); + return sp; +} + +void +bootargs(ulong base) +{ + int i, ac; + uchar *av[32]; + char *p, *pp; + uchar **lsp; + + sp = (uchar*)base + BY2PG - MAXSYSARG*BY2WD; + + ac = 0; + av[ac++] = pusharg("/386/9safari"); + av[ac++] = pusharg("-p"); + + /* 4 byte word align stack */ + sp = (uchar*)((ulong)sp & ~3); + + /* build argc, argv on stack */ + sp -= (ac+1)*sizeof(sp); + lsp = (uchar**)sp; + for(i = 0; i < ac; i++) + *lsp++ = av[i] + ((USTKTOP - BY2PG) - base); + *lsp = 0; + sp += (USTKTOP - BY2PG) - base - sizeof(ulong); +} + Conf conf; void diff --git a/port/devcons.c b/port/devcons.c index 55133b26dcd3fac0745e518dfada8e9d41493b7f..321c1843af1f953727167aaa9f2c8ab39d5998a5 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -361,7 +361,7 @@ Dirtab consdir[]={ "user", {Quser}, 0, 0666, "chal", {Qchal}, 8, 0666, "crypt", {Qcrypt}, 0, 0666, - "key", {Qkey}, DESKEYLEN, 0222, + "key", {Qkey}, DESKEYLEN, 0622, "klog", {Qklog}, 0, 0444, "sysstat", {Qsysstat}, 0, 0666, "sysname", {Qsysname}, 0, 0664, @@ -597,7 +597,7 @@ consread(Chan *c, void *buf, long n, ulong offset) return n; case Qchal: - if(offset != 0 || n != 8) + if(offset!=0 || n!=8) error(Ebadarg); chal = u->p->pgrp->crypt->chal; chal[0] = RXschal; @@ -608,6 +608,14 @@ consread(Chan *c, void *buf, long n, ulong offset) chal[0] = RXstick; return n; + case Qkey: + if(offset!=0 || n!=DESKEYLEN) + error(Ebadarg); + if(strcmp(u->p->user, eve)!=0 || conf.cntrlp==0) + error(Eperm); + memmove(buf, evekey, DESKEYLEN); + return n; + case Quser: return readstr(offset, buf, n, u->p->user);