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
usage(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
main(int argc,char * argv[])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