Add original unix v6
This commit is contained in:
@@ -0,0 +1,552 @@
|
||||
#
|
||||
|
||||
/*
|
||||
* restore from incremental dumps
|
||||
*/
|
||||
|
||||
char *dargv[]
|
||||
{
|
||||
0,
|
||||
"t",
|
||||
0
|
||||
};
|
||||
char *ifile;
|
||||
char *ofile;
|
||||
#include "/usr/sys/ino.h"
|
||||
#include "/usr/sys/filsys.h"
|
||||
|
||||
struct filsys sblock;
|
||||
int isize;
|
||||
int *talist;
|
||||
int fi;
|
||||
int buf[256];
|
||||
int dbuf[256];
|
||||
int cbuf[256];
|
||||
char *date[2];
|
||||
char *ddate[2];
|
||||
int fo;
|
||||
int pher;
|
||||
char *tsize 15000;
|
||||
int iflg;
|
||||
int wflg;
|
||||
int cflg;
|
||||
char file[10];
|
||||
int ilist[100];
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
char *key;
|
||||
register *tap, *p;
|
||||
register struct inode *ip;
|
||||
int i, com, sz, *q, l;
|
||||
|
||||
ifile = "/dev/mt0";
|
||||
if(argc == 1) {
|
||||
argv = dargv;
|
||||
for(argc = 1; dargv[argc]; argc++);
|
||||
}
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
key = *argv;
|
||||
while(*key)
|
||||
switch(*key++) {
|
||||
default:
|
||||
printf("bad character in key\n");
|
||||
exit();
|
||||
|
||||
case 't':
|
||||
case 'r':
|
||||
case 'x':
|
||||
com = key[-1];
|
||||
continue;
|
||||
|
||||
case 'i':
|
||||
iflg++;
|
||||
continue;
|
||||
|
||||
case '-':
|
||||
continue;
|
||||
|
||||
case 'c':
|
||||
cflg++;
|
||||
continue;
|
||||
|
||||
case 'f':
|
||||
argv++;
|
||||
argc--;
|
||||
ifile = *argv;
|
||||
continue;
|
||||
|
||||
case 'w':
|
||||
wflg++;
|
||||
continue;
|
||||
|
||||
}
|
||||
otape();
|
||||
sread(buf, 0);
|
||||
tap = buf;
|
||||
isize = *tap++;
|
||||
*tap++; /* fsize */
|
||||
date[0] = *tap++;
|
||||
date[1] = *tap++;
|
||||
ddate[0] = *tap++;
|
||||
ddate[1] = *tap++;
|
||||
tsize = *tap++;
|
||||
i = size(0, isize*32);
|
||||
talist = sbrk(i*512);
|
||||
tap = talist;
|
||||
while(i--) {
|
||||
tread(tap, 0);
|
||||
tap =+ 256;
|
||||
}
|
||||
switch(com) {
|
||||
|
||||
case 't':
|
||||
l = 0;
|
||||
com = 0;
|
||||
pdate(ddate);
|
||||
pdate(date);
|
||||
tap = talist;
|
||||
for(i=0; i<isize*16; i++) {
|
||||
sz = *tap++;
|
||||
if(sz == 0 || sz == -1) {
|
||||
if(com == 0)
|
||||
continue;
|
||||
if(i == com) {
|
||||
printf("%l", i);
|
||||
l =+ 5;
|
||||
} else {
|
||||
printf("%l-%l", com, i);
|
||||
l =+ 10;
|
||||
}
|
||||
if(l > 60) {
|
||||
printf("\n");
|
||||
l = 0;
|
||||
} else
|
||||
printf(",");
|
||||
com = 0;
|
||||
} else
|
||||
if(com == 0)
|
||||
com = i+1;
|
||||
}
|
||||
if(com)
|
||||
printf("%l-\n", com);
|
||||
printf("\n");
|
||||
exit();
|
||||
|
||||
case 'r':
|
||||
if(argc <= 1) {
|
||||
printf("no filesystem name\n");
|
||||
exit();
|
||||
}
|
||||
ofile = argv[1];
|
||||
fo = open(ofile, 2);
|
||||
if(fo < 0) {
|
||||
printf("can not open %s\n", ofile);
|
||||
exit();
|
||||
}
|
||||
printf("last chance before scribbling on %s\n", ofile);
|
||||
getchar();
|
||||
dread(1, &sblock);
|
||||
tap = talist;
|
||||
for(i=0; i<sblock.s_isize; i++) {
|
||||
if(i >= isize)
|
||||
break;
|
||||
dread(i+2, buf);
|
||||
for(ip = &buf[0]; ip < &buf[256]; ip++) {
|
||||
sz = *tap++;
|
||||
if(sz == 0)
|
||||
continue;
|
||||
dealoc(ip);
|
||||
if(sz == -1) {
|
||||
for(p = ip; p < &ip->i_mtime[2]; )
|
||||
*p++ = 0;
|
||||
continue;
|
||||
}
|
||||
sread(dbuf, 0);
|
||||
q = dbuf;
|
||||
for(p = ip; p < &ip->i_mtime[2]; )
|
||||
*p++ = *q++;
|
||||
restor(ip, sz-1);
|
||||
}
|
||||
dwrite(i+2, buf);
|
||||
}
|
||||
dwrite(1, &sblock);
|
||||
com = 0;
|
||||
for(; i < isize; i++)
|
||||
for(l = 0; l < 16; l++) {
|
||||
sz = *tap++;
|
||||
if(sz != 0 && sz != -1)
|
||||
com++;
|
||||
}
|
||||
if(com)
|
||||
printf("%l files not restored - small ilist\n", com);
|
||||
exit();
|
||||
|
||||
case 'x':
|
||||
i = 0;
|
||||
tap = ilist;
|
||||
while(argc > 1) {
|
||||
i++;
|
||||
sz = number(argv[1]);
|
||||
argv++;
|
||||
argc--;
|
||||
if(sz <= 0 || sz >=isize*16) {
|
||||
printf("%l not in range\n", sz);
|
||||
continue;
|
||||
}
|
||||
if(talist[sz-1] == 0) {
|
||||
printf("%l not dumped\n", sz);
|
||||
continue;
|
||||
}
|
||||
if(talist[sz-1] == -1) {
|
||||
printf("%l does not exist\n", sz);
|
||||
continue;
|
||||
}
|
||||
*tap++ = sz;
|
||||
}
|
||||
if(i != 0 && ilist[0] == 0)
|
||||
exit();
|
||||
tap = talist;
|
||||
for(i=1; i<=isize*16; i++) {
|
||||
if(ilist[0] != 0) {
|
||||
for(sz=0; ilist[sz]; sz++)
|
||||
if(ilist[sz] == i)
|
||||
goto yes;
|
||||
sz = *tap++;
|
||||
no:
|
||||
if(sz == -1)
|
||||
sz = 0;
|
||||
while(sz--)
|
||||
tread(dbuf, 1);
|
||||
continue;
|
||||
}
|
||||
yes:
|
||||
sz = *tap++;
|
||||
if(sz == 0 || sz == -1)
|
||||
continue;
|
||||
fo = dwait(i);
|
||||
if(fo < 0)
|
||||
goto no;
|
||||
sz--;
|
||||
sread(buf, 0);
|
||||
ip = buf;
|
||||
while(sz--) {
|
||||
tread(dbuf, 0);
|
||||
com = 512;
|
||||
if(ip->i_size0 == 0 && ip->i_size1 < 512)
|
||||
com = ip->i_size1;
|
||||
write(fo, dbuf, com);
|
||||
if(com > ip->i_size1)
|
||||
ip->i_size0--;
|
||||
ip->i_size1 =- com;
|
||||
}
|
||||
close(fo);
|
||||
chmod(file, ip->i_mode);
|
||||
chown(file, ip->i_uid);
|
||||
}
|
||||
exit();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
dealoc(p)
|
||||
struct inode *p;
|
||||
{
|
||||
register struct inode *ip;
|
||||
register i, j;
|
||||
int k;
|
||||
int xbuf[256], ybuf[256];
|
||||
|
||||
ip = p;
|
||||
if(ip->i_mode & (IFCHR&IFBLK))
|
||||
return;
|
||||
for(i=7; i>=0; i--)
|
||||
if(ip->i_addr[i]) {
|
||||
if(ip->i_mode&ILARG) {
|
||||
dread(ip->i_addr[i], xbuf);
|
||||
for(j=255; j>=0; j--)
|
||||
if(xbuf[j]) {
|
||||
if(i == 7) {
|
||||
dread(xbuf[j], ybuf);
|
||||
for(k=255; k>=0; k--)
|
||||
if(ybuf[k])
|
||||
free(ybuf[k]);
|
||||
}
|
||||
free(xbuf[j]);
|
||||
}
|
||||
}
|
||||
free(ip->i_addr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
restor(p, sz)
|
||||
struct inode *p;
|
||||
{
|
||||
register struct inode *ip;
|
||||
register i, j;
|
||||
int xbuf[256];
|
||||
|
||||
ip = p;
|
||||
if(ip->i_mode & (IFCHR&IFBLK))
|
||||
return;
|
||||
for(i=0; i<8; i++)
|
||||
ip->i_addr[i] = 0;
|
||||
if(sz <= 8) {
|
||||
for(i=0; i<sz; i++)
|
||||
ip->i_addr[i] = rcop();
|
||||
ip->i_mode =& ~ILARG;
|
||||
return;
|
||||
}
|
||||
for(i=0; i<256; i++)
|
||||
xbuf[i] = 0;
|
||||
for(j=0; sz >= 256; j++) {
|
||||
if(j <= 7)
|
||||
ip->i_addr[j] = alloc();
|
||||
if(j >= 7)
|
||||
xbuf[j-7] = alloc();
|
||||
for(i=0; i<256; i++)
|
||||
dbuf[i] = rcop();
|
||||
if(j < 7)
|
||||
dwrite(ip->i_addr[j], dbuf); else
|
||||
dwrite(xbuf[j-7], dbuf);
|
||||
sz =- 256;
|
||||
}
|
||||
if(sz) {
|
||||
if(j <= 7)
|
||||
ip->i_addr[j] = alloc();
|
||||
if(j >= 7)
|
||||
xbuf[j-7] = alloc();
|
||||
for(i=0; i<sz; i++)
|
||||
dbuf[i] = rcop();
|
||||
for(; i<256; i++)
|
||||
dbuf[i] = 0;
|
||||
if(j < 7)
|
||||
dwrite(ip->i_addr[j], dbuf); else
|
||||
dwrite(xbuf[j-7], dbuf);
|
||||
}
|
||||
if(j >= 7)
|
||||
dwrite(ip->i_addr[7], xbuf);
|
||||
ip->i_mode =| ILARG;
|
||||
}
|
||||
|
||||
rcop()
|
||||
{
|
||||
register b;
|
||||
|
||||
b = alloc();
|
||||
tread(cbuf, 0);
|
||||
dwrite(b, cbuf);
|
||||
return(b);
|
||||
}
|
||||
|
||||
pdate(d)
|
||||
int *d;
|
||||
{
|
||||
|
||||
if(d[0] == 0 && d[1] == 0)
|
||||
printf("the epoch\n"); else
|
||||
printf(ctime(d));
|
||||
}
|
||||
|
||||
dread(bno, b)
|
||||
{
|
||||
|
||||
seek(fo, bno, 3);
|
||||
if(read(fo, b, 512) != 512) {
|
||||
printf("disk read error %l\n", bno);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
dwrite(bno, b)
|
||||
{
|
||||
|
||||
seek(fo, bno, 3);
|
||||
if(write(fo, b, 512) != 512) {
|
||||
printf("disk write error %l\n", bno);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
sread(b, flag)
|
||||
int *b;
|
||||
{
|
||||
register i, s, *p;
|
||||
|
||||
tread(b, flag);
|
||||
if(flag)
|
||||
return;
|
||||
i = 256;
|
||||
s = 0;
|
||||
p = b;
|
||||
while(i--)
|
||||
s =+ *p++;
|
||||
if(s != 031415) {
|
||||
printf("checksum error\n");
|
||||
if(!iflg)
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
tread(b, flag)
|
||||
int *b;
|
||||
{
|
||||
register c;
|
||||
static char *pta, *ata, ctflg;
|
||||
|
||||
if(pta++ >= tsize) {
|
||||
pta = 1;
|
||||
ata = 0;
|
||||
close(fi);
|
||||
otape();
|
||||
ctflg++;
|
||||
}
|
||||
if(flag)
|
||||
return;
|
||||
if(ctflg) {
|
||||
printf("change tapes\n");
|
||||
if(ctflg > 1)
|
||||
printf("skip %d tapes\n", ctflg-1);
|
||||
while((c = getchar()) != '\n')
|
||||
if(c == 0)
|
||||
exit();
|
||||
ctflg = 0;
|
||||
}
|
||||
ata++;
|
||||
if(iflg)
|
||||
for(; pta != ata; ata++)
|
||||
read(fi, b, 512);
|
||||
if(pta != ata) {
|
||||
seek(fi, pta-ata, 4);
|
||||
ata = pta;
|
||||
}
|
||||
if(read(fi, b, 512) != 512) {
|
||||
printf("tape read error %l\n", ata-1);
|
||||
if(!iflg)
|
||||
exit();
|
||||
for(c=0; c<256; c++)
|
||||
b[c] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
number(s)
|
||||
char *s;
|
||||
{
|
||||
register n, c;
|
||||
|
||||
n = 0;
|
||||
while(c = *s++) {
|
||||
if(c<'0' || c>'9')
|
||||
continue;
|
||||
n = n*10+c-'0';
|
||||
}
|
||||
return(n);
|
||||
}
|
||||
|
||||
size(s0, s1)
|
||||
{
|
||||
register s;
|
||||
extern ldivr;
|
||||
|
||||
s = ldiv(s0&0377, s1, 512);
|
||||
if(ldivr)
|
||||
s++;
|
||||
return(s);
|
||||
}
|
||||
|
||||
otape()
|
||||
{
|
||||
register char *p;
|
||||
|
||||
fi = open(ifile, 0);
|
||||
if(fi < 0) {
|
||||
printf("can not open %s\n", ifile);
|
||||
exit();
|
||||
}
|
||||
if(!cflg)
|
||||
return;
|
||||
p = ifile;
|
||||
while(*p++)
|
||||
;
|
||||
p[-2]++;
|
||||
}
|
||||
|
||||
dwait(ino)
|
||||
{
|
||||
register i;
|
||||
|
||||
dconv(ino, file);
|
||||
loop:
|
||||
if(wflg) {
|
||||
printf("%s ", file);
|
||||
i = getchar();
|
||||
if(i == 'x')
|
||||
exit();
|
||||
if(i == '\n')
|
||||
return(-1);
|
||||
if(i != 'y')
|
||||
goto flush;
|
||||
i = getchar();
|
||||
if(i != '\n') {
|
||||
flush:
|
||||
while((i=getchar()) != '\n')
|
||||
if(i == '\0')
|
||||
exit();
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
i = creat(file, 0666);
|
||||
return(i);
|
||||
}
|
||||
|
||||
dconv(n, p)
|
||||
char *p;
|
||||
{
|
||||
register i;
|
||||
|
||||
if(i = ldiv(0, n, 10))
|
||||
p = dconv(i, p);
|
||||
*p++ = lrem(0, n, 10) + '0';
|
||||
*p = '\0';
|
||||
return(p);
|
||||
}
|
||||
|
||||
alloc()
|
||||
{
|
||||
register b, i;
|
||||
|
||||
i = --sblock.s_nfree;
|
||||
if(i<0 || i>=100) {
|
||||
printf("bad freeblock\n");
|
||||
exit();
|
||||
}
|
||||
b = sblock.s_free[i];
|
||||
if(b == 0) {
|
||||
printf("out of freelist\n");
|
||||
exit();
|
||||
}
|
||||
if(sblock.s_nfree <= 0) {
|
||||
dread(b, cbuf);
|
||||
sblock.s_nfree = cbuf[0];
|
||||
for(i=0; i<100; i++)
|
||||
sblock.s_free[i] = cbuf[i+1];
|
||||
}
|
||||
return(b);
|
||||
}
|
||||
|
||||
free(in)
|
||||
{
|
||||
register i;
|
||||
|
||||
if(sblock.s_nfree >= 100) {
|
||||
cbuf[0] = sblock.s_nfree;
|
||||
for(i=0; i<100; i++)
|
||||
cbuf[i+1] = sblock.s_free[i];
|
||||
sblock.s_nfree = 0;
|
||||
dwrite(in, cbuf);
|
||||
}
|
||||
sblock.s_free[sblock.s_nfree++] = in;
|
||||
}
|
||||
Reference in New Issue
Block a user