diff options
Diffstat (limited to 'Python/getcwd.c')
-rw-r--r-- | Python/getcwd.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Python/getcwd.c b/Python/getcwd.c new file mode 100644 index 0000000..44dc9e6 --- /dev/null +++ b/Python/getcwd.c @@ -0,0 +1,82 @@ + +/* Two PD getcwd() implementations. + Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */ + +#include <stdio.h> +#include <errno.h> + +#ifdef HAVE_GETWD + +/* Version for BSD systems -- use getwd() */ + +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> +#endif + +#ifndef MAXPATHLEN +#if defined(PATH_MAX) && PATH_MAX > 1024 +#define MAXPATHLEN PATH_MAX +#else +#define MAXPATHLEN 1024 +#endif +#endif + +extern char *getwd(char *); + +char * +getcwd(char *buf, int size) +{ + char localbuf[MAXPATHLEN+1]; + char *ret; + + if (size <= 0) { + errno = EINVAL; + return NULL; + } + ret = getwd(localbuf); + if (ret != NULL && strlen(localbuf) >= (size_t)size) { + errno = ERANGE; + return NULL; + } + if (ret == NULL) { + errno = EACCES; /* Most likely error */ + return NULL; + } + strncpy(buf, localbuf, size); + return buf; +} + +#else /* !HAVE_GETWD */ + +/* Version for really old UNIX systems -- use pipe from pwd */ + +#ifndef PWD_CMD +#define PWD_CMD "/bin/pwd" +#endif + +char * +getcwd(char *buf, int size) +{ + FILE *fp; + char *p; + if (size <= 0) { + errno = EINVAL; + return NULL; + } + if ((fp = popen(PWD_CMD, "r")) == NULL) + return NULL; + if (fgets(buf, size, fp) == NULL || 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 /* !HAVE_GETWD */ |