Add the uuidgen(1) command, adapted from FreeBSD. While here, also add

a DCE-compatible -s flag, which causes uuidgen(1) to output C code for
the UUIDs rather than the standard string representation.

PR 23470.
This commit is contained in:
thorpej 2004-09-13 23:35:19 +00:00
parent 523777c603
commit 1209149ad2
6 changed files with 293 additions and 4 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: mi,v 1.500 2004/09/11 01:19:14 ian Exp $
# $NetBSD: mi,v 1.501 2004/09/13 23:35:19 thorpej Exp $
. base-sys-root
./altroot base-sys-root
./bin base-sys-root
@ -626,6 +626,7 @@
./usr/bin/uucp base-uucp-bin uucp
./usr/bin/uudecode base-util-bin
./usr/bin/uuencode base-util-bin
./usr/bin/uuidgen base-util-bin
./usr/bin/uulog base-uucp-bin uucp
./usr/bin/uuname base-uucp-bin uucp
./usr/bin/uupick base-uucp-bin uucp

View File

@ -1,4 +1,4 @@
# $NetBSD: mi,v 1.724 2004/09/05 06:32:03 manu Exp $
# $NetBSD: mi,v 1.725 2004/09/13 23:35:19 thorpej Exp $
./etc/mtree/set.man man-sys-root
./usr/share/info/am-utils.info man-amd-info info
./usr/share/info/as.info man-computil-info bfd,info
@ -435,6 +435,7 @@
./usr/share/man/cat1/uucp.0 man-uucp-catman uucp,.cat
./usr/share/man/cat1/uudecode.0 man-uucp-catman .cat
./usr/share/man/cat1/uuencode.0 man-uucp-catman .cat
./usr/share/man/cat1/uuidgen.0 man-util-catman .cat
./usr/share/man/cat1/uustat.0 man-uucp-catman uucp,.cat
./usr/share/man/cat1/uux.0 man-uucp-catman uucp,.cat
./usr/share/man/cat1/vacation.0 man-mail-catman .cat
@ -2566,6 +2567,7 @@
./usr/share/man/man1/uucp.1 man-uucp-man uucp,.man
./usr/share/man/man1/uudecode.1 man-uucp-man .man
./usr/share/man/man1/uuencode.1 man-uucp-man .man
./usr/share/man/man1/uuidgen.1 man-util-man .man
./usr/share/man/man1/uustat.1 man-uucp-man uucp,.man
./usr/share/man/man1/uux.1 man-uucp-man uucp,.man
./usr/share/man/man1/vacation.1 man-mail-man .man

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.140 2004/05/25 10:31:45 lha Exp $
# $NetBSD: Makefile,v 1.141 2004/09/13 23:35:19 thorpej Exp $
# from: @(#)Makefile 8.3 (Berkeley) 1/7/94
.include <bsd.own.mk>
@ -24,7 +24,7 @@ SUBDIR= apply apropos asa at audio awk banner basename biff \
tcopy tee telnet tftp time tip tn3270 top touch tput \
tr true tset tsort tty ul uname unexpand unifdef \
uniq units unvis usbhidaction usbhidctl users \
uudecode uuencode vacation vgrind vi vis vmstat w \
uudecode uuencode uuidgen vacation vgrind vi vis vmstat w \
wall wc what whatis whereis who whois window \
write xargs xinstall xlint xstr yacc yes

6
usr.bin/uuidgen/Makefile Normal file
View File

@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.1 2004/09/13 23:35:19 thorpej Exp $
PROG= uuidgen
WARNS= 2
.include <bsd.prog.mk>

88
usr.bin/uuidgen/uuidgen.1 Normal file
View File

