summaryrefslogtreecommitdiff
path: root/usr/src/cmd/zfs
diff options
context:
space:
mode:
authormmusante <none@none>2007-04-11 09:10:08 -0700
committermmusante <none@none>2007-04-11 09:10:08 -0700
commitcdf5b4ca0fa5ca7622b06bcb271be9e8a8245fec (patch)
treec4bec9f51e851f4223cfda3f1e15c9bf2a9b6abc /usr/src/cmd/zfs
parent69648175ab3df6ed66211c75234243dbdf9ddd35 (diff)
downloadillumos-joyent-cdf5b4ca0fa5ca7622b06bcb271be9e8a8245fec.tar.gz
PSARC 2007/142 zfs rename -r
6479884 want 'zfs rename -r' to recursively rename snapshots
Diffstat (limited to 'usr/src/cmd/zfs')
-rw-r--r--usr/src/cmd/zfs/zfs_main.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/usr/src/cmd/zfs/zfs_main.c b/usr/src/cmd/zfs/zfs_main.c
index 815b72ea75..73b818abd4 100644
--- a/usr/src/cmd/zfs/zfs_main.c
+++ b/usr/src/cmd/zfs/zfs_main.c
@@ -196,7 +196,8 @@ get_usage(zfs_help_t idx)
"\treceive [-vnF] -d <filesystem>\n"));
case HELP_RENAME:
return (gettext("\trename <filesystem|volume|snapshot> "
- "<filesystem|volume|snapshot>\n"));
+ "<filesystem|volume|snapshot>\n"
+ "\trename -r <snapshot> <snapshot>"));
case HELP_ROLLBACK:
return (gettext("\trollback [-rRf] <snapshot>\n"));
case HELP_SEND:
@@ -1475,7 +1476,7 @@ zfs_do_list(int argc, char **argv)
}
/*
- * zfs rename <fs | snap | vol> <fs | snap | vol>
+ * zfs rename [-r] <fs | snap | vol> <fs | snap | vol>
*
* Renames the given dataset to another of the same type.
*/
@@ -1484,38 +1485,57 @@ static int
zfs_do_rename(int argc, char **argv)
{
zfs_handle_t *zhp;
+ int c;
int ret;
+ int recurse = 0;
/* check options */
- if (argc > 1 && argv[1][0] == '-') {
- (void) fprintf(stderr, gettext("invalid option '%c'\n"),
- argv[1][1]);
- usage(B_FALSE);
+ while ((c = getopt(argc, argv, "r")) != -1) {
+ switch (c) {
+ case 'r':
+ recurse = 1;
+ break;
+ case '?':
+ default:
+ (void) fprintf(stderr, gettext("invalid option '%c'\n"),
+ optopt);
+ usage(B_FALSE);
+ }
}
+ argc -= optind;
+ argv += optind;
+
/* check number of arguments */
- if (argc < 2) {
+ if (argc < 1) {
(void) fprintf(stderr, gettext("missing source dataset "
"argument\n"));
usage(B_FALSE);
}
- if (argc < 3) {
+ if (argc < 2) {
(void) fprintf(stderr, gettext("missing target dataset "
"argument\n"));
usage(B_FALSE);
}
- if (argc > 3) {
+ if (argc > 2) {
(void) fprintf(stderr, gettext("too many arguments\n"));
usage(B_FALSE);
}
- if ((zhp = zfs_open(g_zfs, argv[1], ZFS_TYPE_ANY)) == NULL)
+ if (recurse && strchr(argv[0], '@') == 0) {
+ (void) fprintf(stderr, gettext("source dataset for recursive "
+ "rename must be a snapshot\n"));
+ usage(B_FALSE);
+ }
+
+ if ((zhp = zfs_open(g_zfs, argv[0], ZFS_TYPE_ANY)) == NULL)
return (1);
- ret = (zfs_rename(zhp, argv[2]) != 0);
+ ret = (zfs_rename(zhp, argv[1], recurse) != 0);
if (!ret)
- zpool_log_history(g_zfs, argc, argv, argv[2], B_FALSE, B_FALSE);
+ zpool_log_history(g_zfs, argc + optind, argv - optind, argv[1],
+ B_FALSE, B_FALSE);
zfs_close(zhp);
return (ret);