Package: genext2fs
Version: 1.3-7.1
Severity: normal

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'stable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.11-1-686
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages genext2fs depends on:
ii  libc6                         2.3.5-6    GNU C Library: Shared libraries an

genext2fs recommends no packages.

-- no debconf information

genext2fs fills in st_mode and atime/mtime/ctime with useless data.

this patch attempts to migrate the data from the source filesystem to
the image


--- genext2fs.c-dist    2005-02-08 17:41:02.000000000 -0800
+++ genext2fs.c 2005-11-08 19:02:07.000000000 -0800
@@ -77,6 +77,7 @@
 #include <unistd.h>
 #include <sys/stat.h>
 #include <assert.h>
+#include <time.h>
 
 
 
@@ -461,6 +462,7 @@
 #undef utdecl32
 
 char * argv0;
+time_t t_now;
 
 // error (un)handling
 inline void errexit(const char *fmt, ...)
@@ -955,14 +957,55 @@
        return nod;
 }
 
+// retrieves a mode info from a struct stat
+uint32 get_mode(const struct stat *st)
+{
+       uint32 mode = 0;
+
+       if(st->st_mode & S_IRUSR)
+               mode |= FM_IRUSR;
+       if(st->st_mode & S_IRGRP)
+               mode |= FM_IRGRP;
+       if(st->st_mode & S_IROTH)
+               mode |= FM_IROTH;
+
+       if(st->st_mode & S_IWUSR)
+               mode |= FM_IWUSR;
+       if(st->st_mode & S_IWGRP)
+               mode |= FM_IWGRP;
+       if(st->st_mode & S_IWOTH)
+               mode |= FM_IWOTH;
+
+       if(st->st_mode & S_IXUSR)
+               mode |= FM_IXUSR;
+       if(st->st_mode & S_IXGRP)
+               mode |= FM_IXGRP;
+       if(st->st_mode & S_IXOTH)
+               mode |= FM_IXOTH;
+
+       return mode;
+}
+
+
 // make a full-fledged directory (i.e. with "." & "..")
-uint32 mkdir_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 
mode)
+uint32 mkdir_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 
mode, const struct stat *st)
 {
        uint32 nod;
        if((nod = find_dir(fs, parent_nod, name)))
                return nod;
                nod = alloc_nod(fs);
-       get_nod(fs, nod)->i_mode = FM_IFDIR | mode;
+       if(mode) {
+           get_nod(fs, nod)->i_mode = FM_IFDIR | mode;
+           get_nod(fs, nod)->i_atime = t_now;
+           get_nod(fs, nod)->i_ctime = t_now;
+           get_nod(fs, nod)->i_mtime = t_now;
+       }
+       if(st) {
+           get_nod(fs, nod)->i_mode = FM_IFDIR | get_mode(st);
+           get_nod(fs, nod)->i_atime = st->st_atime;
+           get_nod(fs, nod)->i_ctime = st->st_ctime;
+           get_nod(fs, nod)->i_mtime = st->st_mtime;
+       }
        add2dir(fs, parent_nod, nod, name);
        add2dir(fs, nod, nod, ".");
        add2dir(fs, nod, parent_nod, "..");
@@ -971,54 +1014,47 @@
 }
 
 // make a symlink
-uint32 mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, size_t 
size, uint8 * b)
+uint32 mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, const 
struct stat *st, uint8 * b)
 {
        uint32 nod = alloc_nod(fs);
-       get_nod(fs, nod)->i_mode = FM_IFLNK | FM_IRWXU | FM_IRWXG | FM_IRWXO;
-       get_nod(fs, nod)->i_size = size;
+       get_nod(fs, nod)->i_mode = FM_IFLNK | get_mode(st);
+       get_nod(fs, nod)->i_size = st->st_size;
+       get_nod(fs, nod)->i_atime = st->st_atime;
+       get_nod(fs, nod)->i_ctime = st->st_ctime;
+       get_nod(fs, nod)->i_mtime = st->st_mtime;
        add2dir(fs, parent_nod, nod, name);
-       if(size <= 4 * (EXT2_TIND_BLOCK+1))
+       if(st->st_size <= 4 * (EXT2_TIND_BLOCK+1))
        {
-               strncpy((char*)get_nod(fs, nod)->i_block, (char*)b, size);
+               strncpy((char*)get_nod(fs, nod)->i_block, (char*)b, 
st->st_size);
                return nod;
        }
-       extend_blk(fs, nod, b, rndup(size, BLOCKSIZE) / BLOCKSIZE);
+       extend_blk(fs, nod, b, rndup(st->st_size, BLOCKSIZE) / BLOCKSIZE);
        return nod;
 }
 
 // make a file from a FILE*
-uint32 mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 
mode, size_t size, FILE *f)
+uint32 mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, const 
struct stat *st, FILE *f)
 {
        uint8 * b;
        uint32 nod = alloc_nod(fs);
-       get_nod(fs, nod)->i_mode = FM_IFREG | mode;
-       get_nod(fs, nod)->i_size = size;
+       get_nod(fs, nod)->i_mode = FM_IFREG | get_mode(st);
+       get_nod(fs, nod)->i_size = st->st_size;
+       get_nod(fs, nod)->i_atime = st->st_atime;
+       get_nod(fs, nod)->i_ctime = st->st_ctime;
+       get_nod(fs, nod)->i_mtime = st->st_mtime;
        add2dir(fs, parent_nod, nod, name);
-       if(!(b = (uint8*)malloc(rndup(size, BLOCKSIZE))))
+       if(!(b = (uint8*)malloc(rndup(st->st_size, BLOCKSIZE))))
                errexit("not enough mem to read file '%s'", name);
-       memset(b, 0,rndup(size, BLOCKSIZE));
+       memset(b, 0,rndup(st->st_size, BLOCKSIZE));
        if(f)
-               fread(b, size, 1, f);
+               fread(b, st->st_size, 1, f);
        else
-               memset(b, 0, size);
-       extend_blk(fs, nod, b, rndup(size, BLOCKSIZE) / BLOCKSIZE);
+               memset(b, 0, st->st_size);
+       extend_blk(fs, nod, b, rndup(st->st_size, BLOCKSIZE) / BLOCKSIZE);
        free(b);
        return nod;
 }
 
