aboutsummaryrefslogtreecommitdiffstats
path: root/main/busybox/0001-ash-add-built-in-BB_ASH_VERSION-variable.patch
blob: f7f901f6ad419d6ac6da54606928f246aa8230d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
From cf95fcc20717e4c0906109b13565fdd06d874ee0 Mon Sep 17 00:00:00 2001
From: Ariadne Conill <ariadne@dereferenced.org>
Date: Wed, 10 Mar 2021 23:38:57 -0700
Subject: [PATCH] ash: add built-in $BB_ASH_VERSION variable

This is helpful for detecting if the shell is busybox ash or not,
which is necessary for enabling ash-specific features in /etc/profile
and Alpine's default $ENV.

https://gitlab.alpinelinux.org/alpine/aports/-/issues/12398 outlines
the rationale for detecting what shell is running in /etc/profile and
similar.

function                                             old     new   delta
.rodata                                            77899   77925     +26
varinit_data                                         360     384     +24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 50/0)               Total: 50 bytes

Signed-off-by: Ariadne Conill <ariadne@dereferenced.org>
---
 shell/ash.c | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index 6a16833b1..b8525dd57 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -153,6 +153,14 @@
 //config:	you to run the specified command or builtin,
 //config:	even when there is a function with the same name.
 //config:
+//config:config ASH_VERSION_VAR
+//config:	bool "declare $BB_ASH_VERSION variable"
+//config:	default y
+//config:	depends on SHELL_ASH
+//config:	help
+//config:	Enable support for declaring the $BB_ASH_VERSION variable,
+//config:	which is set as the busybox version.
+//config:
 //config:endif # ash options
 
 //applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
@@ -2109,6 +2117,9 @@ static const struct {
 	{ VSTRFIXED|VTEXTFIXED       , "PS1=$ "    , NULL            },
 	{ VSTRFIXED|VTEXTFIXED       , "PS2=> "    , NULL            },
 	{ VSTRFIXED|VTEXTFIXED       , "PS4=+ "    , NULL            },
+#if ENABLE_ASH_VERSION_VAR
+	{ VSTRFIXED|VTEXTFIXED       , "BB_ASH_VERSION=" BB_VER, NULL },
+#endif
 #if ENABLE_ASH_GETOPTS
 	{ VSTRFIXED|VTEXTFIXED       , defoptindvar, getoptsreset    },
 #endif
@@ -2159,18 +2170,19 @@ extern struct globals_var *BB_GLOBAL_CONST ash_ptr_to_globals_var;
 #define vps1      varinit[VAR_OFFSET1 + 2]
 #define vps2      varinit[VAR_OFFSET1 + 3]
 #define vps4      varinit[VAR_OFFSET1 + 4]
+#define VAR_OFFSET2 (VAR_OFFSET1 + ENABLE_ASH_VERSION_VAR)
 #if ENABLE_ASH_GETOPTS
-# define voptind  varinit[VAR_OFFSET1 + 5]
+# define voptind  varinit[VAR_OFFSET2 + 5]
 #endif
-#define VAR_OFFSET2 (VAR_OFFSET1 + ENABLE_ASH_GETOPTS)
-#define vlineno   varinit[VAR_OFFSET2 + 5]
+#define VAR_OFFSET3 (VAR_OFFSET2 + ENABLE_ASH_GETOPTS)
+#define vlineno   varinit[VAR_OFFSET3 + 5]
 #if ENABLE_ASH_RANDOM_SUPPORT
-# define vrandom  varinit[VAR_OFFSET2 + 6]
+# define vrandom  varinit[VAR_OFFSET3 + 6]
 #endif
-#define VAR_OFFSET3 (VAR_OFFSET2 + ENABLE_ASH_RANDOM_SUPPORT)
+#define VAR_OFFSET4 (VAR_OFFSET2 + ENABLE_ASH_RANDOM_SUPPORT)
 #if BASH_EPOCH_VARS
-# define vepochs  varinit[VAR_OFFSET3 + 6]
-# define vepochr  varinit[VAR_OFFSET3 + 7]
+# define vepochs  varinit[VAR_OFFSET4 + 6]
+# define vepochr  varinit[VAR_OFFSET4 + 7]
 #endif
 #define INIT_G_var() do { \
 	unsigned i; \
-- 
2.30.2