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