From 1a0edd8eeb2e3aae407a91795696461f475b445e Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Wed, 23 Dec 2020 20:24:04 -0700 Subject: [PATCH] Add program_invocation_short_name --- include/bits/errno.h | 1 + src/header/errno/mod.rs | 17 +++++++++++++++++ tests/errno.c | 2 ++ tests/expected/bins_dynamic/errno.stdout | 2 ++ tests/expected/bins_static/errno.stdout | 2 ++ 5 files changed, 24 insertions(+) diff --git a/include/bits/errno.h b/include/bits/errno.h index 3d6409a2..9594ee57 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 0530f74e..7a51f0b2 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 699bfa96..92bc5515 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 4c460834..b3aff487 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 9d4b10bd..a8236cdb 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 -- GitLab