]> pd.if.org Git - uuid/blobdiff - uuidgen.c
remove unused variable from makefile
[uuid] / uuidgen.c
index ada26d03922c3485799ae7371b4746e8c484b601..6328e5be99f53baad2767917c5cfc0203cccdefc 100644 (file)
--- a/uuidgen.c
+++ b/uuidgen.c
-/*
- * test program for uuid library
- *
- * written by nathan wagner and placed in the public domain
- */
+#include <stdlib.h>
 #include <stdio.h>
+#include <unistd.h>
 #include <string.h>
-#include <stdlib.h>
 
 #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;
+
 }