-// retrieves a mode info from a struct stat
-uint32 get_mode(struct stat *st)
-{
-       uint32 mode = 0;
-       if(st->st_mode & S_IRUSR)
-               mode |= FM_IRUSR | FM_IRGRP | FM_IROTH;
-       if(st->st_mode & S_IWUSR)
-               mode |= FM_IWUSR | FM_IWGRP | FM_IWOTH;
-       if(st->st_mode & S_IXUSR)
-               mode |= FM_IXUSR | FM_IXGRP | FM_IXOTH;
-       return mode;
-}
-
 // retrieves a mode info from a string
 uint32 get_modestr(const char *p)
 {
@@ -1095,7 +1131,7 @@
                switch(*cmod)
                {
                        case 'd':
-                               mkdir_fs(fs, nod, name, mode);
+                               mkdir_fs(fs, nod, name, mode, NULL);
                                break;
                        case 'c':
                        case 'b':
@@ -1141,17 +1177,17 @@
                                        errexit("out of memory");
                                if(readlink(dent->d_name, (char*)b, st.st_size) 
< 0)
                                        pexit(dent->d_name);
-                               mklink_fs(fs, this_nod, dent->d_name, 
st.st_size, b);
+                               mklink_fs(fs, this_nod, dent->d_name, &st, b);
                                free(b);
                                break;
                        case S_IFREG:
                                if(!(fh = fopen(dent->d_name, "r")))
                                        pexit(dent->d_name);
-                               mkfile_fs(fs, this_nod, dent->d_name, 
get_mode(&st), st.st_size, fh);
+                               mkfile_fs(fs, this_nod, dent->d_name, &st, fh);
                                fclose(fh);
                                break;
                        case S_IFDIR:
-                               nod = mkdir_fs(fs, this_nod, dent->d_name, 
get_mode(&st));
+                               nod = mkdir_fs(fs, this_nod, dent->d_name, 0, 
&st);
                                if(chdir(dent->d_name) < 0)
                                        pexit(dent->d_name);
                                add2fs_from_dir(fs, nod);
@@ -1319,7 +1355,7 @@
 }
 
 // initialize an empty filesystem
-filesystem * init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes)
+filesystem * init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, 
struct stat *st)
 {
        int i;
        filesystem *fs;
@@ -1433,9 +1469,12 @@
        fs->gd[0].bg_free_inodes_count--;
        fs->gd[0].bg_used_dirs_count = 1;
        itab0 = (inode *)get_blk(fs,fs->gd[0].bg_inode_table);
-       itab0[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | FM_IRWXU | FM_IRWXG | 
FM_IRWXO; 
+       itab0[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | get_mode(st); 
        itab0[EXT2_ROOT_INO-1].i_size = BLOCKSIZE;
        itab0[EXT2_ROOT_INO-1].i_links_count = 2;
+       itab0[EXT2_ROOT_INO-1].i_atime = t_now;
+       itab0[EXT2_ROOT_INO-1].i_ctime = t_now;
+       itab0[EXT2_ROOT_INO-1].i_mtime = t_now;
 
        b = get_workblk();
        d = (directory*)b;
@@ -1453,7 +1492,7 @@
        // make lost+found directory and reserve blocks
        if(fs->sb.s_r_blocks_count)
        {
-               nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", FM_IRWXU | 
FM_IRWXG | FM_IRWXO);
+               nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", 0755, NULL);
                memset(b, 0, BLOCKSIZE);
                ((directory*)b)->d_rec_len = BLOCKSIZE;
                for(i = 1; i < fs->sb.s_r_blocks_count; i++)
@@ -1836,6 +1875,7 @@
                showhelp();
                exit(1);
        }
+       t_now = time(NULL);
        while((c = getopt(argc, argv, "x:f:d:b:i:r:g:e:zvh")) != EOF)
                switch(c)
                {
@@ -1892,13 +1932,24 @@
        }
        else
        {
+               struct stat st;
+               if(didx) {
+                   /* pull ROOT_INO stat from first -d specifier */
+                   stat(dopt[0], &st);
+               } else {
+                   /* pull ROOT_INO stat from cwd */
+                   char *pdir = getcwd(0, GETCWD_SIZE);
+                   stat(pdir, &st);
+                   free(pdir);
+               }
+
                if(nbblocks == -1)
                        errexit("filesystem size unspecified");
                if(nbinodes == -1)
                        nbinodes = nbblocks * BLOCKSIZE / 
rndup(BYTES_PER_INODE, BLOCKSIZE);
                if(nbresrvd == -1)
                        nbresrvd = nbblocks * RESERVED_INODES;
-               fs = init_fs(nbblocks, nbinodes, nbresrvd, holes);
+               fs = init_fs(nbblocks, nbinodes, nbresrvd, holes, &st);
        }
        for(i = 0; i < didx; i++)
        {


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to