extern ss_request_table debug_cmds;
-ext2_filsys current_fs = NULL;
-ino_t root, cwd;
+ext2_filsys current_fs = NULL;
+ext2_ino_t root, cwd;
static void open_filesystem(char *device, int open_flags, blk_t superblock,
blk_t blocksize, int catastrophic)
#ifdef HAVE_OPTRESET
optreset = 1; /* Makes BSD getopt happy */
#endif
- while ((c = getopt (argc, argv, "wfcb:s:")) != EOF) {
+ while ((c = getopt (argc, argv, "iwfcb:s:")) != EOF) {
switch (c) {
+ case 'i':
+ open_flags |= EXT2_FLAG_IMAGE_FILE;
+ break;
case 'w':
open_flags |= EXT2_FLAG_RW;
break;
return;
}
-static void print_features(struct ext2fs_sb * s, FILE *f)
+static void print_features(struct ext2_super_block * s, FILE *f)
{
-#ifdef EXT2_DYNAMIC_REV
int i, j, printed=0;
-__u32 *mask = &s->s_feature_compat, m;
+ __u32 *mask = &s->s_feature_compat, m;
- printf ("Filesystem features:");
+ fputs("Filesystem features:", f);
for (i=0; i <3; i++,mask++) {
for (j=0,m=1; j < 32; j++, m<<=1) {
if (*mask & m) {
}
}
if (printed == 0)
- printf("(none)");
- printf("\n");
-#endif
+ fputs("(none)", f);
+ fputs("\n", f);
}
void do_show_super_stats(int argc, char *argv[])
{
int i;
FILE *out;
- struct ext2fs_sb *sb;
struct ext2_group_desc *gdp;
int c, header_only = 0;
- char buf[80];
- const char *none = "(none)";
const char *usage = "Usage: show_super [-h]";
optind = 0;
if (check_fs_open(argv[0]))
return;
out = open_pager();
- sb = (struct ext2fs_sb *) current_fs->super;
- fprintf(out, "Filesystem is read-%s\n",
- current_fs->flags & EXT2_FLAG_RW ? "write" : "only");
- if (sb->s_volume_name[0]) {
- memset(buf, 0, sizeof(buf));
- strncpy(buf, sb->s_volume_name, sizeof(sb->s_volume_name));
- } else
- strcpy(buf, none);
- fprintf(out, "Volume name = %s\n", buf);
- if (sb->s_last_mounted[0]) {
- memset(buf, 0, sizeof(buf));
- strncpy(buf, sb->s_last_mounted, sizeof(sb->s_last_mounted));
- } else
- strcpy(buf, none);
- fprintf(out, "Last mounted directory = %s\n", buf);
- if (!uuid_is_null(sb->s_uuid))
- uuid_unparse(sb->s_uuid, buf);
- else
- strcpy(buf, none);
- fprintf(out, "Filesystem UUID = %s\n", buf);
- print_features(sb, out);
- fprintf(out, "Last mount time = %s", time_to_string(sb->s_mtime));
- fprintf(out, "Last write time = %s", time_to_string(sb->s_wtime));
- fprintf(out, "Mount counts = %d (maximal = %d)\n",
- sb->s_mnt_count, sb->s_max_mnt_count);
- fputs ("Filesystem OS type = ", out);
- switch (sb->s_creator_os) {
- case EXT2_OS_LINUX: fputs ("Linux\n", out); break;
- case EXT2_OS_HURD: fputs ("GNU\n", out); break;
- case EXT2_OS_MASIX: fputs ("Masix\n", out); break;
- default: fputs ("unknown\n", out);
- }
- fprintf(out, "Superblock size = %d\n",
- sizeof(struct ext2_super_block));
- fprintf(out, "Block size = %d, fragment size = %d\n",
- EXT2_BLOCK_SIZE(sb), EXT2_FRAG_SIZE(sb));
- fprintf(out, "Inode size = %d\n", EXT2_INODE_SIZE(sb));
- fprintf(out, "%d inodes, %d free\n", sb->s_inodes_count,
- sb->s_free_inodes_count);
- fprintf(out, "%d blocks, %d free, %d reserved, first block = %d\n",
- sb->s_blocks_count, sb->s_free_blocks_count,
- sb->s_r_blocks_count, sb->s_first_data_block);
- fprintf(out, "%d blocks per group\n", sb->s_blocks_per_group);
- fprintf(out, "%d fragments per group\n", sb->s_frags_per_group);
- fprintf(out, "%d inodes per group\n", EXT2_INODES_PER_GROUP(sb));
- fprintf(out, "%ld group%s (%ld descriptors block%s)\n",
- current_fs->group_desc_count,
- (current_fs->group_desc_count != 1) ? "s" : "",
- current_fs->desc_blocks,
- (current_fs->desc_blocks != 1) ? "s" : "");
+
+ list_super2(current_fs->super, out);
if (header_only) {
close_pager(out);
fprintf(out, " Group %2d: block bitmap at %d, "
"inode bitmap at %d, "
"inode table at %d\n"
- " %d free block%s, "
- "%d free inode%s, "
- "%d used director%s\n",
+ " %d free %s, "
+ "%d free %s, "
+ "%d used %s\n",
i, gdp->bg_block_bitmap,
gdp->bg_inode_bitmap, gdp->bg_inode_table,
gdp->bg_free_blocks_count,
- gdp->bg_free_blocks_count != 1 ? "s" : "",
+ gdp->bg_free_blocks_count != 1 ? "blocks" : "block",
gdp->bg_free_inodes_count,
- gdp->bg_free_inodes_count != 1 ? "s" : "",
+ gdp->bg_free_inodes_count != 1 ? "inodes" : "inode",
gdp->bg_used_dirs_count,
- gdp->bg_used_dirs_count != 1 ? "ies" : "y");
+ gdp->bg_used_dirs_count != 1 ? "directories"
+ : "directory");
close_pager(out);
}
}
struct list_blocks_struct {
- FILE *f;
- int total;
+ FILE *f;
+ e2_blkcnt_t total;
+ blk_t first_block, last_block;
+ e2_blkcnt_t first_bcnt, last_bcnt;
+ e2_blkcnt_t first;
};
-static int list_blocks_proc(ext2_filsys fs, blk_t *blocknr, int blockcnt,
- void *private)
+static void finish_range(struct list_blocks_struct *lb)
+{
+ if (lb->first_block == 0)
+ return;
+ if (lb->first)
+ lb->first = 0;
+ else
+ fprintf(lb->f, ", ");
+ if (lb->first_block == lb->last_block)
+ fprintf(lb->f, "(%d):%d", lb->first_bcnt, lb->first_block);
+ else
+ fprintf(lb->f, "(%d-%d):%d-%d", lb->first_bcnt,
+ lb->last_bcnt, lb->first_block, lb->last_block);
+ lb->first_block = 0;
+}
+
+static int list_blocks_proc(ext2_filsys fs, blk_t *blocknr,
+ e2_blkcnt_t blockcnt, blk_t ref_block,
+ int ref_offset, void *private)
{
struct list_blocks_struct *lb = (struct list_blocks_struct *) private;
- fprintf(lb->f, "%d ", *blocknr);
lb->total++;
+ if (blockcnt >= 0) {
+ /*
+ * See if we can add on to the existing range (if it exists)
+ */
+ if (lb->first_block &&
+ (lb->last_block+1 == *blocknr) &&
+ (lb->last_bcnt+1 == blockcnt)) {
+ lb->last_block = *blocknr;
+ lb->last_bcnt = blockcnt;
+ return 0;
+ }
+ /*
+ * Start a new range.
+ */
+ finish_range(lb);
+ lb->first_block = lb->last_block = *blocknr;
+ lb->first_bcnt = lb->last_bcnt = blockcnt;
+ return 0;
+ }
+ /*
+ * Not a normal block. Always force a new range.
+ */
+ finish_range(lb);
+ if (lb->first)
+ lb->first = 0;
+ else
+ fprintf(lb->f, ", ");
+ if (blockcnt == -1)
+ fprintf(lb->f, "(IND):%d", *blocknr);
+ else if (blockcnt == -2)
+ fprintf(lb->f, "(DIND):%d", *blocknr);
+ else if (blockcnt == -3)
+ fprintf(lb->f, "(TIND):%d", *blocknr);
return 0;
}
-static void dump_blocks(FILE *f, ino_t inode)
+static void dump_blocks(FILE *f, const char *prefix, ext2_ino_t inode)
{
struct list_blocks_struct lb;
- fprintf(f, "BLOCKS:\n");
+ fprintf(f, "%sBLOCKS:\n%s", prefix, prefix);
lb.total = 0;
+ lb.first_block = 0;
lb.f = f;
- ext2fs_block_iterate(current_fs, inode, 0, NULL,
+ lb.first = 1;
+ ext2fs_block_iterate2(current_fs, inode, 0, NULL,
list_blocks_proc, (void *)&lb);
+ finish_range(&lb);
if (lb.total)
- fprintf(f, "\nTOTAL: %d\n", lb.total);
+ fprintf(f, "\n%sTOTAL: %d\n", prefix, lb.total);
fprintf(f,"\n");
}
-static void dump_inode(ino_t inode_num, struct ext2_inode inode)
+void internal_dump_inode(FILE *out, const char *prefix,
+ ext2_ino_t inode_num, struct ext2_inode *inode,
+ int do_dump_blocks)
{
const char *i_type;
- FILE *out;
char frag, fsize;
int os = current_fs->super->s_creator_os;
- out = open_pager();
- if (LINUX_S_ISDIR(inode.i_mode)) i_type = "directory";
- else if (LINUX_S_ISREG(inode.i_mode)) i_type = "regular";
- else if (LINUX_S_ISLNK(inode.i_mode)) i_type = "symlink";
- else if (LINUX_S_ISBLK(inode.i_mode)) i_type = "block special";
- else if (LINUX_S_ISCHR(inode.i_mode)) i_type = "character special";
- else if (LINUX_S_ISFIFO(inode.i_mode)) i_type = "FIFO";
- else if (LINUX_S_ISSOCK(inode.i_mode)) i_type = "socket";
+ if (LINUX_S_ISDIR(inode->i_mode)) i_type = "directory";
+ else if (LINUX_S_ISREG(inode->i_mode)) i_type = "regular";
+ else if (LINUX_S_ISLNK(inode->i_mode)) i_type = "symlink";
+ else if (LINUX_S_ISBLK(inode->i_mode)) i_type = "block special";
+ else if (LINUX_S_ISCHR(inode->i_mode)) i_type = "character special";
+ else if (LINUX_S_ISFIFO(inode->i_mode)) i_type = "FIFO";
+ else if (LINUX_S_ISSOCK(inode->i_mode)) i_type = "socket";
else i_type = "bad type";
- fprintf(out, "Inode: %ld Type: %s ", inode_num, i_type);
- fprintf(out, "Mode: %04o Flags: 0x%x Generation: %u\n",
- inode.i_mode & 0777, inode.i_flags, inode.i_generation);
- fprintf(out, "User: %5d Group: %5d Size: ",
- inode.i_uid, inode.i_gid);
- if (LINUX_S_ISDIR(inode.i_mode))
- fprintf(out, "%d\n", inode.i_size);
- else {
- __u64 i_size = (inode.i_size |
- ((unsigned long long)inode.i_size_high << 32));
-
+ fprintf(out, "%sInode: %u Type: %s ", prefix, inode_num, i_type);
+ fprintf(out, "%sMode: %04o Flags: 0x%x Generation: %u\n",
+ prefix,
+ inode->i_mode & 0777, inode->i_flags, inode->i_generation);
+ fprintf(out, "%sUser: %5d Group: %5d Size: ",
+ prefix, inode->i_uid, inode->i_gid);
+ if (LINUX_S_ISREG(inode->i_mode)) {
+ __u64 i_size = (inode->i_size |
+ ((unsigned long long)inode->i_size_high << 32));
+
fprintf(out, "%lld\n", i_size);
- }
+ } else
+ fprintf(out, "%d\n", inode->i_size);
if (current_fs->super->s_creator_os == EXT2_OS_HURD)
fprintf(out,
- "File ACL: %d Directory ACL: %d Translator: %d\n",
- inode.i_file_acl, LINUX_S_ISDIR(inode.i_mode) ? inode.i_dir_acl : 0,
- inode.osd1.hurd1.h_i_translator);
+ "%sFile ACL: %d Directory ACL: %d Translator: %d\n",
+ prefix,
+ inode->i_file_acl, LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0,
+ inode->osd1.hurd1.h_i_translator);
else
- fprintf(out, "File ACL: %d Directory ACL: %d\n",
- inode.i_file_acl, LINUX_S_ISDIR(inode.i_mode) ? inode.i_dir_acl : 0);
- fprintf(out, "Links: %d Blockcount: %d\n", inode.i_links_count,
- inode.i_blocks);
+ fprintf(out, "%sFile ACL: %d Directory ACL: %d\n",
+ prefix,
+ inode->i_file_acl, LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0);
+ fprintf(out, "%sLinks: %d Blockcount: %d\n",
+ prefix, inode->i_links_count, inode->i_blocks);
switch (os) {
case EXT2_OS_LINUX:
- frag = inode.osd2.linux2.l_i_frag;
- fsize = inode.osd2.linux2.l_i_fsize;
+ frag = inode->osd2.linux2.l_i_frag;
+ fsize = inode->osd2.linux2.l_i_fsize;
break;
case EXT2_OS_HURD:
- frag = inode.osd2.hurd2.h_i_frag;
- fsize = inode.osd2.hurd2.h_i_fsize;
+ frag = inode->osd2.hurd2.h_i_frag;
+ fsize = inode->osd2.hurd2.h_i_fsize;
break;
case EXT2_OS_MASIX:
- frag = inode.osd2.masix2.m_i_frag;
- fsize = inode.osd2.masix2.m_i_fsize;
+ frag = inode->osd2.masix2.m_i_frag;
+ fsize = inode->osd2.masix2.m_i_fsize;
break;
default:
frag = fsize = 0;
}
- fprintf(out, "Fragment: Address: %d Number: %d Size: %d\n",
- inode.i_faddr, frag, fsize);
- fprintf(out, "ctime: 0x%08x -- %s", inode.i_ctime,
- time_to_string(inode.i_ctime));
- fprintf(out, "atime: 0x%08x -- %s", inode.i_atime,
- time_to_string(inode.i_atime));
- fprintf(out, "mtime: 0x%08x -- %s", inode.i_mtime,
- time_to_string(inode.i_mtime));
- if (inode.i_dtime)
- fprintf(out, "dtime: 0x%08x -- %s", inode.i_dtime,
- time_to_string(inode.i_dtime));
- if (LINUX_S_ISLNK(inode.i_mode) && inode.i_blocks == 0)
- fprintf(out, "Fast_link_dest: %s\n", (char *)inode.i_block);
- else
- dump_blocks(out, inode_num);
+ fprintf(out, "%sFragment: Address: %d Number: %d Size: %d\n",
+ prefix, inode->i_faddr, frag, fsize);
+ fprintf(out, "%sctime: 0x%08x -- %s", prefix, inode->i_ctime,
+ time_to_string(inode->i_ctime));
+ fprintf(out, "%satime: 0x%08x -- %s", prefix, inode->i_atime,
+ time_to_string(inode->i_atime));
+ fprintf(out, "%smtime: 0x%08x -- %s", prefix, inode->i_mtime,
+ time_to_string(inode->i_mtime));
+ if (inode->i_dtime)
+ fprintf(out, "%sdtime: 0x%08x -- %s", prefix, inode->i_dtime,
+ time_to_string(inode->i_dtime));
+ if (LINUX_S_ISLNK(inode->i_mode) && inode->i_blocks == 0)
+ fprintf(out, "%sFast_link_dest: %.*s\n", prefix,
+ (int) inode->i_size, (char *)inode->i_block);
+ else if (do_dump_blocks)
+ dump_blocks(out, prefix, inode_num);
+}
+
+static void dump_inode(ext2_ino_t inode_num, struct ext2_inode inode)
+{
+ FILE *out;
+
+ out = open_pager();
+ internal_dump_inode(out, "", inode_num, &inode, 1);
close_pager(out);
}
void do_stat(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
struct ext2_inode inode_buf;
- int retval;
+ int retval;
if (argc != 2) {
com_err(argv[0], 0, "Usage: stat <file>");
void do_chroot(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
int retval;
if (argc != 2) {
void do_clri(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
int retval;
struct ext2_inode inode_buf;
void do_freei(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
if (argc != 2) {
com_err(argv[0], 0, "Usage: freei <file>");
void do_seti(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
if (argc != 2) {
com_err(argv[0], 0, "Usage: seti <file>");
void do_testi(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
if (argc != 2) {
com_err(argv[0], 0, "Usage: testi <file>");
return;
if (ext2fs_test_inode_bitmap(current_fs->inode_map,inode))
- printf("Inode %ld is marked in use\n", inode);
+ printf("Inode %u is marked in use\n", inode);
else
- printf("Inode %ld is not in use\n", inode);
+ printf("Inode %u is not in use\n", inode);
}
void do_modify_inode(int argc, char *argv[])
{
struct ext2_inode inode;
- ino_t inode_num;
- int i;
+ ext2_ino_t inode_num;
+ int i;
errcode_t retval;
- unsigned char *frag, *fsize;
- char buf[80];
- int os = current_fs->super->s_creator_os;
- const char *hex_format = "0x%x";
- const char *octal_format = "0%o";
- const char *decimal_format = "%d";
+ unsigned char *frag, *fsize;
+ char buf[80];
+ int os = current_fs->super->s_creator_os;
+ const char *hex_format = "0x%x";
+ const char *octal_format = "0%o";
+ const char *decimal_format = "%d";
if (argc != 2) {
com_err(argv[0], 0, "Usage: modify_inode <file>");
modify_u16(argv[0], "Link count", decimal_format, &inode.i_links_count);
modify_u32(argv[0], "Block count", decimal_format, &inode.i_blocks);
modify_u32(argv[0], "File flags", hex_format, &inode.i_flags);
+ modify_u32(argv[0], "Generation", hex_format, &inode.i_generation);
#if 0
modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1);
#endif
void do_change_working_dir(int argc, char *argv[])
{
- ino_t inode;
- int retval;
+ ext2_ino_t inode;
+ int retval;
if (argc != 2) {
com_err(argv[0], 0, "Usage: cd <file>");
com_err(argv[0], retval,
"while trying to get pathname of cwd");
}
- printf("[pwd] INODE: %6ld PATH: %s\n", cwd, pathname);
+ printf("[pwd] INODE: %6u PATH: %s\n", cwd, pathname);
free(pathname);
retval = ext2fs_get_pathname(current_fs, root, 0, &pathname);
if (retval) {
com_err(argv[0], retval,
"while trying to get pathname of root");
}
- printf("[root] INODE: %6ld PATH: %s\n", root, pathname);
+ printf("[root] INODE: %6u PATH: %s\n", root, pathname);
free(pathname);
return;
}
static void make_link(char *sourcename, char *destname)
{
- ino_t inode;
- int retval;
- ino_t dir;
- char *dest, *cp, *basename;
+ ext2_ino_t inode;
+ int retval;
+ ext2_ino_t dir;
+ char *dest, *cp, *basename;
/*
* Get the source inode
static void unlink_file_by_name(char *filename)
{
- int retval;
- ino_t dir;
- char *basename;
+ int retval;
+ ext2_ino_t dir;
+ char *basename;
basename = strrchr(filename, '/');
if (basename) {
void do_find_free_inode(int argc, char *argv[])
{
- ino_t free_inode, dir;
- int mode;
- int retval;
- char *tmp;
+ ext2_ino_t free_inode, dir;
+ int mode;
+ int retval;
+ char *tmp;
if (argc > 3 || (argc>1 && *argv[1] == '?')) {
com_err(argv[0], 0, "Usage: find_free_inode [dir] [mode]");
if (retval)
com_err("ext2fs_new_inode", retval, "");
else
- printf("Free inode found: %ld\n", free_inode);
+ printf("Free inode found: %u\n", free_inode);
}
-static errcode_t copy_file(int fd, ino_t newfile)
+static errcode_t copy_file(int fd, ext2_ino_t newfile)
{
ext2_file_t e2_file;
errcode_t retval;
- unsigned int got, written;
+ int got;
+ unsigned int written;
char buf[8192];
char *ptr;
void do_write(int argc, char *argv[])
{
- int fd;
- struct stat statbuf;
- ino_t newfile;
- errcode_t retval;
+ int fd;
+ struct stat statbuf;
+ ext2_ino_t newfile;
+ errcode_t retval;
struct ext2_inode inode;
- dgrp_t group;
+ dgrp_t group;
if (check_fs_open(argv[0]))
return;
current_fs->group_desc[group].bg_free_inodes_count--;
current_fs->super->s_free_inodes_count--;
ext2fs_mark_super_dirty(current_fs);
- printf("Allocated inode: %ld\n", newfile);
- retval = ext2fs_link(current_fs, cwd, argv[2], newfile, 0);
+ printf("Allocated inode: %u\n", newfile);
+ retval = ext2fs_link(current_fs, cwd, argv[2], newfile,
+ EXT2_FT_REG_FILE);
if (retval) {
com_err(argv[2], retval, "");
close(fd);
inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL);
inode.i_links_count = 1;
inode.i_size = statbuf.st_size;
- ext2fs_write_inode(current_fs, newfile, &inode);
retval = ext2fs_write_inode(current_fs, newfile, &inode);
if (retval) {
com_err(argv[0], retval, "while trying to write inode %d",
void do_mknod(int argc, char *argv[])
{
- unsigned long mode, major, minor, nr;
- ino_t newfile;
- errcode_t retval;
+ unsigned long mode, major, minor, nr;
+ ext2_ino_t newfile;
+ errcode_t retval;
struct ext2_inode inode;
+ int filetype;
if (check_fs_open(argv[0]))
return;
switch (argv[2][0]) {
case 'p':
mode = LINUX_S_IFIFO;
+ filetype = EXT2_FT_FIFO;
nr = 3;
break;
case 'c':
mode = LINUX_S_IFCHR;
+ filetype = EXT2_FT_CHRDEV;
nr = 5;
break;
case 'b':
mode = LINUX_S_IFBLK;
+ filetype = EXT2_FT_BLKDEV;
nr = 5;
break;
default:
+ filetype = 0;
nr = 0;
}
if (nr == 5) {
com_err(argv[0], retval, "");
return;
}
- printf("Allocated inode: %ld\n", newfile);
- retval = ext2fs_link(current_fs, cwd, argv[1], newfile, 0);
+ printf("Allocated inode: %u\n", newfile);
+ retval = ext2fs_link(current_fs, cwd, argv[1], newfile, filetype);
if (retval) {
if (retval == EXT2_ET_DIR_NO_SPACE) {
retval = ext2fs_expand_dir(current_fs, cwd);
if (!retval)
retval = ext2fs_link(current_fs, cwd,
- argv[1], newfile, 0);
+ argv[1], newfile,
+ filetype);
}
if (retval) {
com_err(argv[1], retval, "");
inode.i_atime = inode.i_ctime = inode.i_mtime = time(NULL);
inode.i_block[0] = major*256+minor;
inode.i_links_count = 1;
- ext2fs_write_inode(current_fs, newfile, &inode);
retval = ext2fs_write_inode(current_fs, newfile, &inode);
if (retval) {
com_err(argv[0], retval, "while trying to write inode %d", inode);
void do_mkdir(int argc, char *argv[])
{
char *cp;
- ino_t parent;
+ ext2_ino_t parent;
char *name;
errcode_t retval;
return 0;
}
-static void kill_file_by_inode(ino_t inode)
+static void kill_file_by_inode(ext2_ino_t inode)
{
struct ext2_inode inode_buf;
inode_buf.i_dtime = time(NULL);
ext2fs_write_inode(current_fs, inode, &inode_buf);
- printf("Kill file by inode %ld\n", inode);
+ printf("Kill file by inode %u\n", inode);
ext2fs_block_iterate(current_fs, inode, 0, NULL,
release_blocks_proc, NULL);
printf("\n");
void do_kill_file(int argc, char *argv[])
{
- ino_t inode_num;
+ ext2_ino_t inode_num;
if (argc != 2) {
com_err(argv[0], 0, "Usage: kill_file <file>");
void do_rm(int argc, char *argv[])
{
int retval;
- ino_t inode_num;
+ ext2_ino_t inode_num;
struct ext2_inode inode;
if (argc != 2) {
void do_expand_dir(int argc, char *argv[])
{
- ino_t inode;
+ ext2_ino_t inode;
int retval;
if (argc != 2) {
else
ext2fs_mark_super_dirty(current_fs);
}
- print_features((struct ext2fs_sb *) current_fs->super, stdout);
+ print_features(current_fs->super, stdout);
}
static int source_file(const char *cmd_file, int sci_idx)
char *tmp;
initialize_ext2_error_table();
- fprintf (stderr, "debugfs %s, %s for EXT2 FS %s, %s\n",
- E2FSPROGS_VERSION, E2FSPROGS_DATE,
- EXT2FS_VERSION, EXT2FS_DATE);
+ fprintf (stderr, "debugfs %s (%s)\n", E2FSPROGS_VERSION,
+ E2FSPROGS_DATE);
- while ((c = getopt (argc, argv, "wcR:f:b:s:V")) != EOF) {
+ while ((c = getopt (argc, argv, "iwcR:f:b:s:V")) != EOF) {
switch (c) {
case 'R':
request = optarg;
case 'f':
cmd_file = optarg;
break;
+ case 'i':
+ open_flags |= EXT2_FLAG_IMAGE_FILE;
+ break;
case 'w':
- open_flags = EXT2_FLAG_RW;
+ open_flags |= EXT2_FLAG_RW;
break;
case 'b':
blocksize = strtoul(optarg, &tmp, 0);