Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144394400
D25362.id73349.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D25362.id73349.diff
View Options
Index: head/sbin/md5/md5.c
===================================================================
--- head/sbin/md5/md5.c
+++ head/sbin/md5/md5.c
@@ -52,11 +52,14 @@
#define TEST_BLOCK_COUNT 100000
#define MDTESTCOUNT 8
+static int pflag;
static int qflag;
static int rflag;
static int sflag;
+static int skip;
static char* checkAgainst;
static int checksFailed;
+static int failed;
typedef void (DIGEST_Init)(void *);
typedef void (DIGEST_Update)(void *, const unsigned char *, size_t);
@@ -86,10 +89,10 @@
} Algorithm_t;
static void MD5_Update(MD5_CTX *, const unsigned char *, size_t);
-static void MDString(const Algorithm_t *, const char *);
+static void MDOutput(const Algorithm_t *, char *, char **);
static void MDTimeTrial(const Algorithm_t *);
static void MDTestSuite(const Algorithm_t *);
-static void MDFilter(const Algorithm_t *, int);
+static char *MDFilter(const Algorithm_t *, char*, int);
static void usage(const Algorithm_t *);
typedef union {
@@ -170,9 +173,9 @@
cap_rights_t rights;
#endif
int ch, fd;
- char *p;
+ char *p, *string;
char buf[HEX_DIGEST_LENGTH];
- int failed;
+ size_t len;
unsigned digest;
const char* progname;
@@ -191,13 +194,14 @@
failed = 0;
checkAgainst = NULL;
checksFailed = 0;
+ skip = 0;
while ((ch = getopt(argc, argv, "c:pqrs:tx")) != -1)
switch (ch) {
case 'c':
checkAgainst = optarg;
break;
case 'p':
- MDFilter(&Algorithm[digest], 1);
+ pflag = 1;
break;
case 'q':
qflag = 1;
@@ -207,13 +211,15 @@
break;
case 's':
sflag = 1;
- MDString(&Algorithm[digest], optarg);
+ string = optarg;
break;
case 't':
MDTimeTrial(&Algorithm[digest]);
+ skip = 1;
break;
case 'x':
MDTestSuite(&Algorithm[digest]);
+ skip = 1;
break;
default:
usage(&Algorithm[digest]);
@@ -249,32 +255,19 @@
}
p = Algorithm[digest].Fd(fd, buf);
(void)close(fd);
- if (p == NULL) {
- warn("%s", *argv);
- failed++;
- } else {
- if (qflag)
- printf("%s", p);
- else if (rflag)
- printf("%s %s", p, *argv);
- else
- printf("%s (%s) = %s",
- Algorithm[digest].name, *argv, p);
- if (checkAgainst && strcasecmp(checkAgainst, p) != 0)
- {
- checksFailed++;
- if (!qflag)
- printf(" [ Failed ]");
- }
- printf("\n");
- }
+ MDOutput(&Algorithm[digest], p, argv);
} while (*++argv);
- } else if (!sflag && (optind == 1 || qflag || rflag)) {
+ } else if (!sflag && !skip) {
#ifdef HAVE_CAPSICUM
if (caph_limit_stdin() < 0 || caph_enter() < 0)
err(1, "capsicum");
#endif
- MDFilter(&Algorithm[digest], 0);
+ p = MDFilter(&Algorithm[digest], (char *)&buf, pflag);
+ MDOutput(&Algorithm[digest], p, NULL);
+ } else if (sflag) {
+ len = strlen(string);
+ p = Algorithm[digest].Data(string, len, buf);
+ MDOutput(&Algorithm[digest], p, &string);
}
if (failed != 0)
@@ -284,30 +277,38 @@
return (0);
}
+
/*
- * Digests a string and prints the result.
+ * Common output handling
*/
static void
-MDString(const Algorithm_t *alg, const char *string)
+MDOutput(const Algorithm_t *alg, char *p, char *argv[])
{
- size_t len = strlen(string);
- char buf[HEX_DIGEST_LENGTH];
-
- alg->Data(string,len,buf);
- if (qflag)
- printf("%s", buf);
- else if (rflag)
- printf("%s \"%s\"", buf, string);
- else
- printf("%s (\"%s\") = %s", alg->name, string, buf);
- if (checkAgainst && strcasecmp(buf,checkAgainst) != 0)
- {
- checksFailed++;
- if (!qflag)
- printf(" [ failed ]");
+ if (p == NULL) {
+ warn("%s", *argv);
+ failed++;
+ } else {
+ /*
+ * If argv is NULL we are reading from stdin, where the output
+ * format has always been just the hash.
+ */
+ if (qflag || argv == NULL)
+ printf("%s", p);
+ else if (rflag)
+ printf("%s %s", p, *argv);
+ else
+ printf("%s (%s) = %s",
+ alg->name, *argv, p);
+ if (checkAgainst && strcasecmp(checkAgainst, p) != 0)
+ {
+ checksFailed++;
+ if (!qflag)
+ printf(" [ Failed ]");
+ }
+ printf("\n");
}
- printf("\n");
}
+
/*
* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks.
*/
@@ -507,13 +508,13 @@
/*
* Digests the standard input and prints the result.
*/
-static void
-MDFilter(const Algorithm_t *alg, int tee)
+static char *
+MDFilter(const Algorithm_t *alg, char *buf, int tee)
{
DIGEST_CTX context;
unsigned int len;
unsigned char buffer[BUFSIZ];
- char buf[HEX_DIGEST_LENGTH];
+ char *p;
alg->Init(&context);
while ((len = fread(buffer, 1, BUFSIZ, stdin))) {
@@ -521,7 +522,9 @@
err(1, "stdout");
alg->Update(&context, buffer, len);
}
- printf("%s\n", alg->End(&context, buf));
+ p = alg->End(&context, buf);
+
+ return (p);
}
static void
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Feb 9, 5:24 AM (1 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28542584
Default Alt Text
D25362.id73349.diff (4 KB)
Attached To
Mode
D25362: md5(1): fix -c flag to work with input on stdin
Attached
Detach File
Event Timeline
Log In to Comment