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/sys/ken/subr.c

Synthesized-from: v5

usr/sys/ken/subr.c [new file with mode: 0644]

diff --git a/usr/sys/ken/subr.c b/usr/sys/ken/subr.c
new file mode 100644 (file)
index 0000000..123d750
--- /dev/null
@@ -0,0 +1,149 @@
+#
+/*
+ *     Copyright 1973 Bell Telephone Laboratories Inc
+ */
+
+#include "../param.h"
+#include "../conf.h"
+#include "../inode.h"
+#include "../user.h"
+#include "../buf.h"
+#include "../systm.h"
+
+bmap(ip, bn)
+struct inode *ip;
+int bn;
+{
+       register *bp, *bap, nb;
+       int *nbp, d, i;
+
+       d = ip->i_dev;
+
+       if (bn & ~03777) {
+               u.u_error = EFBIG;
+               return(0);
+       }
+       if((ip->i_mode&ILARG) == 0) {
+
+               /*
+                * small file algorithm
+                */
+
+               if((bn & ~7) != 0) {
+
+                       /*
+                        * bad part:
+                        * convert small to large
+                        */
+
+                       if ((bp = alloc(d)) == NULL)
+                               return(0);
+                       bap = bp->b_addr;
+                       for(i=0; i<8; i++) {
+                               *bap++ = ip->i_addr[i];
+                               ip->i_addr[i] = 0;
+                       }
+                       ip->i_addr[0] = bp->b_blkno;
+                       bdwrite(bp);
+                       ip->i_mode =| ILARG;
+                       goto large;
+               }
+               nb = ip->i_addr[bn];
+               if(nb == 0 && (bp = alloc(d)) != NULL) {
+                       bdwrite(bp);
+                       nb = bp->b_blkno;
+                       ip->i_addr[bn] = nb;
+                       ip->i_flag =| IUPD;
+               }
+               if (bn<7)
+                       rablock = ip->i_addr[bn+1];
+               else
+                       rablock = 0;
+               return(nb);
+       }
+
+       /*
+        * large file algorithm
+        */
+
+    large:
+       i = bn>>8;
+       if((nb=ip->i_addr[i]) == 0) {
+               ip->i_flag =| IUPD;
+               if ((bp = alloc(d)) == NULL)
+                       return(0);
+               nb = bp->b_blkno;
+               ip->i_addr[i] = nb;
+       } else
+               bp = bread(d, nb);
+       bap = bp->b_addr;
+       i = bn & 0377;
+       if((nb=bap[i]) == 0 && (nbp = alloc(d)) != NULL) {
+               nb = nbp->b_blkno;
+               bap[i] = nb;
+               bdwrite(nbp);
+               bdwrite(bp);
+       } else
+               brelse(bp);
+       rablock = bap[i+1];
+       return(nb);
+}
+
+passc(c)
+char c;
+{
+
+       if(u.u_segflg)
+               *u.u_base = c; else
+               if(subyte(u.u_base, c) < 0) {
+                       u.u_error = EFAULT;
+                       return(-1);
+               }
+       u.u_count--;
+       if(++u.u_offset[1] == 0)
+               u.u_offset[0]++;
+       u.u_base++;
+       return(u.u_count == 0? -1: 0);
+}
+
+cpass()
+{
+       register c;
+
+       if(u.u_count == 0)
+               return(-1);
+       if(u.u_segflg)
+               c = *u.u_base; else
+               if((c=fubyte(u.u_base)) < 0) {
+                       u.u_error = EFAULT;
+                       return(-1);
+               }
+       u.u_count--;
+       if(++u.u_offset[1] == 0)
+               u.u_offset[0]++;
+       u.u_base++;
+       return(c&0377);
+}
+
+nodev()
+{
+
+       u.u_error = ENODEV;
+}
+
+nulldev()
+{
+}
+
+bcopy(from, to, count)
+int *from, *to;
+{
+       register *a, *b, c;
+
+       a = from;
+       b = to;
+       c = count;
+       do
+               *b++ = *a++;
+       while(--c);
+}