diff options
Diffstat (limited to 'misc-utils/uuidgen.c')
-rw-r--r-- | misc-utils/uuidgen.c | 114 |
1 files changed, 69 insertions, 45 deletions
diff --git a/misc-utils/uuidgen.c b/misc-utils/uuidgen.c index 7dcd1f4..57769c1 100644 --- a/misc-utils/uuidgen.c +++ b/misc-utils/uuidgen.c @@ -17,6 +17,9 @@ #include "nls.h" #include "c.h" #include "closestream.h" +#include "strutils.h" +#include "optutils.h" +#include "xalloc.h" static void __attribute__((__noreturn__)) usage(void) { @@ -29,17 +32,18 @@ static void __attribute__((__noreturn__)) usage(void) fputs(_("Create a new UUID value.\n"), out); fputs(USAGE_OPTIONS, out); - fputs(_(" -r, --random generate random-based uuid\n"), out); - fputs(_(" -t, --time generate time-based uuid\n"), out); - fputs(_(" -n, --namespace ns generate hash-based uuid in this namespace\n"), out); - printf(_(" available namespaces: %s\n"), "@dns @url @oid @x500"); - fputs(_(" -N, --name name generate hash-based uuid from this name\n"), out); - fputs(_(" -m, --md5 generate md5 hash\n"), out); - fputs(_(" -s, --sha1 generate sha1 hash\n"), out); - fputs(_(" -x, --hex interpret name as hex string\n"), out); + fputs(_(" -r, --random generate random-based uuid\n"), out); + fputs(_(" -t, --time generate time-based uuid\n"), out); + fputs(_(" -n, --namespace <ns> generate hash-based uuid in this namespace\n"), out); + fprintf(out, _(" available namespaces: %s\n"), "@dns @url @oid @x500"); + fputs(_(" -N, --name <name> generate hash-based uuid from this name\n"), out); + fputs(_(" -m, --md5 generate md5 hash\n"), out); + fputs(_(" -C, --count <num> generate more uuids in loop\n"), out); + fputs(_(" -s, --sha1 generate sha1 hash\n"), out); + fputs(_(" -x, --hex interpret name as hex string\n"), out); fputs(USAGE_SEPARATOR, out); - printf(USAGE_HELP_OPTIONS(21)); - printf(USAGE_MAN_TAIL("uuidgen(1)")); + fprintf(out, USAGE_HELP_OPTIONS(21)); + fprintf(out, USAGE_MAN_TAIL("uuidgen(1)")); exit(EXIT_SUCCESS); } @@ -54,7 +58,7 @@ badstring: errtryhelp(EXIT_FAILURE); } - value2 = malloc(*valuelen / 2 + 1); + value2 = xmalloc(*valuelen / 2 + 1); for (x = n = 0; n < *valuelen; n++) { c = value[n]; @@ -88,6 +92,7 @@ main (int argc, char *argv[]) char *namespace = NULL, *name = NULL; size_t namelen = 0; uuid_t ns, uu; + unsigned int count = 1, i; static const struct option longopts[] = { {"random", no_argument, NULL, 'r'}, @@ -97,17 +102,30 @@ main (int argc, char *argv[]) {"namespace", required_argument, NULL, 'n'}, {"name", required_argument, NULL, 'N'}, {"md5", no_argument, NULL, 'm'}, + {"count", required_argument, NULL, 'C'}, {"sha1", no_argument, NULL, 's'}, {"hex", no_argument, NULL, 'x'}, {NULL, 0, NULL, 0} }; + static const ul_excl_t excl[] = { + { 'C', 'm', 's' }, + { 'N', 'r', 't' }, + { 'm', 'r', 's', 't' }, + { 'n', 'r', 't' }, + { 0 } + }; + int excl_st[ARRAY_SIZE(excl)] = UL_EXCL_STATUS_INIT; + setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); close_stdout_atexit(); - while ((c = getopt_long(argc, argv, "rtVhn:N:msx", longopts, NULL)) != -1) + while ((c = getopt_long(argc, argv, "C:rtVhn:N:msx", longopts, NULL)) != -1) { + + err_exclusive_options(c, longopts, excl, excl_st); + switch (c) { case 't': do_type = UUID_TYPE_DCE_TIME; @@ -124,6 +142,9 @@ main (int argc, char *argv[]) case 'm': do_type = UUID_TYPE_DCE_MD5; break; + case 'C': + count = strtou32_or_err(optarg, _("invalid count argument")); + break; case 's': do_type = UUID_TYPE_DCE_SHA1; break; @@ -138,6 +159,7 @@ main (int argc, char *argv[]) default: errtryhelp(EXIT_FAILURE); } + } if (namespace) { if (!name) { @@ -165,43 +187,45 @@ main (int argc, char *argv[]) name = unhex(name, &namelen); } - switch (do_type) { - case UUID_TYPE_DCE_TIME: - uuid_generate_time(uu); - break; - case UUID_TYPE_DCE_RANDOM: - uuid_generate_random(uu); - break; - case UUID_TYPE_DCE_MD5: - case UUID_TYPE_DCE_SHA1: - if (namespace[0] == '@' && namespace[1] != '\0') { - const uuid_t *uuidptr; - - uuidptr = uuid_get_template(&namespace[1]); - if (uuidptr == NULL) { - warnx(_("unknown namespace alias: '%s'"), namespace); - errtryhelp(EXIT_FAILURE); - } - memcpy(ns, *uuidptr, sizeof(ns)); - } else { - if (uuid_parse(namespace, ns) != 0) { - warnx(_("invalid uuid for namespace: '%s'"), namespace); - errtryhelp(EXIT_FAILURE); + for (i = 0; i < count; i++) { + switch (do_type) { + case UUID_TYPE_DCE_TIME: + uuid_generate_time(uu); + break; + case UUID_TYPE_DCE_RANDOM: + uuid_generate_random(uu); + break; + case UUID_TYPE_DCE_MD5: + case UUID_TYPE_DCE_SHA1: + if (namespace[0] == '@' && namespace[1] != '\0') { + const uuid_t *uuidptr; + + uuidptr = uuid_get_template(&namespace[1]); + if (uuidptr == NULL) { + warnx(_("unknown namespace alias: '%s'"), namespace); + errtryhelp(EXIT_FAILURE); + } + memcpy(ns, *uuidptr, sizeof(ns)); + } else { + if (uuid_parse(namespace, ns) != 0) { + warnx(_("invalid uuid for namespace: '%s'"), namespace); + errtryhelp(EXIT_FAILURE); + } } + if (do_type == UUID_TYPE_DCE_MD5) + uuid_generate_md5(uu, ns, name, namelen); + else + uuid_generate_sha1(uu, ns, name, namelen); + break; + default: + uuid_generate(uu); + break; } - if (do_type == UUID_TYPE_DCE_MD5) - uuid_generate_md5(uu, ns, name, namelen); - else - uuid_generate_sha1(uu, ns, name, namelen); - break; - default: - uuid_generate(uu); - break; - } - uuid_unparse(uu, str); + uuid_unparse(uu, str); - printf("%s\n", str); + printf("%s\n", str); + } if (is_hex) free(name); |