blob: 0f1ce1063267440d7c83c00b8ef02903a658ba00 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000014
15******************************************************************/
16
Guido van Rossum79273841991-02-19 12:28:18 +000017/* Two PD getcwd() implementations.
18 Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */
Guido van Rossumde9775a1991-01-21 14:27:52 +000019
Guido van Rossum79273841991-02-19 12:28:18 +000020#include <stdio.h>
21#include <errno.h>
Guido van Rossumde9775a1991-01-21 14:27:52 +000022
Guido van Rossum1d5735e1994-08-30 08:27:36 +000023#ifdef HAVE_GETWD
Guido van Rossum79273841991-02-19 12:28:18 +000024
Guido van Rossum1d5735e1994-08-30 08:27:36 +000025/* Version for BSD systems -- use getwd() */
Guido van Rossum79273841991-02-19 12:28:18 +000026
Guido van Rossum1d5735e1994-08-30 08:27:36 +000027#ifdef HAVE_SYS_PARAM_H
28#include <sys/param.h>
29#endif
30
31#ifndef MAXPATHLEN
32#define MAXPATHLEN 1024
33#endif
Guido van Rossum79273841991-02-19 12:28:18 +000034
Guido van Rossumde9775a1991-01-21 14:27:52 +000035extern char *getwd();
36
37char *
38getcwd(buf, size)
39 char *buf;
40 int size;
41{
42 char localbuf[MAXPATHLEN+1];
43 char *ret;
44
45 if (size <= 0) {
46 errno = EINVAL;
47 return NULL;
48 }
49 ret = getwd(localbuf);
Guido van Rossum582acec2000-06-28 22:07:35 +000050 if (ret != NULL && strlen(localbuf) >= (size_t)size) {
Guido van Rossumde9775a1991-01-21 14:27:52 +000051 errno = ERANGE;
52 return NULL;
53 }
54 if (ret == NULL) {
55 errno = EACCES; /* Most likely error */
56 return NULL;
57 }
58 strncpy(buf, localbuf, size);
59 return buf;
60}
61
Guido van Rossum1d5735e1994-08-30 08:27:36 +000062#else /* !HAVE_GETWD */
Guido van Rossum79273841991-02-19 12:28:18 +000063
Guido van Rossum1d5735e1994-08-30 08:27:36 +000064/* Version for really old UNIX systems -- use pipe from pwd */
Guido van Rossum79273841991-02-19 12:28:18 +000065
Guido van Rossum1d5735e1994-08-30 08:27:36 +000066#ifndef PWD_CMD
Guido van Rossum79273841991-02-19 12:28:18 +000067#define PWD_CMD "/bin/pwd"
Guido van Rossum1d5735e1994-08-30 08:27:36 +000068#endif
Guido van Rossum79273841991-02-19 12:28:18 +000069
70char *
71getcwd(buf, size)
72 char *buf;
73 int size;
74{
75 FILE *fp;
76 char *p;
77 int sts;
78 if (size <= 0) {
79 errno = EINVAL;
80 return NULL;
81 }
82 if ((fp = popen(PWD_CMD, "r")) == NULL)
83 return NULL;
84 if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) {
85 errno = EACCES; /* Most likely error */
86 return NULL;
87 }
88 for (p = buf; *p != '\n'; p++) {
89 if (*p == '\0') {
90 errno = ERANGE;
91 return NULL;
92 }
93 }
94 *p = '\0';
95 return buf;
96}
97
Guido van Rossum1d5735e1994-08-30 08:27:36 +000098#endif /* !HAVE_GETWD */