Add parent pointer to dirtree, more work on mke2fs (populate dirtree, count
authorRob Landley <rob@landley.net>
Mon, 5 Feb 2007 00:14:58 +0000 (19:14 -0500)
committerRob Landley <rob@landley.net>
Mon, 5 Feb 2007 00:14:58 +0000 (19:14 -0500)
index blocks).

lib/lib.c
lib/lib.h
toys/e2fs.h
toys/mke2fs.c
toys/toylist.h

index a2f1708..f1d1ce1 100644 (file)
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -534,7 +534,7 @@ struct dirtree *read_dirtree_node(char *path)
 // Given a directory (in a writeable PATH_MAX buffer), recursively read in a
 // directory tree.
 
-struct dirtree *read_dirtree(char *path)
+struct dirtree *read_dirtree(char *path, struct dirtree *parent)
 {
        struct dirtree *dt = NULL, **ddt = &dt;
        DIR *dir;
@@ -554,7 +554,8 @@ struct dirtree *read_dirtree(char *path)
 
                snprintf(path+len, sizeof(toybuf)-len, "/%s", entry->d_name);
                *ddt = read_dirtree_node(path);
-               if (entry->d_type == DT_DIR) (*ddt)->child = read_dirtree(path);
+               (*ddt)->parent = parent;
+               if (entry->d_type == DT_DIR) (*ddt)->child = read_dirtree(path, *ddt);
                ddt = &((*ddt)->next);
                path[len]=0;
        }
index d3c937c..07cc9cd 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -22,8 +22,7 @@ struct arg_list {
 };
 
 struct dirtree {
-       struct dirtree *next;
-       struct dirtree *child;
+       struct dirtree *next, *child, *parent;
        struct stat st;
        char name[];
 };
@@ -68,7 +67,7 @@ char *utoa(unsigned n);
 char *itoa(int n);
 off_t fdlength(int fd);
 struct dirtree *read_dirtree_node(char *path);
-struct dirtree *read_dirtree(char *path);
+struct dirtree *read_dirtree(char *path, struct dirtree *parent);
 
 // getmountlist.c
 struct mtab_list {
index bcffa3c..5a2cb64 100644 (file)
@@ -80,7 +80,7 @@ struct ext2_dentry {
     uint16_t rec_len;       // Directory entry length
     uint8_t  name_len;      // Name length
     uint8_t  file_type;
-       char     name[255];     // File name
+       char     name[0];     // File name
 };
 
 struct ext2_inode {
@@ -109,8 +109,6 @@ struct ext2_inode {
        uint32_t reserved2;
 };
 
-
-
 #define EXT2_FEATURE_COMPAT_DIR_PREALLOC       0x0001
 #define EXT2_FEATURE_COMPAT_IMAGIC_INODES      0x0002
 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL                0x0004
index bf01956..bade3d2 100644 (file)
 
 #define INODES_RESERVED 10
 
+// Calculate data blocks plus index blocks needed to hold a file.
+uint32_t blocks_used(uint64_t size)
+{
+       uint32_t dblocks = (uint32_t)((size+(TT.blocksize-1))/TT.blocksize);
+       uint32_t idx=TT.blocksize/4, iblocks=0, diblocks=0, tiblocks=0;
+
+       // Account for direct, singly, doubly, and triply indiret index blocks
+
+       if (dblocks > 12) {
+               iblocks = ((dblocks-13)/idx)+1;
+               if (iblocks > 1) {
+                       diblocks = ((iblocks-2)/idx)+1;
+                       if (diblocks > 1)
+                               tiblocks = ((diblocks-2)/idx)+1;
+               }
+       }
+       
+       return dblocks + iblocks + diblocks + tiblocks;
+}
+
 // According to http://www.opengroup.org/onlinepubs/9629399/apdxa.htm
 // we should generate a uuid structure by reading a clock with 100 nanosecond
 // precision, normalizing it to the start of the gregorian calendar in 1582,
@@ -187,7 +207,19 @@ int mke2fs_main(void)
                temp = O_RDWR|O_CREAT;
        } else temp = O_RDWR;
 
-       // TODO: collect gene2fs list/lost+found, calculate requirements.
+       // Collect gene2fs list or lost+found, calculate requirements.
+
+       if (TT.gendir) {
+               strncpy(toybuf, TT.gendir, sizeof(toybuf));
+               TT.dt = read_dirtree(toybuf, NULL);
+       } else {
+               TT.dt = xzalloc(sizeof(struct dirtree)+11);
+               strcpy(TT.dt->name, "lost+found");
+               TT.dt->st.st_mode = S_IFDIR|0755;
+               TT.dt->st.st_ctime = TT.dt->st.st_mtime = time(NULL);
+       }
+
+       // Calculate st_nlink for each node in tree.
 
        // TODO: Check if filesystem is mounted here
 
index 715b561..87aaba8 100644 (file)
@@ -23,10 +23,12 @@ struct mke2fs_data {
        long bytes_per_inode;
        long inodes;
        long reserved_percent;
+       char *gendir;
 
        unsigned blocks, groups;
        int fsfd, noseek;
        struct ext2_superblock sb;
+       struct dirtree *dt;
 };
 
 // "E:jJ:L:m:O:"