mirror of
https://xff.cz/git/u-boot/
synced 2025-09-22 02:52:13 +02:00
fs: Add a new command to create symbolic links
The command line is: ln <interface> <dev[:part]> target linkname Currently symbolic links are supported only in ext4 and only if the option CMD_EXT4_WRITE is enabled. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
committed by
Tom Rini
parent
5efc0686ee
commit
aaa12157c7
14
cmd/fs.c
14
cmd/fs.c
@@ -76,6 +76,20 @@ U_BOOT_CMD(
|
|||||||
" device type 'interface' instance 'dev'."
|
" device type 'interface' instance 'dev'."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
static int do_ln_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
|
char * const argv[])
|
||||||
|
{
|
||||||
|
return do_ln(cmdtp, flag, argc, argv, FS_TYPE_ANY);
|
||||||
|
}
|
||||||
|
|
||||||
|
U_BOOT_CMD(
|
||||||
|
ln, 5, 1, do_ln_wrapper,
|
||||||
|
"Create a symbolic link",
|
||||||
|
"<interface> <dev[:part]> target linkname\n"
|
||||||
|
" - create a symbolic link to 'target' with the name 'linkname' on\n"
|
||||||
|
" device type 'interface' instance 'dev'."
|
||||||
|
)
|
||||||
|
|
||||||
static int do_fstype_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
static int do_fstype_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||||
char * const argv[])
|
char * const argv[])
|
||||||
{
|
{
|
||||||
|
44
fs/fs.c
44
fs/fs.c
@@ -90,6 +90,11 @@ static inline int fs_write_unsupported(const char *filename, void *buf,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int fs_ln_unsupported(const char *filename, const char *target)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void fs_close_unsupported(void)
|
static inline void fs_close_unsupported(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -154,6 +159,7 @@ struct fstype_info {
|
|||||||
void (*closedir)(struct fs_dir_stream *dirs);
|
void (*closedir)(struct fs_dir_stream *dirs);
|
||||||
int (*unlink)(const char *filename);
|
int (*unlink)(const char *filename);
|
||||||
int (*mkdir)(const char *dirname);
|
int (*mkdir)(const char *dirname);
|
||||||
|
int (*ln)(const char *filename, const char *target);
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct fstype_info fstypes[] = {
|
static struct fstype_info fstypes[] = {
|
||||||
@@ -181,6 +187,7 @@ static struct fstype_info fstypes[] = {
|
|||||||
.opendir = fat_opendir,
|
.opendir = fat_opendir,
|
||||||
.readdir = fat_readdir,
|
.readdir = fat_readdir,
|
||||||
.closedir = fat_closedir,
|
.closedir = fat_closedir,
|
||||||
|
.ln = fs_ln_unsupported,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -197,8 +204,10 @@ static struct fstype_info fstypes[] = {
|
|||||||
.read = ext4_read_file,
|
.read = ext4_read_file,
|
||||||
#ifdef CONFIG_CMD_EXT4_WRITE
|
#ifdef CONFIG_CMD_EXT4_WRITE
|
||||||
.write = ext4_write_file,
|
.write = ext4_write_file,
|
||||||
|
.ln = ext4fs_create_link,
|
||||||
#else
|
#else
|
||||||
.write = fs_write_unsupported,
|
.write = fs_write_unsupported,
|
||||||
|
.ln = fs_ln_unsupported,
|
||||||
#endif
|
#endif
|
||||||
.uuid = ext4fs_uuid,
|
.uuid = ext4fs_uuid,
|
||||||
.opendir = fs_opendir_unsupported,
|
.opendir = fs_opendir_unsupported,
|
||||||
@@ -222,6 +231,7 @@ static struct fstype_info fstypes[] = {
|
|||||||
.opendir = fs_opendir_unsupported,
|
.opendir = fs_opendir_unsupported,
|
||||||
.unlink = fs_unlink_unsupported,
|
.unlink = fs_unlink_unsupported,
|
||||||
.mkdir = fs_mkdir_unsupported,
|
.mkdir = fs_mkdir_unsupported,
|
||||||
|
.ln = fs_ln_unsupported,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_CMD_UBIFS
|
#ifdef CONFIG_CMD_UBIFS
|
||||||
@@ -240,6 +250,7 @@ static struct fstype_info fstypes[] = {
|
|||||||
.opendir = fs_opendir_unsupported,
|
.opendir = fs_opendir_unsupported,
|
||||||
.unlink = fs_unlink_unsupported,
|
.unlink = fs_unlink_unsupported,
|
||||||
.mkdir = fs_mkdir_unsupported,
|
.mkdir = fs_mkdir_unsupported,
|
||||||
|
.ln = fs_ln_unsupported,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_FS_BTRFS
|
#ifdef CONFIG_FS_BTRFS
|
||||||
@@ -258,6 +269,7 @@ static struct fstype_info fstypes[] = {
|
|||||||
.opendir = fs_opendir_unsupported,
|
.opendir = fs_opendir_unsupported,
|
||||||
.unlink = fs_unlink_unsupported,
|
.unlink = fs_unlink_unsupported,
|
||||||
.mkdir = fs_mkdir_unsupported,
|
.mkdir = fs_mkdir_unsupported,
|
||||||
|
.ln = fs_ln_unsupported,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -275,6 +287,7 @@ static struct fstype_info fstypes[] = {
|
|||||||
.opendir = fs_opendir_unsupported,
|
.opendir = fs_opendir_unsupported,
|
||||||
.unlink = fs_unlink_unsupported,
|
.unlink = fs_unlink_unsupported,
|
||||||
.mkdir = fs_mkdir_unsupported,
|
.mkdir = fs_mkdir_unsupported,
|
||||||
|
.ln = fs_ln_unsupported,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -602,6 +615,22 @@ int fs_mkdir(const char *dirname)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fs_ln(const char *fname, const char *target)
|
||||||
|
{
|
||||||
|
struct fstype_info *info = fs_get_info(fs_type);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = info->ln(fname, target);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
printf("** Unable to create link %s -> %s **\n", fname, target);
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
fs_close();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
||||||
int fstype)
|
int fstype)
|
||||||
{
|
{
|
||||||
@@ -840,3 +869,18 @@ int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int do_ln(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
||||||
|
int fstype)
|
||||||
|
{
|
||||||
|
if (argc != 5)
|
||||||
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
|
if (fs_set_blk_dev(argv[1], argv[2], fstype))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (fs_ln(argv[3], argv[4]))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -191,6 +191,8 @@ int do_rm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
|||||||
int fstype);
|
int fstype);
|
||||||
int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
int do_mkdir(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
||||||
int fstype);
|
int fstype);
|
||||||
|
int do_ln(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
||||||
|
int fstype);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine the UUID of the specified filesystem and print it. Optionally it is
|
* Determine the UUID of the specified filesystem and print it. Optionally it is
|
||||||
|
Reference in New Issue
Block a user