diff options
-rw-r--r-- | Python/getcwd.c | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/Python/getcwd.c b/Python/getcwd.c index 340acab..03ff8e8 100644 --- a/Python/getcwd.c +++ b/Python/getcwd.c @@ -1,10 +1,19 @@ -/* Quick hack to get posix.getcwd() working for pure BSD 4.3 */ +/* Two PD getcwd() implementations. + Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */ -#include "sys/param.h" -#include "errno.h" +/* #define NO_GETWD /* Turn this on to popen pwd instead of calling getwd() */ + +#include <stdio.h> +#include <errno.h> extern int errno; +#ifndef NO_GETWD + +/* Default: Version for BSD systems -- use getwd() */ + +#include "sys/param.h" + extern char *getwd(); char * @@ -32,4 +41,38 @@ getcwd(buf, size) return buf; } -/* PS: for really old systems you must popen /bin/pwd ... */ +#else + +/* NO_GETWD defined: Version for backward UNIXes -- popen /bin/pwd */ + +#define PWD_CMD "/bin/pwd" + +char * +getcwd(buf, size) + char *buf; + int size; +{ + FILE *fp; + char *p; + int sts; + if (size <= 0) { + errno = EINVAL; + return NULL; + } + if ((fp = popen(PWD_CMD, "r")) == NULL) + return NULL; + if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) { + errno = EACCES; /* Most likely error */ + return NULL; + } + for (p = buf; *p != '\n'; p++) { + if (*p == '\0') { + errno = ERANGE; + return NULL; + } + } + *p = '\0'; + return buf; +} + +#endif |