mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
Illumos 5764 - "zfs send -nv" directs output to stderr
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
This commit is contained in:
parent
1cddb8c9ff
commit
93f6d7e2e5
@ -834,7 +834,8 @@ typedef struct send_dump_data {
|
|||||||
char prevsnap[ZFS_MAXNAMELEN];
|
char prevsnap[ZFS_MAXNAMELEN];
|
||||||
uint64_t prevsnap_obj;
|
uint64_t prevsnap_obj;
|
||||||
boolean_t seenfrom, seento, replicate, doall, fromorigin;
|
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;
|
int outfd;
|
||||||
boolean_t err;
|
boolean_t err;
|
||||||
nvlist_t *fss;
|
nvlist_t *fss;
|
||||||
@ -1062,6 +1063,7 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
|||||||
int err;
|
int err;
|
||||||
boolean_t isfromsnap, istosnap, fromorigin;
|
boolean_t isfromsnap, istosnap, fromorigin;
|
||||||
boolean_t exclude = B_FALSE;
|
boolean_t exclude = B_FALSE;
|
||||||
|
FILE *fout = sdd->std_out ? stdout : stderr;
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
thissnap = strchr(zhp->zfs_name, '@') + 1;
|
thissnap = strchr(zhp->zfs_name, '@') + 1;
|
||||||
@ -1136,30 +1138,30 @@ dump_snapshot(zfs_handle_t *zhp, void *arg)
|
|||||||
|
|
||||||
if (sdd->parsable) {
|
if (sdd->parsable) {
|
||||||
if (sdd->prevsnap[0] != '\0') {
|
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);
|
sdd->prevsnap, zhp->zfs_name);
|
||||||
} else {
|
} else {
|
||||||
(void) fprintf(stderr, "full\t%s",
|
(void) fprintf(fout, "full\t%s",
|
||||||
zhp->zfs_name);
|
zhp->zfs_name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
|
(void) fprintf(fout, dgettext(TEXT_DOMAIN,
|
||||||
"send from @%s to %s"),
|
"send from @%s to %s"),
|
||||||
sdd->prevsnap, zhp->zfs_name);
|
sdd->prevsnap, zhp->zfs_name);
|
||||||
}
|
}
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
if (sdd->parsable) {
|
if (sdd->parsable) {
|
||||||
(void) fprintf(stderr, "\t%llu\n",
|
(void) fprintf(fout, "\t%llu\n",
|
||||||
(longlong_t)size);
|
(longlong_t)size);
|
||||||
} else {
|
} else {
|
||||||
char buf[16];
|
char buf[16];
|
||||||
zfs_nicenum(size, buf, sizeof (buf));
|
zfs_nicenum(size, buf, sizeof (buf));
|
||||||
(void) fprintf(stderr, dgettext(TEXT_DOMAIN,
|
(void) fprintf(fout, dgettext(TEXT_DOMAIN,
|
||||||
" estimated size is %s\n"), buf);
|
" estimated size is %s\n"), buf);
|
||||||
}
|
}
|
||||||
sdd->size += size;
|
sdd->size += size;
|
||||||
} else {
|
} 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];
|
int pipefd[2];
|
||||||
dedup_arg_t dda = { 0 };
|
dedup_arg_t dda = { 0 };
|
||||||
int featureflags = 0;
|
int featureflags = 0;
|
||||||
|
FILE *fout;
|
||||||
|
|
||||||
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
|
||||||
"cannot send '%s'"), zhp->zfs_name);
|
"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;
|
sdd.filter_cb_arg = cb_arg;
|
||||||
if (debugnvp)
|
if (debugnvp)
|
||||||
sdd.debugnv = *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
|
* 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->verbose) {
|
||||||
if (flags->parsable) {
|
if (flags->parsable) {
|
||||||
(void) fprintf(stderr, "size\t%llu\n",
|
(void) fprintf(fout, "size\t%llu\n",
|
||||||
(longlong_t)sdd.size);
|
(longlong_t)sdd.size);
|
||||||
} else {
|
} else {
|
||||||
char buf[16];
|
char buf[16];
|
||||||
zfs_nicenum(sdd.size, buf, sizeof (buf));
|
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);
|
"total estimated size is %s\n"), buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2830,7 +2830,9 @@ Include the dataset's properties in the stream. This flag is implicit when -R i
|
|||||||
.RS 4n
|
.RS 4n
|
||||||
Do a dry-run ("No-op") send. Do not generate any actual send data. This is
|
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
|
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
|
.RE
|
||||||
|
|
||||||
.sp
|
.sp
|
||||||
|
Loading…
Reference in New Issue
Block a user