X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmds-receive.c;h=62a79850580b852253ac797927f94c914c7f4d98;hb=981441102199c5c9e3fca84ff3e723ddfa78de01;hp=d4b310332529b380c8756e6e6c362ec2aa0a64f0;hpb=38c5382e3f7e02ad3669c8d4a0a37d86e4868e9d;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-receive.c b/cmds-receive.c index d4b3103..62a7985 100644 --- a/cmds-receive.c +++ b/cmds-receive.c @@ -17,6 +17,7 @@ */ #include "kerncompat.h" +#include "androidcompat.h" #include #include @@ -25,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -100,7 +101,7 @@ static int finish_subvol(struct btrfs_receive *r) O_RDONLY | O_NOATIME); if (subvol_fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: open %s failed. %s\n", + error("cannot open %s: %s\n", r->cur_subvol_path, strerror(-ret)); goto out; } @@ -118,7 +119,7 @@ static int finish_subvol(struct btrfs_receive *r) ret = ioctl(subvol_fd, BTRFS_IOC_SET_RECEIVED_SUBVOL, &rs_args); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: BTRFS_IOC_SET_RECEIVED_SUBVOL failed. %s\n", + error("ioctl BTRFS_IOC_SET_RECEIVED_SUBVOL failed: %s", strerror(-ret)); goto out; } @@ -127,7 +128,7 @@ static int finish_subvol(struct btrfs_receive *r) ret = ioctl(subvol_fd, BTRFS_IOC_SUBVOL_GETFLAGS, &flags); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: BTRFS_IOC_SUBVOL_GETFLAGS failed. %s\n", + error("ioctl BTRFS_IOC_SUBVOL_GETFLAGS failed: %s", strerror(-ret)); goto out; } @@ -137,8 +138,8 @@ static int finish_subvol(struct btrfs_receive *r) ret = ioctl(subvol_fd, BTRFS_IOC_SUBVOL_SETFLAGS, &flags); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to make subvolume read only. " - "%s\n", strerror(-ret)); + error("failed to make subvolume read only: %s", + strerror(-ret)); goto out; } @@ -165,23 +166,32 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid, if (ret < 0) goto out; - BUG_ON(r->cur_subvol.path); - BUG_ON(r->cur_subvol_path[0]); + if (r->cur_subvol.path) { + error("subvol: another one already started, path ptr: %s", + r->cur_subvol.path); + ret = -EINVAL; + goto out; + } + if (r->cur_subvol_path[0]) { + error("subvol: another one already started, path buf: %s", + r->cur_subvol.path); + ret = -EINVAL; + goto out; + } - if (strlen(r->dest_dir_path) == 0) { + if (*r->dest_dir_path == 0) { strncpy_null(r->cur_subvol_path, path); } else { ret = path_cat_out(r->cur_subvol_path, r->dest_dir_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: subvol: path invalid: %s\n", - path); + error("subvol: path invalid: %s\n", path); goto out; } } ret = path_cat3_out(r->full_subvol_path, r->root_path, r->dest_dir_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: subvol: path invalid: %s\n", path); + error("subvol: path invalid: %s", path); goto out; } @@ -202,8 +212,7 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid, ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: creating subvolume %s failed. " - "%s\n", path, strerror(-ret)); + error("creating subvolume %s failed: %s", path, strerror(-ret)); goto out; } @@ -225,23 +234,32 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid, if (ret < 0) goto out; - BUG_ON(r->cur_subvol.path); - BUG_ON(r->cur_subvol_path[0]); + if (r->cur_subvol.path) { + error("snapshot: another one already started, path ptr: %s", + r->cur_subvol.path); + ret = -EINVAL; + goto out; + } + if (r->cur_subvol_path[0]) { + error("snapshot: another one already started, path buf: %s", + r->cur_subvol.path); + ret = -EINVAL; + goto out; + } - if (strlen(r->dest_dir_path) == 0) { + if (*r->dest_dir_path == 0) { strncpy_null(r->cur_subvol_path, path); } else { ret = path_cat_out(r->cur_subvol_path, r->dest_dir_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: snapshot: path invalid: %s\n", - path); + error("snapshot: path invalid: %s", path); goto out; } } ret = path_cat3_out(r->full_subvol_path, r->root_path, r->dest_dir_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: snapshot: path invalid: %s\n", path); + error("snapshot: path invalid: %s", path); goto out; } @@ -271,7 +289,7 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid, } if (!parent_subvol) { ret = -ENOENT; - fprintf(stderr, "ERROR: could not find parent subvolume\n"); + error("cannot find parent subvolume"); goto out; } @@ -290,8 +308,8 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid, /* First make sure the parent subvol is actually in our path */ if (sub_len < root_len || strstr(parent_subvol->path, r->full_root_path) == NULL) { - fprintf(stderr, "ERROR: parent subvol is not reachable" - " from inside the root subvol.\n"); + error( + "parent subvol is not reachable from inside the root subvol"); ret = -ENOENT; goto out; } @@ -325,7 +343,7 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid, } }*/ - if (strlen(parent_subvol->path) == 0) + if (*parent_subvol->path == 0) args_v2.fd = dup(r->mnt_fd); else args_v2.fd = openat(r->mnt_fd, parent_subvol->path, @@ -333,7 +351,7 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid, if (args_v2.fd < 0) { ret = -errno; if (errno != ENOENT) - fprintf(stderr, "ERROR: open %s failed. %s\n", + error("cannot open %s: %s", parent_subvol->path, strerror(-ret)); else fprintf(stderr, @@ -348,9 +366,8 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid, close(args_v2.fd); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: creating snapshot %s -> %s " - "failed. %s\n", parent_subvol->path, - path, strerror(-ret)); + error("creating snapshot %s -> %s failed: %s", + parent_subvol->path, path, strerror(-ret)); goto out; } @@ -370,7 +387,7 @@ static int process_mkfile(const char *path, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: mkfile: path invalid: %s\n", path); + error("mkfile: path invalid: %s", path); goto out; } @@ -380,8 +397,7 @@ static int process_mkfile(const char *path, void *user) ret = creat(full_path, 0600); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: mkfile %s failed. %s\n", path, - strerror(-ret)); + error("mkfile %s failed: %s", path, strerror(-ret)); goto out; } close(ret); @@ -399,7 +415,7 @@ static int process_mkdir(const char *path, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: mkdir: path invalid: %s\n", path); + error("mkdir: path invalid: %s", path); goto out; } @@ -409,8 +425,7 @@ static int process_mkdir(const char *path, void *user) ret = mkdir(full_path, 0700); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: mkdir %s failed. %s\n", path, - strerror(-ret)); + error("mkdir %s failed: %s", path, strerror(-ret)); } out: @@ -425,7 +440,7 @@ static int process_mknod(const char *path, u64 mode, u64 dev, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: mknod: path invalid: %s\n", path); + error("mknod: path invalid: %s", path); goto out; } @@ -436,8 +451,7 @@ static int process_mknod(const char *path, u64 mode, u64 dev, void *user) ret = mknod(full_path, mode & S_IFMT, dev); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: mknod %s failed. %s\n", path, - strerror(-ret)); + error("mknod %s failed: %s", path, strerror(-ret)); } out: @@ -452,7 +466,7 @@ static int process_mkfifo(const char *path, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: mkfifo: path invalid: %s\n", path); + error("mkfifo: path invalid: %s", path); goto out; } @@ -462,8 +476,7 @@ static int process_mkfifo(const char *path, void *user) ret = mkfifo(full_path, 0600); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: mkfifo %s failed. %s\n", path, - strerror(-ret)); + error("mkfifo %s failed: %s", path, strerror(-ret)); } out: @@ -478,7 +491,7 @@ static int process_mksock(const char *path, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: mksock: path invalid: %s\n", path); + error("mksock: path invalid: %s", path); goto out; } @@ -488,8 +501,7 @@ static int process_mksock(const char *path, void *user) ret = mknod(full_path, 0600 | S_IFSOCK, 0); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: mknod %s failed. %s\n", path, - strerror(-ret)); + error("mknod %s failed: %s", path, strerror(-ret)); } out: @@ -504,7 +516,7 @@ static int process_symlink(const char *path, const char *lnk, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: symlink: path invalid: %s\n", path); + error("symlink: path invalid: %s", path); goto out; } @@ -514,7 +526,7 @@ static int process_symlink(const char *path, const char *lnk, void *user) ret = symlink(lnk, full_path); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: symlink %s -> %s failed. %s\n", path, + error("symlink %s -> %s failed: %s", path, lnk, strerror(-ret)); } @@ -531,15 +543,13 @@ static int process_rename(const char *from, const char *to, void *user) ret = path_cat_out(full_from, r->full_subvol_path, from); if (ret < 0) { - fprintf(stderr, "ERROR: rename: source path invalid: %s\n", - from); + error("rename: source path invalid: %s", from); goto out; } ret = path_cat_out(full_to, r->full_subvol_path, to); if (ret < 0) { - fprintf(stderr, "ERROR: rename: target path invalid: %s\n", - to); + error("rename: target path invalid: %s", to); goto out; } @@ -549,7 +559,7 @@ static int process_rename(const char *from, const char *to, void *user) ret = rename(full_from, full_to); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: rename %s -> %s failed. %s\n", from, + error("rename %s -> %s failed: %s", from, to, strerror(-ret)); } @@ -566,15 +576,13 @@ static int process_link(const char *path, const char *lnk, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: link: source path invalid: %s\n", - full_path); + error("link: source path invalid: %s", full_path); goto out; } ret = path_cat_out(full_link_path, r->full_subvol_path, lnk); if (ret < 0) { - fprintf(stderr, "ERROR: link: target path invalid: %s\n", - full_link_path); + error("link: target path invalid: %s", full_link_path); goto out; } @@ -584,8 +592,7 @@ static int process_link(const char *path, const char *lnk, void *user) ret = link(full_link_path, full_path); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: link %s -> %s failed. %s\n", path, - lnk, strerror(-ret)); + error("link %s -> %s failed: %s", path, lnk, strerror(-ret)); } out: @@ -601,7 +608,7 @@ static int process_unlink(const char *path, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: unlink: path invalid: %s\n", path); + error("unlink: path invalid: %s", path); goto out; } @@ -611,8 +618,7 @@ static int process_unlink(const char *path, void *user) ret = unlink(full_path); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: unlink %s failed. %s\n", path, - strerror(-ret)); + error("unlink %s failed. %s", path, strerror(-ret)); } out: @@ -627,7 +633,7 @@ static int process_rmdir(const char *path, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: rmdir: path invalid: %s\n", path); + error("rmdir: path invalid: %s", path); goto out; } @@ -637,8 +643,7 @@ static int process_rmdir(const char *path, void *user) ret = rmdir(full_path); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: rmdir %s failed. %s\n", path, - strerror(-ret)); + error("rmdir %s failed: %s", path, strerror(-ret)); } out: @@ -659,8 +664,7 @@ static int open_inode_for_write(struct btrfs_receive *r, const char *path) r->write_fd = open(path, O_RDWR); if (r->write_fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: open %s failed. %s\n", path, - strerror(-ret)); + error("cannot open %s: %s", path, strerror(-ret)); goto out; } strncpy_null(r->write_path, path); @@ -690,7 +694,7 @@ static int process_write(const char *path, const void *data, u64 offset, ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: write: path invalid: %s\n", path); + error("write: path invalid: %s", path); goto out; } @@ -703,7 +707,7 @@ static int process_write(const char *path, const void *data, u64 offset, offset + pos); if (w < 0) { ret = -errno; - fprintf(stderr, "ERROR: writing to %s failed. %s\n", + error("writing to %s failed: %s\n", path, strerror(-ret)); goto out; } @@ -730,8 +734,7 @@ static int process_clone(const char *path, u64 offset, u64 len, ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: clone: source path invalid: %s\n", - path); + error("clone: source path invalid: %s", path); goto out; } @@ -748,7 +751,7 @@ static int process_clone(const char *path, u64 offset, u64 len, subvol_path = strdup(r->cur_subvol_path); } else { ret = -ENOENT; - fprintf(stderr, "ERROR: did not find source subvol.\n"); + error("clone: did not find source subvol"); goto out; } } else { @@ -772,16 +775,14 @@ static int process_clone(const char *path, u64 offset, u64 len, ret = path_cat_out(full_clone_path, subvol_path, clone_path); if (ret < 0) { - fprintf(stderr, "ERROR: clone: target path invalid: %s\n", - clone_path); + error("clone: target path invalid: %s", clone_path); goto out; } clone_fd = openat(r->mnt_fd, full_clone_path, O_RDONLY | O_NOATIME); if (clone_fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to open %s. %s\n", - full_clone_path, strerror(-ret)); + error("cannot open %s: %s", full_clone_path, strerror(-ret)); goto out; } @@ -790,9 +791,9 @@ static int process_clone(const char *path, u64 offset, u64 len, clone_args.src_length = len; clone_args.dest_offset = offset; ret = ioctl(r->write_fd, BTRFS_IOC_CLONE_RANGE, &clone_args); - if (ret) { + if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to clone extents to %s\n%s\n", + error("failed to clone extents to %s\n%s\n", path, strerror(-ret)); goto out; } @@ -818,7 +819,7 @@ static int process_set_xattr(const char *path, const char *name, ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: set_xattr: path invalid: %s\n", path); + error("set_xattr: path invalid: %s", path); goto out; } @@ -826,12 +827,10 @@ static int process_set_xattr(const char *path, const char *name, if (g_verbose >= 3) fprintf(stderr, "set_xattr: cache capabilities\n"); if (r->cached_capabilities_len) - fprintf(stderr, - "WARNING: capabilities set multiple times per file: %s\n", + warning("capabilities set multiple times per file: %s", full_path); if (len > sizeof(r->cached_capabilities)) { - fprintf(stderr, - "ERROR: capabilities encoded to %d bytes, buffer too small\n", + error("capabilities encoded to %d bytes, buffer too small", len); ret = -E2BIG; goto out; @@ -849,7 +848,7 @@ static int process_set_xattr(const char *path, const char *name, ret = lsetxattr(full_path, name, data, len, 0); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: lsetxattr %s %s=%.*s failed. %s\n", + error("lsetxattr %s %s=%.*s failed: %s", path, name, len, (char*)data, strerror(-ret)); goto out; } @@ -866,8 +865,7 @@ static int process_remove_xattr(const char *path, const char *name, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: remove_xattr: path invalid: %s\n", - path); + error("remove_xattr: path invalid: %s", path); goto out; } @@ -879,7 +877,7 @@ static int process_remove_xattr(const char *path, const char *name, void *user) ret = lremovexattr(full_path, name); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: lremovexattr %s %s failed. %s\n", + error("lremovexattr %s %s failed: %s", path, name, strerror(-ret)); goto out; } @@ -896,7 +894,7 @@ static int process_truncate(const char *path, u64 size, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: truncate: path invalid: %s\n", path); + error("truncate: path invalid: %s", path); goto out; } @@ -906,8 +904,7 @@ static int process_truncate(const char *path, u64 size, void *user) ret = truncate(full_path, size); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: truncate %s failed. %s\n", - path, strerror(-ret)); + error("truncate %s failed: %s", path, strerror(-ret)); goto out; } @@ -923,7 +920,7 @@ static int process_chmod(const char *path, u64 mode, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: chmod: path invalid: %s\n", path); + error("chmod: path invalid: %s", path); goto out; } @@ -933,8 +930,7 @@ static int process_chmod(const char *path, u64 mode, void *user) ret = chmod(full_path, mode); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: chmod %s failed. %s\n", - path, strerror(-ret)); + error("chmod %s failed: %s", path, strerror(-ret)); goto out; } @@ -950,7 +946,7 @@ static int process_chown(const char *path, u64 uid, u64 gid, void *user) ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: chown: path invalid: %s\n", path); + error("chown: path invalid: %s", path); goto out; } @@ -961,8 +957,7 @@ static int process_chown(const char *path, u64 uid, u64 gid, void *user) ret = lchown(full_path, uid, gid); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: chown %s failed. %s\n", - path, strerror(-ret)); + error("chown %s failed: %s", path, strerror(-ret)); goto out; } @@ -977,7 +972,7 @@ static int process_chown(const char *path, u64 uid, u64 gid, void *user) r->cached_capabilities_len = 0; if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: restoring capabilities %s: %s\n", + error("restoring capabilities %s: %s", path, strerror(-ret)); goto out; } @@ -998,7 +993,7 @@ static int process_utimes(const char *path, struct timespec *at, ret = path_cat_out(full_path, r->full_subvol_path, path); if (ret < 0) { - fprintf(stderr, "ERROR: utimes: path invalid: %s\n", path); + error("utimes: path invalid: %s", path); goto out; } @@ -1010,7 +1005,7 @@ static int process_utimes(const char *path, struct timespec *at, ret = utimensat(AT_FDCWD, full_path, tv, AT_SYMLINK_NOFOLLOW); if (ret < 0) { ret = -errno; - fprintf(stderr, "ERROR: utimes %s failed. %s\n", + error("utimes %s failed: %s", path, strerror(-ret)); goto out; } @@ -1070,15 +1065,13 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, dest_dir_full_path = realpath(tomnt, NULL); if (!dest_dir_full_path) { ret = -errno; - fprintf(stderr, "ERROR: realpath(%s) failed. %s\n", tomnt, - strerror(-ret)); + error("realpath(%s) failed: %s", tomnt, strerror(-ret)); goto out; } r->dest_dir_fd = open(dest_dir_full_path, O_RDONLY | O_NOATIME); if (r->dest_dir_fd < 0) { ret = -errno; - fprintf(stderr, - "ERROR: failed to open destination directory %s. %s\n", + error("cannot open destination directory %s: %s", dest_dir_full_path, strerror(-ret)); goto out; } @@ -1088,16 +1081,14 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, } else { ret = find_mount_root(dest_dir_full_path, &r->root_path); if (ret < 0) { - fprintf(stderr, - "ERROR: failed to determine mount point for %s: %s\n", + error("failed to determine mount point for %s: %s", dest_dir_full_path, strerror(-ret)); ret = -EINVAL; goto out; } if (ret > 0) { - fprintf(stderr, - "ERROR: %s doesn't belong to btrfs mount point\n", - dest_dir_full_path); + error("%s doesn't belong to btrfs mount point", + dest_dir_full_path); ret = -EINVAL; goto out; } @@ -1105,8 +1096,7 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, r->mnt_fd = open(r->root_path, O_RDONLY | O_NOATIME); if (r->mnt_fd < 0) { ret = -errno; - fprintf(stderr, "ERROR: failed to open %s. %s\n", r->root_path, - strerror(-ret)); + error("cannot open %s: %s", r->root_path, strerror(-ret)); goto out; } @@ -1116,17 +1106,14 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, * subvols we want to receive in. */ ret = btrfs_list_get_path_rootid(r->mnt_fd, &subvol_id); - if (ret) { - fprintf(stderr, "ERROR: couldn't resolve our subvolid %d\n", - ret); + if (ret) goto out; - } root_subvol_path[0] = 0; ret = btrfs_subvolid_resolve(r->mnt_fd, root_subvol_path, PATH_MAX, subvol_id); if (ret) { - fprintf(stderr, "ERROR: couldn't resolve our subvol path\n"); + error("cannot resolve our subvol path"); goto out; } @@ -1134,22 +1121,19 @@ static int do_receive(struct btrfs_receive *r, const char *tomnt, * Ok we're inside of a subvol off of the root subvol, we need to * actually set full_root_path. */ - if (strlen(root_subvol_path)) + if (*root_subvol_path) r->full_root_path = root_subvol_path; if (r->dest_dir_chroot) { if (chroot(dest_dir_full_path)) { ret = -errno; - fprintf(stderr, - "ERROR: failed to chroot to %s, %s\n", - dest_dir_full_path, - strerror(-ret)); + error("failed to chroot to %s: %s", + dest_dir_full_path, strerror(-ret)); goto out; } if (chdir("/")) { ret = -errno; - fprintf(stderr, - "ERROR: failed to chdir to /, %s\n", + error("failed to chdir to / after chroot: %s", strerror(-ret)); goto out; } @@ -1200,7 +1184,9 @@ out: close(r->write_fd); r->write_fd = -1; } - free(r->root_path); + + if (r->root_path != realmnt) + free(r->root_path); r->root_path = NULL; r->dest_dir_path = NULL; free(dest_dir_full_path); @@ -1253,9 +1239,8 @@ int cmd_receive(int argc, char **argv) break; case 'f': if (arg_copy_path(fromfile, optarg, sizeof(fromfile))) { - fprintf(stderr, - "ERROR: input file path too long (%zu)\n", - strlen(optarg)); + error("input file path too long (%zu)", + strlen(optarg)); ret = 1; goto out; } @@ -1271,16 +1256,15 @@ int cmd_receive(int argc, char **argv) break; case 'm': if (arg_copy_path(realmnt, optarg, sizeof(realmnt))) { - fprintf(stderr, - "ERROR: mount point path too long (%zu)\n", - strlen(optarg)); + error("mount point path too long (%zu)", + strlen(optarg)); ret = 1; goto out; } break; case '?': default: - fprintf(stderr, "ERROR: receive args invalid.\n"); + error("receive args invalid"); return 1; } } @@ -1293,12 +1277,14 @@ int cmd_receive(int argc, char **argv) if (fromfile[0]) { receive_fd = open(fromfile, O_RDONLY | O_NOATIME); if (receive_fd < 0) { - fprintf(stderr, "ERROR: failed to open %s\n", fromfile); + error("cannot open %s: %s", fromfile, strerror(errno)); goto out; } } ret = do_receive(&r, tomnt, realmnt, receive_fd, max_errors); + if (receive_fd != fileno(stdin)) + close(receive_fd); out: