svn commit: r208134 - stable/8/bin/sh
Stefan Farfeleder
stefanf at FreeBSD.org
Sun May 16 10:01:07 UTC 2010
Author: stefanf
Date: Sun May 16 10:01:06 2010
New Revision: 208134
URL: http://svn.freebsd.org/changeset/base/208134
Log:
Merge r199631: Handle current work directories of arbitrary length.
Modified:
stable/8/bin/sh/cd.c
Directory Properties:
stable/8/bin/sh/ (props changed)
Modified: stable/8/bin/sh/cd.c
==============================================================================
--- stable/8/bin/sh/cd.c Sun May 16 09:59:28 2010 (r208133)
+++ stable/8/bin/sh/cd.c Sun May 16 10:01:06 2010 (r208134)
@@ -70,7 +70,7 @@ STATIC int docd(char *, int, int);
STATIC char *getcomponent(void);
STATIC char *findcwd(char *);
STATIC void updatepwd(char *);
-STATIC char *getpwd2(char *, size_t);
+STATIC char *getpwd2(void);
STATIC char *curdir = NULL; /* current working directory */
STATIC char *prevdir; /* previous working directory */
@@ -263,10 +263,8 @@ findcwd(char *dir)
* any more because we traversed a symbolic link or something
* we couldn't stat().
*/
- if (dir == NULL || curdir == NULL) {
- p = stalloc(PATH_MAX);
- return getpwd2(p, PATH_MAX);
- }
+ if (dir == NULL || curdir == NULL)
+ return getpwd2();
cdcomppath = stalloc(strlen(dir) + 1);
scopy(dir, cdcomppath);
STARTSTACKSTR(new);
@@ -313,7 +311,7 @@ updatepwd(char *dir)
int
pwdcmd(int argc, char **argv)
{
- char buf[PATH_MAX];
+ char *p;
int ch, phys;
optreset = 1; optind = 1; opterr = 0; /* initialize getopt */
@@ -341,9 +339,9 @@ pwdcmd(int argc, char **argv)
out1str(curdir);
out1c('\n');
} else {
- if (getcwd(buf, sizeof(buf)) == NULL)
+ if ((p = getpwd2()) == NULL)
error(".: %s", strerror(errno));
- out1str(buf);
+ out1str(p);
out1c('\n');
}
@@ -356,36 +354,45 @@ pwdcmd(int argc, char **argv)
char *
getpwd(void)
{
- char buf[PATH_MAX];
char *p;
if (curdir)
return curdir;
- p = getpwd2(buf, sizeof(buf));
+ p = getpwd2();
if (p != NULL)
curdir = savestr(p);
return curdir;
}
+#define MAXPWD 256
+
/*
* Return the current directory.
*/
STATIC char *
-getpwd2(char *buf, size_t size)
+getpwd2(void)
{
- if (getcwd(buf, size) == NULL) {
- char *pwd = getenv("PWD");
- struct stat stdot, stpwd;
-
- if (pwd && *pwd == '/' && stat(".", &stdot) != -1 &&
- stat(pwd, &stpwd) != -1 &&
- stdot.st_dev == stpwd.st_dev &&
- stdot.st_ino == stpwd.st_ino) {
+ struct stat stdot, stpwd;
+ char *pwd;
+ int i;
+
+ for (i = MAXPWD;; i *= 2) {
+ pwd = stalloc(i);
+ if (getcwd(pwd, i) != NULL)
return pwd;
- }
- return NULL;
+ stunalloc(pwd);
+ if (errno != ERANGE)
+ break;
+ }
+
+ pwd = getenv("PWD");
+ if (pwd && *pwd == '/' && stat(".", &stdot) != -1 &&
+ stat(pwd, &stpwd) != -1 &&
+ stdot.st_dev == stpwd.st_dev &&
+ stdot.st_ino == stpwd.st_ino) {
+ return pwd;
}
- return buf;
+ return NULL;
}
More information about the svn-src-all
mailing list