summaryrefslogtreecommitdiffstats
path: root/usr.bin/cap_mkdb/cap_mkdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/cap_mkdb/cap_mkdb.c')
-rw-r--r--usr.bin/cap_mkdb/cap_mkdb.c250
1 files changed, 0 insertions, 250 deletions
diff --git a/usr.bin/cap_mkdb/cap_mkdb.c b/usr.bin/cap_mkdb/cap_mkdb.c
deleted file mode 100644
index f809c86..0000000
--- a/usr.bin/cap_mkdb/cap_mkdb.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. 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.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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.
- */
-
-#ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1992, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
-#endif /* not lint */
-
-#ifndef lint
-static char sccsid[] = "@(#)cap_mkdb.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/stat.h>
-
-#include <db.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void db_build __P((char **));
-void dounlink __P((void));
-void usage __P((void));
-
-DB *capdbp;
-int verbose;
-char *capdb, *capname, buf[8 * 1024];
-
-/*
- * Mkcapdb creates a capability hash database for quick retrieval of capability
- * records. The database contains 2 types of entries: records and references
- * marked by the first byte in the data. A record entry contains the actual
- * capability record whereas a reference contains the name (key) under which
- * the correct record is stored.
- */
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{
- int c;
-
- capname = NULL;
- while ((c = getopt(argc, argv, "f:v")) != EOF) {
- switch(c) {
- case 'f':
- capname = optarg;
- break;
- case 'v':
- verbose = 1;
- break;
- case '?':
- default:
- usage();
- }
- }
- argc -= optind;
- argv += optind;
-
- if (*argv == NULL)
- usage();
-
- /*
- * The database file is the first argument if no name is specified.
- * Make arrangements to unlink it if exit badly.
- */
- (void)snprintf(buf, sizeof(buf), "%s.db", capname ? capname : *argv);
- if ((capname = strdup(buf)) == NULL)
- err(1, "");
- if ((capdbp = dbopen(capname,
- O_CREAT | O_TRUNC | O_RDWR, DEFFILEMODE, DB_HASH, NULL)) == NULL)
- err(1, "%s", buf);
-
- if (atexit(dounlink))
- err(1, "atexit");
-
- db_build(argv);
-
- if (capdbp->close(capdbp) < 0)
- err(1, "%s", capname);
- capname = NULL;
- exit(0);
-}
-
-void
-dounlink()
-{
- if (capname != NULL)
- (void)unlink(capname);
-}
-
-/*
- * Any changes to these definitions should be made also in the getcap(3)
- * library routines.
- */
-#define RECOK (char)0
-#define TCERR (char)1
-#define SHADOW (char)2
-
-/*
- * Db_build() builds the name and capabilty databases according to the
- * details above.
- */
-void
-db_build(ifiles)
- char **ifiles;
-{
- DBT key, data;
- recno_t reccnt;
- size_t len, bplen;
- int st;
- char *bp, *p, *t;
-
- data.data = NULL;
- key.data = NULL;
- for (reccnt = 0, bplen = 0; (st = cgetnext(&bp, ifiles)) > 0;) {
-
- /*
- * Allocate enough memory to store record, terminating
- * NULL and one extra byte.
- */
- len = strlen(bp);
- if (bplen <= len + 2) {
- bplen += MAX(256, len + 2);
- if ((data.data = realloc(data.data, bplen)) == NULL)
- err(1, "");
- }
-
- /* Find the end of the name field. */
- if ((p = strchr(bp, ':')) == NULL) {
- warnx("no name field: %.*s", MIN(len, 20), bp);
- continue;
- }
-
- /* First byte of stored record indicates status. */
- switch(st) {
- case 1:
- ((char *)(data.data))[0] = RECOK;
- break;
- case 2:
- ((char *)(data.data))[0] = TCERR;
- warnx("Record not tc expanded: %.*s", p - bp, bp);
- break;
- }
-
- /* Create the stored record. */
- memmove(&((u_char *)(data.data))[1], bp, len + 1);
- data.size = len + 2;
-
- /* Store the record under the name field. */
- key.data = bp;
- key.size = p - bp;
-
- switch(capdbp->put(capdbp, &key, &data, R_NOOVERWRITE)) {
- case -1:
- err(1, "put");
- /* NOTREACHED */
- case 1:
- warnx("ignored duplicate: %.*s",
- key.size, (char *)key.data);
- continue;
- }
- ++reccnt;
-
- /* If only one name, ignore the rest. */
- if ((p = strchr(bp, '|')) == NULL)
- continue;
-
- /* The rest of the names reference the entire name. */
- ((char *)(data.data))[0] = SHADOW;
- memmove(&((u_char *)(data.data))[1], key.data, key.size);
- data.size = key.size + 1;
-
- /* Store references for other names. */
- for (p = t = bp;; ++p) {
- if (p > t && (*p == ':' || *p == '|')) {
- key.size = p - t;
- key.data = t;
- switch(capdbp->put(capdbp,
- &key, &data, R_NOOVERWRITE)) {
- case -1:
- err(1, "put");
- /* NOTREACHED */
- case 1:
- warnx("ignored duplicate: %.*s",
- key.size, (char *)key.data);
- }
- t = p + 1;
- }
- if (*p == ':')
- break;
- }
- }
-
- switch(st) {
- case -1:
- err(1, "file argument");
- /* NOTREACHED */
- case -2:
- errx(1, "potential reference loop detected");
- /* NOTREACHED */
- }
-
- if (verbose)
- (void)printf("cap_mkdb: %d capability records\n", reccnt);
-}
-
-void
-usage()
-{
- (void)fprintf(stderr,
- "usage: cap_mkdb [-v] [-f outfile] file1 [file2 ...]\n");
- exit(1);
-}
OpenPOWER on IntegriCloud