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 > >