From abdf84f38ae766f401961d82d4eefdad78ac24ed Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sat, 20 Mar 2004 16:54:15 -0500 Subject: [PATCH] debugfs.c (make_link): Set the filetype information when creating a link. --- TODO | 6 +----- debugfs/ChangeLog | 5 +++++ debugfs/debugfs.c | 42 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 38b7574..3339705 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -Need to process the bad block inode *before* doing the inod scan. +Need to process the bad block inode *before* doing the inode scan. Also check to see if the first block of the inode table is not on the bad block scan, and fix that. We need to check for an inaccurate @@ -193,10 +193,6 @@ TODO list. - Ted ------------------------------------------------------------------ - -Debugfs's link command should set the file type information - --------------------------------------------------------------- From e2fsprogs Debian TODO file as of 1.10-13. diff --git a/debugfs/ChangeLog b/debugfs/ChangeLog index 17f96c9..3f546c8 100644 --- a/debugfs/ChangeLog +++ b/debugfs/ChangeLog @@ -1,3 +1,8 @@ +2004-03-20 Theodore Ts'o + + * debugfs.c (make_link): Set the filetype information when + creating a link. + 2004-02-28 Theodore Ts'o * Release of E2fsprogs 1.35 diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index 2752ff8..e16ac84 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -818,9 +818,39 @@ void do_print_working_directory(int argc, char *argv[]) return; } +/* + * Given a mode, return the ext2 file type + */ +static int ext2_file_type(unsigned int mode) +{ + if (LINUX_S_ISREG(mode)) + return EXT2_FT_REG_FILE; + + if (LINUX_S_ISDIR(mode)) + return EXT2_FT_DIR; + + if (LINUX_S_ISCHR(mode)) + return EXT2_FT_CHRDEV; + + if (LINUX_S_ISBLK(mode)) + return EXT2_FT_BLKDEV; + + if (LINUX_S_ISLNK(mode)) + return EXT2_FT_SYMLINK; + + if (LINUX_S_ISFIFO(mode)) + return EXT2_FT_FIFO; + + if (LINUX_S_ISSOCK(mode)) + return EXT2_FT_SOCK; + + return 0; +} + static void make_link(char *sourcename, char *destname) { - ext2_ino_t inode; + ext2_ino_t ino; + struct ext2_inode inode; int retval; ext2_ino_t dir; char *dest, *cp, *basename; @@ -828,8 +858,8 @@ static void make_link(char *sourcename, char *destname) /* * Get the source inode */ - inode = string_to_inode(sourcename); - if (!inode) + ino = string_to_inode(sourcename); + if (!ino) return; basename = strrchr(sourcename, '/'); if (basename) @@ -859,8 +889,12 @@ static void make_link(char *sourcename, char *destname) dest = destname; } } + + if (debugfs_read_inode(ino, &inode, sourcename)) + return; - retval = ext2fs_link(current_fs, dir, dest, inode, 0); + retval = ext2fs_link(current_fs, dir, dest, ino, + ext2_file_type(inode.i_mode)); if (retval) com_err("make_link", retval, ""); return; -- 1.8.3.1