diff options
author | kientzle <kientzle@FreeBSD.org> | 2004-06-27 01:08:54 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2004-06-27 01:08:54 +0000 |
commit | 4731df16a26e51f2f571e0222cbf4aa767d23583 (patch) | |
tree | a0292e2cb8223353f471fc7db905e9f6f1e96d62 /usr.bin/tar | |
parent | ddb1bad6a35a7a69ac921f84ecd8dd66c69b4415 (diff) | |
download | FreeBSD-src-4731df16a26e51f2f571e0222cbf4aa767d23583.zip FreeBSD-src-4731df16a26e51f2f571e0222cbf4aa767d23583.tar.gz |
Don't abort immediately on directory change errors.
Instead, display a warning, clean up, and let main() return the error.
In particular, this means that chdir() problems won't leave broken
archives, though they will prompt an error exit value.
Diffstat (limited to 'usr.bin/tar')
-rw-r--r-- | usr.bin/tar/write.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/usr.bin/tar/write.c b/usr.bin/tar/write.c index da88154..4c16ffa 100644 --- a/usr.bin/tar/write.c +++ b/usr.bin/tar/write.c @@ -349,9 +349,13 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) pending_dir = NULL; - if (bsdtar->start_dir != NULL && chdir(bsdtar->start_dir)) - bsdtar_errc(bsdtar, 1, errno, + if (bsdtar->start_dir != NULL && chdir(bsdtar->start_dir)) { + bsdtar_warnc(bsdtar, errno, "chdir(%s) failed", bsdtar->start_dir); + bsdtar->return_value = 1; + return; + } + if (bsdtar->names_from_file != NULL) archive_names_from_file(bsdtar, a); @@ -363,9 +367,12 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) if (*arg == '\0') { bsdtar->argv++; arg = *bsdtar->argv; - if (arg == NULL) - bsdtar_errc(bsdtar, 1, 0, + if (arg == NULL) { + bsdtar_warnc(bsdtar, 1, 0, "Missing argument for -C"); + bsdtar->return_value = 1; + return; + } } /*- @@ -417,10 +424,13 @@ write_archive(struct archive *a, struct bsdtar *bsdtar) if (pending_dir && (*arg != '/' || (*arg == '@' && arg[1] != '/'))) { /* Handle a deferred -C */ - if (chdir(pending_dir)) - bsdtar_errc(bsdtar, 1, 0, + if (chdir(pending_dir)) { + bsdtar_warnc(bsdtar, 0, "could not chdir to '%s'\n", pending_dir); + bsdtar->return_value = 1; + return; + } free(pending_dir); pending_dir = NULL; } |