From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: libc-alpha@sourceware.org
Subject: [PATCH 4/4] io: Reorganize the getcwd implementation
Date: Wed, 26 Aug 2020 18:02:46 -0300 [thread overview]
Message-ID: <20200826210246.2830973-4-adhemerval.zanella@linaro.org> (raw)
In-Reply-To: <20200826210246.2830973-1-adhemerval.zanella@linaro.org>
The generic implementation uses two internal symbols: __getcwd_system
(which might be overriden by the system) and __getcwd_generic (the
generic implementation shared with gnulib). The Linux implementation
is moved to __getcwd_system and generic POSIX implementation is moved
to __getcwd_generic.
This change aims to make the code sync with gnulib easier and simplify
the Linux override implementation.
The dl-fxstatat64 is not required anymore and adding it explicit issue
a duplicate symbol in libc.so linking.
Hurd still overrides the getcwd altogether and one possibility would
to be move its implementation to __getcwd_system and reimplement the
__getcwd_generic to be a empty one.
Checked on x86_64-linux-gnu and i686-linux-gnu.
---
include/unistd.h | 2 +
io/Makefile | 2 +-
sysdeps/posix/getcwd.c => io/getcwd-generic.c | 7 +--
io/getcwd-system.c | 28 +++++++++
io/getcwd.c | 9 ++-
sysdeps/unix/sysv/linux/Makefile | 3 +-
sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c | 1 -
sysdeps/unix/sysv/linux/dl-fxstatat64.c | 1 -
sysdeps/unix/sysv/linux/dl-getcwd.c | 1 -
.../sysv/linux/{getcwd.c => getcwd-system.c} | 58 +------------------
.../sysv/linux/sparc/sparc64/dl-fxstatat64.c | 1 -
.../sysv/linux/wordsize-64/dl-fxstatat64.c | 1 -
12 files changed, 40 insertions(+), 74 deletions(-)
rename sysdeps/posix/getcwd.c => io/getcwd-generic.c (99%)
create mode 100644 io/getcwd-system.c
delete mode 100644 sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c
delete mode 100644 sysdeps/unix/sysv/linux/dl-fxstatat64.c
delete mode 100644 sysdeps/unix/sysv/linux/dl-getcwd.c
rename sysdeps/unix/sysv/linux/{getcwd.c => getcwd-system.c} (53%)
delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/dl-fxstatat64.c
delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/dl-fxstatat64.c
diff --git a/include/unistd.h b/include/unistd.h
index f48da2c7a3..792cfdff0b 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -76,6 +76,8 @@ extern int __lchown (const char *__file, __uid_t __owner,
__gid_t __group);
extern int __chdir (const char *__path) attribute_hidden;
extern int __fchdir (int __fd) attribute_hidden;
+extern char *__getcwd_generic (char *__buf, size_t __size) attribute_hidden;
+extern char *__getcwd_system (char *__buf, size_t __size) attribute_hidden;
extern char *__getcwd (char *__buf, size_t __size);
libc_hidden_proto (__getcwd)
extern int __rmdir (const char *__path) attribute_hidden;
diff --git a/io/Makefile b/io/Makefile
index cf380f3516..26dfe047c0 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -46,7 +46,7 @@ routines := \
close dup dup2 dup3 pipe pipe2 \
creat creat64 \
chdir fchdir \
- getcwd getwd getdirname \
+ getcwd getwd getcwd-system getcwd-generic getdirname \
chown fchown lchown fchownat \
ttyname ttyname_r isatty \
link linkat symlink symlinkat readlink readlinkat \
diff --git a/sysdeps/posix/getcwd.c b/io/getcwd-generic.c
similarity index 99%
rename from sysdeps/posix/getcwd.c
rename to io/getcwd-generic.c
index 1e6fc9b845..e259ce14da 100644
--- a/sysdeps/posix/getcwd.c
+++ b/io/getcwd-generic.c
@@ -154,7 +154,7 @@ getcwd_nothrow (char *buf, size_t size)
bytes long, unless SIZE == 0, in which case it is as big as necessary. */
char *
-__getcwd (char *buf, size_t size)
+__getcwd_generic (char *buf, size_t size)
{
/* Lengths of big file name components and entire file names, and a
deep level of file name nesting. These numbers are not upper
@@ -486,8 +486,3 @@ __getcwd (char *buf, size_t size)
}
return NULL;
}
-
-#if defined _LIBC && !defined __getcwd
-libc_hidden_def (__getcwd)
-weak_alias (__getcwd, getcwd)
-#endif
diff --git a/io/getcwd-system.c b/io/getcwd-system.c
new file mode 100644
index 0000000000..4390479aa2
--- /dev/null
+++ b/io/getcwd-system.c
@@ -0,0 +1,28 @@
+/* Architectur specific getcwd implementation. Generic implementation.
+ Copyright (C) 2020 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, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <unistd.h>
+
+/* This function is called by the generic 'getcwd' implementation to allow
+ a system to implement if the it provides a faster or simpler way to obtain
+ the current direction (e.g. through a syscall). */
+char *
+__getcwd_system (char *buf, size_t size)
+{
+ return NULL;
+}
diff --git a/io/getcwd.c b/io/getcwd.c
index 0fabd98131..cf7a8e1a30 100644
--- a/io/getcwd.c
+++ b/io/getcwd.c
@@ -29,11 +29,10 @@
char *
__getcwd (char *buf, size_t size)
{
- __set_errno (ENOSYS);
- return NULL;
+ char *r = __getcwd_system (buf, size);
+ if (r == NULL)
+ r = __getcwd_generic (buf, size);
+ return r;
}
libc_hidden_def (__getcwd)
weak_alias (__getcwd, getcwd)
-
-stub_warning (__getcwd)
-stub_warning (getcwd)
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 9b2a253032..465ffe7104 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -280,8 +280,7 @@ tests += tst-fallocate tst-fallocate64 tst-o_path-locks
endif
ifeq ($(subdir),elf)
-sysdep-rtld-routines += dl-brk dl-sbrk dl-getcwd dl-openat64 dl-opendir \
- dl-fxstatat64
+sysdep-rtld-routines += dl-brk dl-sbrk dl-openat64 dl-opendir
libof-lddlibc4 = lddlibc4
diff --git a/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c
deleted file mode 100644
index 330b33f7c7..0000000000
--- a/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "fxstatat.c"
diff --git a/sysdeps/unix/sysv/linux/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/dl-fxstatat64.c
deleted file mode 100644
index d229d0ea0f..0000000000
--- a/sysdeps/unix/sysv/linux/dl-fxstatat64.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <fxstatat64.c>
diff --git a/sysdeps/unix/sysv/linux/dl-getcwd.c b/sysdeps/unix/sysv/linux/dl-getcwd.c
deleted file mode 100644
index 4bd5657f1e..0000000000
--- a/sysdeps/unix/sysv/linux/dl-getcwd.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "getcwd.c"
diff --git a/sysdeps/unix/sysv/linux/getcwd.c b/sysdeps/unix/sysv/linux/getcwd-system.c
similarity index 53%
rename from sysdeps/unix/sysv/linux/getcwd.c
rename to sysdeps/unix/sysv/linux/getcwd-system.c
index fabc4bb8cc..a7e8535b72 100644
--- a/sysdeps/unix/sysv/linux/getcwd.c
+++ b/sysdeps/unix/sysv/linux/getcwd-system.c
@@ -17,16 +17,8 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <assert.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
#include <unistd.h>
-#include <sys/param.h>
-
#include <sysdep.h>
-#include <sys/syscall.h>
-
/* If we compile the file for use in ld.so we don't need the feature
that getcwd() allocates the buffers itself. */
@@ -34,19 +26,10 @@
# define NO_ALLOCATION 1
#endif
-
-/* The "proc" filesystem provides an easy method to retrieve the value.
- For each process, the corresponding directory contains a symbolic link
- named `cwd'. Reading the content of this link immediate gives us the
- information. But we have to take care for systems which do not have
- the proc filesystem mounted. Use the POSIX implementation in this case. */
-static char *generic_getcwd (char *buf, size_t size);
-
char *
-__getcwd (char *buf, size_t size)
+__getcwd_system (char *buf, size_t size)
{
char *path;
- char *result;
#ifndef NO_ALLOCATION
size_t alloc_size = size;
@@ -58,7 +41,7 @@ __getcwd (char *buf, size_t size)
return NULL;
}
- alloc_size = MAX (PATH_MAX, __getpagesize ());
+ alloc_size = PATH_MAX;
}
if (buf == NULL)
@@ -75,7 +58,7 @@ __getcwd (char *buf, size_t size)
int retval;
- retval = INLINE_SYSCALL (getcwd, 2, path, alloc_size);
+ retval = INLINE_SYSCALL_CALL (getcwd, path, alloc_size);
if (retval > 0 && path[0] == '/')
{
#ifndef NO_ALLOCATION
@@ -92,34 +75,6 @@ __getcwd (char *buf, size_t size)
return buf;
}
- /* The system call either cannot handle paths longer than a page
- or can succeed without returning an absolute path. Just use the
- generic implementation right away. */
- if (retval >= 0 || errno == ENAMETOOLONG)
- {
-#ifndef NO_ALLOCATION
- if (buf == NULL && size == 0)
- {
- free (path);
- path = NULL;
- }
-#endif
-
- result = generic_getcwd (path, size);
-
-#ifndef NO_ALLOCATION
- if (result == NULL && buf == NULL && size != 0)
- free (path);
-#endif
-
- return result;
- }
-
- /* It should never happen that the `getcwd' syscall failed because
- the buffer is too small if we allocated the buffer ourselves
- large enough. */
- assert (errno != ERANGE || buf != NULL || size != 0);
-
#ifndef NO_ALLOCATION
if (buf == NULL)
free (path);
@@ -127,10 +82,3 @@ __getcwd (char *buf, size_t size)
return NULL;
}
-libc_hidden_def (__getcwd)
-weak_alias (__getcwd, getcwd)
-
-/* Get the code for the generic version. */
-#define GETCWD_RETURN_TYPE static char *
-#define __getcwd generic_getcwd
-#include <sysdeps/posix/getcwd.c>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/sparc/sparc64/dl-fxstatat64.c
deleted file mode 100644
index 330b33f7c7..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/dl-fxstatat64.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "fxstatat.c"
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/wordsize-64/dl-fxstatat64.c
deleted file mode 100644
index 330b33f7c7..0000000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/dl-fxstatat64.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "fxstatat.c"
--
2.25.1
next prev parent reply other threads:[~2020-08-26 21:03 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-26 21:02 [PATCH 1/4] Sync getcwd with gnulib Adhemerval Zanella
2020-08-26 21:02 ` [PATCH 2/4] linux: Remove __ASSUME_ATFCTS Adhemerval Zanella
2020-08-26 21:02 ` [PATCH 3/4] Use LFS readdir in generic POSIX getcwd [BZ# 22899] Adhemerval Zanella
2020-08-27 9:58 ` Florian Weimer
2020-08-26 21:02 ` Adhemerval Zanella [this message]
2020-08-26 22:39 ` [PATCH 4/4] io: Reorganize the getcwd implementation Paul Eggert
2020-08-27 12:35 ` Adhemerval Zanella
2020-08-27 13:21 ` Florian Weimer
2020-08-27 13:40 ` Adhemerval Zanella
2020-08-27 17:29 ` Adhemerval Zanella
2020-08-27 19:20 ` [PATCH v2] " Adhemerval Zanella
2020-08-27 23:44 ` Paul Eggert
2020-08-31 18:27 ` Adhemerval Zanella
2020-08-26 22:39 ` [PATCH 1/4] Sync getcwd with gnulib Paul Eggert
2020-08-27 11:07 ` Adhemerval Zanella
2020-08-27 8:14 ` Florian Weimer
2020-08-27 10:53 ` Adhemerval Zanella
2020-08-27 10:58 ` Florian Weimer
2020-08-27 11:06 ` Adhemerval Zanella
2020-08-27 11:10 ` Florian Weimer
2020-08-27 11:33 ` Adhemerval Zanella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200826210246.2830973-4-adhemerval.zanella@linaro.org \
--to=adhemerval.zanella@linaro.org \
--cc=libc-alpha@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).