71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin/*
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * This file and its contents are supplied under the terms of the
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * Common Development and Distribution License ("CDDL"), version 1.0.
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * You may only use this file in accordance with the terms of version
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * 1.0 of the CDDL.
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin *
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * A full copy of the text of the CDDL should have accompanied this
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * source. A copy of the CDDL is also available via the Internet at
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * http://www.illumos.org/license/CDDL.
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin */
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin/*
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin */
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#include <stdio.h>
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#include <stdlib.h>
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#include <libgen.h>
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#include <uuid/uuid.h>
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#include <getopt.h>
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#include <locale.h>
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminstatic char *progname;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminstatic int rflag, tflag;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminstatic char uu_string[UUID_PRINTABLE_STRING_LENGTH];
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminstatic void
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminusage(void)
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin{
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) fprintf(stderr, gettext(
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin "Usage: %s [-r | -t] [-o filename]\n"), progname);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin exit(1);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin}
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminint
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Ereminmain(int argc, char *argv[])
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin{
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin FILE *out;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin uuid_t uu = { 0 };
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin int c;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) setlocale(LC_ALL, "");
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#if !defined(TEXT_DOMAIN)
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#define TEXT_DOMAIN "SYS_TEST"
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin#endif
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) textdomain(TEXT_DOMAIN);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin progname = basename(argv[0]);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin out = stdout;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin while ((c = getopt(argc, argv, ":rto:")) != EOF) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin switch ((char)c) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin case 'r':
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin rflag++;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin break;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin case 't':
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin tflag++;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin break;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin case 'o':
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin if ((out = fopen(optarg, "w")) == NULL) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) fprintf(stderr, gettext(
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin "%s: cannot open %s\n"),
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin progname, optarg);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin return (1);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin }
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin break;
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin case '?': /* fallthrough */
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin default:
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin usage();
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin }
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin }
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin if ((rflag && tflag) || optind != argc) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin usage();
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin }
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin if (rflag) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin /* DCE version 4 */
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin uuid_generate_random(uu);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin } else if (tflag) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin /* DCE version 1 */
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin uuid_generate_time(uu);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin } else {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin uuid_generate(uu);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin }
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin if (uuid_is_null(uu) != 0) {
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) fprintf(stderr, gettext(
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin "%s: failed to "
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin "generate uuid\n"), progname);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin exit(1);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin }
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin uuid_unparse(uu, uu_string);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) fprintf(out, "%s\n", uu_string);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin if (out != NULL && out != stdout)
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin (void) fclose(out);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin return (0);
71d45228ba245d505c3beae1d756e775616f6d5aAlexander Eremin}