Add original unix v6
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
#
|
||||
|
||||
char *dargv[]
|
||||
{
|
||||
"/dev/rrk2",
|
||||
"/dev/rrp0",
|
||||
0
|
||||
};
|
||||
#define NINODE 16*16
|
||||
#define NB 10
|
||||
#include "/usr/sys/ino.h"
|
||||
#include "/usr/sys/filsys.h"
|
||||
|
||||
struct inode inode[NINODE];
|
||||
struct filsys sblock;
|
||||
|
||||
int sflg;
|
||||
|
||||
int fi;
|
||||
int nifiles;
|
||||
int nfile;
|
||||
int nspcl;
|
||||
int nlarg;
|
||||
int nvlarg;
|
||||
int nindir;
|
||||
int nvindir;
|
||||
int ndir;
|
||||
int nused;
|
||||
int nfree;
|
||||
int ino;
|
||||
int ndup;
|
||||
int blist[10] { -1};
|
||||
int nerror;
|
||||
int bmap[4096];
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
register char **p;
|
||||
register int n, *lp;
|
||||
|
||||
if (argc == 1) {
|
||||
for (p = dargv; *p;)
|
||||
check(*p++);
|
||||
return(nerror);
|
||||
}
|
||||
while (--argc) {
|
||||
argv++;
|
||||
if (**argv=='-') switch ((*argv)[1]) {
|
||||
case 's':
|
||||
sflg++;
|
||||
continue;
|
||||
|
||||
case 'b':
|
||||
lp = blist;
|
||||
while (lp < &blist[NB-1] && (n = number(argv[1]))) {
|
||||
*lp++ = n;
|
||||
argv++;
|
||||
argc--;
|
||||
}
|
||||
*lp++ = -1;
|
||||
continue;
|
||||
|
||||
default:
|
||||
printf("Bad flag\n");
|
||||
}
|
||||
check(*argv);
|
||||
}
|
||||
return(nerror);
|
||||
}
|
||||
|
||||
check(file)
|
||||
char *file;
|
||||
{
|
||||
register *ip, i, j;
|
||||
|
||||
fi = open(file, sflg?2:0);
|
||||
if (fi < 0) {
|
||||
printf("cannot open %s\n", file);
|
||||
nerror =| 04;
|
||||
return;
|
||||
}
|
||||
printf("%s:\n", file);
|
||||
nfile = 0;
|
||||
nspcl = 0;
|
||||
nlarg = 0;
|
||||
nvlarg = 0;
|
||||
nindir = 0;
|
||||
nvindir = 0;
|
||||
ndir = 0;
|
||||
nused = 0;
|
||||
nfree = 0;
|
||||
ndup = 0;
|
||||
for (ip = bmap; ip < &bmap[4096];)
|
||||
*ip++ = 0;
|
||||
sync();
|
||||
bread(1, &sblock, 512);
|
||||
nifiles = sblock.s_isize*16;
|
||||
for(i=0; ino < nifiles; i =+ NINODE/16) {
|
||||
bread(i+2, inode, sizeof inode);
|
||||
for(j=0; j<NINODE && ino<nifiles; j++) {
|
||||
ino++;
|
||||
pass1(&inode[j]);
|
||||
}
|
||||
}
|
||||
ino = 0;
|
||||
sync();
|
||||
bread(1, &sblock, 512);
|
||||
if (sflg) {
|
||||
makefree();
|
||||
return;
|
||||
}
|
||||
while(i = alloc()) {
|
||||
if (chk(i, "free"))
|
||||
break;
|
||||
nfree++;
|
||||
}
|
||||
if (ndup) {
|
||||
printf("%l dups in free\n", ndup);
|
||||
nerror =| 02;
|
||||
}
|
||||
j = 0;
|
||||
for (ip = bmap; ip < &bmap[4096];) {
|
||||
i = *ip++;
|
||||
while (i) {
|
||||
if (i<0)
|
||||
j--;
|
||||
i =<< 1;
|
||||
}
|
||||
}
|
||||
j =+ sblock.s_fsize - sblock.s_isize - 2;
|
||||
if (j)
|
||||
printf("missing%5l\n", j);
|
||||
printf("spcl %6l\n", nspcl);
|
||||
printf("files %6l\n", nfile);
|
||||
printf("large %6l\n", nlarg);
|
||||
if (nvlarg)
|
||||
printf("huge %6l\n", nvlarg);
|
||||
printf("direc %6l\n", ndir);
|
||||
printf("indir %6l\n", nindir);
|
||||
if (nvindir)
|
||||
printf("indir2%6l\n", nvindir);
|
||||
printf("used %6l\n", nused);
|
||||
printf("free %6l\n", nfree);
|
||||
close(fi);
|
||||
}
|
||||
|
||||
pass1(aip)
|
||||
struct inode *aip;
|
||||
{
|
||||
int buf[256], vbuf[256];
|
||||
register i, j, *ip;
|
||||
|
||||
ip = aip;
|
||||
if ((ip->i_mode&IALLOC) == 0)
|
||||
return;
|
||||
if ((ip->i_mode&IFCHR&IFBLK) != 0) {
|
||||
nspcl++;
|
||||
return;
|
||||
}
|
||||
if ((ip->i_mode&IFMT) == IFDIR)
|
||||
ndir++;
|
||||
else
|
||||
nfile++;
|
||||
if ((ip->i_mode&ILARG) != 0) {
|
||||
nlarg++;
|
||||
for(i=0; i<7; i++)
|
||||
if (ip->i_addr[i] != 0) {
|
||||
nindir++;
|
||||
if (chk(ip->i_addr[i], "indirect"))
|
||||
continue;
|
||||
bread(ip->i_addr[i], buf, 512);
|
||||
for(j=0; j<256; j++)
|
||||
if (buf[j] != 0)
|
||||
chk(buf[j], "data (large)");
|
||||
}
|
||||
if (ip->i_addr[7]) {
|
||||
nvlarg++;
|
||||
if (chk(ip->i_addr[7], "indirect"))
|
||||
return;
|
||||
bread(ip->i_addr[7], buf, 512);
|
||||
for(i=0; i<256; i++)
|
||||
if (buf[i] != 0) {
|
||||
nvindir++;
|
||||
if (chk(buf[i], "2nd indirect"))
|
||||
continue;
|
||||
bread(buf[i], vbuf, 512);
|
||||
for(j=0; j<256; j++)
|
||||
if (vbuf[j])
|
||||
chk(vbuf[j], "data (very large)");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
for(i=0; i<8; i++) {
|
||||
if (ip->i_addr[i] != 0)
|
||||
chk(ip->i_addr[i], "data (small)");
|
||||
}
|
||||
}
|
||||
|
||||
chk(ab, s)
|
||||
char *ab;
|
||||
{
|
||||
register char *b;
|
||||
register n, m;
|
||||
|
||||
b = ab;
|
||||
if (ino)
|
||||
nused++;
|
||||
if (b<sblock.s_isize+2 || b>=sblock.s_fsize) {
|
||||
printf("%l bad; inode=%l, class=%s\n", b, ino, s);
|
||||
return(1);
|
||||
}
|
||||
m = 1 << (b&017);
|
||||
n = (b>>4) & 07777;
|
||||
if (bmap[n]&m) {
|
||||
printf("%l dup; inode=%l, class=%s\n", b, ino, s);
|
||||
ndup++;
|
||||
}
|
||||
bmap[n] =| m;
|
||||
for (n=0; blist[n] != -1; n++)
|
||||
if (b == blist[n])
|
||||
printf("%l arg; inode=%l, class=%s\n", b, ino, s);
|
||||
return(0);
|
||||
}
|
||||
|
||||
alloc()
|
||||
{
|
||||
register b, i;
|
||||
int buf[256];
|
||||
|
||||
i = --sblock.s_nfree;
|
||||
if (i<0 || i>=100) {
|
||||
printf("bad freeblock\n");
|
||||
return(0);
|
||||
}
|
||||
b = sblock.s_free[i];
|
||||
if (b == 0)
|
||||
return(0);
|
||||
if (sblock.s_nfree <= 0) {
|
||||
bread(b, buf, 512);
|
||||
sblock.s_nfree = buf[0];
|
||||
for(i=0; i<100; i++)
|
||||
sblock.s_free[i] = buf[i+1];
|
||||
}
|
||||
return(b);
|
||||
}
|
||||
|
||||
bread(bno, buf, cnt)
|
||||
int *buf;
|
||||
{
|
||||
register *ip;
|
||||
|
||||
seek(fi, bno, 3);
|
||||
if (read(fi, buf, cnt) != cnt) {
|
||||
printf("read error %d\n", bno);
|
||||
if (sflg) {
|
||||
printf("No update\n");
|
||||
sflg = 0;
|
||||
}
|
||||
for (ip = buf; ip < &buf[256];)
|
||||
*ip++ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
free(in)
|
||||
{
|
||||
register i;
|
||||
int buf[256];
|
||||
|
||||
if (sblock.s_nfree >= 100) {
|
||||
buf[0] = sblock.s_nfree;
|
||||
for(i=0; i<100; i++)
|
||||
buf[i+1] = sblock.s_free[i];
|
||||
sblock.s_nfree = 0;
|
||||
bwrite(in, buf);
|
||||
}
|
||||
sblock.s_free[sblock.s_nfree++] = in;
|
||||
}
|
||||
|
||||
bwrite(bno, buf)
|
||||
{
|
||||
|
||||
seek(fi, bno, 3);
|
||||
if (write(fi, buf, 512) != 512)
|
||||
printf("write error %d\n", bno);
|
||||
}
|
||||
|
||||
number(as)
|
||||
char *as;
|
||||
{
|
||||
register n, c;
|
||||
register char *s;
|
||||
|
||||
s = as;
|
||||
n = 0;
|
||||
while ((c = *s++) >= '0' && c <= '9') {
|
||||
n = n*10+c-'0';
|
||||
}
|
||||
return(n);
|
||||
}
|
||||
|
||||
makefree()
|
||||
{
|
||||
register i;
|
||||
|
||||
sblock.s_nfree = 0;
|
||||
sblock.s_ninode = 0;
|
||||
sblock.s_flock = 0;
|
||||
sblock.s_ilock = 0;
|
||||
sblock.s_fmod = 0;
|
||||
free(0);
|
||||
for(i=sblock.s_fsize-1; i>=sblock.s_isize+2; i--) {
|
||||
if ((bmap[(i>>4)&07777] & (1<<(i&017)))==0)
|
||||
free(i);
|
||||
}
|
||||
bwrite(1, &sblock);
|
||||
close(fi);
|
||||
sync();
|
||||
return;
|
||||
}
|
||||
Reference in New Issue
Block a user