Add original unix v6
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
#
|
||||
|
||||
char *dargv[]
|
||||
{
|
||||
"/dev/rrk2",
|
||||
"/dev/rrp0",
|
||||
0
|
||||
};
|
||||
|
||||
#define NINODE 16*16
|
||||
#include "/usr/sys/ino.h"
|
||||
#include "/usr/sys/filsys.h"
|
||||
|
||||
struct filsys sblock;
|
||||
struct inode inode[NINODE];
|
||||
|
||||
int sflg;
|
||||
int aflg;
|
||||
#define NI 20
|
||||
#define NDIRS 787
|
||||
|
||||
int ilist[NI] { -1};
|
||||
int fi;
|
||||
struct htab {
|
||||
int hino;
|
||||
int hpino;
|
||||
char hname[14];
|
||||
} htab[NDIRS];
|
||||
int nhent 10;
|
||||
int (*pass[])() { pass1, pass2, pass3 };
|
||||
char *lasts;
|
||||
int ino;
|
||||
int nerror;
|
||||
int nffil;
|
||||
int fout;
|
||||
int nfiles;
|
||||
struct dir {
|
||||
int ino;
|
||||
char name[14];
|
||||
};
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
register char **p;
|
||||
register int n, *lp;
|
||||
|
||||
nffil = dup(1);
|
||||
if (argc == 1) {
|
||||
for (p = dargv; *p;)
|
||||
check(*p++);
|
||||
return(nerror);
|
||||
}
|
||||
while (--argc) {
|
||||
argv++;
|
||||
if (**argv=='-') switch ((*argv)[1]) {
|
||||
case 's':
|
||||
sflg++;
|
||||
continue;
|
||||
|
||||
case 'a':
|
||||
aflg++;
|
||||
continue;
|
||||
|
||||
case 'i':
|
||||
lp = ilist;
|
||||
while (lp < &ilist[NI-1] && (n = number(argv[1]))) {
|
||||
*lp++ = n;
|
||||
argv++;
|
||||
argc--;
|
||||
}
|
||||
*lp++ = -1;
|
||||
continue;
|
||||
|
||||
default:
|
||||
printf2("Bad flag\n");
|
||||
}
|
||||
check(*argv);
|
||||
}
|
||||
return(nerror);
|
||||
}
|
||||
|
||||
check(file)
|
||||
char *file;
|
||||
{
|
||||
register i, j, pno;
|
||||
|
||||
fi = open(file, 0);
|
||||
if (fi < 0) {
|
||||
printf2("cannot open %s\n", file);
|
||||
return;
|
||||
}
|
||||
printf2("%s:\n", file);
|
||||
sync();
|
||||
bread(1, &sblock, 512);
|
||||
nfiles = sblock.s_isize*16;
|
||||
for (i=0; i<NDIRS; i++)
|
||||
htab[i].hino = 0;
|
||||
fout = nffil;
|
||||
flush();
|
||||
for (pno=0; pno<3; pno++) {
|
||||
ino = 0;
|
||||
for (i=0; ino<nfiles; i =+ NINODE/16) {
|
||||
bread(i+2, inode, sizeof inode);
|
||||
for (j=0; j<NINODE && ino<nfiles; j++) {
|
||||
ino++;
|
||||
(*pass[pno])(&inode[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
flush();
|
||||
fout = 1;
|
||||
}
|
||||
|
||||
pass1(ip)
|
||||
{
|
||||
if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)
|
||||
return;
|
||||
lookup(ino, 1);
|
||||
}
|
||||
|
||||
pass2(ip)
|
||||
struct inode *ip;
|
||||
{
|
||||
register doff;
|
||||
register struct htab *hp;
|
||||
register struct dir *dp;
|
||||
int i;
|
||||
|
||||
if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)
|
||||
return;
|
||||
doff = 0;
|
||||
while (dp = dread(ip, doff)) {
|
||||
doff =+ 16;
|
||||
if (dp->ino==0)
|
||||
continue;
|
||||
if ((hp = lookup(dp->ino, 0)) == 0)
|
||||
continue;
|
||||
if (dotname(dp))
|
||||
continue;
|
||||
hp->hpino = ino;
|
||||
for (i=0; i<14; i++)
|
||||
hp->hname[i] = dp->name[i];
|
||||
}
|
||||
}
|
||||
|
||||
pass3(ip)
|
||||
struct inode *ip;
|
||||
{
|
||||
register doff;
|
||||
register struct dir *dp;
|
||||
register int *ilp;
|
||||
|
||||
if ((ip->i_mode&IALLOC)==0 || (ip->i_mode&IFMT)!=IFDIR)
|
||||
return;
|
||||
doff = 0;
|
||||
while (dp = dread(ip, doff)) {
|
||||
doff =+ 16;
|
||||
if (dp->ino==0)
|
||||
continue;
|
||||
if (aflg==0 && dotname(dp))
|
||||
continue;
|
||||
for (ilp=ilist; *ilp >= 0; ilp++)
|
||||
if (*ilp == dp->ino)
|
||||
break;
|
||||
if (ilp > ilist && *ilp!=dp->ino)
|
||||
continue;
|
||||
printf("%d ", dp->ino);
|
||||
pname(ino, 0);
|
||||
printf("/%.14s\n", dp->name);
|
||||
}
|
||||
}
|
||||
|
||||
dotname(adp)
|
||||
{
|
||||
register struct dir *dp;
|
||||
|
||||
dp = adp;
|
||||
if (dp->name[0]=='.')
|
||||
if (dp->name[1]==0 || dp->name[1]=='.' && dp->name[2]==0)
|
||||
return(1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
pname(i, lev)
|
||||
{
|
||||
register struct htab *hp;
|
||||
|
||||
if (i==1)
|
||||
return;
|
||||
if ((hp = lookup(i, 0)) == 0) {
|
||||
printf("???");
|
||||
return;
|
||||
}
|
||||
if (lev > 10) {
|
||||
printf("...");
|
||||
return;
|
||||
}
|
||||
pname(hp->hpino, ++lev);
|
||||
printf("/%.14s", hp->hname);
|
||||
}
|
||||
|
||||
lookup(i, ef)
|
||||
{
|
||||
register struct htab *hp;
|
||||
|
||||
for (hp = &htab[i%NDIRS]; hp->hino;) {
|
||||
if (hp->hino==i)
|
||||
return(hp);
|
||||
if (++hp >= &htab[NDIRS])
|
||||
hp = htab;
|
||||
}
|
||||
if (ef==0)
|
||||
return(0);
|
||||
if (++nhent >= NDIRS) {
|
||||
printf2("Out of core-- increase NDIRS\n");
|
||||
flush();
|
||||
exit(1);
|
||||
}
|
||||
hp->hino = i;
|
||||
return(hp);
|
||||
}
|
||||
|
||||
dread(aip, aoff)
|
||||
{
|
||||
register b, off;
|
||||
register struct inode *ip;
|
||||
static ibuf[256];
|
||||
static char buf[512];
|
||||
|
||||
off = aoff;
|
||||
ip = aip;
|
||||
if ((off&0777)==0) {
|
||||
if (off==0177000) {
|
||||
printf2("Monstrous directory %l\n", ino);
|
||||
return(0);
|
||||
}
|
||||
if ((ip->i_mode&ILARG)==0) {
|
||||
if (off>=010000 || (b = ip->i_addr[off>>9])==0)
|
||||
return(0);
|
||||
bread(b, buf, 512);
|
||||
} else {
|
||||
if (off==0) {
|
||||
if (ip->i_addr[0]==0)
|
||||
return(0);
|
||||
bread(ip->i_addr[0], ibuf, 512);
|
||||
}
|
||||
if ((b = ibuf[(off>>9)&0177])==0)
|
||||
return(0);
|
||||
bread(b, buf, 512);
|
||||
}
|
||||
}
|
||||
return(&buf[off&0777]);
|
||||
}
|
||||
|
||||
bread(bno, buf, cnt)
|
||||
{
|
||||
|
||||
seek(fi, bno, 3);
|
||||
if (read(fi, buf, cnt) != cnt) {
|
||||
printf2("read error %d\n", bno);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
bwrite(bno, buf)
|
||||
{
|
||||
|
||||
seek(fi, bno, 3);
|
||||
if (write(fi, buf, 512) != 512) {
|
||||
printf2("write error %d\n", bno);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
printf2(s, a1, a2)
|
||||
{
|
||||
extern fout;
|
||||
|
||||
flush();
|
||||
fout = 2;
|
||||
printf(s, a1, a2);
|
||||
fout = nffil;
|
||||
flush();
|
||||
}
|
||||
Reference in New Issue
Block a user