X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/45fc66f996168c3c47194069ac65105fb53de2aa..b1a11722df79ff28a2704e918ef0c3639d1db0d3:/usr/src/usr.bin/find/find.c diff --git a/usr/src/usr.bin/find/find.c b/usr/src/usr.bin/find/find.c index 0503386351..3e5e6c791c 100644 --- a/usr/src/usr.bin/find/find.c +++ b/usr/src/usr.bin/find/find.c @@ -15,42 +15,61 @@ char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)find.c 4.25 (Berkeley) %G%"; +static char sccsid[] = "@(#)find.c 4.32 (Berkeley) %G%"; #endif /* not lint */ #include #include #include #include -#include +#include #include #include "find.h" FTS *tree; /* pointer to top of FTS hierarchy */ time_t now; /* time find was run */ -dev_t curdev = (dev_t)-1; /* device number of current tree */ int ftsoptions; /* options passed to ftsopen() */ +int deprecated; /* old or new syntax */ int depth; /* set by -depth option */ int output_specified; /* one of -print, -ok or -exec was specified */ -int xdev; /* set by -xdev option */ main(argc, argv) int argc; char **argv; { PLAN *plan; - char **paths, **find_getpaths(); + char **p, **paths; PLAN *find_formplan(); time_t time(); - (void)time(&now); /* initialize the time-of-day */ + (void)time(&now); /* initialize the time-of-day */ if (argc < 2) usage(); - - ftsoptions = FTS_MULTIPLE|FTS_NOSTAT|FTS_PHYSICAL; - paths = find_getpaths(&argv); /* places to start search */ + paths = argv; + ftsoptions = FTS_NOSTAT|FTS_PHYSICAL; + + /* + * if arguments start with an option, treat it like new syntax; + * otherwise, if has a "-option" anywhere (which isn't an argument + * to another command) treat it as old syntax. + */ + if (argv[1][0] != '-') + for (p = argv + 1; *p; ++p) { + if (!strcmp(*p, "exec") || !strcmp(*p, "ok")) { + while (p[1] && strcmp(*++p, ";")); + continue; + } + if (**p == '-') { + deprecated = 1; + oldsyntax(&argv); + break; + } + } + if (!deprecated) + newsyntax(argc, &argv); + plan = find_formplan(argv); /* execution plan */ find_execute(plan, paths); } @@ -65,7 +84,6 @@ find_formplan(argv) char **argv; { PLAN *plan, *tail, *new; - int i; PLAN *c_print(), *find_create(), *find_squish_not(), *find_squish_or(); PLAN *find_squish_paren(); @@ -86,7 +104,8 @@ find_formplan(argv) * plan->next pointer. */ for (plan = NULL; *argv;) { - new = find_create(&argv); + if (!(new = find_create(&argv))) + continue; if (plan == NULL) tail = plan = new; else { @@ -157,18 +176,19 @@ find_execute(plan, paths) exit(1); } while (entry = ftsread(tree)) { - switch(entry->info) { + switch(entry->fts_info) { case FTS_DNR: (void)fprintf(stderr, - "find: %s: unable to read.\n", entry->path); + "find: %s: unable to read.\n", entry->fts_path); continue; case FTS_DNX: (void)fprintf(stderr, - "find: %s: unable to search.\n", entry->path); + "find: %s: unable to search.\n", entry->fts_path); continue; case FTS_ERR: (void)fprintf(stderr, - "find: %s: %s.\n", entry->path, strerror(errno)); + "find: %s: %s.\n", entry->fts_path, + strerror(errno)); continue; case FTS_D: if (depth) @@ -176,7 +196,7 @@ find_execute(plan, paths) break; case FTS_DC: (void)fprintf(stderr, - "find: directory cycle: %s.\n", entry->path); + "find: directory cycle: %s.\n", entry->fts_path); continue; case FTS_DP: if (!depth) @@ -184,28 +204,18 @@ find_execute(plan, paths) case FTS_NS: if (!(ftsoptions & FTS_NOSTAT)) { (void)fprintf(stderr, - "find: can't stat: %s.\n", entry->path); + "find: can't stat: %s.\n", entry->fts_path); continue; } break; } - /* always keep curdev up to date, -fstype uses it. */ - if (xdev && curdev != entry->statb.st_dev && - ftsset(tree, entry, FTS_SKIP)) { - (void)fprintf(stderr, "find: %s: %s.\n", - entry->path, strerror(errno)); - exit(1); - } - /* * call all the functions in the execution plan until one is * false or all have been executed. This is where we do all * the work specified by the user on the command line. */ for (p = plan; p && (p->eval)(p, entry); p = p->next); - - curdev = entry->statb.st_dev; } (void)ftsclose(tree); }