From baf3e7c14b117d01c6f6b05cd617904d3a294ec7 Mon Sep 17 00:00:00 2001 From: "Tim J. Robbins" Date: Wed, 22 May 2002 03:29:20 +0000 Subject: [PATCH] Temporarily back out revision 1.24; it seems to handle the case where the current directory no longer exists incorrectly and breaks `make cleandir'. --- bin/sh/cd.c | 102 ++++++++++++---------------------------------------- 1 file changed, 23 insertions(+), 79 deletions(-) diff --git a/bin/sh/cd.c b/bin/sh/cd.c index b7473badeb31..26ad2f25d1f5 100644 --- a/bin/sh/cd.c +++ b/bin/sh/cd.c @@ -67,7 +67,7 @@ static const char rcsid[] = #include "show.h" #include "cd.h" -STATIC int docd(char *, int, int); +STATIC int docd(char *, int); STATIC char *getcomponent(void); STATIC void updatepwd(char *); @@ -76,36 +76,16 @@ char *prevdir; /* previous working directory */ STATIC char *cdcomppath; int -cdcmd(int argc, char **argv) +cdcmd(int argc __unused, char **argv __unused) { char *dest; char *path; char *p; struct stat statb; - int ch, phys, print = 0; + int print = 0; - optreset = 1; optind = 1; /* initialize getopt */ - phys = 0; - while ((ch = getopt(argc, argv, "LP")) != -1) { - switch (ch) { - case 'L': - phys = 0; - break; - case 'P': - phys = 1; - break; - default: - error("unknown option: -%c", optopt); - break; - } - } - argc -= optind; - argv += optind; - - if (argc > 1) - error("too many arguments"); - - if ((dest = *argv) == NULL && (dest = bltinlookup("HOME", 1)) == NULL) + nextopt(nullstr); + if ((dest = *argptr) == NULL && (dest = bltinlookup("HOME", 1)) == NULL) error("HOME not set"); if (*dest == '\0') dest = "."; @@ -128,8 +108,9 @@ cdcmd(int argc, char **argv) p += 2; print = strcmp(p, dest); } - if (docd(p, print, phys) >= 0) + if (docd(p, print) >= 0) return 0; + } } error("can't cd to %s", dest); @@ -143,7 +124,7 @@ cdcmd(int argc, char **argv) * directory name if "print" is nonzero. */ STATIC int -docd(char *dest, int print, int phys) +docd(char *dest, int print) { char *p; char *q; @@ -152,20 +133,7 @@ docd(char *dest, int print, int phys) int first; int badstat; - TRACE(("docd(\"%s\", %d, %d) called\n", dest, print, phys)); - - if (phys) { - INTOFF; - if (chdir(dest) < 0) { - INTON; - return -1; - } - updatepwd(NULL); - INTON; - if (print && iflag && curdir) - out1fmt("%s\n", curdir); - return 0; - } + TRACE(("docd(\"%s\", %d) called\n", dest, print)); /* * Check each component of the path. If we find a symlink or @@ -193,18 +161,20 @@ docd(char *dest, int print, int phys) if (equal(component, "..")) continue; STACKSTRNUL(p); - if (lstat(stackblock(), &statb) < 0) { + if ((lstat(stackblock(), &statb) < 0) + || (S_ISLNK(statb.st_mode))) { + /* print = 1; */ badstat = 1; break; } } INTOFF; - updatepwd(badstat ? NULL : dest); - if (chdir(curdir) < 0) { + if (chdir(dest) < 0) { INTON; return -1; } + updatepwd(badstat ? NULL : dest); INTON; if (print && iflag && curdir) out1fmt("%s\n", curdir); @@ -300,48 +270,22 @@ updatepwd(char *dir) INTON; } -#define MAXPWD 256 int pwdcmd(int argc __unused, char **argv __unused) { - char buf[MAXPWD]; - int ch, phys; - - optreset = 1; optind = 1; /* initialize getopt */ - phys = 0; - while ((ch = getopt(argc, argv, "LP")) != -1) { - switch (ch) { - case 'L': - phys = 0; - break; - case 'P': - phys = 1; - break; - default: - error("unknown option: -%c", optopt); - break; - } - } - argc -= optind; - argv += optind; - - if (argc != 0) - error("too many arguments"); - - if (!phys && getpwd()) { - out1str(curdir); - out1c('\n'); - } else { - if (getcwd(buf, sizeof(buf)) == NULL) - error(".: %s", strerror(errno)); - out1str(buf); - out1c('\n'); - } - + if (!getpwd()) + error("getcwd() failed: %s", strerror(errno)); + out1str(curdir); + out1c('\n'); return 0; } + + + +#define MAXPWD 256 + /* * Find out what the current directory is. If we already know the current * directory, this routine returns immediately.