[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.21

1.21    ! tedu        1: /*     $OpenBSD: option.c,v 1.20 2017/01/03 21:31:16 tedu 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 },
1.20      tedu       62:        { "-delete",    N_DELETE,       c_delete,       O_ZERO },
1.1       deraadt    63:        { "-depth",     N_DEPTH,        c_depth,        O_ZERO },
1.5       tholo      64:        { "-empty",     N_EMPTY,        c_empty,        O_ZERO },
1.1       deraadt    65:        { "-exec",      N_EXEC,         c_exec,         O_ARGVP },
1.6       millert    66:        { "-execdir",   N_EXECDIR,      c_execdir,      O_ARGVP },
1.12      millert    67:        { "-flags",     N_FLAGS,        c_flags,        O_ARGV },
1.1       deraadt    68:        { "-follow",    N_FOLLOW,       c_follow,       O_ZERO },
                     69:        { "-fstype",    N_FSTYPE,       c_fstype,       O_ARGV },
                     70:        { "-group",     N_GROUP,        c_group,        O_ARGV },
1.11      deraadt    71:        { "-iname",     N_INAME,        c_iname,        O_ARGV },
1.1       deraadt    72:        { "-inum",      N_INUM,         c_inum,         O_ARGV },
                     73:        { "-links",     N_LINKS,        c_links,        O_ARGV },
                     74:        { "-ls",        N_LS,           c_ls,           O_ZERO },
1.4       tholo      75:        { "-maxdepth",  N_MAXDEPTH,     c_maxdepth,     O_ARGV },
                     76:        { "-mindepth",  N_MINDEPTH,     c_mindepth,     O_ARGV },
1.8       deraadt    77:        { "-mmin",      N_MMIN,         c_mmin,         O_ARGV },
1.4       tholo      78:        { "-mount",     N_XDEV,         c_xdev,         O_ZERO },
1.1       deraadt    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 },
1.21    ! tedu       83:        { "-not",       N_NOT,          c_not,          O_ZERO },
1.1       deraadt    84:        { "-nouser",    N_NOUSER,       c_nouser,       O_ZERO },
                     85:        { "-o",         N_OR,           c_or,           O_ZERO },
                     86:        { "-ok",        N_OK,           c_exec,         O_ARGVP },
                     87:        { "-or",        N_OR,           c_or,           O_ZERO },
                     88:        { "-path",      N_PATH,         c_path,         O_ARGV },
                     89:        { "-perm",      N_PERM,         c_perm,         O_ARGV },
                     90:        { "-print",     N_PRINT,        c_print,        O_ZERO },
                     91:        { "-print0",    N_PRINT0,       c_print0,       O_ZERO },
                     92:        { "-prune",     N_PRUNE,        c_prune,        O_ZERO },
                     93:        { "-size",      N_SIZE,         c_size,         O_ARGV },
                     94:        { "-type",      N_TYPE,         c_type,         O_ARGV },
                     95:        { "-user",      N_USER,         c_user,         O_ARGV },
                     96:        { "-xdev",      N_XDEV,         c_xdev,         O_ZERO },
                     97: };
                     98:
                     99: /*
                    100:  * find_create --
                    101:  *     create a node corresponding to a command line argument.
                    102:  *
                    103:  * TODO:
                    104:  *     add create/process function pointers to node, so we can skip
                    105:  *     this switch stuff.
                    106:  */
                    107: PLAN *
1.16      deraadt   108: find_create(char ***argvp)
1.1       deraadt   109: {
1.13      mpech     110:        OPTION *p;
1.1       deraadt   111:        PLAN *new;
                    112:        char **argv;
                    113:
                    114:        argv = *argvp;
                    115:
                    116:        if ((p = option(*argv)) == NULL)
                    117:                errx(1, "%s: unknown option", *argv);
                    118:        ++argv;
                    119:        if (p->flags & (O_ARGV|O_ARGVP) && !*argv)
                    120:                errx(1, "%s: requires additional arguments", *--argv);
                    121:
                    122:        switch(p->flags) {
                    123:        case O_NONE:
                    124:                new = NULL;
                    125:                break;
                    126:        case O_ZERO:
1.16      deraadt   127:                new = (p->create)(NULL, NULL, 0);
1.1       deraadt   128:                break;
                    129:        case O_ARGV:
1.16      deraadt   130:                new = (p->create)(*argv++, NULL, 0);
1.1       deraadt   131:                break;
                    132:        case O_ARGVP:
1.16      deraadt   133:                new = (p->create)(NULL, &argv, p->token == N_OK);
1.19      deraadt   134:                mayexecve = 1;
1.1       deraadt   135:                break;
                    136:        default:
                    137:                abort();
                    138:        }
                    139:        *argvp = argv;
                    140:        return (new);
                    141: }
                    142:
                    143: OPTION *
1.16      deraadt   144: option(char *name)
1.1       deraadt   145: {
                    146:        OPTION tmp;
                    147:
                    148:        tmp.name = name;
                    149:        return ((OPTION *)bsearch(&tmp, options,
                    150:            sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
                    151: }
                    152:
                    153: int
1.16      deraadt   154: typecompare(const void *a, const void *b)
1.1       deraadt   155: {
                    156:        return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name));
                    157: }