/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu> */
/* Hacked to work with BusyBox by Alfred M. Szmidt <ams@trillian.itslinux.org> */
-#include "internal.h"
+#include "busybox.h"
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
+#include <getopt.h>
+
+/* For some silly reason, this file uses backwards TRUE and FALSE conventions */
+#undef TRUE
+#undef FALSE
+#define FALSE ((int) 1)
+#define TRUE ((int) 0)
//----------------------------------------------------------------------------
//--------md5.c
#include <string.h>
#include <endian.h>
-#include "internal.h"
+#include "busybox.h"
//----------------------------------------------------------------------------
//--------md5.h
//----------------------------------------------------------------------------
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef _MD5_H
-#define _MD5_H 1
+static const int _MD5_H = 1;
#include <stdio.h>
-#if defined HAVE_LIMITS_H || _LIBC
+#if defined HAVE_LIMITS_H || defined _LIBC
# include <limits.h>
#endif
the resulting executable. Locally running cross-compiled executables
is usually not possible. */
-#ifdef _LIBC
# include <sys/types.h>
typedef u_int32_t md5_uint32;
-#else
-# if defined __STDC__ && __STDC__
-# define UINT_MAX_32_BITS 4294967295U
-# else
-# define UINT_MAX_32_BITS 0xFFFFFFFF
-# endif
-
-/* If UINT_MAX isn't defined, assume it's a 32-bit type.
- This should be valid for all systems GNU cares about because
- that doesn't include 16-bit systems, and only modern systems
- (that certainly have <limits.h>) have 64+-bit integral types. */
-
-# ifndef UINT_MAX
-# define UINT_MAX UINT_MAX_32_BITS
-# endif
-
-# if UINT_MAX == UINT_MAX_32_BITS
- typedef unsigned int md5_uint32;
-# else
-# if USHRT_MAX == UINT_MAX_32_BITS
- typedef unsigned short md5_uint32;
-# else
-# if ULONG_MAX == UINT_MAX_32_BITS
- typedef unsigned long md5_uint32;
-# else
- /* The following line is intended to evoke an error.
- Using #error is not portable enough. */
- "Cannot determine unsigned 32-bit data type."
-# endif
-# endif
-# endif
-#endif
-
-#undef __P
-#if defined (__STDC__) && __STDC__
-#define __P(x) x
-#else
-#define __P(x) ()
-#endif
/* Structure to save state of computation between the single steps. */
struct md5_ctx
int md5_stream(FILE *stream, void *resblock)
{
/* Important: BLOCKSIZE must be a multiple of 64. */
-#define BLOCKSIZE 4096
+static const int BLOCKSIZE = 4096;
struct md5_ctx ctx;
char buffer[BLOCKSIZE + 72];
size_t sum;
/* The minimum length of a valid digest line in a file produced
by `md5sum FILE' and read by `md5sum -c'. This length does
not include any newline character at the end of a line. */
-#define MIN_DIGEST_LINE_LENGTH 35 /* 32 - message digest length
+static const int MIN_DIGEST_LINE_LENGTH = 35; /* 32 - message digest length
2 - blank and binary indicator
1 - minimum filename length */
static int warn = 0; /* With -w, print a message to standard error warning
about each improperly formatted MD5 checksum line */
-static const char md5sum_usage[] =
- "md5sum [OPTION] [FILE]...\n"
- "or: md5sum [OPTION] -c [FILE]\n"
-#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nPrint or check MD5 checksums.\n\n"
- "Options:\n"
- "With no FILE, or when FILE is -, read standard input.\n\n"
- "\t-b\tread files in binary mode\n"
- "\t-c\tcheck MD5 sums against given list\n"
- "\t-t\tread files in text mode (default)\n"
- "\t-g\tread a string\n"
- "\nThe following two options are useful only when verifying checksums:\n"
- "\t-s,\tdon't output anything, status code shows success\n"
- "\t-w,\twarn about improperly formated MD5 checksum lines\n"
-#endif
-;
-
static int split_3(char *s,
size_t s_len,
unsigned char **u,
} else {
fp = fopen(filename, OPENOPTS(binary));
if (fp == NULL) {
- errorMsg("md5sum: %s: %s\n", filename, strerror(errno));
+ perror_msg("%s", filename);
return FALSE;
}
}
if (md5_stream(fp, md5_result)) {
- errorMsg("md5sum: %s: %s\n", filename, strerror(errno));
+ perror_msg("%s", filename);
if (fp != stdin)
fclose(fp);
}
if (fp != stdin && fclose(fp) == EOF) {
- errorMsg("md5sum: %s: %s\n", filename, strerror(errno));
+ perror_msg("%s", filename);
return FALSE;
}
int n_open_or_read_failures = 0;
unsigned char md5buffer[16];
size_t line_number;
- char *line;
- size_t line_chars_allocated;
+ char line[BUFSIZ];
if (STREQ(checkfile_name, "-")) {
have_read_stdin = 1;
} else {
checkfile_stream = fopen(checkfile_name, "r");
if (checkfile_stream == NULL) {
- errorMsg("md5sum: %s: %s\n", checkfile_name, strerror(errno));
+ perror_msg("%s", checkfile_name);
return FALSE;
}
}
line_number = 0;
- line = 0;
- line_chars_allocated = 0;
do {
char *filename;
++line_number;
- line_length = getline(&line, &line_chars_allocated, checkfile_stream);
+ fgets(line, BUFSIZ-1, checkfile_stream);
+ line_length = strlen(line);
- if (line_length <= 0)
+ if (line_length <= 0 || line==NULL)
break;
/* Ignore comment lines, which begin with a '#' character. */
if (split_3(line, line_length, &md5num, &binary, &filename)
|| !hex_digits(md5num)) {
if (warn) {
- errorMsg("%s: %lu: improperly formatted MD5 checksum line\n",
+ error_msg("%s: %lu: improperly formatted MD5 checksum line",
checkfile_name, (unsigned long) line_number);
}
} else {
while (!feof(checkfile_stream) && !ferror(checkfile_stream));
- if (line)
- free(line);
-
if (ferror(checkfile_stream)) {
- errorMsg("%s: read error", checkfile_name); /* */
+ error_msg("%s: read error", checkfile_name);
return FALSE;
}
if (checkfile_stream != stdin && fclose(checkfile_stream) == EOF) {
- errorMsg("md5sum: %s: %s\n", checkfile_name, strerror(errno));
+ perror_msg("md5sum: %s", checkfile_name);
return FALSE;
}
if (n_properly_formated_lines == 0) {
/* Warn if no tests are found. */
- errorMsg("%s: no properly formatted MD5 checksum lines found\n",
+ error_msg("%s: no properly formatted MD5 checksum lines found",
checkfile_name);
return FALSE;
} else {
- n_open_or_read_failures);
if (n_open_or_read_failures > 0) {
- errorMsg("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) {
- errorMsg("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;
}
}
if (file_type_specified && do_check) {
- errorMsg("the -b and -t options are meaningless when verifying checksums\n");
- exit FALSE;
+ error_msg_and_die("the -b and -t options are meaningless when verifying checksums");
}
if (n_strings > 0 && do_check) {
- errorMsg("the -g and -c options are mutually exclusive\n");
- exit FALSE;
+ error_msg_and_die("the -g and -c options are mutually exclusive");
}
if (status_only && !do_check) {
- errorMsg("the -s option is meaningful only when verifying checksums\n");
- exit FALSE;
+ error_msg_and_die("the -s option is meaningful only when verifying checksums");
}
if (warn && !do_check) {
- errorMsg("the -w option is meaningful only when verifying checksums\n");
- exit FALSE;
+ error_msg_and_die("the -w option is meaningful only when verifying checksums");
}
if (n_strings > 0) {
size_t i;
if (optind < argc) {
- errorMsg("no files may be specified when using -g\n");
- exit FALSE;
+ error_msg_and_die("no files may be specified when using -g");
}
for (i = 0; i < n_strings; ++i) {
size_t cnt;
}
} else if (do_check) {
if (optind + 1 < argc) {
- errorMsg("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]);
}
if (fclose (stdout) == EOF) {
- errorMsg("write error");
- exit FALSE;
+ error_msg_and_die("write error");
}
if (have_read_stdin && fclose (stdin) == EOF) {
- errorMsg("standard input");
- exit FALSE;
+ error_msg_and_die("standard input");
}
- exit (err == 0 ? TRUE : FALSE);
+ if (err == 0)
+ return EXIT_SUCCESS;
+ else
+ return EXIT_FAILURE;
}