Rewrote mkdir (and touched lots of things in the process).
[oweals/busybox.git] / coreutils / dd.c
index a0d2330ea6511d47f2c15f1bedc260299e93ed8b..297d0ab51a056245ab91627c51d96a9a13af8d57 100644 (file)
  *
  */
 
-#include "busybox.h"
-
 #include <sys/types.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
 #include <fcntl.h>
+#include "busybox.h"
 
-static struct suffix_mult dd_suffixes[] = {
+
+static const struct suffix_mult dd_suffixes[] = {
        { "c", 1 },
        { "w", 2 },
        { "b", 512 },
@@ -41,7 +45,7 @@ static struct suffix_mult dd_suffixes[] = {
 
 int dd_main(int argc, char **argv)
 {
-       int i, ifd, ofd, sync = FALSE, trunc = TRUE;
+       int i, ifd, ofd, oflag, sync_flag = FALSE, trunc = TRUE;
        size_t in_full = 0, in_part = 0, out_full = 0, out_part = 0;
        size_t bs = 512, count = -1;
        ssize_t n;
@@ -69,10 +73,10 @@ int dd_main(int argc, char **argv)
                                        trunc = FALSE;
                                        buf += 7;
                                } else if (strncmp("sync", buf, 4) == 0) {
-                                       sync = TRUE;
+                                       sync_flag = TRUE;
                                        buf += 4;
                                } else {
-                                       error_msg_and_die("invalid conversion `%s'\n", argv[i]+5);
+                                       error_msg_and_die("invalid conversion `%s'", argv[i]+5);
                                }
                                if (buf[0] == '\0')
                                        break;
@@ -80,7 +84,7 @@ int dd_main(int argc, char **argv)
                                        buf++;
                        }
                } else
-                       usage(dd_usage);
+                       show_usage();
        }
 
        buf = xmalloc(bs);
@@ -94,8 +98,19 @@ int dd_main(int argc, char **argv)
        }
 
        if (outfile != NULL) {
-               if ((ofd = open(outfile, O_WRONLY | O_CREAT, 0666)) < 0)
+               oflag = O_WRONLY | O_CREAT;
+
+               if (!seek && trunc)
+                       oflag |= O_TRUNC;
+
+               if ((ofd = open(outfile, oflag, 0666)) < 0)
                        perror_msg_and_die("%s", outfile);
+
+               if (seek && trunc) {
+                       if (ftruncate(ofd, seek * bs) < 0)
+                               perror_msg_and_die("%s", outfile);
+               }
+
                statusfp = stdout;
        } else {
                ofd = STDOUT_FILENO;
@@ -113,11 +128,6 @@ int dd_main(int argc, char **argv)
                        perror_msg_and_die("%s", outfile);
        }
 
-       if (trunc) {
-               if (ftruncate(ofd, seek * bs) < 0)
-                       perror_msg_and_die("%s", outfile);
-       }
-
        while (in_full + in_part != count) {
                n = safe_read(ifd, buf, bs);
                if (n < 0)
@@ -128,7 +138,7 @@ int dd_main(int argc, char **argv)
                        in_full++;
                else
                        in_part++;
-               if (sync) {
+               if (sync_flag) {
                        memset(buf + n, '\0', bs - n);
                        n = bs;
                }
@@ -141,8 +151,8 @@ int dd_main(int argc, char **argv)
                        out_part++;
        }
 
-       fprintf(statusfp, "%d+%d records in\n", in_full, in_part);
-       fprintf(statusfp, "%d+%d records out\n", out_full, out_part);
+       fprintf(statusfp, "%ld+%ld records in\n", (long)in_full, (long)in_part);
+       fprintf(statusfp, "%ld+%ld records out\n", (long)out_full, (long)out_part);
 
        return EXIT_SUCCESS;
 }