-/* sys.c 4.1 %G% */
+/* sys.c 4.5 82/03/07 */
-#include <sys/param.h>
-#include <sys/ino.h>
-#include <sys/inode.h>
-#include <sys/filsys.h>
-#include <sys/dir.h>
+#include "../h/param.h"
+#include "../h/inode.h"
+#include "../h/fs.h"
+#include "../h/ndir.h"
#include "saio.h"
ino_t dlook();
+struct dirstuff {
+ int loc;
+ struct iob *io;
+};
+
static
openi(n,io)
-register struct iob *io;
+ register struct iob *io;
{
register struct dinode *dp;
io->i_offset = 0;
- io->i_bn = fsbtodb(itod(n)) + io->i_boff;
- io->i_cc = BSIZE;
+ io->i_bn = fsbtodb(&io->i_fs, itod(&io->i_fs, n)) + io->i_boff;
+ io->i_cc = io->i_fs.fs_bsize;
io->i_ma = io->i_buf;
devread(io);
-
dp = (struct dinode *)io->i_buf;
- dp = &dp[itoo(n)];
- io->i_ino.i_number = n;
- io->i_ino.i_mode = dp->di_mode;
- io->i_ino.i_size = dp->di_size;
- l3tol((char *)io->i_ino.i_un.i_addr, (char *)dp->di_addr, NADDR);
+ io->i_ino.i_ic = dp[itoo(&io->i_fs, n)].di_ic;
}
static
find(path, file)
-register char *path;
-struct iob *file;
+ register char *path;
+ struct iob *file;
{
register char *q;
char c;
static daddr_t
sbmap(io, bn)
-register struct iob *io;
-daddr_t bn;
+ register struct iob *io;
+ daddr_t bn;
{
- register i;
register struct inode *ip;
- int j, sh;
+ int i, j, sh;
daddr_t nb, *bap;
- int ibn = bn;
ip = &io->i_ino;
- if(bn < 0) {
+ if (bn < 0) {
printf("bn negative\n");
return((daddr_t)0);
}
/*
- * blocks 0..NADDR-4 are direct blocks
+ * blocks 0..NDADDR are direct blocks
*/
- if(bn < NADDR-3) {
- i = bn;
- nb = ip->i_un.i_addr[i];
+ if(bn < NDADDR) {
+ nb = ip->i_db[bn];
return(nb);
}
/*
- * addresses NADDR-3, NADDR-2, and NADDR-1
- * have single, double, triple indirect blocks.
- * the first step is to determine
- * how many levels of indirection.
+ * addresses NIADDR have single and double indirect blocks.
+ * the first step is to determine how many levels of indirection.
*/
- sh = 0;
- nb = 1;
- bn -= NADDR-3;
- for(j=3; j>0; j--) {
- sh += NSHIFT;
- nb <<= NSHIFT;
- if(bn < nb)
+ sh = 1;
+ bn -= NDADDR;
+ for (j = NIADDR; j > 0; j--) {
+ sh *= NINDIR(&io->i_fs);
+ if (bn < sh)
break;
- bn -= nb;
+ bn -= sh;
}
- if(j == 0) {
- printf("bn ovf %D\n",bn);
- return((daddr_t)0);
+ if (j == 0) {
+ printf("bn ovf %D\n", bn);
+ return ((daddr_t)0);
}
/*
- * fetch the address from the inode
+ * fetch the first indirect block address from the inode
*/
- nb = ip->i_un.i_addr[NADDR-j];
- if(nb == 0) {
+ nb = ip->i_ib[NIADDR - j];
+ if (nb == 0) {
printf("bn void %D\n",bn);
return((daddr_t)0);
}
/*
* fetch through the indirect blocks
*/
- for(; j<=3; j++) {
+ for (; j <= NIADDR; j++) {
if (blknos[j] != nb) {
- io->i_bn = fsbtodb(nb) + io->i_boff;
+ io->i_bn = fsbtodb(&io->i_fs, nb) + io->i_boff;
io->i_ma = b[j];
- io->i_cc = BSIZE;
+ io->i_cc = io->i_fs.fs_bsize;
devread(io);
- bap = (daddr_t *)b[j];
blknos[j] = nb;
}
bap = (daddr_t *)b[j];
- sh -= NSHIFT;
- i = (bn>>sh) & NMASK;
+ sh /= NINDIR(&io->i_fs);
+ i = (bn / sh) % NINDIR(&io->i_fs);
nb = bap[i];
if(nb == 0) {
printf("bn void %D\n",bn);
static ino_t
dlook(s, io)
-char *s;
-register struct iob *io;
+ char *s;
+ register struct iob *io;
{
register struct direct *dp;
register struct inode *ip;
- daddr_t bn;
- int n,dc;
+ struct dirstuff dirp;
+ int len;
- if (s==NULL || *s=='\0')
+ if (s == NULL || *s == '\0')
return(0);
ip = &io->i_ino;
- if ((ip->i_mode&IFMT)!=IFDIR) {
+ if ((ip->i_mode&IFMT) != IFDIR) {
printf("not a directory\n");
return(0);
}
-
- n = ip->i_size/sizeof(struct direct);
-
- if (n==0) {
+ if (ip->i_size == 0) {
printf("zero length directory\n");
return(0);
}
-
- dc = BSIZE;
- bn = (daddr_t)0;
- while(n--) {
- if (++dc >= BSIZE/sizeof(struct direct)) {
- io->i_bn = fsbtodb(sbmap(io, bn++)) + io->i_boff;
- io->i_ma = io->i_buf;
- io->i_cc = BSIZE;
- devread(io);
- dp = (struct direct *)io->i_buf;
- dc = 0;
- }
-
- if (match(s, dp->d_name))
+ len = strlen(s);
+ dirp.loc = 0;
+ dirp.io = io;
+ for (dp = readdir(&dirp); dp != NULL; dp = readdir(&dirp)) {
+ if(dp->d_ino == 0)
+ continue;
+ if (dp->d_namlen == len && !strcmp(s, dp->d_name))
return(dp->d_ino);
- dp++;
}
return(0);
}
-static
-match(s1,s2)
-register char *s1,*s2;
+/*
+ * get next entry in a directory.
+ */
+struct direct *
+readdir(dirp)
+ register struct dirstuff *dirp;
{
- register cc;
+ register struct direct *dp;
+ register struct iob *io;
+ daddr_t lbn, d;
+ int off;
- cc = DIRSIZ;
- while (cc--) {
- if (*s1 != *s2)
- return(0);
- if (*s1++ && *s2++)
- continue; else
- return(1);
+ io = dirp->io;
+ for(;;) {
+ if (dirp->loc >= io->i_ino.i_size)
+ return NULL;
+ off = blkoff(&io->i_fs, dirp->loc);
+ if (off == 0) {
+ lbn = lblkno(&io->i_fs, dirp->loc);
+ d = sbmap(io, lbn);
+ if(d == 0)
+ return NULL;
+ io->i_bn = fsbtodb(&io->i_fs, d) + io->i_boff;
+ io->i_ma = io->i_buf;
+ io->i_cc = blksize(&io->i_fs, &io->i_ino, lbn);
+ devread(io);
+ }
+ dp = (struct direct *)(io->i_buf + off);
+ dirp->loc += dp->d_reclen;
+ if (dp->d_ino == 0)
+ continue;
+ return (dp);
}
- return(1);
}
lseek(fdesc, addr, ptr)
-int fdesc;
-off_t addr;
-int ptr;
+ int fdesc;
+ off_t addr;
+ int ptr;
{
register struct iob *io;
return(-1);
}
fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES || ((io = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
+ if (fdesc < 0 || fdesc >= NFILES ||
+ ((io = &iob[fdesc])->i_flgs & F_ALLOC) == 0)
return(-1);
io->i_offset = addr;
- io->i_bn = fsbtodb(addr/BSIZE) + io->i_boff;
+ io->i_bn = addr / DEV_BSIZE;
io->i_cc = 0;
return(0);
}
getc(fdesc)
-int fdesc;
+ int fdesc;
{
register struct iob *io;
+ register struct fs *fs;
register char *p;
- register c;
- int off;
+ int c, lbn, off, size, diff;
if (fdesc >= 0 && fdesc <= 2)
return(getchar());
fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES || ((io = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
+ if (fdesc < 0 || fdesc >= NFILES ||
+ ((io = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
return(-1);
p = io->i_ma;
if (io->i_cc <= 0) {
- io->i_bn = fsbtodb(io->i_offset/(off_t)BSIZE);
- if (io->i_flgs&F_FILE)
- io->i_bn = fsbtodb(sbmap(io, dbtofsb(io->i_bn))) + io->i_boff;
+ if ((io->i_flgs & F_FILE) != 0) {
+ diff = io->i_ino.i_size - io->i_offset;
+ if (diff <= 0)
+ return (-1);
+ fs = &io->i_fs;
+ lbn = lblkno(fs, io->i_offset);
+ io->i_bn = fsbtodb(fs, sbmap(io, lbn)) + io->i_boff;
+ off = blkoff(fs, io->i_offset);
+ size = blksize(fs, &io->i_ino, lbn);
+ } else {
+ io->i_bn = io->i_offset / DEV_BSIZE;
+ off = 0;
+ size = DEV_BSIZE;
+ }
io->i_ma = io->i_buf;
- io->i_cc = BSIZE;
+ io->i_cc = size;
devread(io);
- if (io->i_flgs&F_FILE) {
- off = io->i_offset % (off_t)BSIZE;
- if (io->i_offset+(BSIZE-off) >= io->i_ino.i_size)
- io->i_cc = io->i_ino.i_size - io->i_offset + off;
+ if ((io->i_flgs & F_FILE) != 0) {
+ if (io->i_offset - off + size >= io->i_ino.i_size)
+ io->i_cc = diff + off;
io->i_cc -= off;
- if (io->i_cc <= 0)
- return(-1);
- } else
- off = 0;
+ }
p = &io->i_buf[off];
}
io->i_cc--;
io->i_ma = p;
return(c);
}
+
/* does this port?
getw(fdesc)
-int fdesc;
+ int fdesc;
{
register w,i;
register char *cp;
*/
read(fdesc, buf, count)
-int fdesc;
-char *buf;
-int count;
+ int fdesc;
+ char *buf;
+ int count;
{
register i;
register struct iob *file;
return(count - i);
}
fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES || ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
+ if (fdesc < 0 || fdesc >= NFILES ||
+ ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
return(-1);
if ((file->i_flgs&F_READ) == 0)
return(-1);
- if ((file->i_flgs&F_FILE) == 0) {
+ if ((file->i_flgs & F_FILE) == 0) {
file->i_cc = count;
file->i_ma = buf;
i = devread(file);
- file->i_bn += CLSIZE;
+ file->i_bn += (count / DEV_BSIZE);
return(i);
- }
- else {
+ } else {
if (file->i_offset+count > file->i_ino.i_size)
count = file->i_ino.i_size - file->i_offset;
if ((i = count) <= 0)
}
write(fdesc, buf, count)
-int fdesc;
-char *buf;
-int count;
+ int fdesc;
+ char *buf;
+ int count;
{
register i;
register struct iob *file;
return(count);
}
fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES || ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
+ if (fdesc < 0 || fdesc >= NFILES ||
+ ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
return(-1);
if ((file->i_flgs&F_WRITE) == 0)
return(-1);
file->i_cc = count;
file->i_ma = buf;
i = devwrite(file);
- file->i_bn += CLSIZE;
+ file->i_bn += (count / DEV_BSIZE);
return(i);
}
+int openfirst = 1;
+
open(str, how)
-char *str;
-int how;
+ char *str;
+ int how;
{
register char *cp;
int i;
register struct iob *file;
register struct devsw *dp;
int fdesc;
- static first = 1;
long atol();
- if (first) {
+ if (openfirst) {
for (i = 0; i < NFILES; i++)
iob[i].i_flgs = 0;
- first = 0;
+ openfirst = 0;
}
for (fdesc = 0; fdesc < NFILES; fdesc++)
}
*cp++ = '\0';
for (dp = devsw; dp->dv_name; dp++) {
- if (match(str, dp->dv_name))
+ if (!strcmp(str, dp->dv_name))
goto gotdev;
}
printf("Unknown device\n");
*(cp-1) = '(';
file->i_ino.i_dev = dp-devsw;
file->i_unit = *cp++ - '0';
- if (file->i_unit < 0 || file->i_unit > 7) {
+ if (*cp >= '0' && *cp <= '9')
+ file->i_unit = file->i_unit * 10 + *cp++ - '0';
+ if (file->i_unit < 0 || file->i_unit > 31) {
printf("Bad unit specifier\n");
file->i_flgs = 0;
return(-1);
file->i_offset = 0;
return(fdesc+3);
}
+ file->i_ma = (char *)(&file->i_fs);
+ file->i_cc = SBSIZE;
+ file->i_bn = SBLOCK;
+ file->i_offset = 0;
+ devread(file);
if ((i = find(cp, file)) == 0) {
file->i_flgs = 0;
return(-1);
}
close(fdesc)
-int fdesc;
+ int fdesc;
{
struct iob *file;
fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES || ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
+ if (fdesc < 0 || fdesc >= NFILES ||
+ ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0)
return(-1);
if ((file->i_flgs&F_FILE) == 0)
devclose(file);
}
_stop(s)
-char *s;
+ char *s;
{
+ int i;
+
+ for (i = 0; i < NFILES; i++)
+ if (iob[i].i_flgs != 0)
+ close(i);
printf("%s\n", s);
_rtt();
}
trap(ps)
-int ps;
+ int ps;
{
printf("Trap %o\n", ps);
for (;;)