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]