From: David Sterba Date: Mon, 7 Nov 2016 15:51:20 +0000 (+0100) Subject: btrfs-progs: send: check for output file existence before creating X-Git-Tag: upstream/4.16.1~1032 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=84d1f29d47839ab60e8362f0e05f176d0c6d0755;p=platform%2Fupstream%2Fbtrfs-progs.git btrfs-progs: send: check for output file existence before creating In some cases the root might not be able to create the output file (and streaming to stdout is not an option). Make the output file creation two step and let it work if the file is already created. Signed-off-by: David Sterba --- diff --git a/cmds-send.c b/cmds-send.c index fbb2f80..7aa4b36 100644 --- a/cmds-send.c +++ b/cmds-send.c @@ -571,7 +571,20 @@ int cmd_send(int argc, char **argv) usage(cmd_send_usage); if (outname[0]) { - send.dump_fd = creat(outname, 0600); + int tmpfd; + + /* + * Try to use an existing file first. Even if send runs as + * root, it might not have permissions to create file (eg. on a + * NFS) but it should still be able to use a pre-created file. + */ + tmpfd = open(outname, O_WRONLY | O_TRUNC); + if (tmpfd < 0) { + if (errno == ENOENT) + tmpfd = open(outname, + O_CREAT | O_WRONLY | O_TRUNC, 0600); + } + send.dump_fd = tmpfd; if (send.dump_fd == -1) { ret = -errno; error("cannot create '%s': %s", outname, strerror(-ret));