int journal_enable_debug = -1;
#endif
+/*
+ * There must be only one definition if we're hooking in extra commands or
+ * chaging default prompt. Use -DSKIP_GLOBDEF for that.
+ */
+#ifndef SKIP_GLOBDEFS
ss_request_table *extra_cmds;
const char *debug_prog_name;
-int sci_idx;
+#endif
+int ss_sci_idx;
ext2_filsys current_fs;
quota_ctx_t current_qctx;
ext2_ino_t root, cwd;
+int no_copy_xattrs;
static int debugfs_setup_tdb(const char *device_name, char *undo_file,
io_manager *io_ptr)
{
errcode_t retval = ENOMEM;
- char *tdb_dir = NULL, *tdb_file = NULL;
- char *dev_name, *tmp_name;
+ const char *tdb_dir = NULL;
+ char *tdb_file = NULL;
+ char *dev_name, *tmp_name;
/* (re)open a specific undo file */
if (undo_file && undo_file[0] != 0) {
try_open_again:
retval = ext2fs_open(device, open_flags, superblock, blocksize,
io_ptr, ¤t_fs);
- if (retval && !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) {
+ if (retval && (retval == EXT2_ET_SB_CSUM_INVALID) &&
+ !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) {
open_flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS;
printf("Checksum errors in superblock! Retrying...\n");
goto try_open_again;
com_err(device, retval, "while trying to close filesystem");
}
-void do_open_filesys(int argc, char **argv)
+void do_open_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int c, err;
int catastrophic = 0;
"<device>\n", argv[0]);
}
-void do_lcd(int argc, char **argv)
+void do_lcd(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
if (argc != 2) {
com_err(argv[0], 0, "Usage: %s %s", argv[0], "<native dir>");
return;
}
-void do_close_filesys(int argc, char **argv)
+void do_close_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int c;
}
#ifndef READ_ONLY
-void do_init_filesys(int argc, char **argv)
+void do_init_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
struct ext2_super_block param;
errcode_t retval;
}
}
-void do_show_super_stats(int argc, char *argv[])
+void do_show_super_stats(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
const char *units ="block";
dgrp_t i;
#ifndef READ_ONLY
void do_dirty_filesys(int argc EXT2FS_ATTR((unused)),
- char **argv EXT2FS_ATTR((unused)))
+ char **argv EXT2FS_ATTR((unused)),
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
if (check_fs_open(argv[0]))
return;
if (is_large_inode && large_inode->i_extra_isize >= 32)
fprintf(out, " Project: %5d", large_inode->i_projid);
fputs(" Size: ", out);
- if (LINUX_S_ISREG(inode->i_mode))
+ if (LINUX_S_ISREG(inode->i_mode) || LINUX_S_ISDIR(inode->i_mode))
fprintf(out, "%llu\n", EXT2_I_SIZE(inode));
else
fprintf(out, "%d\n", inode->i_size);
close_pager(out);
}
-void do_stat(int argc, char *argv[])
+void do_stat(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
struct ext2_inode * inode_buf;
return;
}
- if (debugfs_read_inode_full(inode, inode_buf, argv[0],
- EXT2_INODE_SIZE(current_fs->super))) {
+ if (debugfs_read_inode2(inode, inode_buf, argv[0],
+ EXT2_INODE_SIZE(current_fs->super), 0)) {
free(inode_buf);
return;
}
return;
}
-void do_dump_extents(int argc, char **argv)
+void do_dump_extents(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
struct ext2_inode inode;
ext2_ino_t ino;
return 0;
}
-void do_blocks(int argc, char *argv[])
+void do_blocks(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
return;
}
-void do_chroot(int argc, char *argv[])
+void do_chroot(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
int retval;
}
#ifndef READ_ONLY
-void do_clri(int argc, char *argv[])
+void do_clri(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
struct ext2_inode inode_buf;
return;
}
-void do_freei(int argc, char *argv[])
+void do_freei(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
unsigned int len = 1;
int err = 0;
ext2fs_mark_ib_dirty(current_fs);
}
-void do_seti(int argc, char *argv[])
+void do_seti(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
unsigned int len = 1;
int err = 0;
}
#endif /* READ_ONLY */
-void do_testi(int argc, char *argv[])
+void do_testi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
}
#ifndef READ_ONLY
-void do_freeb(int argc, char *argv[])
+void do_freeb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
blk64_t block;
blk64_t count = 1;
ext2fs_mark_bb_dirty(current_fs);
}
-void do_setb(int argc, char *argv[])
+void do_setb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
blk64_t block;
blk64_t count = 1;
}
#endif /* READ_ONLY */
-void do_testb(int argc, char *argv[])
+void do_testb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
blk64_t block;
blk64_t count = 1;
}
-void do_modify_inode(int argc, char *argv[])
+void do_modify_inode(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
struct ext2_inode inode;
ext2_ino_t inode_num;
}
#endif /* READ_ONLY */
-void do_change_working_dir(int argc, char *argv[])
+void do_change_working_dir(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
int retval;
return;
}
-void do_print_working_directory(int argc, char *argv[])
+void do_print_working_directory(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int retval;
char *pathname = NULL;
}
-void do_link(int argc, char *argv[])
+void do_link(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
if (common_args_process(argc, argv, 3, 3, "link",
"<source file> <dest_name>", CHECK_FS_RW))
return 0;
}
-void do_undel(int argc, char *argv[])
+void do_undel(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t ino;
struct ext2_inode inode;
return;
}
-void do_unlink(int argc, char *argv[])
+void do_unlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
if (common_args_process(argc, argv, 2, 2, "link",
"<pathname>", CHECK_FS_RW))
unlink_file_by_name(argv[1]);
}
-void do_copy_inode(int argc, char *argv[])
+void do_copy_inode(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t src_ino, dest_ino;
unsigned char buf[4096];
if (!dest_ino)
return;
- if (debugfs_read_inode_full(src_ino, (struct ext2_inode *) buf,
- argv[0], sizeof(buf)))
+ if (debugfs_read_inode2(src_ino, (struct ext2_inode *) buf,
+ argv[0], sizeof(buf), 0))
return;
- if (debugfs_write_inode_full(dest_ino, (struct ext2_inode *) buf,
- argv[0], sizeof(buf)))
+ if (debugfs_write_inode2(dest_ino, (struct ext2_inode *) buf,
+ argv[0], sizeof(buf), 0))
return;
}
#endif /* READ_ONLY */
-void do_find_free_block(int argc, char *argv[])
+void do_find_free_block(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
blk64_t free_blk, goal, first_free = 0;
int count;
printf("\n");
}
-void do_find_free_inode(int argc, char *argv[])
+void do_find_free_inode(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t free_inode, dir;
int mode;
}
#ifndef READ_ONLY
-void do_write(int argc, char *argv[])
+void do_write(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
errcode_t retval;
com_err(argv[0], retval, 0);
}
-void do_mknod(int argc, char *argv[])
+void do_mknod(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
unsigned long major, minor;
errcode_t retval;
goto usage;
st.st_rdev = makedev(major, minor);
- retval = do_mknod_internal(current_fs, cwd, argv[1], &st);
+ retval = do_mknod_internal(current_fs, cwd, argv[1],
+ st.st_mode, st.st_rdev);
if (retval)
com_err(argv[0], retval, 0);
}
-void do_mkdir(int argc, char *argv[])
+void do_mkdir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
errcode_t retval;
}
-void do_kill_file(int argc, char *argv[])
+void do_kill_file(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode_num;
kill_file_by_inode(inode_num);
}
-void do_rm(int argc, char *argv[])
+void do_rm(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int retval;
ext2_ino_t inode_num;
return 0;
}
-void do_rmdir(int argc, char *argv[])
+void do_rmdir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int retval;
ext2_ino_t inode_num;
#endif /* READ_ONLY */
void do_show_debugfs_params(int argc EXT2FS_ATTR((unused)),
- char *argv[] EXT2FS_ATTR((unused)))
+ char *argv[] EXT2FS_ATTR((unused)),
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
if (current_fs)
printf("Open mode: read-%s\n",
}
#ifndef READ_ONLY
-void do_expand_dir(int argc, char *argv[])
+void do_expand_dir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t inode;
int retval;
return;
}
-void do_features(int argc, char *argv[])
+void do_features(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int i;
}
#endif /* READ_ONLY */
-void do_bmap(int argc, char *argv[])
+void do_bmap(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t ino;
blk64_t blk, pblk = 0;
fputc('\n', stdout);
}
-void do_imap(int argc, char *argv[])
+void do_imap(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t ino;
unsigned long group, block, block_nr, offset;
}
-void do_idump(int argc, char *argv[])
+void do_idump(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
struct ext2_inode_large *inode;
ext2_ino_t ino;
reset_getopt();
while ((c = getopt (argc, argv, "bex")) != EOF) {
if (mode || c == '?') {
- print_usage:
com_err(argv[0], 0,
"Usage: inode_dump [-b]|[-e] <file>");
return;
case 'x':
case 'e':
if (size <= EXT2_GOOD_OLD_INODE_SIZE) {
- no_extra_space:
com_err(argv[0], 0, "No extra space in inode");
goto err;
}
}
#ifndef READ_ONLY
-void do_set_current_time(int argc, char *argv[])
+void do_set_current_time(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
__s64 now;
return 0;
}
-void do_supported_features(int argc, char *argv[])
+void do_supported_features(int argc, char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
int ret;
__u32 supp[3] = { EXT2_LIB_FEATURE_COMPAT_SUPP,
}
#ifndef READ_ONLY
-void do_punch(int argc, char *argv[])
+void do_punch(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t ino;
blk64_t start, end;
}
}
-void do_fallocate(int argc, char *argv[])
+void do_fallocate(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
ext2_ino_t ino;
blk64_t start, end;
}
#endif /* READ_ONLY */
-void do_symlink(int argc, char *argv[])
+void do_symlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
errcode_t retval;
}
#if CONFIG_MMP
-void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[])
+void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[],
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
struct mmp_struct *mmp_s;
unsigned long long mmp_block;
fprintf(stdout, "check_interval: %d\n", mmp_s->mmp_check_interval);
fprintf(stdout, "sequence: %08x\n", mmp_s->mmp_seq);
fprintf(stdout, "time: %lld -- %s", mmp_s->mmp_time, ctime(&t));
- fprintf(stdout, "node_name: %s\n", mmp_s->mmp_nodename);
- fprintf(stdout, "device_name: %s\n", mmp_s->mmp_bdevname);
+ fprintf(stdout, "node_name: %.*s\n",
+ EXT2_LEN_STR(mmp_s->mmp_nodename));
+ fprintf(stdout, "device_name: %.*s\n",
+ EXT2_LEN_STR(mmp_s->mmp_bdevname));
fprintf(stdout, "magic: 0x%x\n", mmp_s->mmp_magic);
fprintf(stdout, "checksum: 0x%08x\n", mmp_s->mmp_checksum);
}
#else
void do_dump_mmp(int argc EXT2FS_ATTR((unused)),
- char *argv[] EXT2FS_ATTR((unused)))
+ char *argv[] EXT2FS_ATTR((unused)),
+ int sci_idx EXT2FS_ATTR((unused)),
+ void *infop EXT2FS_ATTR((unused)))
{
fprintf(stdout, "MMP is unsupported, please recompile with "
"--enable-mmp\n");
superblock, blocksize, catastrophic,
data_filename, undo_file);
- sci_idx = ss_create_invocation(debug_prog_name, "0.0", (char *) NULL,
- &debug_cmds, &retval);
+ ss_sci_idx = ss_create_invocation(debug_prog_name, "0.0", (char *) NULL,
+ &debug_cmds, &retval);
if (retval) {
- ss_perror(sci_idx, retval, "creating invocation");
+ ss_perror(ss_sci_idx, retval, "creating invocation");
exit(1);
}
- ss_get_readline(sci_idx);
+ ss_get_readline(ss_sci_idx);
- (void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &retval);
+ (void) ss_add_request_table(ss_sci_idx, &ss_std_requests, 1, &retval);
if (retval) {
- ss_perror(sci_idx, retval, "adding standard requests");
+ ss_perror(ss_sci_idx, retval, "adding standard requests");
exit (1);
}
if (extra_cmds)
- ss_add_request_table (sci_idx, extra_cmds, 1, &retval);
+ ss_add_request_table(ss_sci_idx, extra_cmds, 1, &retval);
if (retval) {
- ss_perror(sci_idx, retval, "adding extra requests");
+ ss_perror(ss_sci_idx, retval, "adding extra requests");
exit (1);
}
if (request) {
retval = 0;
- retval = ss_execute_line(sci_idx, request);
+ retval = ss_execute_line(ss_sci_idx, request);
if (retval) {
- ss_perror(sci_idx, retval, request);
+ ss_perror(ss_sci_idx, retval, request);
exit_status++;
}
} else if (cmd_file) {
- exit_status = source_file(cmd_file, sci_idx);
+ exit_status = source_file(cmd_file, ss_sci_idx);
} else {
- ss_listen(sci_idx);
+ ss_listen(ss_sci_idx);
}
- ss_delete_invocation(sci_idx);
+ ss_delete_invocation(ss_sci_idx);
if (current_fs)
close_filesystem();