GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/find/option.c Lines: 21 25 84.0 %
Date: 2017-11-13 Branches: 7 11 63.6 %

Line Branch Exec Source
1
/*	$OpenBSD: option.c,v 1.20 2017/01/03 21:31:16 tedu 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
	{ "-delete",	N_DELETE,	c_delete,	O_ZERO },
63
	{ "-depth",	N_DEPTH,	c_depth,	O_ZERO },
64
	{ "-empty",	N_EMPTY,	c_empty,	O_ZERO },
65
	{ "-exec",	N_EXEC,		c_exec,		O_ARGVP },
66
	{ "-execdir",	N_EXECDIR,	c_execdir,	O_ARGVP },
67
	{ "-flags",	N_FLAGS,	c_flags,	O_ARGV },
68
	{ "-follow",	N_FOLLOW,	c_follow,	O_ZERO },
69
	{ "-fstype",	N_FSTYPE,	c_fstype,	O_ARGV },
70
	{ "-group",	N_GROUP,	c_group,	O_ARGV },
71
	{ "-iname",	N_INAME,	c_iname,	O_ARGV },
72
	{ "-inum",	N_INUM,		c_inum,		O_ARGV },
73
	{ "-links",	N_LINKS,	c_links,	O_ARGV },
74
	{ "-ls",	N_LS,		c_ls,		O_ZERO },
75
	{ "-maxdepth",	N_MAXDEPTH,	c_maxdepth,	O_ARGV },
76
	{ "-mindepth",	N_MINDEPTH,	c_mindepth,	O_ARGV },
77
	{ "-mmin",	N_MMIN,		c_mmin,		O_ARGV },
78
	{ "-mount",	N_XDEV,		c_xdev,		O_ZERO },
79
	{ "-mtime",	N_MTIME,	c_mtime,	O_ARGV },
80
	{ "-name",	N_NAME,		c_name,		O_ARGV },
81
	{ "-newer",	N_NEWER,	c_newer,	O_ARGV },
82
	{ "-nogroup",	N_NOGROUP,	c_nogroup,	O_ZERO },
83
	{ "-nouser",	N_NOUSER,	c_nouser,	O_ZERO },
84
	{ "-o",		N_OR,		c_or,		O_ZERO },
85
	{ "-ok",	N_OK,		c_exec,		O_ARGVP },
86
	{ "-or",	N_OR,		c_or,		O_ZERO },
87
	{ "-path", 	N_PATH,		c_path,		O_ARGV },
88
	{ "-perm",	N_PERM,		c_perm,		O_ARGV },
89
	{ "-print",	N_PRINT,	c_print,	O_ZERO },
90
	{ "-print0",	N_PRINT0,	c_print0,	O_ZERO },
91
	{ "-prune",	N_PRUNE,	c_prune,	O_ZERO },
92
	{ "-size",	N_SIZE,		c_size,		O_ARGV },
93
	{ "-type",	N_TYPE,		c_type,		O_ARGV },
94
	{ "-user",	N_USER,		c_user,		O_ARGV },
95
	{ "-xdev",	N_XDEV,		c_xdev,		O_ZERO },
96
};
97
98
/*
99
 * find_create --
100
 *	create a node corresponding to a command line argument.
101
 *
102
 * TODO:
103
 *	add create/process function pointers to node, so we can skip
104
 *	this switch stuff.
105
 */
106
PLAN *
107
find_create(char ***argvp)
108
{
109
	OPTION *p;
110
	PLAN *new;
111
86
	char **argv;
112
113
43
	argv = *argvp;
114
115
43
	if ((p = option(*argv)) == NULL)
116
		errx(1, "%s: unknown option", *argv);
117
43
	++argv;
118

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

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