truncate: do not die when a file doesn't exist and no-create flag is on
authorAri Sundholm <ari@tuxera.com>
Mon, 25 May 2015 13:16:11 +0000 (15:16 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 25 May 2015 13:17:03 +0000 (15:17 +0200)
Additionally, open(2) failures do not make the program die immediately.
This makes the behavior of the program match coreutils more closely.

function                                             old     new   delta
truncate_main                                        161     221     +60

Signed-off-by: Ari Sundholm <ari@tuxera.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/truncate.c

index 0e36daba3a37bc4c6dcd72dc023fc1a6086d0363..e5fa656c8e623f5a1c145651c2acc39927328ff0 100644 (file)
@@ -64,12 +64,22 @@ int truncate_main(int argc UNUSED_PARAM, char **argv)
 
        argv += optind;
        while (*argv) {
-               int fd = xopen(*argv, flags);
-               if (ftruncate(fd, size) == -1) {
-                       bb_perror_msg("%s: ftruncate", *argv);
-                       ret = EXIT_FAILURE;
+               int fd = open(*argv, flags);
+               if (fd < 0) {
+                       if (errno != ENOENT || !(opts & OPT_NOCREATE)) {
+                               bb_perror_msg("%s: open", *argv);
+                               ret = EXIT_FAILURE;
+                       }
+                       /* else: ENOENT && OPT_NOCREATE:
+                        * do not report error, exitcode is also 0.
+                        */
+               } else {
+                       if (ftruncate(fd, size) == -1) {
+                               bb_perror_msg("%s: truncate", *argv);
+                               ret = EXIT_FAILURE;
+                       }
+                       xclose(fd);
                }
-               xclose(fd);
                ++argv;
        }