|
|
1.1 ! root 1: #include "stdio.h" ! 2: #include "sys/param.h" ! 3: #include "sys/stat.h" ! 4: #include "sys/filsys.h" ! 5: #include "sys/dir.h" ! 6: #include "sys/ino.h" ! 7: #include "sys/inode.h" ! 8: ! 9: #define ICOUNT BUFSIZE/sizeof(struct dinode) ! 10: struct filsys sb; ! 11: struct dinode ib[ICOUNT]; ! 12: struct direct db[BUFSIZE/sizeof(struct direct)]; ! 13: struct stat statbuf; ! 14: char buf[BUFSIZE]; ! 15: long where[NADDR]; ! 16: ! 17: main(argc, argv) ! 18: char **argv; ! 19: { ! 20: register int i, j; ! 21: daddr_t size, isize; ! 22: register daddr_t bno, bfree; ! 23: int fd; ! 24: long atol(); ! 25: off_t lseek(); ! 26: ! 27: if(argc != 3) { ! 28: fprintf(stderr, "%s: bit-dev no-of-4k-blocks\n", argv[0]); ! 29: exit(1); ! 30: } ! 31: fd = open(argv[1], 2); ! 32: if(fd < 0) { ! 33: perror(argv[1]); ! 34: exit(1); ! 35: } ! 36: if(fstat(fd, &statbuf) < 0) { ! 37: perror(argv[1]); ! 38: exit(1); ! 39: } ! 40: if(!BITFS(statbuf.st_rdev)) { ! 41: fprintf(stderr, "%s device %d, 0%o can't have a 4k system\n", ! 42: argv[1], major(statbuf.st_rdev), minor(statbuf.st_rdev)); ! 43: exit(1); ! 44: } ! 45: size = atoi(argv[2]); ! 46: if(size <= 3) { ! 47: fprintf(stderr, "size %ld too small\n", size); ! 48: exit(1); ! 49: } ! 50: if((i = lseek(fd, (size -1) * BUFSIZE, 0)) < 0 || ! 51: (j = read(fd, buf, BUFSIZE)) != BUFSIZE) { ! 52: fprintf(stderr, "size %ld too large (lseek %d, read %d)\n", size, ! 53: i, j); ! 54: exit(1); ! 55: } ! 56: isize = (size - 2)/(1 + ICOUNT); /* DOUBTFUL */ ! 57: if(isize * ICOUNT > 65536) ! 58: isize = 65536/ICOUNT; /* 65535 is largest short */ ! 59: fprintf(stderr, "%ld 4k blocks, %ld blocks of inodes, %d inodes\n", ! 60: size, isize - 2, ICOUNT * (isize - 2)); ! 61: for(bno = 2; bno < isize; bno++) { /* zero out all inodes */ ! 62: lseek(fd, (off_t)(bno * BUFSIZE), 0); ! 63: if (write(fd, (char *)ib, BUFSIZE) != BUFSIZE) { ! 64: perror("inode write"); ! 65: exit(1); ! 66: } ! 67: } ! 68: where[0] = isize; ! 69: /* next block has the root directory */ ! 70: db[0].d_ino = ROOTINO; ! 71: db[0].d_name[0] = '.'; ! 72: db[1].d_ino = ROOTINO; ! 73: db[1].d_name[1] = db[1].d_name[0] = '.'; ! 74: if (write(fd, (char *)db, BUFSIZE) != BUFSIZE) { ! 75: perror("root dir write"); ! 76: exit(1); ! 77: } ! 78: /* now for its inode */ ! 79: ib[ROOTINO-1].di_mode = IFDIR | IREAD | IWRITE | IEXEC; ! 80: ib[ROOTINO-1].di_mode |= (IREAD | IEXEC | IWRITE) >> 3; ! 81: ib[ROOTINO-1].di_mode |= (IREAD | IEXEC | IWRITE) >> 6; ! 82: ib[ROOTINO-1].di_nlink = 2; ! 83: ib[ROOTINO-1].di_uid = ib[ROOTINO-1].di_gid = 0; ! 84: ib[ROOTINO-1].di_size = 2*sizeof(struct direct); ! 85: ltol3(ib[ROOTINO-1].di_addr, where, 1); ! 86: ib[ROOTINO-1].di_atime = ib[ROOTINO-1].di_mtime = ! 87: ib[ROOTINO-1].di_ctime = time(0); ! 88: lseek(fd, (off_t)(2*BUFSIZE), 0); ! 89: if (write(fd, (char *)ib, BUFSIZE) != BUFSIZE) { ! 90: perror("root inode write"); ! 91: exit(1); ! 92: } ! 93: /* and now the super block */ ! 94: sb.s_isize = isize; ! 95: sb.s_fsize = size; ! 96: sb.s_time = ib[ROOTINO-1].di_atime; ! 97: sb.s_tfree = size - isize - 1; ! 98: sb.s_tinode = (isize - 2) * ICOUNT - 1; ! 99: sb.s_valid = 1; ! 100: for(i = 0; i < BITMAP; i++) ! 101: sb.s_bfree[i] = 0; ! 102: for(bno = isize + 1; bno < size; bno++) { ! 103: bfree = bno - isize; ! 104: sb.s_bfree[bfree>>5] |= (1 << (bfree & 31)); ! 105: } ! 106: if((++bfree >> 5) >= BITMAP) { ! 107: fprintf(stderr, "free map won't fit, blk = %ld, wd = %ld\n", ! 108: bno, bfree); ! 109: exit(1); ! 110: } ! 111: lseek(fd, (off_t)BUFSIZE, 0); ! 112: if (write(fd, (char *)&sb, BUFSIZE) != BUFSIZE) { ! 113: perror("superblock write"); ! 114: exit(1); ! 115: } ! 116: exit(0); ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.