83 lines · 1.4 KB · C
RawDownload
 /* 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;	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 /* !HAVE_GETWD */