Research V5 development
authorKen Thompson <ken@research.uucp>
Tue, 26 Nov 1974 23:13:21 +0000 (18:13 -0500)
committerKen Thompson <ken@research.uucp>
Tue, 26 Nov 1974 23:13:21 +0000 (18:13 -0500)
Work on file usr/source/s4/fltpr.s
Work on file usr/source/s2/rm.c
Work on file usr/mdec/uboot.s
Work on file usr/source/s4/exit.s
Work on file usr/source/s4/mount.s
Work on file usr/source/s4/crypt.s
Work on file usr/source/s4/chdir.s
Work on file usr/source/s2/passwd.s
Work on file usr/source/s4/mdate.s

Co-Authored-By: Dennis Ritchie <dmr@research.uucp>
Synthesized-from: v5

usr/mdec/uboot.s [new file with mode: 0644]
usr/source/s2/passwd.s [new file with mode: 0644]
usr/source/s2/rm.c [new file with mode: 0644]
usr/source/s4/chdir.s [new file with mode: 0644]
usr/source/s4/crypt.s [new file with mode: 0644]
usr/source/s4/exit.s [new file with mode: 0644]
usr/source/s4/fltpr.s [new file with mode: 0644]
usr/source/s4/mdate.s [new file with mode: 0644]
usr/source/s4/mount.s [new file with mode: 0644]

