GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/find/option.c Lines: 17 25 68.0 %
Date: 2016-12-06 Branches: 6 11 54.5 %

Line Branch Exec Source
1
/*	$OpenBSD: option.c,v 1.19 2015/10/05 15:25:16 deraadt Exp $	*/
2
3
/*-
4
 * Copyright (c) 1990, 1993
5
 *	The Regents of the University of California.  All rights reserved.
6
 *
7
 * This code is derived from software contributed to Berkeley by
8
 * Cimarron D. Taylor of the University of California, Berkeley.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 * 3. Neither the name of the University nor the names of its contributors
19
 *    may be used to endorse or promote products derived from this software
20
 *    without specific prior written permission.
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
 * SUCH DAMAGE.
33
 */
34
35
#include <sys/types.h>
36
#include <sys/stat.h>
37
38
#include <err.h>
39
#include <fts.h>
40
#include <stdio.h>
41
#include <stdlib.h>
42
#include <string.h>
43
44
#include "find.h"
45
#include "extern.h"
46
47
int typecompare(const void *, const void *);
48
49
/* NB: the following table must be sorted lexically. */
50
static OPTION options[] = {
51
	{ "!",		N_NOT,		c_not,		O_ZERO },
52
	{ "(",		N_OPENPAREN,	c_openparen,	O_ZERO },
53
	{ ")",		N_CLOSEPAREN,	c_closeparen,	O_ZERO },
54
	{ "-a",		N_AND,		NULL,		O_NONE },
55
	{ "-amin",	N_AMIN,		c_amin,		O_ARGV },
56
	{ "-and",	N_AND,		NULL,		O_NONE },
57
	{ "-anewer",	N_ANEWER,	c_anewer,	O_ARGV },
58
	{ "-atime",	N_ATIME,	c_atime,	O_ARGV },
59
	{ "-cmin",	N_CMIN,		c_cmin,		O_ARGV },
60
	{ "-cnewer",	N_CNEWER,	c_cnewer,	O_ARGV },
61
	{ "-ctime",	N_CTIME,	c_ctime,	O_ARGV },
62
	{ "-depth",	N_DEPTH,	c_depth,	O_ZERO },
63
	{ "-empty",	N_EMPTY,	c_empty,	O_ZERO },
64
	{ "-exec",	N_EXEC,		c_exec,		O_ARGVP },
65
	{ "-execdir",	N_EXECDIR,	c_execdir,	O_ARGVP },
66
	{ "-flags",	N_FLAGS,	c_flags,	O_ARGV },
67
	{ "-follow",	N_FOLLOW,	c_follow,	O_ZERO },
68
	{ "-fstype",	N_FSTYPE,	c_fstype,	O_ARGV },
69
	{ "-group",	N_GROUP,	c_group,	O_ARGV },
70
	{ "-iname",	N_INAME,	c_iname,	O_ARGV },
71
	{ "-inum",	N_INUM,		c_inum,		O_ARGV },
72
	{ "-links",	N_LINKS,	c_links,	O_ARGV },
73
	{ "-ls",	N_LS,		c_ls,		O_ZERO },
74
	{ "-maxdepth",	N_MAXDEPTH,	c_maxdepth,	O_ARGV },
75
	{ "-mindepth",	N_MINDEPTH,	c_mindepth,	O_ARGV },
76
	{ "-mmin",	N_MMIN,		c_mmin,		O_ARGV },
77
	{ "-mount",	N_XDEV,		c_xdev,		O_ZERO },
78
	{ "-mtime",	N_MTIME,	c_mtime,	O_ARGV },
79
	{ "-name",	N_NAME,		c_name,		O_ARGV },
80
	{ "-newer",	N_NEWER,	c_newer,	O_ARGV },
81
	{ "-nogroup",	N_NOGROUP,	c_nogroup,	O_ZERO },
82
	{ "-nouser",	N_NOUSER,	c_nouser,	O_ZERO },
83
	{ "-o",		N_OR,		c_or,		O_ZERO },
84
	{ "-ok",	N_OK,		c_exec,		O_ARGVP },
85
	{ "-or",	N_OR,		c_or,		O_ZERO },
86
	{ "-path", 	N_PATH,		c_path,		O_ARGV },
87
	{ "-perm",	N_PERM,		c_perm,		O_ARGV },
88
	{ "-print",	N_PRINT,	c_print,	O_ZERO },
89
	{ "-print0",	N_PRINT0,	c_print0,	O_ZERO },
90
	{ "-prune",	N_PRUNE,	c_prune,	O_ZERO },
91
	{ "-size",	N_SIZE,		c_size,		O_ARGV },
92
	{ "-type",	N_TYPE,		c_type,		O_ARGV },
93
	{ "-user",	N_USER,		c_user,		O_ARGV },
94
	{ "-xdev",	N_XDEV,		c_xdev,		O_ZERO },
95
};
96
97
/*
98
 * find_create --
99
 *	create a node corresponding to a command line argument.
100
 *
101
 * TODO:
102
 *	add create/process function pointers to node, so we can skip
103
 *	this switch stuff.
104
 */
105
PLAN *
106
find_create(char ***argvp)
107
11
{
108
	OPTION *p;
109
	PLAN *new;
110
	char **argv;
111
112
11
	argv = *argvp;
113
114
11
	if ((p = option(*argv)) == NULL)
115
		errx(1, "%s: unknown option", *argv);
116
11
	++argv;
117

11
	if (p->flags & (O_ARGV|O_ARGVP) && !*argv)
118
		errx(1, "%s: requires additional arguments", *--argv);
119
120

11
	switch(p->flags) {
121
	case O_NONE:
122
		new = NULL;
123
		break;
124
	case O_ZERO:
125
2
		new = (p->create)(NULL, NULL, 0);
126
2
		break;
127
	case O_ARGV:
128
9
		new = (p->create)(*argv++, NULL, 0);
129
9
		break;
130
	case O_ARGVP:
131
		new = (p->create)(NULL, &argv, p->token == N_OK);
132
		mayexecve = 1;
133
		break;
134
	default:
135
		abort();
136
	}
137
11
	*argvp = argv;
138
11
	return (new);
139
}
140
141
OPTION *
142
option(char *name)
143
11
{
144
	OPTION tmp;
145
146
11
	tmp.name = name;
147
11
	return ((OPTION *)bsearch(&tmp, options,
148
	    sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
149
}
150
151
int
152
typecompare(const void *a, const void *b)
153
49
{
154
49
	return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name));
155
}