Hi,

1.4, not yet released fixes a lot of bugs.  You may want to take a
look to see if this has been fixed there.

http://genext2fs.sourceforge.net/

On 11/8/05, Nye Liu <[EMAIL PROTECTED]> wrote:
> Package: genext2fs
> Version: 1.3-7.1
> Severity: normal
>
>
> cleaned up the patch some so that t_now isn't used for root inode... now
> gets it from source filesystem stat()
>
> t_now is only used when no struct st is passed (eg lost+found)
>
> --- genext2fs.c 2005-11-08 19:19:01.000000000 -0800
> +++ genext2fs.c-dist    2005-02-08 17:41:02.000000000 -0800
> @@ -77,7 +77,6 @@
>  #include <unistd.h>
>  #include <sys/stat.h>
>  #include <assert.h>
> -#include <time.h>
>
>
>
> @@ -956,56 +955,14 @@
>         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, const struct stat *st)
> +uint32 mkdir_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 
> mode)
>  {
>         uint32 nod;
>         if((nod = find_dir(fs, parent_nod, name)))
>                 return nod;
>                 nod = alloc_nod(fs);
> -       if(mode) {
> -           time_t t_now = time(NULL);
> -           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;
> -       }
> +       get_nod(fs, nod)->i_mode = FM_IFDIR | mode;
>         add2dir(fs, parent_nod, nod, name);
>         add2dir(fs, nod, nod, ".");
>         add2dir(fs, nod, parent_nod, "..");
> @@ -1014,47 +971,54 @@
>  }
>
>  // make a symlink
> -uint32 mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, const 
> struct stat *st, uint8 * b)
> +uint32 mklink_fs(filesystem *fs, uint32 parent_nod, const char *name, size_t 
> size, uint8 * b)
>  {
>         uint32 nod = alloc_nod(fs);
> -       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;
> +       get_nod(fs, nod)->i_mode = FM_IFLNK | FM_IRWXU | FM_IRWXG | FM_IRWXO;
> +       get_nod(fs, nod)->i_size = size;
>         add2dir(fs, parent_nod, nod, name);
> -       if(st->st_size <= 4 * (EXT2_TIND_BLOCK+1))
> +       if(size <= 4 * (EXT2_TIND_BLOCK+1))
>         {
> -               strncpy((char*)get_nod(fs, nod)->i_block, (char*)b, 
> st->st_size);
> +               strncpy((char*)get_nod(fs, nod)->i_block, (char*)b, size);
>                 return nod;
>         }
> -       extend_blk(fs, nod, b, rndup(st->st_size, BLOCKSIZE) / BLOCKSIZE);
> +       extend_blk(fs, nod, b, rndup(size, BLOCKSIZE) / BLOCKSIZE);
>         return nod;
>  }
>
>  // make a file from a FILE*
> -uint32 mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, const 
> struct stat *st, FILE *f)
> +uint32 mkfile_fs(filesystem *fs, uint32 parent_nod, const char *name, uint32 
> mode, size_t size, FILE *f)
>  {
>         uint8 * b;
>         uint32 nod = alloc_nod(fs);
> -       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;
> +       get_nod(fs, nod)->i_mode = FM_IFREG | mode;
> +       get_nod(fs, nod)->i_size = size;
>         add2dir(fs, parent_nod, nod, name);
> -       if(!(b = (uint8*)malloc(rndup(st->st_size, BLOCKSIZE))))
> +       if(!(b = (uint8*)malloc(rndup(size, BLOCKSIZE))))
>                 errexit("not enough mem to read file '%s'", name);
> -       memset(b, 0,rndup(st->st_size, BLOCKSIZE));
> +       memset(b, 0,rndup(size, BLOCKSIZE));
>         if(f)
> -               fread(b, st->st_size, 1, f);
> +               fread(b, size, 1, f);
>         else
> -               memset(b, 0, st->st_size);
> -       extend_blk(fs, nod, b, rndup(st->st_size, BLOCKSIZE) / BLOCKSIZE);
> +               memset(b, 0, size);
> +       extend_blk(fs, nod, b, rndup(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)
>  {
> @@ -1131,7 +1095,7 @@
>                 switch(*cmod)
>                 {
>                         case 'd':
> -                               mkdir_fs(fs, nod, name, mode, NULL);
> +                               mkdir_fs(fs, nod, name, mode);
>                                 break;
>                         case 'c':
>                         case 'b':
> @@ -1177,17 +1141,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, b);
> +                               mklink_fs(fs, this_nod, dent->d_name, 
> st.st_size, 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, &st, 
> fh);
> +                               mkfile_fs(fs, this_nod, dent->d_name, 
> get_mode(&st), st.st_size, fh);
>                                 fclose(fh);
>                                 break;
>                         case S_IFDIR:
> -                               nod = mkdir_fs(fs, this_nod, dent->d_name, 0, 
> &st);
> +                               nod = mkdir_fs(fs, this_nod, dent->d_name, 
> get_mode(&st));
>                                 if(chdir(dent->d_name) < 0)
>                                         pexit(dent->d_name);
>                                 add2fs_from_dir(fs, nod);
> @@ -1355,7 +1319,7 @@
>  }
>
>  // initialize an empty filesystem
> -filesystem * init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes, 
> struct stat *st)
> +filesystem * init_fs(int nbblocks, int nbinodes, int nbresrvd, int holes)
>  {
>         int i;
>         filesystem *fs;
> @@ -1469,12 +1433,9 @@
>         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 | get_mode(st);
> +       itab0[EXT2_ROOT_INO-1].i_mode = FM_IFDIR | FM_IRWXU | FM_IRWXG | 
> FM_IRWXO;
>         itab0[EXT2_ROOT_INO-1].i_size = BLOCKSIZE;
>         itab0[EXT2_ROOT_INO-1].i_links_count = 2;
> -       itab0[EXT2_ROOT_INO-1].i_atime = st->st_atime;
> -       itab0[EXT2_ROOT_INO-1].i_ctime = st->st_ctime;
> -       itab0[EXT2_ROOT_INO-1].i_mtime = st->st_mtime;
>
>         b = get_workblk();
>         d = (directory*)b;
> @@ -1492,7 +1453,7 @@
>         // make lost+found directory and reserve blocks
>         if(fs->sb.s_r_blocks_count)
>         {
> -               nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", 0755, NULL);
> +               nod = mkdir_fs(fs, EXT2_ROOT_INO, "lost+found", FM_IRWXU | 
> FM_IRWXG | FM_IRWXO);
>                 memset(b, 0, BLOCKSIZE);
>                 ((directory*)b)->d_rec_len = BLOCKSIZE;
>                 for(i = 1; i < fs->sb.s_r_blocks_count; i++)
> @@ -1931,24 +1892,13 @@
>         }
>         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, &st);
> +               fs = init_fs(nbblocks, nbinodes, nbresrvd, holes);
>         }
>         for(i = 0; i < didx; i++)
>         {
>
> -- 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
>
>

Reply via email to