home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Python / getcwd.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-25  |  1.3 KB  |  80 lines

  1.  
  2. /* Two PD getcwd() implementations.
  3.    Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@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. #define MAXPATHLEN 1024
  18. #endif
  19.  
  20. extern char *getwd(char *);
  21.  
  22. char *
  23. getcwd(char *buf, int size)
  24. {
  25.     char localbuf[MAXPATHLEN+1];
  26.     char *ret;
  27.     
  28.     if (size <= 0) {
  29.         errno = EINVAL;
  30.         return NULL;
  31.     }
  32.     ret = getwd(localbuf);
  33.     if (ret != NULL && strlen(localbuf) >= (size_t)size) {
  34.         errno = ERANGE;
  35.         return NULL;
  36.     }
  37.     if (ret == NULL) {
  38.         errno = EACCES; /* Most likely error */
  39.         return NULL;
  40.     }
  41.     strncpy(buf, localbuf, size);
  42.     return buf;
  43. }
  44.  
  45. #else /* !HAVE_GETWD */
  46.  
  47. /* Version for really old UNIX systems -- use pipe from pwd */
  48.  
  49. #ifndef PWD_CMD
  50. #define PWD_CMD "/bin/pwd"
  51. #endif
  52.  
  53. char *
  54. getcwd(char *buf, int size)
  55. {
  56.     FILE *fp;
  57.     char *p;
  58.     int sts;
  59.     if (size <= 0) {
  60.         errno = EINVAL;
  61.         return NULL;
  62.     }
  63.     if ((fp = popen(PWD_CMD, "r")) == NULL)
  64.         return NULL;
  65.     if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) {
  66.         errno = EACCES; /* Most likely error */
  67.         return NULL;
  68.     }
  69.     for (p = buf; *p != '\n'; p++) {
  70.         if (*p == '\0') {
  71.             errno = ERANGE;
  72.             return NULL;
  73.         }
  74.     }
  75.     *p = '\0';
  76.     return buf;
  77. }
  78.  
  79. #endif /* !HAVE_GETWD */
  80.