blob: ad9eb179b3090ee88117a505c9e904720ebe4f81 [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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000029extern char *getwd(char *);
Guido van Rossumde9775a1991-01-21 14:27:52 +000030
31char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000032getcwd(char *buf, int size)
Guido van Rossumde9775a1991-01-21 14:27:52 +000033{
34 char localbuf[MAXPATHLEN+1];
35 char *ret;
36
37 if (size <= 0) {
38 errno = EINVAL;
39 return NULL;
40 }
41 ret = getwd(localbuf);
Guido van Rossum582acec2000-06-28 22:07:35 +000042 if (ret != NULL && strlen(localbuf) >= (size_t)size) {
Guido van Rossumde9775a1991-01-21 14:27:52 +000043 errno = ERANGE;
44 return NULL;
45 }
46 if (ret == NULL) {
47 errno = EACCES; /* Most likely error */
48 return NULL;
49 }
50 strncpy(buf, localbuf, size);
51 return buf;
52}
53
Guido van Rossum1d5735e1994-08-30 08:27:36 +000054#else /* !HAVE_GETWD */
Guido van Rossum79273841991-02-19 12:28:18 +000055
Guido van Rossum1d5735e1994-08-30 08:27:36 +000056/* Version for really old UNIX systems -- use pipe from pwd */
Guido van Rossum79273841991-02-19 12:28:18 +000057
Guido van Rossum1d5735e1994-08-30 08:27:36 +000058#ifndef PWD_CMD
Guido van Rossum79273841991-02-19 12:28:18 +000059#define PWD_CMD "/bin/pwd"
Guido van Rossum1d5735e1994-08-30 08:27:36 +000060#endif
Guido van Rossum79273841991-02-19 12:28:18 +000061
62char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000063getcwd(char *buf, int size)
Guido van Rossum79273841991-02-19 12:28:18 +000064{
65 FILE *fp;
66 char *p;
67 int sts;
68 if (size <= 0) {
69 errno = EINVAL;
70 return NULL;
71 }
72 if ((fp = popen(PWD_CMD, "r")) == NULL)
73 return NULL;
74 if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) {
75 errno = EACCES; /* Most likely error */
76 return NULL;
77 }
78 for (p = buf; *p != '\n'; p++) {
79 if (*p == '\0') {
80 errno = ERANGE;
81 return NULL;
82 }
83 }
84 *p = '\0';
85 return buf;
86}
87
Guido van Rossum1d5735e1994-08-30 08:27:36 +000088#endif /* !HAVE_GETWD */