Home | History | Annotate | Download | only in Python
      1 
      2 /* Two PD getcwd() implementations.
      3    Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido (at) cwi.nl>. */
      4 
      5 #include <stdio.h>
      6 #include <errno.h>
      7 
      8 #ifdef HAVE_GETWD
      9 
     10 /* Version for BSD systems -- use getwd() */
     11 
     12 #ifdef HAVE_SYS_PARAM_H
     13 #include <sys/param.h>
     14 #endif
     15 
     16 #ifndef MAXPATHLEN
     17 #if defined(PATH_MAX) && PATH_MAX > 1024
     18 #define MAXPATHLEN PATH_MAX
     19 #else
     20 #define MAXPATHLEN 1024
     21 #endif
     22 #endif
     23 
     24 extern char *getwd(char *);
     25 
     26 char *
     27 getcwd(char *buf, int size)
     28 {
     29     char localbuf[MAXPATHLEN+1];
     30     char *ret;
     31 
     32     if (size <= 0) {
     33         errno = EINVAL;
     34         return NULL;
     35     }
     36     ret = getwd(localbuf);
     37     if (ret != NULL && strlen(localbuf) >= (size_t)size) {
     38         errno = ERANGE;
     39         return NULL;
     40     }
     41     if (ret == NULL) {
     42         errno = EACCES; /* Most likely error */
     43         return NULL;
     44     }
     45     strncpy(buf, localbuf, size);
     46     return buf;
     47 }
     48 
     49 #else /* !HAVE_GETWD */
     50 
     51 /* Version for really old UNIX systems -- use pipe from pwd */
     52 
     53 #ifndef PWD_CMD
     54 #define PWD_CMD "/bin/pwd"
     55 #endif
     56 
     57 char *
     58 getcwd(char *buf, int size)
     59 {
     60     FILE *fp;
     61     char *p;
     62     if (size <= 0) {
     63         errno = EINVAL;
     64         return NULL;
     65     }
     66     if ((fp = popen(PWD_CMD, "r")) == NULL)
     67         return NULL;
     68     if (fgets(buf, size, fp) == NULL || pclose(fp) != 0) {
     69         errno = EACCES; /* Most likely error */
     70         return NULL;
     71     }
     72     for (p = buf; *p != '\n'; p++) {
     73         if (*p == '\0') {
     74             errno = ERANGE;
     75             return NULL;
     76         }
     77     }
     78     *p = '\0';
     79     return buf;
     80 }
     81 
     82 #endif /* !HAVE_GETWD */
     83