sigset.c -> sigsetops.c, add sigsetops man page
[unix-history] / usr / src / usr.bin / find / find.c
index 0503386..69d7b2c 100644 (file)
@@ -15,42 +15,61 @@ char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)find.c     4.25 (Berkeley) %G%";
+static char sccsid[] = "@(#)find.c     4.31 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fts.h>
 #include <stdio.h>
 #endif /* not lint */
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fts.h>
 #include <stdio.h>
-#include <strings.h>
+#include <string.h>
 #include <errno.h>
 #include "find.h"
 
 FTS *tree;                     /* pointer to top of FTS hierarchy */
 time_t now;                    /* time find was run */
 #include <errno.h>
 #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 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 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;
 
 main(argc, argv)
        int argc;
        char **argv;
 {
        PLAN *plan;
-       char **paths, **find_getpaths();
+       char **p, **paths;
        PLAN *find_formplan();
        time_t time();
     
        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();
 
        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);
 }
        plan = find_formplan(argv);             /* execution plan */
        find_execute(plan, paths);
 }
@@ -65,7 +84,6 @@ find_formplan(argv)
        char **argv;
 {
        PLAN *plan, *tail, *new;
        char **argv;
 {
        PLAN *plan, *tail, *new;
-       int i;
        PLAN *c_print(), *find_create(), *find_squish_not(), *find_squish_or();
        PLAN *find_squish_paren();
 
        PLAN *c_print(), *find_create(), *find_squish_not(), *find_squish_or();
        PLAN *find_squish_paren();
 
@@ -157,18 +175,19 @@ find_execute(plan, paths)
                exit(1);
        }
        while (entry = ftsread(tree)) {
                exit(1);
        }
        while (entry = ftsread(tree)) {
-               switch(entry->info) {
+               switch(entry->fts_info) {
                case FTS_DNR:
                        (void)fprintf(stderr,
                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,
                        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,
                        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)
                        continue;
                case FTS_D:
                        if (depth)
@@ -176,7 +195,7 @@ find_execute(plan, paths)
                        break;
                case FTS_DC:
                        (void)fprintf(stderr,
                        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)
                        continue;
                case FTS_DP:
                        if (!depth)
@@ -184,28 +203,18 @@ find_execute(plan, paths)
                case FTS_NS:
                        if (!(ftsoptions & FTS_NOSTAT)) {
                                (void)fprintf(stderr,
                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;
                }
 
                                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);
                /*
                 * 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);
 }
        }
        (void)ftsclose(tree);
 }