summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Lau <stevelauc@outlook.com>2022-10-25 08:04:54 +0800
committerSteve Lau <stevelauc@outlook.com>2022-10-25 08:04:54 +0800
commit5ffdbc684775b453e5b01cc69b72d48827650157 (patch)
tree5e5d9e19b6942981df8a1e8e9a09da5354128015
parent09ad0b37f3d9d9a12c6a86251cf0b3f035125bcd (diff)
downloadrust-libc-5ffdbc684775b453e5b01cc69b72d48827650157.tar.gz
expose dirname and basename
-rw-r--r--libc-test/build.rs23
-rw-r--r--libc-test/semver/android.txt2
-rw-r--r--libc-test/semver/apple.txt2
-rw-r--r--libc-test/semver/dragonfly.txt2
-rw-r--r--libc-test/semver/freebsd.txt4
-rw-r--r--libc-test/semver/linux-gnu.txt5
-rw-r--r--libc-test/semver/linux-musl.txt4
-rw-r--r--libc-test/semver/netbsd.txt2
-rw-r--r--libc-test/semver/openbsd.txt2
-rw-r--r--src/unix/bsd/apple/mod.rs3
-rw-r--r--src/unix/bsd/freebsdlike/dragonfly/mod.rs3
-rw-r--r--src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs3
-rw-r--r--src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs3
-rw-r--r--src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs3
-rw-r--r--src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs3
-rw-r--r--src/unix/bsd/netbsdlike/mod.rs3
-rw-r--r--src/unix/linux_like/android/mod.rs3
-rw-r--r--src/unix/linux_like/linux/gnu/mod.rs8
-rw-r--r--src/unix/linux_like/linux/musl/mod.rs3
19 files changed, 78 insertions, 3 deletions
diff --git a/libc-test/build.rs b/libc-test/build.rs
index d5bf3ea61b..85d6d17f84 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -204,6 +204,7 @@ fn test_apple(target: &str) {
"iconv.h",
"ifaddrs.h",
"langinfo.h",
+ "libgen.h",
"libproc.h",
"limits.h",
"locale.h",
@@ -417,6 +418,7 @@ fn test_openbsd(target: &str) {
"errno.h",
"execinfo.h",
"fcntl.h",
+ "libgen.h",
"limits.h",
"link.h",
"locale.h",
@@ -992,6 +994,7 @@ fn test_netbsd(target: &str) {
"elf.h",
"errno.h",
"fcntl.h",
+ "libgen.h",
"limits.h",
"link.h",
"locale.h",
@@ -1206,6 +1209,7 @@ fn test_dragonflybsd(target: &str) {
"ifaddrs.h",
"kvm.h",
"langinfo.h",
+ "libgen.h",
"limits.h",
"link.h",
"locale.h",
@@ -1505,6 +1509,7 @@ fn test_android(target: &str) {
"fcntl.h",
"grp.h",
"ifaddrs.h",
+ "libgen.h",
"limits.h",
"link.h",
"locale.h",
@@ -1866,6 +1871,7 @@ fn test_freebsd(target: &str) {
"iconv.h",
"ifaddrs.h",
"langinfo.h",
+ "libgen.h",
"libutil.h",
"limits.h",
"link.h",
@@ -2771,6 +2777,7 @@ fn test_linux(target: &str) {
"iconv.h",
"ifaddrs.h",
"langinfo.h",
+ "libgen.h",
"limits.h",
"link.h",
"locale.h",
@@ -3410,6 +3417,22 @@ fn test_linux(target: &str) {
// it can't be changed from struct.
"pthread_sigqueue" => true,
+ // There are two versions of basename(3) on Linux with glibc, see
+ //
+ // https://man7.org/linux/man-pages/man3/basename.3.html
+ //
+ // If libgen.h is included, then the POSIX version will be available;
+ // If _GNU_SOURCE is defined and string.h is included, then the GNU one
+ // will be used.
+ //
+ // libc exposes both of them, providing a prefix to differentiate between
+ // them.
+ //
+ // Because the name with prefix is not a valid symbol in C, we have to
+ // skip the tests.
+ "posix_basename" if gnu => true,
+ "gnu_basename" if gnu => true,
+
_ => false,
}
});
diff --git a/libc-test/semver/android.txt b/libc-test/semver/android.txt
index d5d9fc5600..6445af0264 100644
--- a/libc-test/semver/android.txt
+++ b/libc-test/semver/android.txt
@@ -3548,3 +3548,5 @@ winsize
wmemchr
write
writev
+dirname
+basename \ No newline at end of file
diff --git a/libc-test/semver/apple.txt b/libc-test/semver/apple.txt
index 7235418174..95af36bbb4 100644
--- a/libc-test/semver/apple.txt
+++ b/libc-test/semver/apple.txt
@@ -2227,3 +2227,5 @@ wait4
waitid
xsw_usage
xucred
+dirname
+basename \ No newline at end of file
diff --git a/libc-test/semver/dragonfly.txt b/libc-test/semver/dragonfly.txt
index fa472ce662..f8f0fa0891 100644
--- a/libc-test/semver/dragonfly.txt
+++ b/libc-test/semver/dragonfly.txt
@@ -1546,3 +1546,5 @@ wait4
waitid
xucred
eaccess
+dirname
+basename
diff --git a/libc-test/semver/freebsd.txt b/libc-test/semver/freebsd.txt
index 649ef77161..09bda1f2dd 100644
--- a/libc-test/semver/freebsd.txt
+++ b/libc-test/semver/freebsd.txt
@@ -1925,4 +1925,6 @@ wait4
waitid
xallocx
xucred
-eaccess \ No newline at end of file
+eaccess
+dirname
+basename \ No newline at end of file
diff --git a/libc-test/semver/linux-gnu.txt b/libc-test/semver/linux-gnu.txt
index a4289ad849..bf663a1930 100644
--- a/libc-test/semver/linux-gnu.txt
+++ b/libc-test/semver/linux-gnu.txt
@@ -657,4 +657,7 @@ eaccess
asctime_r
ctime_r
strftime
-strptime \ No newline at end of file
+strptime
+dirname
+posix_basename
+gnu_basename \ No newline at end of file
diff --git a/libc-test/semver/linux-musl.txt b/libc-test/semver/linux-musl.txt
index c00934af10..7af1418931 100644
--- a/libc-test/semver/linux-musl.txt
+++ b/libc-test/semver/linux-musl.txt
@@ -52,4 +52,6 @@ euidaccess
eaccess
asctime_r
strftime
-strptime \ No newline at end of file
+strptime
+dirname
+basename \ No newline at end of file
diff --git a/libc-test/semver/netbsd.txt b/libc-test/semver/netbsd.txt
index f14f2eae45..97d76cb304 100644
--- a/libc-test/semver/netbsd.txt
+++ b/libc-test/semver/netbsd.txt
@@ -1533,3 +1533,5 @@ uucred
vm_size_t
wait4
waitid
+dirname
+basename \ No newline at end of file
diff --git a/libc-test/semver/openbsd.txt b/libc-test/semver/openbsd.txt
index 0ae23f549b..d540671e1b 100644
--- a/libc-test/semver/openbsd.txt
+++ b/libc-test/semver/openbsd.txt
@@ -1231,3 +1231,5 @@ utmp
utrace
wait4
xucred
+dirname
+basename \ No newline at end of file
diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs
index 8a7e2f1f09..6b391893a3 100644
--- a/src/unix/bsd/apple/mod.rs
+++ b/src/unix/bsd/apple/mod.rs
@@ -5870,6 +5870,9 @@ extern "C" {
pub fn malloc_size(ptr: *const ::c_void) -> ::size_t;
pub fn malloc_good_size(size: ::size_t) -> ::size_t;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
pub unsafe fn mach_task_self() -> ::mach_port_t {
diff --git a/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/src/unix/bsd/freebsdlike/dragonfly/mod.rs
index 96818616b2..70fe6e2edd 100644
--- a/src/unix/bsd/freebsdlike/dragonfly/mod.rs
+++ b/src/unix/bsd/freebsdlike/dragonfly/mod.rs
@@ -1663,6 +1663,9 @@ extern "C" {
pub fn umtx_sleep(ptr: *const ::c_int, value: ::c_int, timeout: ::c_int) -> ::c_int;
pub fn umtx_wakeup(ptr: *const ::c_int, count: ::c_int) -> ::c_int;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
#[link(name = "rt")]
diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
index aaa0435847..563c0f936f 100644
--- a/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
+++ b/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
@@ -463,6 +463,9 @@ extern "C" {
) -> ::c_int;
pub fn fdatasync(fd: ::c_int) -> ::c_int;
+
+ pub fn dirname(path: *const ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *const ::c_char) -> *mut ::c_char;
}
cfg_if! {
diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
index e7f8ad7802..df00b6c1d6 100644
--- a/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
+++ b/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
@@ -487,6 +487,9 @@ extern "C" {
pub fn setproctitle_fast(fmt: *const ::c_char, ...);
pub fn timingsafe_bcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int;
pub fn timingsafe_memcmp(a: *const ::c_void, b: *const ::c_void, len: ::size_t) -> ::c_int;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
cfg_if! {
diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
index bcd09006b5..798431c35e 100644
--- a/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
+++ b/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
@@ -535,6 +535,9 @@ extern "C" {
len: ::size_t,
flags: ::c_uint,
) -> ::ssize_t;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
#[link(name = "kvm")]
diff --git a/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs b/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
index 9da6696048..3e0ec40519 100644
--- a/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
+++ b/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
@@ -535,6 +535,9 @@ extern "C" {
len: ::size_t,
flags: ::c_uint,
) -> ::ssize_t;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
#[link(name = "kvm")]
diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs
index 6c2096b1d9..b71531c253 100644
--- a/src/unix/bsd/netbsdlike/mod.rs
+++ b/src/unix/bsd/netbsdlike/mod.rs
@@ -743,6 +743,9 @@ extern "C" {
pub fn gethostid() -> ::c_long;
pub fn sethostid(hostid: ::c_long) -> ::c_int;
pub fn ftok(path: *const ::c_char, id: ::c_int) -> ::key_t;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
cfg_if! {
diff --git a/src/unix/linux_like/android/mod.rs b/src/unix/linux_like/android/mod.rs
index 67e5eb52b4..683a4c3ef9 100644
--- a/src/unix/linux_like/android/mod.rs
+++ b/src/unix/linux_like/android/mod.rs
@@ -3227,6 +3227,9 @@ extern "C" {
pub fn reallocarray(ptr: *mut ::c_void, nmemb: ::size_t, size: ::size_t) -> *mut ::c_void;
pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int;
+
+ pub fn dirname(path: *const ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *const ::c_char) -> *mut ::c_char;
}
cfg_if! {
diff --git a/src/unix/linux_like/linux/gnu/mod.rs b/src/unix/linux_like/linux/gnu/mod.rs
index 3506d922dd..98a58a2acb 100644
--- a/src/unix/linux_like/linux/gnu/mod.rs
+++ b/src/unix/linux_like/linux/gnu/mod.rs
@@ -1346,6 +1346,14 @@ extern "C" {
tm: *const ::tm,
) -> ::size_t;
pub fn strptime(s: *const ::c_char, format: *const ::c_char, tm: *mut ::tm) -> *mut ::c_char;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ /// POSIX version of `basename(3)`, defined in `libgen.h`.
+ #[link_name = "__xpg_basename"]
+ pub fn posix_basename(path: *mut ::c_char) -> *mut ::c_char;
+ /// GNU version of `basename(3)`, defined in `string.h`.
+ #[link_name = "basename"]
+ pub fn gnu_basename(path: *const ::c_char) -> *mut ::c_char;
}
extern "C" {
diff --git a/src/unix/linux_like/linux/musl/mod.rs b/src/unix/linux_like/linux/musl/mod.rs
index 32d3578218..25291c2306 100644
--- a/src/unix/linux_like/linux/musl/mod.rs
+++ b/src/unix/linux_like/linux/musl/mod.rs
@@ -767,6 +767,9 @@ extern "C" {
tm: *const ::tm,
) -> ::size_t;
pub fn strptime(s: *const ::c_char, format: *const ::c_char, tm: *mut ::tm) -> *mut ::c_char;
+
+ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char;
+ pub fn basename(path: *mut ::c_char) -> *mut ::c_char;
}
cfg_if! {