X-Git-Url: https://pd.if.org/git/?p=uuid;a=blobdiff_plain;f=uuidgen.c;h=6328e5be99f53baad2767917c5cfc0203cccdefc;hp=ada26d03922c3485799ae7371b4746e8c484b601;hb=HEAD;hpb=c7e13d717c38e528ae241bf5facb51bca63f323c diff --git a/uuidgen.c b/uuidgen.c index ada26d0..6328e5b 100644 --- a/uuidgen.c +++ b/uuidgen.c @@ -1,67 +1,161 @@ -/* - * test program for uuid library - * - * written by nathan wagner and placed in the public domain - */ +#include #include +#include #include -#include #include "pduuid.h" +#include "warn.h" -void ufmt(pd_uuid_t *uuid, char *s) { - int i; - for (i=0;i<4;i++) { - s += sprintf(s, "%02x", uuid->data[i]); - } - s += sprintf(s, "-"); - for (;i<6;i++) { - s += sprintf(s, "%02x", uuid->data[i]); - } - s += sprintf(s, "-"); - for (;i<8;i++) { - s += sprintf(s, "%02x", uuid->data[i]); - } - s += sprintf(s, "-"); - for (;i<10;i++) { - s += sprintf(s, "%02x", uuid->data[i]); - } - s += sprintf(s, "-"); - for (;i<16;i++) { - s += sprintf(s, "%02x", uuid->data[i]); - } +void print_help() { + printf("uuidgen [-rthV]\n"); +} +void print_version() { + printf("uuidgen version 1.0\n"); } int main(int ac, char *av[]) { - pd_uuid_t uuid; - pd_uuid_t dns; - char fmt[37]; + pd_uuid_t u; /* generated uuid */ + pd_uuid_t nsuuid; /* namespace uuid */ + pd_uuid_t *nsid = 0; /* pointer to namespace uuid */ + char *ns = 0; /* literal ns id string */ -#ifdef WIN32 - srand(time(0)); -#else - srandom(time(0)); -#endif + struct pd_uuid_state s; + char uuid[PD_UUID_STRLEN+1]; + int q = 1; + int opt; + int mode = 4; + int i; - pd_uuid_make_v1(0, &uuid); - ufmt(&uuid, fmt); - printf("v1: %s\n", fmt); + /* + * V = version + * h = help + * q = quantity + * + * t = time, v1 + * T = time with random mac + * r = random, v4 + * m = md5 ns, v3 + * s = sha1 ns, v5 + * v2 isn't used + * v = set version + * + * n = namespace + * D = DNS ns + * U = URL ns + * O = OID ns + * X = X.500 ns + */ - pd_uuid_make_v4(0, &uuid); - ufmt(&uuid, fmt); - printf("v4: %s\n", fmt); + while ((opt = getopt(ac, av, "Vhq:tTrmsv:n:DUOX")) != -1) { + switch (opt) { + case 'n': + ns = optarg; + if (mode != 3 && mode != 5) mode = 5; + break; + case 'D': + nsid = &pd_uuid_ns_dns; + break; + case 'U': + nsid = &pd_uuid_ns_url; + break; + case 'O': + nsid = &pd_uuid_ns_oid; + break; + case 'X': + nsid = &pd_uuid_ns_x500; + break; + case 'r': + mode = 4; + break; + case 't': + mode = 1; + break; + case 'm': + mode = 3; + break; + case 's': + mode = 5; + break; + case 'T': + mode = -1; + break; + case 'h': + print_help(); + exit(EXIT_SUCCESS); + break; + case 'v': + mode = atoi(optarg); + break; + case 'V': + print_version(); + exit(EXIT_SUCCESS); + break; + case 'q': + q = atoi(optarg); + break; + default: + warn("uuidgen: unknown option '%c'", opt); + print_help(); + exit(EXIT_FAILURE); + } + } - pd_uuid_set_string(&dns, "6ba7b810-9dad-11d1-80b4-00c04fd430c8"); - ufmt(&dns, fmt); - printf("dns: %s\n", fmt); + pd_uuid_init_state(&s); - pd_uuid_make_v3(0, &uuid, &dns, "granicus.if.org", strlen("granicus.if.org")); - ufmt(&uuid, fmt); - printf("granicus.if.org (v3): %s\n", fmt); + if (mode == 3 || mode == 5) { + /* TODO warn if q != 1 */ + int len; + if (!nsid) { + if (!ns) { + die("must specify namespace for version %d uuids", mode); + } + if (!strcmp(ns, "dns")) { + nsid = &pd_uuid_ns_dns; + } else if (!strcmp(ns, "url")) { + nsid = &pd_uuid_ns_url; + } else if (!strcmp(ns, "oid")) { + nsid = &pd_uuid_ns_oid; + } else if (!strcmp(ns, "x500")) { + nsid = &pd_uuid_ns_x500; + } else { + nsid = &nsuuid; + if (pd_uuid_set_string(nsid, ns) != 0) { + die("malformed ns uuid: %s\n", ns); + } + } + } + for (i = optind; i < ac; i++) { + len = strlen(av[i]); + if (mode == 3) { + pd_uuid_get_string(nsid, uuid); + pd_uuid_make_v3(0, &u, nsid, av[i], len); + } else { + pd_uuid_make_v5(&s, &u, nsid, av[i], len); + } + pd_uuid_get_string(&u, uuid); + printf("%s\n", uuid); + } + exit(EXIT_SUCCESS); + } - pd_uuid_make_v5(0, &uuid, &dns, "granicus.if.org", strlen("granicus.if.org")); - ufmt(&uuid, fmt); - printf("granicus.if.org (v5): %s\n", fmt); + while (q--) { + switch (mode) { + case -1: + pd_uuid_make_v1mc(&s, &u); + break; + case 1: + pd_uuid_make_v1(&s, &u); + break; + case 4: + pd_uuid_make_v4(&s, &u); + break; + default: + die("uuidgen: unknown uuid version '%d'\n", mode); + } + pd_uuid_get_string(&u, uuid); + printf("%s\n", uuid); + } return 0; + }