1 /* 2 * Copyright (c) 2002 Marcel Moolenaar 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 */ 27 28 #include <sys/cdefs.h> 29 __FBSDID("$FreeBSD$"); 30 31 #include <sys/capsicum.h> 32 33 #include <capsicum_helpers.h> 34 #include <err.h> 35 #include <stdio.h> 36 #include <stdlib.h> 37 #include <unistd.h> 38 #include <uuid.h> 39 40 static void 41 usage(void) 42 { 43 (void)fprintf(stderr, "usage: uuidgen [-1] [-n count] [-o filename]\n"); 44 exit(1); 45 } 46 47 int 48 main(int argc, char *argv[]) 49 { 50 FILE *fp; 51 uuid_t *store, *uuid; 52 char *p; 53 int ch, count, i, iterate, status; 54 55 count = -1; /* no count yet */ 56 fp = stdout; /* default output file */ 57 iterate = 0; /* not one at a time */ 58 while ((ch = getopt(argc, argv, "1n:o:")) != -1) 59 switch (ch) { 60 case '1': 61 iterate = 1; 62 break; 63 case 'n': 64 if (count > 0) 65 usage(); 66 count = strtol(optarg, &p, 10); 67 if (*p != 0 || count < 1) 68 usage(); 69 break; 70 case 'o': 71 if (fp != stdout) 72 errx(1, "multiple output files not allowed"); 73 fp = fopen(optarg, "w"); 74 if (fp == NULL) 75 err(1, "fopen"); 76 break; 77 default: 78 usage(); 79 } 80 argv += optind; 81 argc -= optind; 82 83 if (argc) 84 usage(); 85 86 caph_cache_catpages(); 87 if (caph_limit_stdio() < 0) 88 err(1, "Unable to limit stdio"); 89 if (cap_enter() < 0 && errno != ENOSYS) 90 err(1, "Unable to enter capability mode"); 91 92 if (count == -1) 93 count = 1; 94 95 store = (uuid_t*)malloc(sizeof(uuid_t) * count); 96 if (store == NULL) 97 err(1, "malloc()"); 98 99 if (!iterate) { 100 /* Get them all in a single batch */ 101 if (uuidgen(store, count) != 0) 102 err(1, "uuidgen()"); 103 } else { 104 uuid = store; 105 for (i = 0; i < count; i++) { 106 if (uuidgen(uuid++, 1) != 0) 107 err(1, "uuidgen()"); 108 } 109 } 110 111 uuid = store; 112 while (count--) { 113 uuid_to_string(uuid++, &p, &status); 114 if (status != uuid_s_ok) 115 err(1, "cannot stringify a UUID"); 116 fprintf(fp, "%s\n", p); 117 free(p); 118 } 119 120 free(store); 121 if (fp != stdout) 122 fclose(fp); 123 return (0); 124 } 125