blob: 7646d835a722f79778860437d4d343629ca27039 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum79273841991-02-19 12:28:18 +000011/* Two PD getcwd() implementations.
12 Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */
Guido van Rossumde9775a1991-01-21 14:27:52 +000013
Guido van Rossum79273841991-02-19 12:28:18 +000014#include <stdio.h>
15#include <errno.h>
Guido van Rossumde9775a1991-01-21 14:27:52 +000016
Guido van Rossum1d5735e1994-08-30 08:27:36 +000017#ifdef HAVE_GETWD
Guido van Rossum79273841991-02-19 12:28:18 +000018
Guido van Rossum1d5735e1994-08-30 08:27:36 +000019/* Version for BSD systems -- use getwd() */
Guido van Rossum79273841991-02-19 12:28:18 +000020
Guido van Rossum1d5735e1994-08-30 08:27:36 +000021#ifdef HAVE_SYS_PARAM_H
22#include <sys/param.h>
23#endif
24
25#ifndef MAXPATHLEN
26#define MAXPATHLEN 1024
27#endif
Guido van Rossum79273841991-02-19 12:28:18 +000028
Guido van Rossumde9775a1991-01-21 14:27:52 +000029extern char *getwd();
30
31char *
32getcwd(buf, size)
33 char *buf;
34 int size;
35{
36 char localbuf[MAXPATHLEN+1];
37 char *ret;
38
39 if (size <= 0) {
40 errno = EINVAL;
41 return NULL;
42 }
43 ret = getwd(localbuf);
Guido van Rossum582acec2000-06-28 22:07:35 +000044 if (ret != NULL && strlen(localbuf) >= (size_t)size) {
Guido van Rossumde9775a1991-01-21 14:27:52 +000045 errno = ERANGE;
46 return NULL;
47 }
48 if (ret == NULL) {
49 errno = EACCES; /* Most likely error */
50 return NULL;
51 }
52 strncpy(buf, localbuf, size);
53 return buf;
54}
55
Guido van Rossum1d5735e1994-08-30 08:27:36 +000056#else /* !HAVE_GETWD */
Guido van Rossum79273841991-02-19 12:28:18 +000057
Guido van Rossum1d5735e1994-08-30 08:27:36 +000058/* Version for really old UNIX systems -- use pipe from pwd */
Guido van Rossum79273841991-02-19 12:28:18 +000059
Guido van Rossum1d5735e1994-08-30 08:27:36 +000060#ifndef PWD_CMD
Guido van Rossum79273841991-02-19 12:28:18 +000061#define PWD_CMD "/bin/pwd"
Guido van Rossum1d5735e1994-08-30 08:27:36 +000062#endif
Guido van Rossum79273841991-02-19 12:28:18 +000063
64char *
65getcwd(buf, size)
66 char *buf;
67 int size;
68{
69 FILE *fp;
70 char *p;
71 int sts;
72 if (size <= 0) {
73 errno = EINVAL;
74 return NULL;
75 }
76 if ((fp = popen(PWD_CMD, "r")) == NULL)
77 return NULL;
78 if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) {
79 errno = EACCES; /* Most likely error */
80 return NULL;
81 }
82 for (p = buf; *p != '\n'; p++) {
83 if (*p == '\0') {
84 errno = ERANGE;
85 return NULL;
86 }
87 }
88 *p = '\0';
89 return buf;
90}
91
Guido van Rossum1d5735e1994-08-30 08:27:36 +000092#endif /* !HAVE_GETWD */