annotate toys/mke2fs.c @ 99:97d717829ff0

More work on mke2fs.c. Random in-progress snapshot...
author Rob Landley <rob@landley.net>
date Mon, 12 Feb 2007 20:03:01 -0500
parents 4c81e6375719
children ff85a83e7d7e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* vi: set ts=4:
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * mke2fs.c - Create an ext2 filesystem image.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * Copyright 2006 Rob Landley <rob@landley.net>
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 */
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 #include "toys.h"
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
9
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
10 #define TT toy.mke2fs
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
11
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 // b - block size (1024, 2048, 4096)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 // F - force (run on mounted device or non-block device)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 // i - bytes per inode
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 // N - number of inodes
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 // m - reserved blocks percentage
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 // n - Don't write
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 // q - quiet
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
19
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 // L - volume label
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 // M - last mounted path
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 // o - creator os
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
23
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 // j - create journal
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 // J - journal options (size=1024-102400 blocks,device=)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 // device=/dev/blah or LABEL=label UUID=uuid
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
27
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 // E - extended options (stride=stripe-size blocks)
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 // O - none,dir_index,filetype,has_journal,journal_dev,sparse_super
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
30
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
31 #define INODES_RESERVED 10
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
32
97
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
33 // Calculate data blocks plus index blocks needed to hold a file.
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
34
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
35 static uint32_t count_blocks_used(uint64_t size)
97
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
36 {
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
37 uint32_t dblocks = (uint32_t)((size+(TT.blocksize-1))/TT.blocksize);
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
38 uint32_t idx=TT.blocksize/4, iblocks=0, diblocks=0, tiblocks=0;
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
39
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
40 // Account for direct, singly, doubly, and triply indirect index blocks
97
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
41
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
42 if (dblocks > 12) {
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
43 iblocks = ((dblocks-13)/idx)+1;
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
44 if (iblocks > 1) {
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
45 diblocks = ((iblocks-2)/idx)+1;
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
46 if (diblocks > 1)
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
47 tiblocks = ((diblocks-2)/idx)+1;
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
48 }
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
49 }
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
50
97
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
51 return dblocks + iblocks + diblocks + tiblocks;
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
52 }
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
53
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
54 // Calculate the number of blocks used by each inode. Returns blocks used,
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
55 // assigns bytes used to *size. Writes total block count to TT.treeblocks
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
56 // and inode count to TT.treeinodes.
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
57
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
58 long check_treesize(struct dirtree *this, off_t *size)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
59 {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
60 long blocks;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
61
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
62 while (this) {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
63 *size += sizeof(struct ext2_dentry) + strlen(this->name);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
64
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
65 if (this->child)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
66 this->st.st_blocks = check_treesize(this->child, &this->st.st_size);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
67 else if (S_ISREG(this->st.st_mode)) {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
68 this->st.st_blocks = count_blocks_used(this->st.st_size);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
69 TT.treeblocks += this->st.st_blocks;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
70 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
71 this = this->next;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
72 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
73 TT.treeblocks += blocks = count_blocks_used(*size);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
74 TT.treeinodes++;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
75
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
76 return blocks;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
77 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
78
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 // According to http://www.opengroup.org/onlinepubs/9629399/apdxa.htm
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 // we should generate a uuid structure by reading a clock with 100 nanosecond
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 // precision, normalizing it to the start of the gregorian calendar in 1582,
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 // and looking up our eth0 mac address.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 //
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 // On the other hand, we have 128 bits to come up with a unique identifier, of
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 // which 6 have a defined value. /dev/urandom it is.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
86
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
87 static void create_uuid(char *uuid)
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 {
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
89 // Read 128 random bits
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 int fd = xopen("/dev/urandom", O_RDONLY);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 xreadall(fd, uuid, 16);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 close(fd);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
93
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 // Claim to be a DCE format UUID.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 uuid[6] = (uuid[6] & 0x0F) | 0x40;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 uuid[8] = (uuid[8] & 0x3F) | 0x80;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
97
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 // rfc2518 section 6.4.1 suggests if we're not using a macaddr, we should
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 // set bit 1 of the node ID, which is the mac multicast bit. This means we
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 // should never collide with anybody actually using a macaddr.
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 uuid[11] = uuid[11] | 128;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 }
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
103
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
104 // Fill out superblock and TT
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
105
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
106 static void init_superblock(struct ext2_superblock *sb)
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
107 {
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
108 uint32_t temp;
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
109
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
110 // Set log_block_size and log_frag_size.
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
111
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
112 for (temp = 0; temp < 4; temp++) if (TT.blocksize == 1024<<temp) break;
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
113 if (temp==4) error_exit("bad blocksize");
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
114 sb->log_block_size = sb->log_frag_size = SWAP_LE32(temp);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
115
80
7a058d60faf1 One more field, minor shrinking, and start on block groups.
Rob Landley <rob@landley.net>
parents: 79
diff changeset
116 // Fill out blocks_count, r_blocks_count, first_data_block
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
117
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
118 sb->blocks_count = SWAP_LE32(TT.blocks);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
119 if (!TT.reserved_percent) TT.reserved_percent = 5;
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
120 temp = (TT.blocks * (uint64_t)TT.reserved_percent) /100;
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
121 sb->r_blocks_count = SWAP_LE32(temp);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
122
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
123 sb->first_data_block = SWAP_LE32(TT.blocksize == 1024 ? 1 : 0);
80
7a058d60faf1 One more field, minor shrinking, and start on block groups.
Rob Landley <rob@landley.net>
parents: 79
diff changeset
124
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
125 // Set blocks_per_group and frags_per_group, which is the size of an
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
126 // allocation bitmap that fits in one block (I.E. how many bits per block)?
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
127
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
128 temp = TT.blocksize*8;
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
129 sb->blocks_per_group = sb->frags_per_group = SWAP_LE32(temp);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
130
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
131 // How many block groups do we need? (Round up avoiding integer overflow.)
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
132
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
133 TT.groups = (TT.blocks)/temp;
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
134 if (TT.blocks & (temp-1)) TT.groups++;
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
135
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
136 // Figure out how many total inodes we need.
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
137
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
138 if (!TT.inodespg) {
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
139 if (!TT.bytes_per_inode) TT.bytes_per_inode = 8192;
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
140 TT.inodespg = (TT.blocks * (uint64_t)TT.blocksize) / TT.bytes_per_inode;
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
141 }
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
142
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
143 // Figure out inodes per group, rounded up to block size.
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
144
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
145 // How many blocks of inodes total, rounded up
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
146 temp = TT.inodespg / (TT.blocksize/sizeof(struct ext2_inode));
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
147 if (temp * (TT.blocksize/sizeof(struct ext2_inode)) != TT.inodespg) temp++;
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
148 // How many blocks of inodes per group, again rounded up
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
149 TT.inodespg = temp / TT.groups;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
150 if (temp & (TT.groups-1)) TT.inodespg++;
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
151 // How many inodes per group is that?
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
152 TT.inodespg *= (TT.blocksize/sizeof(struct ext2_inode));
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
153
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
154 // Set inodes_per_group and total inodes_count
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
155 sb->inodes_per_group = SWAP_LE32(TT.inodespg);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
156 sb->inodes_count = SWAP_LE32(TT.inodespg * TT.groups);
79
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
157
1aff4181427b Filling out most of the ext2 superblock correctly now.
Rob Landley <rob@landley.net>
parents: 76
diff changeset
158 // Fill out the rest of the superblock.
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
159 sb->max_mnt_count=0xFFFF;
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
160 sb->wtime = sb->lastcheck = sb->mkfs_time = SWAP_LE32(time(NULL));
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
161 sb->magic = SWAP_LE32(0xEF53);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
162 sb->state = sb->errors = SWAP_LE16(1);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
163
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 sb->rev_level = SWAP_LE32(1);
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
165 sb->first_ino = SWAP_LE32(INODES_RESERVED+1);
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
166 sb->inode_size = SWAP_LE16(sizeof(struct ext2_inode));
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 sb->feature_incompat = SWAP_LE32(EXT2_FEATURE_INCOMPAT_FILETYPE);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 sb->feature_ro_compat = SWAP_LE32(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER);
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
169
76
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
170 create_uuid(sb->uuid);
e6332139adae More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 75
diff changeset
171
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
172 // TODO If we're called as mke3fs or mkfs.ext3, do a journal.
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
173
75
89ca591a9236 More random progress on mke2fs. Nothing to see yet.
Rob Landley <rob@landley.net>
parents: 53
diff changeset
174 //if (strchr(toys.which->name,'3'))
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
175 // sb->feature_compat = SWAP_LE32(EXT3_FEATURE_COMPAT_HAS_JOURNAL);
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
176
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
177 // TODO fill out free_blocks, free_inodes, first_ino
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
178 }
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
179
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
180 // Number of blocks used in this group by superblock/group list backup.
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
181 // Returns 0 if this group doesn't have a superblock backup.
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
182 static int group_superblock_used(uint32_t group)
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
183 {
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
184 int used = 0, i;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
185
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
186 // Superblock backups are on groups 0, 1, and powers of 3, 5, and 7.
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
187 if(!group || group==1) used++;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
188 for (i=3; i<9; i+=2) {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
189 int j = i;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
190 while (j<group) j*=i;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
191 if (j==group) used++;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
192 }
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
193
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
194 if (used) {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
195 // How blocks does the group table take up?
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
196 used = TT.groups * sizeof(struct ext2_group);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
197 used += TT.blocksize - 1;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
198 used /= TT.blocksize;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
199 // Plus the superblock itself.
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
200 used++;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
201 // And a corner case.
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
202 if (!group && TT.blocksize == 1024) used++;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
203 }
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
204
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
205 return used;
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
206 }
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
207
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
208 static void bits_set(char *array, int start, int len)
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
209 {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
210 while(len) {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
211 if ((start&7) || len<8) {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
212 array[start/8]|=(1<<(start&7));
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
213 start++;
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
214 len--;
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
215 } else {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
216 array[start/8]=255;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
217 start+=8;
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
218 len-=8;
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
219 }
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
220 }
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
221 }
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
222
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
223 // Seek past len bytes (to maintain sparse file), or write zeroes if output
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
224 // not seekable
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
225 static void put_zeroes(int len)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
226 {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
227 if(TT.noseek || -1 == lseek(TT.fsfd, len, SEEK_SET)) {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
228
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
229 TT.noseek=1;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
230 memset(toybuf, 0, sizeof(toybuf));
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
231 while (len) {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
232 int out = len > sizeof(toybuf) ? sizeof(toybuf) : len;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
233 xwrite(TT.fsfd, toybuf, out);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
234 len -= out;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
235 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
236 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
237 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
238
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
239 static void fill_inode(struct ext2_inode *in, struct dirtree *this)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
240 {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
241 memset(in,0,sizeof(struct ext2_inode));
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
242
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
243 // This works on Linux. S_ISREG/DIR/CHR/BLK/FIFO/LNK/SOCK(m)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
244 in->mode = this->st.st_mode;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
245
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
246 in->uid = this->st.st_uid & 0xFFFF;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
247 in->uid_high = this->st.st_uid >> 16;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
248 in->gid = this->st.st_gid & 0xFFFF;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
249 in->gid_high = this->st.st_gid >> 16;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
250 in->size = this->st.st_size & 0xFFFFFFFF;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
251
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
252 in->atime = this->st.st_atime;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
253 in->ctime = this->st.st_ctime;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
254 in->mtime = this->st.st_mtime;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
255
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
256 in->links_count = this->st.st_nlink; // TODO
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
257 in->blocks = this->st.st_blocks;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
258 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
259
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
260 int mke2fs_main(void)
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
261 {
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
262 int i, temp, blockbits;
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
263 off_t length;
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
264
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
265 // Handle command line arguments.
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
266
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
267 if (toys.optargs[1]) {
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
268 sscanf(toys.optargs[1], "%u", &TT.blocks);
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
269 temp = O_RDWR|O_CREAT;
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
270 } else temp = O_RDWR;
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
271
97
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
272 // Collect gene2fs list or lost+found, calculate requirements.
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
273
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
274 if (TT.gendir) {
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
275 strncpy(toybuf, TT.gendir, sizeof(toybuf));
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
276 TT.dt = read_dirtree(toybuf, NULL);
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
277 } else {
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
278 TT.dt = xzalloc(sizeof(struct dirtree)+11);
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
279 strcpy(TT.dt->name, "lost+found");
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
280 TT.dt->st.st_mode = S_IFDIR|0755;
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
281 TT.dt->st.st_ctime = TT.dt->st.st_mtime = time(NULL);
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
282 }
4c81e6375719 Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
Rob Landley <rob@landley.net>
parents: 84
diff changeset
283
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
284 // TODO: Calculate st_nlink for each node in tree.
81
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
285
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
286 // TODO: Check if filesystem is mounted here
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
287
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
288 // For mke?fs, open file. For gene?fs, create file.
f95f6fd94eed Move superblock initialization to a function. Trim unused padding from
Rob Landley <rob@landley.net>
parents: 80
diff changeset
289 TT.fsfd = xcreate(*toys.optargs, temp, 0777);
75
89ca591a9236 More random progress on mke2fs. Nothing to see yet.
Rob Landley <rob@landley.net>
parents: 53
diff changeset
290
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
291 // Determine appropriate block size and block count from file length.
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
292
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
293 length = fdlength(TT.fsfd);
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
294 if (!TT.blocksize) TT.blocksize = (length && length < 1<<29) ? 1024 : 4096;
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
295 if (!TT.blocks) TT.blocks = length/TT.blocksize;
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
296 if (!TT.blocks) error_exit("gene2fs is a TODO item");
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
297
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
298 // Skip the first 1k to avoid the boot sector (if any), then
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
299 // initialize superblock structure
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
300
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
301 put_zeroes(1024);
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
302 init_superblock(&TT.sb);
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
303 blockbits = 8*TT.blocksize;
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
304
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
305 // Figure out how much space is used
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
306 length = 0;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
307 length = check_treesize(TT.dt, &length);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
308 for (temp=i=0; i<TT.groups; i++) {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
309 temp += group_superblock_used(i) + 2;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
310 temp += TT.inodespg/(TT.blocksize/sizeof(struct ext2_inode));
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
311 }
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
312 TT.sb.free_blocks_count = SWAP_LE32(TT.blocks - TT.treeblocks - temp);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
313 TT.sb.free_inodes_count = SWAP_LE32(TT.inodespg*TT.groups - INODES_RESERVED
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
314 - TT.treeinodes);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
315
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
316 // Figure out how many inodes are used
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
317
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
318 // Loop through block groups.
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
319
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
320 for (i=0; i<TT.groups; i++) {
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
321 struct ext2_inode *in = (struct ext2_inode *)toybuf;
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
322 uint32_t start, itable, used, end;
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
323 int j, slot;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
324
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
325 // Where does this group end?
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
326 end = blockbits;
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
327 if ((i+1)*blockbits > TT.blocks) end = TT.blocks & (blockbits-1);
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
328
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
329 // Blocks used by inode table
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
330 itable = (TT.inodespg*sizeof(struct ext2_inode))/TT.blocksize;
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
331
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
332 // If a superblock goes here, write it out.
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
333 start = group_superblock_used(i);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
334 if (start) {
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
335 struct ext2_group *bg = (struct ext2_group *)toybuf;
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
336
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
337 TT.sb.block_group_nr = SWAP_LE16(i);
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
338
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
339 // Write superblock and pad it up to block size
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
340 xwrite(TT.fsfd, &TT.sb, sizeof(struct ext2_superblock));
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
341 temp = TT.blocksize - sizeof(struct ext2_superblock);
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
342 if (!i && TT.blocksize > 1024) temp -= 1024;
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
343 memset(toybuf, 0, TT.blocksize);
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
344 xwrite(TT.fsfd, toybuf, temp);
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
345
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
346 // Loop through groups to write group descriptor table.
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
347 for(j=0; j<TT.groups; j++) {
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
348
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
349 // Figure out what sector this group starts in.
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
350 used = group_superblock_used(j);
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
351
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
352 // Find next array slot in this block (flush block if full).
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
353 slot = j % (TT.blocksize/sizeof(struct ext2_group));
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
354 if (!slot) {
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
355 if (j) xwrite(TT.fsfd, bg, TT.blocksize);
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
356 memset(bg, 0, TT.blocksize);
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
357 }
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
358
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
359 // How many free inodes in this group? (TODO)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
360 temp = TT.inodespg;
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
361 if (!i) temp -= INODES_RESERVED;
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
362 bg[slot].free_inodes_count = SWAP_LE16(temp);
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
363
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
364 // How many free blocks in this group? (TODO)
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
365 temp = TT.inodespg/(TT.blocksize/sizeof(struct ext2_inode)) + 2;
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
366 temp = end-used-temp;
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
367 bg[slot].free_blocks_count = SWAP_LE32(temp);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
368
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
369 // Fill out rest of group structure (TODO: gene2fs allocation)
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
370 used += j*blockbits;
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
371 bg[slot].block_bitmap = SWAP_LE32(used++);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
372 bg[slot].inode_bitmap = SWAP_LE32(used++);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
373 bg[slot].inode_table = SWAP_LE32(used);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
374 bg[slot].used_dirs_count = 0; // (TODO)
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
375 }
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
376 xwrite(TT.fsfd, bg, TT.blocksize);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
377 }
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
378
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
379 // Now write out stuff that every block group has.
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
380
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
381 // Write block usage bitmap (TODO: fill it)
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
382
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
383 memset(toybuf, 0, TT.blocksize);
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
384 bits_set(toybuf, 0, start+itable);
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
385 if (end!=blockbits) bits_set(toybuf, end, blockbits-end);
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
386 xwrite(TT.fsfd, toybuf, TT.blocksize);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
387
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
388 // Write inode bitmap (TODO)
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
389 memset(toybuf, 0, TT.blocksize);
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
390 if (!i) bits_set(toybuf, 0, INODES_RESERVED);
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
391 bits_set(toybuf, TT.inodespg, blockbits-TT.inodespg);
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
392 xwrite(TT.fsfd, toybuf, TT.blocksize);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
393
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
394 start += 3;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
395
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
396 // Write inode table for this group
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
397 for (j = 0; j<TT.inodespg; j++) {
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
398 slot = j % (TT.blocksize/sizeof(struct ext2_inode));
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
399 if (!slot) {
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
400 if (j) {
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
401 xwrite(TT.fsfd, in, TT.blocksize);
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
402 start++;
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
403 }
83
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
404 memset(in, 0, TT.blocksize);
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
405 }
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
406 }
4b25264da01b mke2fs: Stopping for dinner. It compiles.
Rob Landley <rob@landley.net>
parents: 82
diff changeset
407 xwrite(TT.fsfd, in, TT.blocksize);
84
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
408
bdbef4ab4ac6 This creates an almost valid empty ext2 filesystem, except for a few superblock
Rob Landley <rob@landley.net>
parents: 83
diff changeset
409 // Write empty data blocks
99
97d717829ff0 More work on mke2fs.c. Random in-progress snapshot...
Rob Landley <rob@landley.net>
parents: 97
diff changeset
410 put_zeroes((end-start) * TT.blocksize);
82
612c8d6c2829 More work on mke2fs.
Rob Landley <rob@landley.net>
parents: 81
diff changeset
411 }
53
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
412
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
413 return 0;
41d55b5d49fd Add start of mke2fs/gene2fs, and some other stuff I've been working on.
Rob Landley <rob@landley.net>
parents:
diff changeset
414 }