diff options
| author | ahl <none@none> | 2007-01-26 16:04:11 -0800 |
|---|---|---|
| committer | ahl <none@none> | 2007-01-26 16:04:11 -0800 |
| commit | 72bdce51192b13a20009855f749004480874291b (patch) | |
| tree | 4673256e930cceeb5f3b40c4a817413fe4cabecf /usr/src | |
| parent | 939f5b6842eff917e44546d4a0b24d02586ec98d (diff) | |
| download | illumos-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.c | 7 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs.h | 4 | ||||
| -rw-r--r-- | usr/src/lib/libzfs/common/libzfs_dataset.c | 30 |
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", |
