/Python/getcwd.c

http://unladen-swallow.googlecode.com/ · C · 83 lines · 65 code · 14 blank · 4 comment · 18 complexity · 93dd395919f4d13770feb84fd77de7db MD5 · raw file

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