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 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 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