1/*	$NetBSD: uuidgen.c,v 1.3 2008/04/28 20:24:15 martin Exp $	*/
2
3/*-
4 * Copyright (c) 2004 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 * Copyright (c) 2002 Marcel Moolenaar
34 * All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 *
40 * 1. Redistributions of source code must retain the above copyright
41 *    notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above copyright
43 *    notice, this list of conditions and the following disclaimer in the
44 *    documentation and/or other materials provided with the distribution.
45 *
46 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
47 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
48 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
49 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
50 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
51 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
52 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
53 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
54 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
55 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56 */
57
58#include <sys/cdefs.h>
59__RCSID("$NetBSD: uuidgen.c,v 1.3 2008/04/28 20:24:15 martin Exp $");
60
61#include <err.h>
62#include <stdio.h>
63#include <stdlib.h>
64#include <unistd.h>
65#include <uuid.h>
66
67__dead static void
68usage(void)
69{
70
71	(void)fprintf(stderr, "usage: %s [-1s] [-n count] [-o filename]\n",
72	    getprogname());
73	exit(1);
74}
75
76int
77main(int argc, char *argv[])
78{
79	FILE *fp;
80	uuid_t *store, *uuid;
81	char *p;
82	int ch, count, i, iterate, c_struct;
83
84	count = -1;	/* no count yet */
85	fp = stdout;	/* default output file */
86	iterate = 0;	/* not one at a time */
87	c_struct = 0;	/* not as a C structure */
88
89	while ((ch = getopt(argc, argv, "1n:o:s")) != -1) {
90		switch (ch) {
91		case '1':
92			iterate = 1;
93			break;
94		case 'n':
95			if (count > 0)
96				usage();
97			count = strtol(optarg, &p, 10);
98			if (*p != 0 || count < 1)
99				usage();
100			break;
101		case 'o':
102			if (fp != stdout)
103				errx(1, "multiple output files not allowed");
104			fp = fopen(optarg, "w");
105			if (fp == NULL)
106				err(1, "fopen");
107			break;
108		case 's':
109			c_struct = 1;
110			break;
111		default:
112			usage();
113		}
114	}
115	argv += optind;
116	argc -= optind;
117
118	if (argc)
119		usage();
120
121	if (count == -1)
122		count = 1;
123
124	store = (uuid_t*)malloc(sizeof(uuid_t) * count);
125	if (store == NULL)
126		err(1, "malloc()");
127
128	if (!iterate) {
129		/* Get them all in a single batch */
130		if (uuidgen(store, count) != 0)
131			err(1, "uuidgen()");
132	} else {
133		uuid = store;
134		for (i = 0; i < count; i++) {
135			if (uuidgen(uuid++, 1) != 0)
136				err(1, "uuidgen()");
137		}
138	}
139
140	uuid = store;
141	while (count--) {
142		uuid_to_string(uuid++, &p, NULL);
143		if (c_struct) {
144			fprintf(fp, "= { /* %s */\n", p);	/* } */
145			/*
146			 * Chunk up the string for processing:
147			 *
148			 *	aaaaaaaa-bbbb-cccc-dddd-0123456789ab
149			 *
150			 * We output it like so:
151			 *
152			 * = { \/\* aaaaaaaa-bbbb-cccc-ddee-0123456789ab \*\/
153			 *	0xaaaaaaaa,
154			 *	0xbbbb,
155			 *	0xcccc,
156			 *	0xdd,
157			 *	0xee,
158			 *	{ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab }
159			 * };
160			 */
161			p[8] = '\0';	/* aaaaaaaa */
162			p[13] = '\0';	/* bbbb */
163			p[18] = '\0';	/* cccc */
164			p[23] = '\0';	/* dddd */
165			fprintf(fp, "\t0x%s,\n", p);
166			fprintf(fp, "\t0x%s,\n", &p[9]);
167			fprintf(fp, "\t0x%s,\n", &p[14]);
168			fprintf(fp, "\t0x%c%c,\n", p[19], p[20]);
169			fprintf(fp, "\t0x%c%c,\n", p[21], p[22]);
170			fprintf(fp, "\t{ 0x%c%c, 0x%c%c, 0x%c%c, 0x%c%c, "
171					"0x%c%c, 0x%c%c }\n",
172				p[24], p[25], p[26], p[27],
173				p[28], p[29], p[30], p[31],
174				p[32], p[33], p[34], p[35]);
175	/* { */		fprintf(fp, "};\n");
176		} else
177			fprintf(fp, "%s\n", p);
178		free(p);
179	}
180
181	free(store);
182	if (fp != stdout)
183		fclose(fp);
184	return (0);
185}
186