summaryrefslogtreecommitdiffstats
path: root/misc-utils/mcookie.c
diff options
context:
space:
mode:
authorSami Kerola2014-03-08 22:43:27 +0100
committerKarel Zak2014-03-26 10:36:18 +0100
commitcdf0c32596f76a6729c3bd54c1bd2b45d3fe8304 (patch)
treec662b90498d004ab385e0087f47e1e5d2918565a /misc-utils/mcookie.c
parentmcookie: use lib/randutils (diff)
downloadkernel-qcow2-util-linux-cdf0c32596f76a6729c3bd54c1bd2b45d3fe8304.tar.gz
kernel-qcow2-util-linux-cdf0c32596f76a6729c3bd54c1bd2b45d3fe8304.tar.xz
kernel-qcow2-util-linux-cdf0c32596f76a6729c3bd54c1bd2b45d3fe8304.zip
mcookie: allow --file option be defined multiple times
Earlier only the last option argument took effect. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'misc-utils/mcookie.c')
-rw-r--r--misc-utils/mcookie.c73
1 files changed, 44 insertions, 29 deletions
diff --git a/misc-utils/mcookie.c b/misc-utils/mcookie.c
index 33e10eb4a..9bfa9759c 100644
--- a/misc-utils/mcookie.c
+++ b/misc-utils/mcookie.c
@@ -23,6 +23,7 @@
#include "nls.h"
#include "closestream.h"
#include "randutils.h"
+#include "xalloc.h"
#include <fcntl.h>
#include <getopt.h>
@@ -69,15 +70,45 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
}
+static void randomness_from_files(char **files, int nfiles,
+ struct MD5Context *ctx, int verbose)
+{
+ int fd, i;
+ int count = 0;
+
+ for (i = 0; i < nfiles; i++) {
+ if (files[i][0] == '-' && !files[i][1])
+ fd = STDIN_FILENO;
+ else
+ fd = open(files[i], O_RDONLY);
+
+ if (fd < 0) {
+ warn(_("cannot open %s"), files[i]);
+ } else {
+ count = hash_file(ctx, fd);
+ if (verbose)
+ fprintf(stderr,
+ P_("Got %d byte from %s\n",
+ "Got %d bytes from %s\n", count),
+ count, files[i]);
+
+ if (fd != STDIN_FILENO)
+ if (close(fd))
+ err(EXIT_FAILURE,
+ _("closing %s failed"), files[i]);
+ }
+ }
+}
+
int main(int argc, char **argv)
{
size_t i;
struct MD5Context ctx;
unsigned char digest[MD5LENGTH];
unsigned char buf[RAND_BYTES];
- int fd;
+ char **files = NULL;
+ int nfiles;
int c;
- char *file = NULL;
int verbose = 0;
static const struct option longopts[] = {
@@ -93,6 +124,13 @@ int main(int argc, char **argv)
textdomain(PACKAGE);
atexit(close_stdout);
+ MD5Init(&ctx);
+
+ if (2 < argc) {
+ files = xmalloc(sizeof(char *) * argc);
+ nfiles = 0;
+ }
+
while ((c =
getopt_long(argc, argv, "f:vVh", longopts, NULL)) != -1)
switch (c) {
@@ -100,7 +138,8 @@ int main(int argc, char **argv)
verbose = 1;
break;
case 'f':
- file = optarg;
+ files[nfiles] = optarg;
+ nfiles++;
break;
case 'V':
printf(UTIL_LINUX_VERSION);
@@ -111,32 +150,8 @@ int main(int argc, char **argv)
usage(stderr);
}
- MD5Init(&ctx);
-
- if (file) {
- int count = 0;
-
- if (file[0] == '-' && !file[1])
- fd = STDIN_FILENO;
- else
- fd = open(file, O_RDONLY);
-
- if (fd < 0) {
- warn(_("cannot open %s"), file);
- } else {
- count = hash_file(&ctx, fd);
- if (verbose)
- fprintf(stderr,
- P_("Got %d byte from %s\n",
- "Got %d bytes from %s\n", count),
- count, file);
-
- if (fd != STDIN_FILENO)
- if (close(fd))
- err(EXIT_FAILURE,
- _("closing %s failed"), file);
- }
- }
+ randomness_from_files(files, nfiles, &ctx, verbose);
+ free(files);
random_get_bytes(&buf, RAND_BYTES);
MD5Update(&ctx, buf, RAND_BYTES);