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