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