BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.bin / find / main.c
index f353f43..114e8ef 100644 (file)
  * Copyright (c) 1990 The Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1990 The Regents of the University of California.
  * All rights reserved.
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)main.c     5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)main.c     5.9 (Berkeley) 5/24/91";
 #endif /* not lint */
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #endif /* not lint */
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <stdio.h>
+#include <fcntl.h>
+#include <time.h>
 #include <fts.h>
 #include <fts.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include "find.h"
 
 #include "find.h"
 
-newsyntax(argc, argvp)
+time_t now;                    /* time find was run */
+int dotfd;                     /* starting directory */
+int ftsoptions;                        /* options for the ftsopen(3) call */
+int isdeprecated;              /* using deprecated syntax */
+int isdepth;                   /* do directories on post-order visit */
+int isoutput;                  /* user specified output operator */
+int isxargs;                   /* don't permit xargs delimiting chars */
+
+static void usage();
+
+main(argc, argv)
        int argc;
        int argc;
-       char ***argvp;
+       char **argv;
 {
 {
-       extern char *optarg;
-       extern int depth, optind, xdev;
+       register char **p, **start;
+       PLAN *find_formplan();
        int ch;
        int ch;
-       char **argv, **cur;
 
 
-       cur = argv = *argvp;
-       while ((ch = getopt(argc, argv, "df:sx")) != EOF)
+       (void)time(&now);       /* initialize the time-of-day */
+
+       p = start = argv;
+       ftsoptions = FTS_NOSTAT|FTS_PHYSICAL;
+       while ((ch = getopt(argc, argv, "df:sXx")) != EOF)
                switch(ch) {
                case 'd':
                switch(ch) {
                case 'd':
-                       depth = 1;
+                       isdepth = 1;
                        break;
                case 'f':
                        break;
                case 'f':
-                       *cur++ = optarg;
+                       *p++ = optarg;
                        break;
                case 's':
                        ftsoptions &= ~FTS_PHYSICAL;
                        ftsoptions |= FTS_LOGICAL;
                        break;
                        break;
                case 's':
                        ftsoptions &= ~FTS_PHYSICAL;
                        ftsoptions |= FTS_LOGICAL;
                        break;
+               case 'X':
+                       isxargs = 1;
+                       break;
                case 'x':
                case 'x':
-                       xdev = 1;
                        ftsoptions &= ~FTS_NOSTAT;
                        ftsoptions &= ~FTS_NOSTAT;
+                       ftsoptions |= FTS_XDEV;
                        break;
                case '?':
                default:
                        break;
                case '?':
                default:
-                       usage();
+                       break;
                }
 
                }
 
-       *argvp += optind;
-       if (cur == argv) {
-               if (!**argvp)
-                       usage();
-               *cur++ = **argvp;
-               ++*argvp;
+       argc -= optind; 
+       argv += optind;
+
+       /* Find first option to delimit the file list. */
+       while (*argv) {
+               if (option(*argv))
+                       break;
+               *p++ = *argv++;
        }
        }
-       *cur = NULL;
+
+       if (p == start)
+               usage();
+       *p = NULL;
+
+       if ((dotfd = open(".", O_RDONLY, 0)) < 0)
+               err(".: %s", strerror(errno));
+
+       find_execute(find_formplan(argv), start);
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr,
+           "usage: find [-dsXx] [-f file] [file ...] expression\n");
+       exit(1);
 }
 }