From 3917f4fee3d69c111e2623e4834e1b413e382409 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Tue, 23 Sep 2014 00:39:18 +0200 Subject: [PATCH] Use PWD in get_current_dir_name(3) if correct. --- libc/Makefile | 1 + libc/unistd/get_current_dir_name.cpp | 46 ++++++++++++++++++++++++++++ libc/unistd/getcwd.cpp | 16 +++------- 3 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 libc/unistd/get_current_dir_name.cpp diff --git a/libc/Makefile b/libc/Makefile index 160c4d6e..071ee81b 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -589,6 +589,7 @@ unistd/fork.o \ unistd/fpathconf.o \ unistd/fsync.o \ unistd/ftruncate.o \ +unistd/get_current_dir_name.o \ unistd/getcwd.o \ unistd/getdomainname.o \ unistd/getegid.o \ diff --git a/libc/unistd/get_current_dir_name.cpp b/libc/unistd/get_current_dir_name.cpp new file mode 100644 index 00000000..46f4c0fe --- /dev/null +++ b/libc/unistd/get_current_dir_name.cpp @@ -0,0 +1,46 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2014. + + This file is part of the Sortix C Library. + + The Sortix 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 3 of the License, or (at your + option) any later version. + + The Sortix 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 Sortix C Library. If not, see . + + unistd/get_current_dir_name.cpp + Returns the current working directory. + +*******************************************************************************/ + +#include + +#include +#include +#include +#include + +// TODO: This interface should removed as its $PWD use is not thread safe. +extern "C" char* get_current_dir_name(void) +{ + const char* pwd = getenv("PWD"); + int saved_errno = errno; + struct stat pwd_st; + struct stat cur_st; + if ( pwd && pwd[0] && stat(pwd, &pwd_st) == 0 && stat(".", &cur_st) == 0 ) + { + if ( cur_st.st_dev == pwd_st.st_dev && cur_st.st_ino == pwd_st.st_ino ) + return strdup(pwd); + } + errno = saved_errno; + return canonicalize_file_name("."); +} diff --git a/libc/unistd/getcwd.cpp b/libc/unistd/getcwd.cpp index 03f04e14..9a06f591 100644 --- a/libc/unistd/getcwd.cpp +++ b/libc/unistd/getcwd.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2014. This file is part of the Sortix C Library. @@ -27,25 +27,19 @@ #include #include -extern "C" char* get_current_dir_name(void) -{ - return canonicalize_file_name("."); -} - extern "C" char* getcwd(char* buf, size_t size) { - char* cwd = get_current_dir_name(); - if ( !buf ) - return cwd; + char* cwd = canonicalize_file_name("."); if ( !cwd ) return NULL; - if ( size < strlen(cwd) + 1 ) + if ( !buf ) + return cwd; + if ( size <= strlcpy(buf, cwd, size) ) { free(cwd); errno = ERANGE; return NULL; } - strcpy(buf, cwd); free(cwd); return buf; }