blob: 03ff8e8ca491a64242345884153755f2fe1bc453 [file] [log] [blame]
Guido van Rossum79273841991-02-19 12:28:18 +00001/* Two PD getcwd() implementations.
2 Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */
Guido van Rossumde9775a1991-01-21 14:27:52 +00003
Guido van Rossum79273841991-02-19 12:28:18 +00004/* #define NO_GETWD /* Turn this on to popen pwd instead of calling getwd() */
5
6#include <stdio.h>
7#include <errno.h>
Guido van Rossumde9775a1991-01-21 14:27:52 +00008
9extern int errno;
10
Guido van Rossum79273841991-02-19 12:28:18 +000011#ifndef NO_GETWD
12
13/* Default: Version for BSD systems -- use getwd() */
14
15#include "sys/param.h"
16
Guido van Rossumde9775a1991-01-21 14:27:52 +000017extern char *getwd();
18
19char *
20getcwd(buf, size)
21 char *buf;
22 int size;
23{
24 char localbuf[MAXPATHLEN+1];
25 char *ret;
26
27 if (size <= 0) {
28 errno = EINVAL;
29 return NULL;
30 }
31 ret = getwd(localbuf);
32 if (ret != NULL && strlen(localbuf) >= size) {
33 errno = ERANGE;
34 return NULL;
35 }
36 if (ret == NULL) {
37 errno = EACCES; /* Most likely error */
38 return NULL;
39 }
40 strncpy(buf, localbuf, size);
41 return buf;
42}
43
Guido van Rossum79273841991-02-19 12:28:18 +000044#else
45
46/* NO_GETWD defined: Version for backward UNIXes -- popen /bin/pwd */
47
48#define PWD_CMD "/bin/pwd"
49
50char *
51getcwd(buf, size)
52 char *buf;
53 int size;
54{
55 FILE *fp;
56 char *p;
57 int sts;
58 if (size <= 0) {
59 errno = EINVAL;
60 return NULL;
61 }
62 if ((fp = popen(PWD_CMD, "r")) == NULL)
63 return NULL;
64 if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) {
65 errno = EACCES; /* Most likely error */
66 return NULL;
67 }
68 for (p = buf; *p != '\n'; p++) {
69 if (*p == '\0') {
70 errno = ERANGE;
71 return NULL;
72 }
73 }
74 *p = '\0';
75 return buf;
76}
77
78#endif