You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
1.5 KiB

35 years ago
35 years ago
35 years ago
35 years ago
35 years ago
  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. if (size <= 0) {
  50. errno = EINVAL;
  51. return NULL;
  52. }
  53. if ((fp = popen(PWD_CMD, "r")) == NULL)
  54. return NULL;
  55. if (fgets(buf, size, fp) == NULL || pclose(fp) != 0) {
  56. errno = EACCES; /* Most likely error */
  57. return NULL;
  58. }
  59. for (p = buf; *p != '\n'; p++) {
  60. if (*p == '\0') {
  61. errno = ERANGE;
  62. return NULL;
  63. }
  64. }
  65. *p = '\0';
  66. return buf;
  67. }
  68. #endif /* !HAVE_GETWD */