summaryrefslogtreecommitdiff
path: root/usr.bin/find/function.c
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1999-10-04 21:17:33 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1999-10-04 21:17:33 +0000
commit2a6b2af1a4a3f478bab7a2f06a5f2bd9b19155ca (patch)
tree20030ba0cdae14437dbc9d269331113a0ea24b3b /usr.bin/find/function.c
parentd28da08ec2e33280ee1e3ff202f9a976d78aeb58 (diff)
Move the chdir/fchdir hack so that it is local to the -execdir
function, since that's the only place it needs to be. Doing it for each function caused problems with multiple directories.
Diffstat (limited to 'usr.bin/find/function.c')
-rw-r--r--usr.bin/find/function.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/usr.bin/find/function.c b/usr.bin/find/function.c
index 8b7df0d5d04..80b8e6e9003 100644
--- a/usr.bin/find/function.c
+++ b/usr.bin/find/function.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: function.c,v 1.14 1999/10/03 19:07:35 millert Exp $ */
+/* $OpenBSD: function.c,v 1.15 1999/10/04 21:17:32 millert Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -38,7 +38,7 @@
#ifndef lint
/*static char sccsid[] = "from: @(#)function.c 8.1 (Berkeley) 6/6/93";*/
-static char rcsid[] = "$OpenBSD: function.c,v 1.14 1999/10/03 19:07:35 millert Exp $";
+static char rcsid[] = "$OpenBSD: function.c,v 1.15 1999/10/04 21:17:32 millert Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -50,6 +50,7 @@ static char rcsid[] = "$OpenBSD: function.c,v 1.14 1999/10/03 19:07:35 millert E
#include <dirent.h>
#include <err.h>
#include <errno.h>
+#include <fcntl.h>
#include <fnmatch.h>
#include <fts.h>
#include <grp.h>
@@ -442,9 +443,21 @@ f_execdir(plan, entry)
{
register int cnt;
pid_t pid;
- int status;
+ int status, fd;
char base[MAXPATHLEN];
+ /* fts(3) does not chdir for the root level so we do it ourselves. */
+ if (entry->fts_level == FTS_ROOTLEVEL) {
+ if ((fd = open(".", O_RDONLY)) == -1) {
+ warn("cannot open \".\"");
+ return (0);
+ }
+ if (chdir(entry->fts_accpath)) {
+ warn("cannot chdir to %s", entry->fts_accpath);
+ return (0);
+ }
+ }
+
/* Substitute basename(path) for {} since cwd is it's parent dir */
(void)strncpy(base, basename(entry->fts_path), sizeof(base) - 1);
base[sizeof(base) - 1] = '\0';
@@ -466,6 +479,15 @@ f_execdir(plan, entry)
warn("%s", plan->e_argv[0]);
_exit(1);
}
+
+ /* Undo the above... */
+ if (entry->fts_level == FTS_ROOTLEVEL) {
+ if (fchdir(fd) == -1) {
+ warn("unable to chdir back to starting directory");
+ return (0);
+ }
+ }
+
pid = waitpid(pid, &status, 0);
return (pid != -1 && WIFEXITED(status) && !WEXITSTATUS(status));
}