11590Srgrimes/*-
21590Srgrimes * Copyright (c) 1991, 1993
31590Srgrimes *	The Regents of the University of California.  All rights reserved.
41590Srgrimes *
51590Srgrimes * Redistribution and use in source and binary forms, with or without
61590Srgrimes * modification, are permitted provided that the following conditions
71590Srgrimes * are met:
81590Srgrimes * 1. Redistributions of source code must retain the above copyright
91590Srgrimes *    notice, this list of conditions and the following disclaimer.
101590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
111590Srgrimes *    notice, this list of conditions and the following disclaimer in the
121590Srgrimes *    documentation and/or other materials provided with the distribution.
131590Srgrimes * 3. Neither the name of the University nor the names of its contributors
141590Srgrimes *    may be used to endorse or promote products derived from this software
151590Srgrimes *    without specific prior written permission.
161590Srgrimes *
171590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
181590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
191590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
201590Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
211590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
221590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
231590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
251590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
261590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
271590Srgrimes * SUCH DAMAGE.
281590Srgrimes */
291590Srgrimes
301590Srgrimes#if 0
311590Srgrimes#ifndef lint
321590Srgrimesstatic char sccsid[] = "@(#)misc.c	8.1 (Berkeley) 6/6/93";
331590Srgrimes#endif /*not lint */
341590Srgrimes#endif
3574769Smikeh#include <sys/cdefs.h>
361590Srgrimes__FBSDID("$FreeBSD$");
3774769Smikeh
3874769Smikeh#include <sys/types.h>
3974769Smikeh#include <sys/stat.h>
401590Srgrimes#include <err.h>
411590Srgrimes#include <fts.h>
421590Srgrimes#include <stdio.h>
431590Srgrimes#include <unistd.h>
441590Srgrimes#include "mtree.h"
451590Srgrimes#include "extern.h"
461590Srgrimes
471590Srgrimestypedef struct _key {
481590Srgrimes	const char *name;			/* key name */
491590Srgrimes	u_int val;			/* value */
501590Srgrimes
511590Srgrimes#define	NEEDVALUE	0x01
521590Srgrimes	u_int flags;
531590Srgrimes} KEY;
541590Srgrimes
551590Srgrimes/* NB: the following table must be sorted lexically. */
561590Srgrimesstatic KEY keylist[] = {
5777274Smikeh	{"cksum",	F_CKSUM,	NEEDVALUE},
5877274Smikeh	{"flags",	F_FLAGS,	NEEDVALUE},
591590Srgrimes	{"gid",		F_GID,		NEEDVALUE},
601590Srgrimes	{"gname",	F_GNAME,	NEEDVALUE},
611590Srgrimes	{"ignore",	F_IGN,		0},
621590Srgrimes	{"link",	F_SLINK,	NEEDVALUE},
631590Srgrimes#ifdef MD5
6477274Smikeh	{"md5digest",	F_MD5,		NEEDVALUE},
651590Srgrimes#endif
6677274Smikeh	{"mode",	F_MODE,		NEEDVALUE},
6777274Smikeh	{"nlink",	F_NLINK,	NEEDVALUE},
681590Srgrimes	{"nochange",	F_NOCHANGE,	0},
691590Srgrimes	{"optional",	F_OPT,		0},
701590Srgrimes#ifdef RMD160
711590Srgrimes	{"ripemd160digest", F_RMD160,	NEEDVALUE},
7274769Smikeh#endif
731590Srgrimes#ifdef SHA1
741590Srgrimes	{"sha1digest",	F_SHA1,		NEEDVALUE},
7574769Smikeh#endif
7674769Smikeh#ifdef SHA256
7774769Smikeh	{"sha256digest",	F_SHA256,		NEEDVALUE},
7877274Smikeh#endif
791590Srgrimes	{"size",	F_SIZE,		NEEDVALUE},
801590Srgrimes	{"time",	F_TIME,		NEEDVALUE},
811590Srgrimes	{"type",	F_TYPE,		NEEDVALUE},
821590Srgrimes	{"uid",		F_UID,		NEEDVALUE},
831590Srgrimes	{"uname",	F_UNAME,	NEEDVALUE},
841590Srgrimes};
851590Srgrimes
861590Srgrimesint keycompare(const void *, const void *);
871590Srgrimes
881590Srgrimesu_int
891590Srgrimesparsekey(char *name, int *needvaluep)
9074769Smikeh{
9174769Smikeh	KEY *k, tmp;
9274769Smikeh
931590Srgrimes	tmp.name = name;
941590Srgrimes	k = (KEY *)bsearch(&tmp, keylist, sizeof(keylist) / sizeof(KEY),
951590Srgrimes	    sizeof(KEY), keycompare);
961590Srgrimes	if (k == NULL)
9776455Smikeh		errx(1, "line %d: unknown keyword %s", lineno, name);
9876455Smikeh
9976455Smikeh	if (needvaluep)
10076455Smikeh		*needvaluep = k->flags & NEEDVALUE ? 1 : 0;
10176455Smikeh	return (k->val);
10276455Smikeh}
10376455Smikeh
10476455Smikehint
10576455Smikehkeycompare(const void *a, const void *b)
10676455Smikeh{
10777274Smikeh	return (strcmp(((const KEY *)a)->name, ((const KEY *)b)->name));
10874769Smikeh}
10974769Smikeh
11074769Smikehchar *
11174769Smikehflags_to_string(u_long fflags)
1121590Srgrimes{
1131590Srgrimes	char *string;
11474769Smikeh
11574769Smikeh	string = fflagstostr(fflags);
1161590Srgrimes	if (string != NULL && *string == '\0') {
1171590Srgrimes		free(string);
1181590Srgrimes		string = strdup("none");
1191590Srgrimes	}
12067496Sphk	if (string == NULL)
1211590Srgrimes		err(1, NULL);
1221590Srgrimes
1231590Srgrimes	return string;
1241590Srgrimes}
1251590Srgrimes