xref: /illumos-gate/usr/src/cmd/uuidgen/uuidgen.c (revision eb00b1c8a31c2253a353644606388dff5b0e0275)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
14  */
15 
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <libgen.h>
19 #include <uuid/uuid.h>
20 #include <getopt.h>
21 #include <locale.h>
22 
23 static char *progname;
24 static int rflag, tflag;
25 static char uu_string[UUID_PRINTABLE_STRING_LENGTH];
26 
27 static void
28 usage(void)
29 {
30 	(void) fprintf(stderr, gettext(
31 	    "Usage: %s [-r | -t] [-o filename]\n"), progname);
32 	exit(1);
33 }
34 
35 int
36 main(int argc, char *argv[])
37 {
38 	FILE *out;
39 	uuid_t  uu = { 0 };
40 	int c;
41 
42 	(void) setlocale(LC_ALL, "");
43 
44 #if !defined(TEXT_DOMAIN)
45 #define	TEXT_DOMAIN "SYS_TEST"
46 #endif
47 	(void) textdomain(TEXT_DOMAIN);
48 
49 	progname = basename(argv[0]);
50 	out = stdout;
51 	while ((c = getopt(argc, argv, ":rto:")) != EOF) {
52 		switch ((char)c) {
53 		case 'r':
54 			rflag++;
55 			break;
56 		case 't':
57 			tflag++;
58 			break;
59 		case 'o':
60 			if ((out = fopen(optarg, "w")) == NULL) {
61 				(void) fprintf(stderr, gettext(
62 				    "%s: cannot open %s\n"),
63 				    progname, optarg);
64 				return (1);
65 			}
66 			break;
67 		case '?': /* fallthrough */
68 		default:
69 			usage();
70 		}
71 	}
72 
73 	if ((rflag && tflag) || optind != argc) {
74 		usage();
75 	}
76 
77 	if (rflag) {
78 		/* DCE version 4 */
79 		uuid_generate_random(uu);
80 	} else if (tflag) {
81 		/* DCE version 1 */
82 		uuid_generate_time(uu);
83 	} else {
84 		uuid_generate(uu);
85 	}
86 
87 	if (uuid_is_null(uu) != 0) {
88 		(void) fprintf(stderr, gettext(
89 		    "%s: failed to "
90 		    "generate uuid\n"), progname);
91 		exit(1);
92 	}
93 
94 	uuid_unparse(uu, uu_string);
95 
96 	(void) fprintf(out, "%s\n", uu_string);
97 
98 	if (out != NULL && out != stdout)
99 		(void) fclose(out);
100 
101 	return (0);
102 }
103