]> git.proxmox.com Git - mirror_zfs.git/blobdiff - lib/libzfs/libzfs_sendrecv.c
Add -vnP support to 'zfs send' for bookmarks
[mirror_zfs.git] / lib / libzfs / libzfs_sendrecv.c
index fddcd9c02fc855bad18b3bffcf6506d39ea046bc..857abda3db523efe4ee920428e05d0ef8431800b 100644 (file)
@@ -1242,16 +1242,14 @@ send_print_verbose(FILE *fout, const char *tosnap, const char *fromsnap,
                }
        }
 
-       if (size != 0) {
-               if (parsable) {
-                       (void) fprintf(fout, "\t%llu",
-                           (longlong_t)size);
-               } else {
-                       char buf[16];
-                       zfs_nicebytes(size, buf, sizeof (buf));
-                       (void) fprintf(fout, dgettext(TEXT_DOMAIN,
-                           " estimated size is %s"), buf);
-               }
+       if (parsable) {
+               (void) fprintf(fout, "\t%llu",
+                   (longlong_t)size);
+       } else if (size != 0) {
+               char buf[16];
+               zfs_nicebytes(size, buf, sizeof (buf));
+               (void) fprintf(fout, dgettext(TEXT_DOMAIN,
+                   " estimated size is %s"), buf);
        }
        (void) fprintf(fout, "\n");
 }
@@ -2113,17 +2111,42 @@ err_out:
 }
 
 int
-zfs_send_one(zfs_handle_t *zhp, const char *from, int fd,
-    enum lzc_send_flags flags)
+zfs_send_one(zfs_handle_t *zhp, const char *from, int fd, sendflags_t flags)
 {
-       int err;
+       int err = 0;
        libzfs_handle_t *hdl = zhp->zfs_hdl;
-
+       enum lzc_send_flags lzc_flags = 0;
+       FILE *fout = (flags.verbose && flags.dryrun) ? stdout : stderr;
        char errbuf[1024];
+
+       if (flags.largeblock)
+               lzc_flags |= LZC_SEND_FLAG_LARGE_BLOCK;
+       if (flags.embed_data)
+               lzc_flags |= LZC_SEND_FLAG_EMBED_DATA;
+       if (flags.compress)
+               lzc_flags |= LZC_SEND_FLAG_COMPRESS;
+       if (flags.raw)
+               lzc_flags |= LZC_SEND_FLAG_RAW;
+
+       if (flags.verbose) {
+               uint64_t size = 0;
+               err = lzc_send_space(zhp->zfs_name, from, lzc_flags, &size);
+               if (err == 0) {
+                       send_print_verbose(fout, zhp->zfs_name, from, size,
+                           flags.parsable);
+               } else {
+                       (void) fprintf(stderr, "Cannot estimate send size: "
+                           "%s\n", strerror(errno));
+               }
+       }
+
+       if (flags.dryrun)
+               return (err);
+
        (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
            "warning: cannot send '%s'"), zhp->zfs_name);
 
-       err = lzc_send(zhp->zfs_name, from, fd, flags);
+       err = lzc_send(zhp->zfs_name, from, fd, lzc_flags);
        if (err != 0) {
                switch (errno) {
                case EXDEV: