[BACK]Return to option.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / find

Annotation of src/usr.bin/find/option.c, Revision 1.19

1.19    ! deraadt     1: /*     $OpenBSD: option.c,v 1.18 2009/10/27 23:59:38 deraadt Exp $     */
1.2       deraadt     2:
1.1       deraadt     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.
1.15      millert    18:  * 3. Neither the name of the University nor the names of its contributors
1.1       deraadt    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"
1.16      deraadt    45: #include "extern.h"
1.1       deraadt    46:
1.17      deraadt    47: int typecompare(const void *, const void *);
                     48:
1.1       deraadt    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 },
1.8       deraadt    55:        { "-amin",      N_AMIN,         c_amin,         O_ARGV },
1.10      deraadt    56:        { "-and",       N_AND,          NULL,           O_NONE },
1.9       millert    57:        { "-anewer",    N_ANEWER,       c_anewer,       O_ARGV },
1.1       deraadt    58:        { "-atime",     N_ATIME,        c_atime,        O_ARGV },
1.7       deraadt    59:        { "-cmin",      N_CMIN,         c_cmin,         O_ARGV },
1.9       millert    60:        { "-cnewer",    N_CNEWER,       c_cnewer,       O_ARGV },
1.1       deraadt    61:        { "-ctime",     N_CTIME,        c_ctime,        O_ARGV },
                     62:        { "-depth",     N_DEPTH,        c_depth,        O_ZERO },
1.5       tholo      63:        { "-empty",     N_EMPTY,        c_empty,        O_ZERO },
1.1       deraadt    64:        { "-exec",      N_EXEC,         c_exec,         O_ARGVP },
1.6       millert    65:        { "-execdir",   N_EXECDIR,      c_execdir,      O_ARGVP },
1.12      millert    66:        { "-flags",     N_FLAGS,        c_flags,        O_ARGV },
1.1       deraadt    67:        { "-follow",    N_FOLLOW,       c_follow,       O_ZERO },
                     68:        { "-fstype",    N_FSTYPE,       c_fstype,       O_ARGV },
                     69:        { "-group",     N_GROUP,        c_group,        O_ARGV },
1.11      deraadt    70:        { "-iname",     N_INAME,        c_iname,        O_ARGV },
1.1       deraadt    71:        { "-inum",      N_INUM,         c_inum,         O_ARGV },
                     72:        { "-links",     N_LINKS,        c_links,        O_ARGV },
                     73:        { "-ls",        N_LS,           c_ls,           O_ZERO },
1.4       tholo      74:        { "-maxdepth",  N_MAXDEPTH,     c_maxdepth,     O_ARGV },
                     75:        { "-mindepth",  N_MINDEPTH,     c_mindepth,     O_ARGV },
1.8       deraadt    76:        { "-mmin",      N_MMIN,         c_mmin,         O_ARGV },
1.4       tholo      77:        { "-mount",     N_XDEV,         c_xdev,         O_ZERO },
1.1       deraadt    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 *
1.16      deraadt   106: find_create(char ***argvp)
1.1       deraadt   107: {
1.13      mpech     108:        OPTION *p;
1.1       deraadt   109:        PLAN *new;
                    110:        char **argv;
                    111:
                    112:        argv = *argvp;
                    113:
                    114:        if ((p = option(*argv)) == NULL)
                    115:                errx(1, "%s: unknown option", *argv);
                    116:        ++argv;
                    117:        if (p->flags & (O_ARGV|O_ARGVP) && !*argv)
                    118:                errx(1, "%s: requires additional arguments", *--argv);
                    119:
                    120:        switch(p->flags) {
                    121:        case O_NONE:
                    122:                new = NULL;
                    123:                break;
                    124:        case O_ZERO:
1.16      deraadt   125:                new = (p->create)(NULL, NULL, 0);
1.1       deraadt   126:                break;
                    127:        case O_ARGV:
1.16      deraadt   128:                new = (p->create)(*argv++, NULL, 0);
1.1       deraadt   129:                break;
                    130:        case O_ARGVP:
1.16      deraadt   131:                new = (p->create)(NULL, &argv, p->token == N_OK);
1.19    ! deraadt   132:                mayexecve = 1;
1.1       deraadt   133:                break;
                    134:        default:
                    135:                abort();
                    136:        }
                    137:        *argvp = argv;
                    138:        return (new);
                    139: }
                    140:
                    141: OPTION *
1.16      deraadt   142: option(char *name)
1.1       deraadt   143: {
                    144:        OPTION tmp;
                    145:
                    146:        tmp.name = name;
                    147:        return ((OPTION *)bsearch(&tmp, options,
                    148:            sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
                    149: }
                    150:
                    151: int
1.16      deraadt   152: typecompare(const void *a, const void *b)
1.1       deraadt   153: {
                    154:        return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name));
                    155: }