aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coreutils/truncate.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/coreutils/truncate.c b/coreutils/truncate.c
index 0e36daba3..e5fa656c8 100644
--- a/coreutils/truncate.c
+++ b/coreutils/truncate.c
@@ -64,12 +64,22 @@ int truncate_main(int argc UNUSED_PARAM, char **argv)
64 64
65 argv += optind; 65 argv += optind;
66 while (*argv) { 66 while (*argv) {
67 int fd = xopen(*argv, flags); 67 int fd = open(*argv, flags);
68 if (ftruncate(fd, size) == -1) { 68 if (fd < 0) {
69 bb_perror_msg("%s: ftruncate", *argv); 69 if (errno != ENOENT || !(opts & OPT_NOCREATE)) {
70 ret = EXIT_FAILURE; 70 bb_perror_msg("%s: open", *argv);
71 ret = EXIT_FAILURE;
72 }
73 /* else: ENOENT && OPT_NOCREATE:
74 * do not report error, exitcode is also 0.
75 */
76 } else {
77 if (ftruncate(fd, size) == -1) {
78 bb_perror_msg("%s: truncate", *argv);
79 ret = EXIT_FAILURE;
80 }
81 xclose(fd);
71 } 82 }
72 xclose(fd);
73 ++argv; 83 ++argv;
74 } 84 }
75 85