aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/fmtree/spec.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/fmtree/spec.c')
-rw-r--r--usr.sbin/fmtree/spec.c323
1 files changed, 0 insertions, 323 deletions
diff --git a/usr.sbin/fmtree/spec.c b/usr.sbin/fmtree/spec.c
deleted file mode 100644
index 417932db4310..000000000000
--- a/usr.sbin/fmtree/spec.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/*-
- * Copyright (c) 1989, 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. 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.
- */
-
-#if 0
-#ifndef lint
-static char sccsid[] = "@(#)spec.c 8.1 (Berkeley) 6/6/93";
-#endif /* not lint */
-#endif
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <ctype.h>
-#include <err.h>
-#include <errno.h>
-#include <fts.h>
-#include <grp.h>
-#include <pwd.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <vis.h>
-#include "mtree.h"
-#include "extern.h"
-
-int lineno; /* Current spec line number. */
-
-static void set(char *, NODE *);
-static void unset(char *, NODE *);
-
-NODE *
-mtree_readspec(FILE *fi)
-{
- NODE *centry, *last;
- char *p;
- NODE ginfo, *root;
- int c_cur, c_next;
- char buf[2048];
-
- centry = last = root = NULL;
- bzero(&ginfo, sizeof(ginfo));
- c_cur = c_next = 0;
- for (lineno = 1; fgets(buf, sizeof(buf), fi);
- ++lineno, c_cur = c_next, c_next = 0) {
- /* Skip empty lines. */
- if (buf[0] == '\n')
- continue;
-
- /* Find end of line. */
- if ((p = strchr(buf, '\n')) == NULL)
- errx(1, "line %d too long", lineno);
-
- /* See if next line is continuation line. */
- if (p[-1] == '\\') {
- --p;
- c_next = 1;
- }
-
- /* Null-terminate the line. */
- *p = '\0';
-
- /* Skip leading whitespace. */
- for (p = buf; *p && isspace(*p); ++p);
-
- /* If nothing but whitespace or comment char, continue. */
- if (!*p || *p == '#')
- continue;
-
-#ifdef DEBUG
- (void)fprintf(stderr, "line %d: {%s}\n", lineno, p);
-#endif
- if (c_cur) {
- set(p, centry);
- continue;
- }
-
- /* Grab file name, "$", "set", or "unset". */
- if ((p = strtok(p, "\n\t ")) == NULL)
- errx(1, "line %d: missing field", lineno);
-
- if (p[0] == '/')
- switch(p[1]) {
- case 's':
- if (strcmp(p + 1, "set"))
- break;
- set(NULL, &ginfo);
- continue;
- case 'u':
- if (strcmp(p + 1, "unset"))
- break;
- unset(NULL, &ginfo);
- continue;
- }
-
- if (strchr(p, '/'))
- errx(1, "line %d: slash character in file name",
- lineno);
-
- if (!strcmp(p, "..")) {
- /* Don't go up, if haven't gone down. */
- if (!root)
- goto noparent;
- if (last->type != F_DIR || last->flags & F_DONE) {
- if (last == root)
- goto noparent;
- last = last->parent;
- }
- last->flags |= F_DONE;
- continue;
-
-noparent: errx(1, "line %d: no parent node", lineno);
- }
-
- if ((centry = calloc(1, sizeof(NODE) + strlen(p))) == NULL)
- errx(1, "calloc");
- *centry = ginfo;
-#define MAGIC "?*["
- if (strpbrk(p, MAGIC))
- centry->flags |= F_MAGIC;
- if (strunvis(centry->name, p) == -1)
- errx(1, "filename %s is ill-encoded", p);
- set(NULL, centry);
-
- if (!root) {
- last = root = centry;
- root->parent = root;
- } else if (last->type == F_DIR && !(last->flags & F_DONE)) {
- centry->parent = last;
- last = last->child = centry;
- } else {
- centry->parent = last->parent;
- centry->prev = last;
- last = last->next = centry;
- }
- }
- return (root);
-}
-
-static void
-set(char *t, NODE *ip)
-{
- int type;
- char *kw, *val = NULL;
- struct group *gr;
- struct passwd *pw;
- mode_t *m;
- int value;
- char *ep;
-
- for (; (kw = strtok(t, "= \t\n")); t = NULL) {
- ip->flags |= type = parsekey(kw, &value);
- if (value && (val = strtok(NULL, " \t\n")) == NULL)
- errx(1, "line %d: missing value", lineno);
- switch(type) {
- case F_CKSUM:
- ip->cksum = strtoul(val, &ep, 10);
- if (*ep)
- errx(1, "line %d: invalid checksum %s",
- lineno, val);
- break;
- case F_MD5:
- ip->md5digest = strdup(val);
- if(!ip->md5digest)
- errx(1, "strdup");
- break;
- case F_SHA1:
- ip->sha1digest = strdup(val);
- if(!ip->sha1digest)
- errx(1, "strdup");
- break;
- case F_SHA256:
- ip->sha256digest = strdup(val);
- if(!ip->sha256digest)
- errx(1, "strdup");
- break;
- case F_RMD160:
- ip->rmd160digest = strdup(val);
- if(!ip->rmd160digest)
- errx(1, "strdup");
- break;
- case F_FLAGS:
- if (strcmp("none", val) == 0)
- ip->st_flags = 0;
- else if (strtofflags(&val, &ip->st_flags, NULL) != 0)
- errx(1, "line %d: invalid flag %s",lineno, val);
- break;
- case F_GID:
- ip->st_gid = strtoul(val, &ep, 10);
- if (*ep)
- errx(1, "line %d: invalid gid %s", lineno, val);
- break;
- case F_GNAME:
- if ((gr = getgrnam(val)) == NULL)
- errx(1, "line %d: unknown group %s", lineno, val);
- ip->st_gid = gr->gr_gid;
- break;
- case F_IGN:
- /* just set flag bit */
- break;
- case F_MODE:
- if ((m = setmode(val)) == NULL)
- errx(1, "line %d: invalid file mode %s",
- lineno, val);
- ip->st_mode = getmode(m, 0);
- free(m);
- break;
- case F_NLINK:
- ip->st_nlink = strtoul(val, &ep, 10);
- if (*ep)
- errx(1, "line %d: invalid link count %s",
- lineno, val);
- break;
- case F_OPT:
- /* just set flag bit */
- break;
- case F_SIZE:
- ip->st_size = strtoq(val, &ep, 10);
- if (*ep)
- errx(1, "line %d: invalid size %s",
- lineno, val);
- break;
- case F_SLINK:
- ip->slink = malloc(strlen(val) + 1);
- if (ip->slink == NULL)
- errx(1, "malloc");
- if (strunvis(ip->slink, val) == -1)
- errx(1, "symlink %s is ill-encoded", val);
- break;
- case F_TIME:
- ip->st_mtimespec.tv_sec = strtoul(val, &ep, 10);
- if (*ep == '.') {
- /* Note: we require exactly nine
- * digits after the decimal point. */
- val = ep + 1;
- ip->st_mtimespec.tv_nsec
- = strtoul(val, &ep, 10);
- } else
- ip->st_mtimespec.tv_nsec = 0;
- if (*ep)
- errx(1, "line %d: invalid time %s",
- lineno, val);
- break;
- case F_TYPE:
- switch(*val) {
- case 'b':
- if (!strcmp(val, "block"))
- ip->type = F_BLOCK;
- break;
- case 'c':
- if (!strcmp(val, "char"))
- ip->type = F_CHAR;
- break;
- case 'd':
- if (!strcmp(val, "dir"))
- ip->type = F_DIR;
- break;
- case 'f':
- if (!strcmp(val, "file"))
- ip->type = F_FILE;
- if (!strcmp(val, "fifo"))
- ip->type = F_FIFO;
- break;
- case 'l':
- if (!strcmp(val, "link"))
- ip->type = F_LINK;
- break;
- case 's':
- if (!strcmp(val, "socket"))
- ip->type = F_SOCK;
- break;
- default:
- errx(1, "line %d: unknown file type %s",
- lineno, val);
- }
- break;
- case F_UID:
- ip->st_uid = strtoul(val, &ep, 10);
- if (*ep)
- errx(1, "line %d: invalid uid %s", lineno, val);
- break;
- case F_UNAME:
- if ((pw = getpwnam(val)) == NULL)
- errx(1, "line %d: unknown user %s", lineno, val);
- ip->st_uid = pw->pw_uid;
- break;
- }
- }
-}
-
-static void
-unset(char *t, NODE *ip)
-{
- char *p;
-
- while ((p = strtok(t, "\n\t ")))
- ip->flags &= ~parsekey(p, NULL);
-}