Whamcloud - gitweb
debugfs: add symlink command
authorDarren Hart <dvhart@infradead.org>
Fri, 4 Jan 2013 20:00:59 +0000 (12:00 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 16 Jan 2013 19:09:20 +0000 (14:09 -0500)
Add support for symbolic links using a new symlink command.  Modeled
after the do_mkdir() command.

Testing demonstrates both fastlinks and slowlinks work correctly.
Very long target paths fail as the command parsing appears to truncate
the input to somewhere around 256 bytes.

Signed-off-by: Darren Hart <dvhart@infradead.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: Andreas Dilger <adilger@dilger.ca>
debugfs/debug_cmds.ct
debugfs/debugfs.8.in
debugfs/debugfs.c
debugfs/debugfs.h

index 4e50ab5..96ff00f 100644 (file)
@@ -160,6 +160,9 @@ request do_bmap, "Calculate the logical->physical block mapping for an inode",
 request do_punch, "Punch (or truncate) blocks from an inode by deallocating them",
        punch, truncate;
 
+request do_symlink, "Create a symbolic link",
+       symlink;
+
 request do_imap, "Calculate the location of an inode",
        imap;
 
index bf93622..e563b0d 100644 (file)
@@ -465,6 +465,9 @@ is, all of the blocks starting at
 .I start_blk
 through to the end of the file will be deallocated.
 .TP
+.I symlink filespec target
+Make a symbolic link.
+.TP
 .I pwd
 Print the current working directory.
 .TP
index b4eb805..59860e7 100644 (file)
@@ -2190,6 +2190,49 @@ void do_punch(int argc, char *argv[])
 }
 #endif /* READ_ONLY */
 
+void do_symlink(int argc, char *argv[])
+{
+       char            *cp;
+       ext2_ino_t      parent;
+       char            *name, *target;
+       errcode_t       retval;
+
+       if (common_args_process(argc, argv, 3, 3, "symlink",
+                               "<filename> <target>", CHECK_FS_RW))
+               return;
+
+       cp = strrchr(argv[1], '/');
+       if (cp) {
+               *cp = 0;
+               parent = string_to_inode(argv[1]);
+               if (!parent) {
+                       com_err(argv[1], ENOENT, 0);
+                       return;
+               }
+               name = cp+1;
+       } else {
+               parent = cwd;
+               name = argv[1];
+       }
+       target = argv[2];
+
+try_again:
+       retval = ext2fs_symlink(current_fs, parent, 0, name, target);
+       if (retval == EXT2_ET_DIR_NO_SPACE) {
+               retval = ext2fs_expand_dir(current_fs, parent);
+               if (retval) {
+                       com_err(argv[0], retval, "while expanding directory");
+                       return;
+               }
+               goto try_again;
+       }
+       if (retval) {
+               com_err("ext2fs_symlink", retval, 0);
+               return;
+       }
+
+}
+
 void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[])
 {
        struct ext2_super_block *sb;
index ea09e53..45175cf 100644 (file)
@@ -162,6 +162,7 @@ extern void do_imap(int argc, char **argv);
 extern void do_set_current_time(int argc, char **argv);
 extern void do_supported_features(int argc, char **argv);
 extern void do_punch(int argc, char **argv);
+extern void do_symlink(int argc, char **argv);
 
 extern void do_dump_mmp(int argc, char **argv);
 extern void do_set_mmp_value(int argc, char **argv);