diff --git a/include/bits/errno.h b/include/bits/errno.h index 3d6409a2e781f58453b21df1218a2fd7f7bd04b4..9594ee574d9cec805e44c09bc28a172e37882735 100644 --- a/include/bits/errno.h +++ b/include/bits/errno.h @@ -9,6 +9,7 @@ extern "C" { #define errno (*__errno_location()) #define program_invocation_name (*__program_invocation_name()) +#define program_invocation_short_name (*__program_invocation_short_name()) #ifdef __cplusplus } // extern "C" diff --git a/src/header/errno/mod.rs b/src/header/errno/mod.rs index 0530f74ee442c3a9850ea9969af4a01c2eec5393..7a51f0b202546e46970eeac59c4688be1895f85e 100644 --- a/src/header/errno/mod.rs +++ b/src/header/errno/mod.rs @@ -18,6 +18,23 @@ pub unsafe extern "C" fn __program_invocation_name() -> *mut *mut c_char { &mut platform::inner_argv[0] } +#[no_mangle] +pub unsafe extern "C" fn __program_invocation_short_name() -> *mut *mut c_char { + let mut ptr = platform::inner_argv[0]; + let mut slash_ptr = ptr; + loop { + let b = *ptr as u8; + if b == 0 { + return &mut slash_ptr; + } else { + ptr = ptr.add(1); + if b == b'/' { + slash_ptr = ptr; + } + } + } +} + pub const EPERM: c_int = 1; /* Operation not permitted */ pub const ENOENT: c_int = 2; /* No such file or directory */ pub const ESRCH: c_int = 3; /* No such process */ diff --git a/tests/errno.c b/tests/errno.c index 699bfa96a59106da4cd78f3d9e3a27df6872fcca..92bc5515a8f4fc1e24107bae05f2da8c3fe3c468 100644 --- a/tests/errno.c +++ b/tests/errno.c @@ -5,9 +5,11 @@ int main(int argc, char **argv) { puts(argv[0]); puts(program_invocation_name); + puts(program_invocation_short_name); program_invocation_name = "yes, you can change this"; puts(argv[0]); puts(program_invocation_name); + puts(program_invocation_short_name); } diff --git a/tests/expected/bins_dynamic/errno.stdout b/tests/expected/bins_dynamic/errno.stdout index 4c4608349b07c566aec56afba6cf755868ec8393..b3aff4878b1ac58eaa9466b018cfffafbbfeffd7 100644 --- a/tests/expected/bins_dynamic/errno.stdout +++ b/tests/expected/bins_dynamic/errno.stdout @@ -1,4 +1,6 @@ bins_dynamic/errno bins_dynamic/errno +errno +yes, you can change this yes, you can change this yes, you can change this diff --git a/tests/expected/bins_static/errno.stdout b/tests/expected/bins_static/errno.stdout index 9d4b10bd4fc502a3e5b28adb0e6d09d403a8e098..a8236cdb85b918c41a7850e63fbfecd254b558f6 100644 --- a/tests/expected/bins_static/errno.stdout +++ b/tests/expected/bins_static/errno.stdout @@ -1,4 +1,6 @@ bins_static/errno bins_static/errno +errno +yes, you can change this yes, you can change this yes, you can change this