]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
mcookie: allow --file option be defined multiple times
authorSami Kerola <kerolasa@iki.fi>
Sat, 8 Mar 2014 21:43:27 +0000 (15:43 -0600)
committerKarel Zak <kzak@redhat.com>
Wed, 26 Mar 2014 09:36:18 +0000 (10:36 +0100)
Earlier only the last option argument took effect.

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
misc-utils/mcookie.c

index 33e10eb4a7a7952e10bae70223183017df7fe6e2..9bfa9759cb6bf1a99580c9d15d9468ed5cd2efda 100644 (file)
@@ -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);