|
|
1.1 ! root 1: struct INODE { ! 2: int MODE; ! 3: char NLINKS; ! 4: char UID; ! 5: char GID; ! 6: char FILL; ! 7: long SIZE; ! 8: struct { ! 9: unsigned STBLK; ! 10: unsigned NCBLKS; ! 11: } EXTENTS[27]; ! 12: int ACTIME[2]; ! 13: int MODTIME[2]; ! 14: int CHKSUM; ! 15: }; ! 16: ! 17: struct DIRECT { ! 18: int INUM; ! 19: char NAME[14]; ! 20: }; ! 21: ! 22: ! 23: int dev; ! 24: long offset = 1802240l; ! 25: ! 26: ! 27: char fname[1000]; ! 28: main(argc,argv) ! 29: int argc; ! 30: char **argv; ! 31: { ! 32: int inum; ! 33: char *s; ! 34: ! 35: if(argc != 4) { ! 36: printf("fcopy: device inode directory\n"); ! 37: return(1); ! 38: } ! 39: if((dev = open(argv[1],0)) < 0) { ! 40: printf("can't open device %s\n",argv[1]); ! 41: return(1); ! 42: } ! 43: for(s = fname ; *argv[3] ; *s++ = *argv[3]++); ! 44: *s = 0; ! 45: inum = atoi(argv[2]); ! 46: copy(inum); ! 47: } ! 48: ! 49: ! 50: copy(inum) ! 51: { ! 52: struct INODE ino; ! 53: struct DIRECT entry; ! 54: static char block[512]; ! 55: ! 56: if(lseek(dev, ((long)(inum+7)*128)+offset, 0) < 0 || read(dev, &ino, 128) != 128) { ! 57: message("Cant read inode",inum,fname); ! 58: return; ! 59: } ! 60: if(!(ino.MODE & 0100000)) { ! 61: message("unallocated",inum,fname); ! 62: return; ! 63: } ! 64: switch(ino.MODE & 070000) { ! 65: case 020000: ! 66: message("character special file",inum,fname); ! 67: return; ! 68: case 060000: ! 69: message("block special file",inum,fname); ! 70: return; ! 71: case 070000: ! 72: message("record special file",inum,fname); ! 73: return; ! 74: case 000000: ! 75: case 010000: ! 76: { ! 77: /* copy the regular file to fname */ ! 78: int e,i; ! 79: int ofile; ! 80: /* ! 81: message("copying file",inum,fname); ! 82: */ ! 83: if((ofile = creat(fname, 0777)) < 0) { ! 84: message("cant creat file",inum,fname); ! 85: return; ! 86: } ! 87: if(ino.NLINKS != 1) { ! 88: message("dropping %d links",inum,fname,ino.NLINKS-1); ! 89: } ! 90: for(e = 0 ; ino.SIZE > 0 && e < 27 ; ) { ! 91: if(ino.EXTENTS[e].NCBLKS-- > 0) { ! 92: if(lseek(dev, (long)(ino.EXTENTS[e].STBLK++)*512 + offset, 0) < 0) { ! 93: message("Cant seek",inum,fname); ! 94: return; ! 95: } ! 96: if(read(dev, block, 512) != 512) { ! 97: message("cant read",inum,fname); ! 98: return; ! 99: } ! 100: i = (ino.SIZE >= 512) ? 512 : ino.SIZE; ! 101: if(write(ofile, block, i) != i) { ! 102: message("bad size",inum,fname); ! 103: close(ofile); ! 104: return; ! 105: } ! 106: ino.SIZE -= i; ! 107: } ! 108: else ! 109: e++; ! 110: } ! 111: close(ofile); ! 112: break; ! 113: } ! 114: case 040000: ! 115: case 050000: ! 116: { ! 117: /* copy each directory entry */ ! 118: int e,i,j; ! 119: long b; ! 120: int flag; ! 121: int status; ! 122: /* ! 123: message("directory",inum,fname); ! 124: */ ! 125: if(fork() == 0) { ! 126: execl("/bin/mkdir","mkdir",fname,0); ! 127: exit(1); ! 128: } ! 129: wait(&status); ! 130: if(status) { ! 131: message("can't creat directory",inum,fname); ! 132: } ! 133: flag = 1; ! 134: for(e = 0 ; ino.SIZE > 0 && e < 27 ; ) { ! 135: if(ino.EXTENTS[e].NCBLKS-- > 0) { ! 136: i = (ino.SIZE >= 512) ? 512 : ino.SIZE; ! 137: ino.SIZE -= i; ! 138: b = (long)(ino.EXTENTS[e].STBLK++); ! 139: for(j = (flag?32:0) ; j < i ; j += 16) { ! 140: if(lseek(dev, (b*512)+j+offset, 0) < 0) { ! 141: message("cant seek",inum,fname); ! 142: return; ! 143: } ! 144: read(dev, &entry, 16); ! 145: if(entry.INUM != 0 && entry.NAME[0]) { ! 146: addname(entry.NAME); ! 147: copy(entry.INUM); ! 148: subname(); ! 149: } ! 150: } ! 151: flag = 0; ! 152: } ! 153: else ! 154: e++; ! 155: } ! 156: break; ! 157: } ! 158: default: ! 159: message("funny file type (%o)",inum,fname,ino.MODE); ! 160: return; ! 161: } ! 162: /* change the mode and owner of fname */ ! 163: if(ino.MODE & 07000) { ! 164: message("funny file mode (%o)",inum,fname,ino.MODE); ! 165: } ! 166: chmod(fname, ino.MODE & 0777); ! 167: chown(fname, ino.UID & 0377, ino.GID & 0377); ! 168: } ! 169: ! 170: ! 171: addname(s) ! 172: char *s; ! 173: { ! 174: char *f; ! 175: int i; ! 176: ! 177: f = fname; ! 178: while(*f++); ! 179: f--; ! 180: *f++ = '/'; ! 181: for(i = 14 ; *s && i-- ; *f++ = *s++); ! 182: *f = 0; ! 183: } ! 184: ! 185: ! 186: subname() ! 187: { ! 188: char *f; ! 189: ! 190: f = fname; ! 191: while(*f++); ! 192: while(*--f != '/') ! 193: *f = 0; ! 194: *f = 0; ! 195: } ! 196: ! 197: ! 198: message(s,i,f,x) ! 199: char *s,*f; ! 200: { ! 201: ! 202: printf("[%s] (%d) : ",f,i); ! 203: printf(s,x); ! 204: printf("\n"); ! 205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.