Fix a silly off-by-one error noticed by Santiago Garcia Mantinan <manty@debian.org>
[oweals/busybox.git] / md5sum.c
index ad4078040138da8e9dfd2587f0e8da5340dc27f3..a9bbdef369f1c0b3b344f112a3bdde72d41bc466 100644 (file)
--- a/md5sum.c
+++ b/md5sum.c
 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu> */
 /* Hacked to work with BusyBox by Alfred M. Szmidt <ams@trillian.itslinux.org> */
 
-#include "busybox.h"
 #include <stdio.h>
 #include <errno.h>
 #include <ctype.h>
 #include <getopt.h>
+#include "busybox.h"
 
 /* For some silly reason, this file uses backwards TRUE and FALSE conventions */
 #undef TRUE
@@ -181,7 +181,14 @@ extern void *md5_buffer __P ((const char *buffer, size_t len, void *resblock));
 //--------end of md5.h
 //----------------------------------------------------------------------------
 
-#define SWAP(n) (n)
+/* Handle endian-ness */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+       #define SWAP(n) (n)
+#else
+       #define SWAP(n) ((n << 24) | ((n&65280)<<8) | ((n&16711680)>>8) | (n>>24))
+#endif
+
+
 
 /* This array contains the bytes used to pad the buffer to the next
    64-byte boundary.  (RFC 1321, 3.1: Step 1)  */
@@ -719,7 +726,7 @@ static int md5_check(const char *checkfile_name)
     if (split_3(line, line_length, &md5num, &binary, &filename)
         || !hex_digits(md5num)) {
       if (warn) {
-        error_msg("%s: %lu: improperly formatted MD5 checksum line\n",
+        error_msg("%s: %lu: improperly formatted MD5 checksum line",
                  checkfile_name, (unsigned long) line_number);
       }
     } else {
@@ -764,7 +771,7 @@ static int md5_check(const char *checkfile_name)
   while (!feof(checkfile_stream) && !ferror(checkfile_stream));
 
   if (ferror(checkfile_stream)) {
-    error_msg("%s: read error\n", checkfile_name); /* */
+    error_msg("%s: read error", checkfile_name);
     return FALSE;
   }
 
@@ -775,7 +782,7 @@ static int md5_check(const char *checkfile_name)
 
   if (n_properly_formated_lines == 0) {
     /* Warn if no tests are found.  */
-    error_msg("%s: no properly formatted MD5 checksum lines found\n",
+    error_msg("%s: no properly formatted MD5 checksum lines found",
              checkfile_name);
     return FALSE;
   } else {
@@ -784,13 +791,13 @@ static int md5_check(const char *checkfile_name)
                                  - n_open_or_read_failures);
 
       if (n_open_or_read_failures > 0) {
-        error_msg("WARNING: %d of %d listed files could not be read\n",
+        error_msg("WARNING: %d of %d listed files could not be read",
                  n_open_or_read_failures, n_properly_formated_lines);
         return FALSE;
       }
 
       if (n_mismatched_checksums > 0) {
-        error_msg("WARNING: %d of %d computed checksums did NOT match\n",
+        error_msg("WARNING: %d of %d computed checksums did NOT match",
                  n_mismatched_checksums, n_computed_checkums);
         return FALSE;
       }
@@ -819,8 +826,6 @@ int md5sum_main(int argc,
        if (string == NULL)
          string = (char **) xmalloc ((argc - 1) * sizeof (char *));
 
-       if (optarg == NULL)
-         optarg = "";
        string[n_strings++] = optarg;
        break;
      }
@@ -850,31 +855,31 @@ int md5sum_main(int argc,
       break;
 
      default:
-      usage(md5sum_usage);
+      show_usage();
     }
   }
 
   if (file_type_specified && do_check) {
-    error_msg_and_die("the -b and -t options are meaningless when verifying checksums\n");
+    error_msg_and_die("the -b and -t options are meaningless when verifying checksums");
   }
 
   if (n_strings > 0 && do_check) {
-    error_msg_and_die("the -g and -c options are mutually exclusive\n");
+    error_msg_and_die("the -g and -c options are mutually exclusive");
   }
 
   if (status_only && !do_check) {
-    error_msg_and_die("the -s option is meaningful only when verifying checksums\n");
+    error_msg_and_die("the -s option is meaningful only when verifying checksums");
   }
 
   if (warn && !do_check) {
-    error_msg_and_die("the -w option is meaningful only when verifying checksums\n");
+    error_msg_and_die("the -w option is meaningful only when verifying checksums");
   }
 
   if (n_strings > 0) {
     size_t i;
 
     if (optind < argc) {
-      error_msg_and_die("no files may be specified when using -g\n");
+      error_msg_and_die("no files may be specified when using -g");
     }
     for (i = 0; i < n_strings; ++i) {
       size_t cnt;
@@ -887,7 +892,7 @@ int md5sum_main(int argc,
     }
   } else if (do_check) {
     if (optind + 1 < argc) {
-      error_msg("only one argument may be specified when using -c\n");
+      error_msg("only one argument may be specified when using -c");
     }
 
     err = md5_check ((optind == argc) ? "-" : argv[optind]);
@@ -901,7 +906,12 @@ int md5sum_main(int argc,
 
       fail = md5_file (file, binary, md5buffer);
       err |= fail;
-      if (!fail) {
+      if (!fail && STREQ(file, "-")) {
+         size_t i;
+         for (i = 0; i < 16; ++i)
+             printf ("%02x", md5buffer[i]);
+         putchar ('\n');
+      } else if (!fail) {
         size_t i;
         /* Output a leading backslash if the file name contains
            a newline or backslash.  */
@@ -940,11 +950,11 @@ int md5sum_main(int argc,
   }
 
   if (fclose (stdout) == EOF) {
-    error_msg_and_die("write error\n");
+    error_msg_and_die("write error");
   }
 
   if (have_read_stdin && fclose (stdin) == EOF) {
-    error_msg_and_die("standard input\n");
+    error_msg_and_die("standard input");
   }
 
   if (err == 0)