]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Illumos 5764 - "zfs send -nv" directs output to stderr
authorManoj Joseph <manoj.joseph@delphix.com>
Fri, 10 Jul 2015 23:54:52 +0000 (01:54 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 14 Jul 2015 17:28:32 +0000 (10:28 -0700)
5764 "zfs send -nv" directs output to stderr
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Paul Dagnelie <paul.dagnelie@delphix.com>
Reviewed by: Basil Crow <basil.crow@delphix.com>
Reviewed by: Steven Hartland <killing@multiplay.co.uk>
Reviewed by: Bayard Bell <buffer.g.overflow@gmail.com>
Approved by: Dan McDonald <danmcd@omniti.com>

References:
  https://github.com/illumos/illumos-gate/commit/dc5f28a
  https://www.illumos.org/issues/5764

Ported-by: kernelOfTruth kerneloftruth@gmail.com
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3585

lib/libzfs/libzfs_sendrecv.c
man/man8/zfs.8

index cdc872caa2dbb40c9b3880925567c1af356deb05..8d1a210947a2c862db95cb8f9b19784fed17c531 100644 (file)
@@ -834,7 +834,8 @@ typedef struct send_dump_data {
        char prevsnap[ZFS_MAXNAMELEN];
        uint64_t prevsnap_obj;
        boolean_t seenfrom, seento, replicate, doall, fromorigin;
-       boolean_t verbose, dryrun, parsable, progress, embed_data, large_block;
+       boolean_t verbose, dryrun, parsable, progress, embed_data, std_out;
+       boolean_t large_block;
        int outfd;
        boolean_t err;
        nvlist_t *fss;
@@ -1062,6 +1063,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
        int err;
        boolean_t isfromsnap, istosnap, fromorigin;
        boolean_t exclude = B_FALSE;
+       FILE *fout = sdd->std_out ? stdout : stderr;
 
        err = 0;
        thissnap = strchr(zhp->zfs_name, '@') + 1;
@@ -1136,30 +1138,30 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
 
                if (sdd->parsable) {
                        if (sdd->prevsnap[0] != '\0') {
-                               (void) fprintf(stderr, "incremental\t%s\t%s",
+                               (void) fprintf(fout, "incremental\t%s\t%s",
                                    sdd->prevsnap, zhp->zfs_name);
                        } else {
-                               (void) fprintf(stderr, "full\t%s",
+                               (void) fprintf(fout, "full\t%s",
                                    zhp->zfs_name);
                        }
                } else {
-                       (void) fprintf(stderr, dgettext(TEXT_DOMAIN,
+                       (void) fprintf(fout, dgettext(TEXT_DOMAIN,
                            "send from @%s to %s"),
                            sdd->prevsnap, zhp->zfs_name);
                }
                if (err == 0) {
                        if (sdd->parsable) {
-                               (void) fprintf(stderr, "\t%llu\n",
+                               (void) fprintf(fout, "\t%llu\n",
                                    (longlong_t)size);
                        } else {
                                char buf[16];
                                zfs_nicenum(size, buf, sizeof (buf));
-                               (void) fprintf(stderr, dgettext(TEXT_DOMAIN,
+                               (void) fprintf(fout, dgettext(TEXT_DOMAIN,
                                    " estimated size is %s\n"), buf);
                        }
                        sdd->size += size;
                } else {
-                       (void) fprintf(stderr, "\n");
+                       (void) fprintf(fout, "\n");
                }
        }
 
@@ -1403,6 +1405,7 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
        int pipefd[2];
        dedup_arg_t dda = { 0 };
        int featureflags = 0;
+       FILE *fout;
 
        (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
            "cannot send '%s'"), zhp->zfs_name);
@@ -1537,6 +1540,9 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
        sdd.filter_cb_arg = cb_arg;
        if (debugnvp)
                sdd.debugnv = *debugnvp;
+       if (sdd.verbose && sdd.dryrun)
+               sdd.std_out = B_TRUE;
+       fout = sdd.std_out ? stdout : stderr;
 
        /*
         * Some flags require that we place user holds on the datasets that are
@@ -1576,12 +1582,12 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap,
 
                if (flags->verbose) {
                        if (flags->parsable) {
-                               (void) fprintf(stderr, "size\t%llu\n",
+                               (void) fprintf(fout, "size\t%llu\n",
                                    (longlong_t)sdd.size);
                        } else {
                                char buf[16];
                                zfs_nicenum(sdd.size, buf, sizeof (buf));
-                               (void) fprintf(stderr, dgettext(TEXT_DOMAIN,
+                               (void) fprintf(fout, dgettext(TEXT_DOMAIN,
                                    "total estimated size is %s\n"), buf);
                        }
                }
index 014ed81032b11fbf6213a2195d28c702393c6594..9f42da38b452ceb29af574f8d5d26d8d110d0f71 100644 (file)
@@ -2830,7 +2830,9 @@ Include the dataset's properties in the stream.  This flag is implicit when -R i
 .RS 4n
 Do a dry-run ("No-op") send.  Do not generate any actual send data.  This is
 useful in conjunction with the \fB-v\fR or \fB-P\fR flags to determine what
-data will be sent.
+data will be sent.  In this case, the verbose output will be written to
+standard output (contrast with a non-dry-run, where the stream is written
+to standard output and the verbose output goes to standard error).
 .RE
 
 .sp