summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/unistd.h3
-rw-r--r--libc/sysdeps/linux/common/Makefile2
-rw-r--r--libc/sysdeps/linux/common/getdirname.c45
3 files changed, 46 insertions, 4 deletions
diff --git a/include/unistd.h b/include/unistd.h
index 0f9942b2e..e5441c48e 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -423,13 +423,10 @@ extern int fchdir (int __fd) __THROW;
big as necessary. */
extern char *getcwd (char *__buf, size_t __size) __THROW;
-#if 0
-/*#ifdef __USE_GNU*/
/* Return a malloc'd string containing the current directory name.
If the environment variable `PWD' is set, and its value is correct,
that value is used. */
extern char *get_current_dir_name (void) __THROW;
-#endif
#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
/* Put the absolute pathname of the current working directory in BUF.
diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile
index 9e3f477b0..984ba8dfc 100644
--- a/libc/sysdeps/linux/common/Makefile
+++ b/libc/sysdeps/linux/common/Makefile
@@ -34,7 +34,7 @@ CSRC= waitpid.c getdnnm.c gethstnm.c getcwd.c \
wait3.c setpgrp.c getdtablesize.c create_module.c ptrace.c \
cmsg_nxthdr.c longjmp.c open64.c ftruncate64.c \
truncate64.c getrlimit64.c setrlimit64.c creat64.c mmap64.c \
- llseek.c pread_write.c _exit.c setuid.c sync.c
+ llseek.c pread_write.c _exit.c setuid.c sync.c getdirname.c
ifneq ($(strip $(EXCLUDE_BRK)),true)
CSRC+=sbrk.c
endif
diff --git a/libc/sysdeps/linux/common/getdirname.c b/libc/sysdeps/linux/common/getdirname.c
new file mode 100644
index 000000000..a9ce43f30
--- /dev/null
+++ b/libc/sysdeps/linux/common/getdirname.c
@@ -0,0 +1,45 @@
+/* vi: set sw=4 ts=4: */
+/* Copyright (C) 1992, 1997, 1998, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <unistd.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Return a malloc'd string containing the current directory name.
+ If the environment variable `PWD' is set, and its value is correct,
+ that value is used. */
+
+char *
+get_current_dir_name (void)
+{
+ char *pwd;
+ struct stat64 dotstat, pwdstat;
+
+ pwd = getenv ("PWD");
+ if (pwd != NULL
+ && stat64 (".", &dotstat) == 0
+ && stat64 (pwd, &pwdstat) == 0
+ && pwdstat.st_dev == dotstat.st_dev
+ && pwdstat.st_ino == dotstat.st_ino)
+ /* The PWD value is correct. Use it. */
+ return strdup (pwd);
+
+ return getcwd ((char *) NULL, 0);
+}