dd: exit with 1 if last write was incomplete
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 10 Jan 2018 09:58:55 +0000 (10:58 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 10 Jan 2018 09:58:55 +0000 (10:58 +0100)
$ busybox dd if=/dev/zero of=/dev/loop0 bs=100M count=8; echo $?
8+0 records in
7+1 records out
805220352 bytes (767.9MB) copied, 0.464010 seconds, 1.6GB/s
1  <=========== FIXED

function                                             old     new   delta
write_and_stats                                       96      97      +1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/dd.c

index d302f35d3b12b422d9a26d34259141028992cb78..9d173cc13b03caf706066fcb85444cfb1890f81d 100644 (file)
@@ -195,14 +195,16 @@ static bool write_and_stats(const void *buf, size_t len, size_t obs,
        ssize_t n = full_write_or_warn(buf, len, filename);
        if (n < 0)
                return 1;
-       if ((size_t)n == obs)
-               G.out_full++;
-       else if (n) /* > 0 */
-               G.out_part++;
 #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
        G.total_bytes += n;
 #endif
-       return 0;
+       if ((size_t)n == obs) {
+               G.out_full++;
+               return 0;
+       }
+       if (n) /* > 0 */
+               G.out_part++;
+       return 1;
 }
 
 #if ENABLE_LFS