@ -0,0 +1,88 @@
.\" $NetBSD: uuidgen.1,v 1.1 2004/09/13 23:35:19 thorpej Exp $
.\"
.\" Copyright (c) 2002 Marcel Moolenaar
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\"
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.\" $FreeBSD: src/usr.bin/uuidgen/uuidgen.1,v 1.5 2003/05/22 13:10:32 ru Exp $
.\"
.Dd September 13, 2004
.Dt UUIDGEN 1
.Os
.Sh NAME
.Nm uuidgen
.Nd generate universally unique identifiers
.Sh SYNOPSIS
.Nm
.Op Fl 1
.Op Fl n Ar count
.Op Fl o Ar filename
.Op Fl s
.Sh DESCRIPTION
The
.Nm
utility by default generates a single universally unique identifier (UUID),
also known as a globally unique identifier (GUID).
By default,
.Nm
generates a single UUID and outputs it in the standard string representation
to stdout.
The following options can be used to change the behavior of
.Nm :
.Bl -tag -width indent
.It Fl 1
This option only has effect if multiple identifiers are to be generated and
instructs
.Nm
to not generate them in batch, but one at a time.
.It Fl n
This option controls the number of identifiers generated.
By default, multiple
identifiers are generated in batch.
.It Fl o
Redirect output to
.Ar filename
instead of stdout.
.It Fl c
Output UUIDs as initialized C structures, rather than in the standard
string format.
.El
.Pp
Batched generation yields a dense set of identifiers in such a way that there
is no identifier that is larger than the smallest identifier in the set and
smaller than the largest identifier in the set and that is not already in the
set.
.Pp
When generating the identifiers one at a time, the identifiers will be close
to each other, but operating system latency and processing time will be
reflected in the distance between two successive identifiers.
.Sh DIAGNOSTICS
.Ex -std
.Sh SEE ALSO
.Xr uuidgen 2 ,
.Xr uuid 3
.Sh HISTORY
The
.Nm
command first appeared in
.Nx 3.0 .

192
usr.bin/uuidgen/uuidgen.c Normal file
View File

@ -0,0 +1,192 @@
/* $NetBSD: uuidgen.c,v 1.1 2004/09/13 23:35:19 thorpej Exp $ */
/*-
* Copyright (c) 2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jason R. Thorpe.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright (c) 2002 Marcel Moolenaar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
__RCSID("$NetBSD: uuidgen.c,v 1.1 2004/09/13 23:35:19 thorpej Exp $");
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <uuid.h>
static void
usage(void)
{
(void)fprintf(stderr, "usage: %s [-1] [-n count] [-o filename] [-s]\n",
getprogname());
exit(1);
}
int
main(int argc, char *argv[])
{
FILE *fp;
uuid_t *store, *uuid;
char *p;
int ch, count, i, iterate, c_struct;
count = -1; /* no count yet */
fp = stdout; /* default output file */
iterate = 0; /* not one at a time */
c_struct = 0; /* not as a C structure */
while ((ch = getopt(argc, argv, "1n:o:s")) != -1) {
switch (ch) {
case '1':
iterate = 1;
break;
case 'n':
if (count > 0)
usage();
count = strtol(optarg, &p, 10);
if (*p != 0 || count < 1)
usage();
break;
case 'o':
if (fp != stdout)
errx(1, "multiple output files not allowed");
fp = fopen(optarg, "w");
if (fp == NULL)
err(1, "fopen");
break;
case 's':
c_struct = 1;
break;
default:
usage();
}
}
argv += optind;
argc -= optind;
if (argc)
usage();
if (count == -1)
count = 1;
store = (uuid_t*)malloc(sizeof(uuid_t) * count);
if (store == NULL)
err(1, "malloc()");
if (!iterate) {
/* Get them all in a single batch */
if (uuidgen(store, count) != 0)
err(1, "uuidgen()");
} else {
uuid = store;
for (i = 0; i < count; i++) {
if (uuidgen(uuid++, 1) != 0)
err(1, "uuidgen()");
}
}
uuid = store;
while (count--) {
uuid_to_string(uuid++, &p, NULL);
if (c_struct) {
fprintf(fp, "= { /* %s */\n", p); /* } */
/*
* Chunk up the string for processing:
*
* aaaaaaaa-bbbb-cccc-dddd-0123456789ab
*
* We output it like so:
*
* = { \/\* aaaaaaaa-bbbb-cccc-ddee-0123456789ab \*\/
* 0xaaaaaaaa,
* 0xbbbb,
* 0xcccc,
* 0xdd,
* 0xee,
* { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab }
* };
*/
p[8] = '\0'; /* aaaaaaaa */
p[13] = '\0'; /* bbbb */
p[18] = '\0'; /* cccc */
p[23] = '\0'; /* dddd */
fprintf(fp, "\t0x%s,\n", p);
fprintf(fp, "\t0x%s,\n", &p[9]);
fprintf(fp, "\t0x%s,\n", &p[14]);
fprintf(fp, "\t0x%c%c,\n", p[19], p[20]);
fprintf(fp, "\t0x%c%c,\n", p[21], p[22]);
fprintf(fp, "\t{ 0x%c%c, 0x%c%c, 0x%c%c, 0x%c%c, "
"0x%c%c, 0x%c%c }\n",
p[24], p[25], p[26], p[27],
p[28], p[29], p[30], p[31],
p[32], p[33], p[34], p[35]);
/* { */ fprintf(fp, "};\n");
} else
fprintf(fp, "%s\n", p);
free(p);
}
free(store);
if (fp != stdout)
fclose(fp);
return (0);
}