summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorahl <none@none>2007-01-26 16:04:11 -0800
committerahl <none@none>2007-01-26 16:04:11 -0800
commit72bdce51192b13a20009855f749004480874291b (patch)
tree4673256e930cceeb5f3b40c4a817413fe4cabecf /usr/src
parent939f5b6842eff917e44546d4a0b24d02586ec98d (diff)
downloadillumos-gate-72bdce51192b13a20009855f749004480874291b.tar.gz
6516175 zfs_send()/zfs_receive() should take file descriptor arguments
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/zfs/zfs_main.c7
-rw-r--r--usr/src/lib/libzfs/common/libzfs.h4
-rw-r--r--usr/src/lib/libzfs/common/libzfs_dataset.c30
3 files changed, 21 insertions, 20 deletions
diff --git a/usr/src/cmd/zfs/zfs_main.c b/usr/src/cmd/zfs/zfs_main.c
index d88a2edf33..1e728a1eda 100644
--- a/usr/src/cmd/zfs/zfs_main.c
+++ b/usr/src/cmd/zfs/zfs_main.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -2118,7 +2118,7 @@ zfs_do_send(int argc, char **argv)
}
}
- err = zfs_send(zhp, fromname);
+ err = zfs_send(zhp, fromname, STDOUT_FILENO);
zfs_close(zhp);
return (err != 0);
@@ -2186,7 +2186,8 @@ zfs_do_receive(int argc, char **argv)
return (1);
}
- err = zfs_receive(g_zfs, argv[0], isprefix, verbose, dryrun, force);
+ err = zfs_receive(g_zfs, argv[0], isprefix, verbose, dryrun, force,
+ STDIN_FILENO);
if (!err) {
zpool_log_history(g_zfs, argc + optind, argv - optind, argv[0],
diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h
index 2dd7326918..685f7b5a14 100644
--- a/usr/src/lib/libzfs/common/libzfs.h
+++ b/usr/src/lib/libzfs/common/libzfs.h
@@ -306,9 +306,9 @@ extern int zfs_clone(zfs_handle_t *, const char *, nvlist_t *);
extern int zfs_snapshot(libzfs_handle_t *, const char *, boolean_t);
extern int zfs_rollback(zfs_handle_t *, zfs_handle_t *, int);
extern int zfs_rename(zfs_handle_t *, const char *);
-extern int zfs_send(zfs_handle_t *, const char *);
+extern int zfs_send(zfs_handle_t *, const char *, int);
extern int zfs_receive(libzfs_handle_t *, const char *, int, int, int,
- boolean_t);
+ boolean_t, int);
extern int zfs_promote(zfs_handle_t *);
/*
diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c
index 6d3330d0d5..d59829c1d2 100644
--- a/usr/src/lib/libzfs/common/libzfs_dataset.c
+++ b/usr/src/lib/libzfs/common/libzfs_dataset.c
@@ -2479,7 +2479,7 @@ zfs_create_link_cb(zfs_handle_t *zhp, void *arg)
}
/*
- * Takes a snapshot of the given dataset
+ * Takes a snapshot of the given dataset.
*/
int
zfs_snapshot(libzfs_handle_t *hdl, const char *path, boolean_t recursive)
@@ -2544,27 +2544,27 @@ zfs_snapshot(libzfs_handle_t *hdl, const char *path, boolean_t recursive)
}
/*
- * Dumps a backup of tosnap, incremental from fromsnap if it isn't NULL.
+ * Dumps a backup of the given snapshot (incremental from fromsnap if it's not
+ * NULL) to the file descriptor specified by outfd.
*/
int
-zfs_send(zfs_handle_t *zhp, const char *fromsnap)
+zfs_send(zfs_handle_t *zhp, const char *fromsnap, int outfd)
{
zfs_cmd_t zc = { 0 };
- int ret;
char errbuf[1024];
libzfs_handle_t *hdl = zhp->zfs_hdl;
- (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
- "cannot send '%s'"), zhp->zfs_name);
+ assert(zhp->zfs_type == ZFS_TYPE_SNAPSHOT);
- /* do the ioctl() */
(void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name));
if (fromsnap)
(void) strlcpy(zc.zc_value, fromsnap, sizeof (zc.zc_name));
- zc.zc_cookie = STDOUT_FILENO;
+ zc.zc_cookie = outfd;
+
+ if (ioctl(zhp->zfs_hdl->libzfs_fd, ZFS_IOC_SENDBACKUP, &zc) != 0) {
+ (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
+ "cannot send '%s'"), zhp->zfs_name);
- ret = ioctl(zhp->zfs_hdl->libzfs_fd, ZFS_IOC_SENDBACKUP, &zc);
- if (ret != 0) {
switch (errno) {
case EXDEV:
@@ -2591,7 +2591,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap)
}
}
- return (ret);
+ return (0);
}
/*
@@ -2662,11 +2662,11 @@ ancestorerr:
}
/*
- * Restores a backup of tosnap from stdin.
+ * Restores a backup of tosnap from the file descriptor specified by infd.
*/
int
zfs_receive(libzfs_handle_t *hdl, const char *tosnap, int isprefix,
- int verbose, int dryrun, boolean_t force)
+ int verbose, int dryrun, boolean_t force, int infd)
{
zfs_cmd_t zc = { 0 };
time_t begin_time;
@@ -2687,7 +2687,7 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, int isprefix,
cp = (char *)&drr;
bytes = 0;
do {
- size = read(STDIN_FILENO, cp, sizeof (drr) - bytes);
+ size = read(infd, cp, sizeof (drr) - bytes);
cp += size;
bytes += size;
} while (size > 0);
@@ -2826,7 +2826,7 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, int isprefix,
}
- zc.zc_cookie = STDIN_FILENO;
+ zc.zc_cookie = infd;
zc.zc_guid = force;
if (verbose) {
(void) printf("%s %s stream of %s into %s\n",