|
|
1.1 root 1: #include <libc.h>
2: #include "worm.h"
3: #include <sys/types.h>
4: #include <sys/udaioc.h>
5:
6: Inode *(*inodefn)();
7: void (*traversefn)();
8: extern Inode *vinodefn(), *binodefn();
9: extern void vtraverse(), btraverse();
10: extern char *lkopi(), *cbtinit();
11: long numinodes;
12: long numnamechars;
13:
14: char *
15: openinode(s, flags)
16: register Superblock *s;
17: {
18: short fd = s->fd;
19: char *b, *z;
20: long blk;
21: unsigned short ibuf[3];
22: static char buf[64];
23: extern char *getenv();
24: extern long atol();
25: int goo; extern errno; int ntry;
26:
27: if(z = getenv("WORMZERO"))
28: blk = atol(z);
29: else
30: blk = 0;
31: ntry = 0;
32: loop:
33: bigseek(s->fd, blk, 1024, 0);
34: if(((goo = read(s->fd, (char *)ibuf, sizeof ibuf)) != sizeof ibuf) ||
35: ((((long)ibuf[1])<<16|ibuf[0]) != SMAGIC)){
36: if((goo < 0) && (errno == ENXIO))
37: blk++; /* blank check (unwritten), try next blk */
38: else if((goo == sizeof ibuf) && (ibuf[0] == 0) && (ibuf[1] == 0))
39: blk++; /* zeroes(??), try next blk */
40: else {
41: fprint(2, "DEBUGGING[%d]: read=%d magic=0x%lx errno=%d\n",
42: ntry, goo, (((long)ibuf[1])<<16|ibuf[0]), errno);
43: if(ntry++ < 3)
44: goto loop;
45: }
46: bigseek(s->fd, blk, 1024, 0);
47: if(read(s->fd, (char *)ibuf, sizeof ibuf) < sizeof ibuf)
48: return("no block size");
49: }
50: if(flags&SPIN_DOWN)
51: ioctl(s->fd, UIOSPDW);
52: s->blocksize = ibuf[2]; /* magic is 0-1 */
53: if((b = malloc(s->blocksize)) == 0){
54: sprint(buf, "couldn't malloc buffer (%d bytes)", s->blocksize);
55: return(buf);
56: }
57: bigseek(s->fd, blk, 1024, 0);
58: if(read(s->fd, b, s->blocksize) != s->blocksize)
59: return("superblock read error");
60: *s = *((Superblock *)b);
61: free(b);
62: s->fd = fd;
63: if(s->myblock == 0)
64: s->myblock = blk;
65: switch(s->version)
66: {
67: case VLINK:
68: if(flags&DO_INODE){
69: Superblock tmpsb;
70:
71: tmpsb = *s;
72: if(b = lkopi(s, blk, 0))
73: return(b);
74: if(fastlink(s, &b, &inodefn, &traversefn))
75: return(b);
76: *s = tmpsb;
77: }
78: inodefn = vinodefn;
79: traversefn = vtraverse;
80: return(lkopi(s, blk, flags&DO_INODE));
81: case VBTREE:
82: inodefn = binodefn;
83: traversefn = btraverse;
84: return(cbtinit(s, blk, flags&DO_INODE));
85: default:
86: sprint(buf, "unknown version %d@%ld", s->version, blk);
87: return(buf);
88: }
89: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.