diff --git a/usr/mdec/uboot.s b/usr/mdec/uboot.s
new file mode 100644 (file)
index 0000000..f9f334c
--- /dev/null
@@ -0,0 +1,239 @@
+/ disk boot program to load and transfer
+/ to a unix entry
+
+/ entry is made by jsr pc,*$0
+/ so return can be rts pc
+
+core = 24.
+.. = [core*2048.]-512.
+start:
+       mov     $..,sp
+       mov     sp,r1
+       cmp     pc,r1
+       bhis    2f
+       reset
+       clr     r0
+       cmp     (r0),$407
+       bne     1f
+       mov     $20,r0
+1:
+       mov     (r0)+,(r1)+
+       cmp     r1,$end
+       blo     1b
+       jmp     (sp)
+
+2:
+       mov     $inod,r0
+1:
+       clr     (r0)+
+       cmp     r0,sp
+       blo     1b
+       jsr     pc,getc
+       cmp     r0,$'k
+       bne     3f
+       mov     $rkblk,r0
+       br      1f
+3:
+       cmp     r0,$'p
+       bne     2b
+       mov     $rpblk,r0
+1:
+       mov     r0,rxblk
+       mov     $'\n,r0
+       jsr     pc,putc
+       mov     $names,r1
+
+1:
+       mov     r1,r2
+2:
+       jsr     pc,getc
+       cmp     r0,$'\n
+       beq     1f
+       cmp     r0,$'/
+       beq     3f
+       movb    r0,(r2)+
+       br      2b
+3:
+       cmp     r1,r2
+       beq     2b
+       add     $14.,r1
+       br      1b
+1:
+       mov     $names,r1
+       mov     $1,r0
+1:
+       clr     bno
+       jsr     pc,iget
+       tst     (r1)
+       beq     1f
+2:
+       jsr     pc,rmblk
+               br start
+       mov     $buf,r2
+3:
+       mov     r1,r3
+       mov     r2,r4
+       add     $16.,r2
+       tst     (r4)+
+       beq     5f
+4:
+       cmpb    (r3)+,(r4)+
+       bne     5f
+       cmp     r4,r2
+       blo     4b
+       mov     -16.(r2),r0
+       add     $14.,r1
+       br      1b
+5:
+       cmp     r2,$buf+512.
+       blo     3b
+       br      2b
+1:
+       clr     r1
+1:
+       jsr     pc,rmblk
+               br 1f
+       mov     $buf,r2
+2:
+       mov     (r2)+,(r1)+
+       cmp     r2,$buf+512.
+       blo     2b
+       br      1b
+1:
+       clr     r0
+       cmp     (r0),$407
+       bne     2f
+1:
+       mov     20(r0),(r0)+
+       cmp     r0,sp
+       blo     1b
+2:
+       jsr     pc,*$0
+       br      start
+
+iget:
+       add     $31.,r0
+       mov     r0,r5
+       ash     $-4.,r0
+       jsr     pc,rblk
+       bic     $!17,r5
+       ash     $5.,r5
+       add     $buf,r5
+       mov     $inod,r4
+1:
+       mov     (r5)+,(r4)+
+       cmp     r4,$addr+16.
+       blo     1b
+       rts     pc
+
+rmblk:
+       add     $2,(sp)
+       mov     bno,r0
+       inc     bno
+       bit     $LRG,mode
+       bne     1f
+       asl     r0
+       mov     addr(r0),r0
+       bne     rblk
+2:
+       sub     $2,(sp)
+       rts     pc
+1:
+       clr     -(sp)
+       movb    r0,(sp)
+       clrb    r0
+       swab    r0
+       asl     r0
+       mov     addr(r0),r0
+       beq     2b
+       jsr     pc,rblk
+       mov     (sp)+,r0
+       asl     r0
+       mov     buf(r0),r0
+       beq     2b
+
+rblk:
+       mov     r1,-(sp)
+       mov     r0,r1
+       clr     r0
+       jmp     *rxblk
+
+rpda = 176724
+rpblk:
+       div     $10.,r0
+       mov     r1,-(sp)
+       mov     r0,r1
+       clr     r0
+       div     $20.,r0
+       bisb    r1,1(sp)
+       mov     $rpda,r1
+       mov     (sp)+,(r1)
+       br      1f
+
+rkda = 177412
+rkblk:
+       div     $12.,r0
+       ash     $4.,r0
+       bis     r1,r0
+       mov     $rkda+2,r1
+
+1:
+       mov     r0,-(r1)
+       mov     $buf,-(r1)
+       mov     $-256.,-(r1)
+       mov     $5,-(r1)
+1:
+       tstb    (r1)
+       bge     1b
+       mov     (sp)+,r1
+       rts     pc
+
+tks = 177560
+tkb = 177562
+getc:
+       mov     $tks,r0
+       inc     (r0)
+1:
+       tstb    (r0)
+       bge     1b
+       mov     tkb,r0
+       bic     $!177,r0
+       cmp     r0,$'A
+       blo     1f
+       cmp     r0,$'Z
+       bhi     1f
+       add     $40,r0
+1:
+       cmp     r0,$'\r
+       bne     putc
+       mov     $'\n,r0
+
+tps = 177564
+tpb = 177566
+putc:
+       tstb    tps
+       bge     putc
+       cmp     r0,$'\n
+       bne     1f
+       mov     $'\r,r0
+       jsr     pc,putc
+       mov     $'\n+200,r0
+       jsr     pc,putc
+       clr     r0
+       jsr     pc,putc
+       mov     $'\n,r0
+       rts     pc
+1:
+       mov     r0,tpb
+       rts     pc
+
+end:
+inod = ..-1024.
+mode = inod
+addr = inod+8.
+buf = inod+32.
+bno = buf+514.
+rxblk = bno+2
+names = rxblk+2
+LRG = 10000
+reset = 5
diff --git a/usr/source/s2/passwd.s b/usr/source/s2/passwd.s
new file mode 100644 (file)
index 0000000..9f7b8a7
--- /dev/null
@@ -0,0 +1,175 @@
+/ passwd -- change user's password
+
+.globl mesg
+.globl crypt
+.globl getc
+.globl flush
+.globl fcreat
+.globl putc
+.globl fopen
+
+       cmp     (sp)+,$3
+       bge     1f
+       jsr     r5,mesg
+               <Usage: passwd uid password\n\0>; .even
+       sys     exit
+1:
+       tst     (sp)+
+       mov     (sp)+,uidp
+       mov     (sp)+,r0
+       tstb    (r0)
+       beq     1f
+       jsr     pc,crypt
+       clrb    8(r0)
+1:
+       mov     r0,cryptp
+       mov     $passwf,r0
+       jsr     r5,fopen; ibuf
+       bec     1f
+       jsr     r5,mesg
+               <cannot open password file\n\0>; .even
+       sys     exit
+1:
+       sys     stat; tempf; obuf+20.
+       bec     2f
+       sys     creat; tempf; 222
+       bec     1f
+2:
+       jsr     r5,mesg
+               <temp file busy -- try again\n\0>; .even
+       sys     exit
+1:
+       mov     r0,obuf
+
+/ search for uid
+
+comp:
+       mov     uidp,r1
+1:
+       jsr     pc,pcop
+       cmp     r0,$':
+       beq     1f
+       cmpb    r0,(r1)+
+       beq     1b
+2:
+       jsr     pc,pcop
+       cmp     r0,$'\n
+       bne     2b
+       br      comp
+1:
+       tstb    (r1)+
+       bne     2b
+
+/ skip over old password
+
+1:
+       jsr     pc,pget
+       cmp     r0,$':
+       bne     1b
+
+/ copy in new password
+
+       mov     cryptp,r1
+1:
+       movb    (r1)+,r0
+       beq     1f
+       jsr     pc,pput
+       br      1b
+1:
+       mov     $':,r0
+       jsr     pc,pput
+
+/ validate permission
+
+       clr     r1
+1:
+       jsr     pc,pcop
+       cmp     r0,$':
+       beq     1f
+       mpy     $10.,r1
+       sub     $'0,r0
+       add     r0,r1
+       br      1b
+1:
+       sys     getuid
+       tst     r0
+       beq     1f
+       cmp     r0,r1
+       beq     1f
+       jsr     r5,mesg
+               <permission denied\n\0>; .even
+       br      done
+1:
+       inc     sflg
+1:
+       jsr     pc,pcop
+       br      1b
+
+done:
+       jsr     r5,flush; obuf
+       mov     obuf,r0
+       sys     close
+       mov     ibuf,r0
+       sys     close
+       tst     sflg
+       beq     1f
+       tst     dflg
+       bne     1f
+       inc     dflg
+       mov     $tempf,r0
+       jsr     r5,fopen; ibuf
+       bec     2f
+       jsr     r5,mesg
+               <cannot reopen temp file\n\0>; .even
+       br      1f
+2:
+       mov     $passwf,r0
+       jsr     r5,fcreat; obuf
+       bec     2f
+       jsr     r5,mesg
+               <cannot reopen password file\n\0>; .even
+       br      1f
+2:
+       jsr     pc,pcop
+       br      2b
+1:
+       sys     unlink; tempf
+       sys     exit
+
+pput:
+       jsr     r5,putc; obuf
+       rts     pc
+
+pget:
+       jsr     r5,getc; ibuf
+       bes     1f
+       rts     pc
+1:
+       jsr     r5,mesg
+               <format error on password file\n\0>; .even
+       br      done
+
+pcop:
+       jsr     r5,getc; ibuf
+       bes     1f
+       jsr     r5,putc; obuf
+       rts     pc
+1:
+       tst     sflg
+       bne     1f
+       jsr     r5,mesg
+               <uid not valid\n\0>; .even
+1:
+       br      done
+
+.data
+passwf:        </etc/passwd\0>
+tempf: </tmp/ptmp\0>
+.even
+.bss
+ibuf:  .=.+520.
+obuf:  .=.+520.
+cryptp:        .=.+2
+uidp:  .=.+2
+sflg:  .=.+2
+dflg:  .=.+2
diff --git a/usr/source/s2/rm.c b/usr/source/s2/rm.c
new file mode 100644 (file)
index 0000000..fb4ec00
--- /dev/null
@@ -0,0 +1,107 @@
+main(argc, argv)
+char *argv[];
+{
+       char *arg;
+       int fflg, rflg;
+
+       fflg = 0;
+       rflg = 0;
+       while(--argc > 0) {
+
+               arg = *++argv;
+               if(arg[0] == '-') {
+                       if(arg[1] == 'f') {
+                               fflg++;
+                               continue;
+                       }
+                       if(arg[1] == 'r') {
+                               rflg++;
+                               continue;
+                       }
+               }
+
+               rm(arg, fflg, rflg);
+       }
+}
+
+struct stbuf   {
+       int dev;
+       int inum;
+       int mode;
+       char nlink;
+       char uid;
+       char gid;
+       char siz0;
+       char siz1;
+       int addr[8];
+       int adate[2];
+       int mdate[2];
+       };
+
+rm(arg, fflg, rflg)
+char arg[];
+{
+       char *p;
+       int buf[20];
+       int i, b;
+
+       if(stat(arg, buf)) {
+               printf("%s: non existent\n", arg);
+               return;
+       }
+       if((buf->mode & 060000) == 040000)      {
+               if(rflg) {
+                       i = fork();
+                       if(i < 0) {
+                               printf("%s: try again\n", arg);
+                               return;
+                       }
+                       if(i) {
+                               while(wait() != i);
+                               return;
+                       }
+                       if(chdir(arg)) {
+                               printf("%s: cannot chdir\n", arg);
+                               exit();
+                       }
+                       p = 0;
+                       execl("/etc/glob", "glob", "rm", "-r",
+                               fflg? "-f": "*", fflg? "*": p, 0);
+                       printf("%s: no glob\n", arg);
+                       exit();
+               }
+               printf("%s: directory\n", arg);
+               return;
+       }
+
+       if(!fflg) {
+
+               if(getuid() == buf->uid)
+                       b = 0200; else
+                       b = 2;
+               if((buf->mode & b) == 0)        {
+                       printf("%s: %o mode ", arg, buf->mode);
+                       i = b = getchar();
+                       i = b;
+                       while(b != '\n' && b != '\0')
+                               b = getchar();
+                       if(i != 'y')
+                               return;
+               }
+       }
+       if(unlink(arg))
+               printf("%s: not removed\n", arg);
+}
+
+putchar(c)
+{
+       write(1, &c, 1);
+}
+
+getchar()
+{
+       char c;
+
+       if(read(0, &c, 1) != 1) return(0);
+       return(c);
+}
diff --git a/usr/source/s4/chdir.s b/usr/source/s4/chdir.s
new file mode 100644 (file)
index 0000000..0c8dc26
--- /dev/null
@@ -0,0 +1,19 @@
+/ C library -- chdir
+
+/ error = chdir(string);
+
+.globl _chdir, retrn, cerror
+
+_chdir:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       jmp     retrn
+.data
+9:
+       sys     chdir; 0:..
diff --git a/usr/source/s4/crypt.s b/usr/source/s4/crypt.s
new file mode 100644 (file)
index 0000000..35b1294
--- /dev/null
@@ -0,0 +1,15 @@
+/ C library -- crypt
+/ cstring = crypt(key);
+
+.globl _crypt
+.globl crypt, retrn, savr5
+
+_crypt:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     r5,savr5
+       mov     4(r5),r0
+       jsr     pc,crypt
+       clr     savr5
+       jmp     retrn
+
diff --git a/usr/source/s4/exit.s b/usr/source/s4/exit.s
new file mode 100644 (file)
index 0000000..c50b47e
--- /dev/null
@@ -0,0 +1,13 @@
+/ C library -- exit
+
+/ exit(code)
+/ code is return in r0 to system
+
+.globl _exit
+
+_exit:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),r0
+       sys     exit
+
diff --git a/usr/source/s4/fltpr.s b/usr/source/s4/fltpr.s
new file mode 100644 (file)
index 0000000..87de0a2
--- /dev/null
@@ -0,0 +1,89 @@
+/ C library-- floating output
+
+.globl pfloat
+.globl pscien
+.globl fltused
+
+.globl _ndigit
+.globl ecvt
+.globl fcvt
+
+fltused:               / force loading
+pfloat:
+       tst     r2
+       bne     1f
+       mov     $6,_ndigit
+1:
+       movf    (r4)+,fr0
+       jsr     pc,fcvt
+       tst     r1
+       beq     1f
+       movb    $'-,(r3)+
+1:
+       tst     r2
+       bgt     1f
+       movb    $'0,(r3)+
+1:
+       mov     r2,r1
+       ble     1f
+2:
+       movb    (r0)+,(r3)+
+       sob     r1,2b
+1:
+       mov     _ndigit,r1
+       beq     1f
+       movb    $'.,(r3)+
+1:
+       neg     r2
+       ble     1f
+2:
+       dec     r1
+       blt     1f
+       movb    $'0,(r3)+
+       sob     r2,2b
+1:
+       tst     r1
+       ble     2f
+1:
+       movb    (r0)+,(r3)+
+       sob     r1,1b
+2:
+       rts     pc
+
+pscien:
+       tst     r2
+       bne     1f
+       mov     $6,_ndigit
+1:
+       movf    (r4)+,fr0
+       jsr     pc,ecvt
+       tst     r1
+       beq     1f
+       movb    $'-,(r3)+
+1:
+       movb    (r0)+,(r3)+
+       movb    $'.,(r3)+
+       mov     _ndigit,r1
+       dec     r1
+       ble     1f
+2:
+       movb    (r0)+,(r3)+
+       sob     r1,2b
+1:
+       movb    $'e,(r3)+
+       dec     r2
+       mov     r2,r1
+       bge     1f
+       movb    $'-,(r3)+
+       neg     r1
+       br      2f
+1:
+       movb    $'+,(r3)+
+2:
+       clr     r0
+       div     $10.,r0
+       add     $'0,r0
+       movb    r0,(r3)+
+       add     $'0,r1
+       movb    r1,(r3)+
+       rts     pc
diff --git a/usr/source/s4/mdate.s b/usr/source/s4/mdate.s
new file mode 100644 (file)
index 0000000..f4f9905
--- /dev/null
@@ -0,0 +1,20 @@
+/ C library-- mdate
+
+.globl _mdate, retrn, cerror
+
+_mdate:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(r5),0f
+       mov     6(r5),r1
+       mov     (r1)+,r0
+       mov     (r1),r1
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       jmp     retrn
+.data
+9:
+       sys     mdate; 0:..
diff --git a/usr/source/s4/mount.s b/usr/source/s4/mount.s
new file mode 100644 (file)
index 0000000..4a98b01
--- /dev/null
@@ -0,0 +1,21 @@
+/ C library -- mount
+
+/ error = mount(dev, file, flag)
+
+.globl _mount, retrn, cerror
+
+_mount:
+       mov     r5,-(sp)
+       mov     sp,r5
+       mov     4(sp),0f
+       mov     6(sp),0f+2
+       mov     8(sp),0f+4
+       sys     0; 9f
+       bec     1f
+       jmp     cerror
+1:
+       clr     r0
+       jmp     retrn
+.data
+9:
+       sys     mount; 0:..; ..; ..