use "glibc errno" trick not only for ash, but for entire busybox
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 31 May 2007 22:16:38 +0000 (22:16 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 31 May 2007 22:16:38 +0000 (22:16 -0000)
(add/remove: 1/1 grow/shrink: 37/37 up/down: 139/-228)        Total: -89 bytes

16 files changed:
applets/applets.c
archival/libunarchive/data_skip.c
archival/libunarchive/seek_by_jump.c
coreutils/mv.c
debianutils/mktemp.c
include/libbb.h
libbb/error_msg.c
libbb/perror_msg.c
libbb/run_shell.c
libbb/safe_write.c
loginutils/login.c
miscutils/devfsd.c
networking/libiproute/libnetlink.c
shell/ash.c
util-linux/ipcs.c
util-linux/setarch.c

index e905ebec4769477f9df59b48e704bde8d63fd4e7..bd37043940887d2ed46e7156151288de55050a9e 100644 (file)
@@ -641,10 +641,19 @@ void run_applet_and_exit(const char *name, char **argv)
 }
 
 
+#ifdef __GLIBC__
+/* Make it reside in R/W memory: */
+int *const bb_errno __attribute__ ((section (".data")));
+#endif
+
 int main(int argc, char **argv)
 {
        const char *s;
 
+#ifdef __GLIBC__
+       (*(int **)&bb_errno) = __errno_location();
+#endif
+
 #if !BB_MMU
        /* NOMMU re-exec trick sets high-order bit in first byte of name */
        if (argv[0][0] & 0x80) {
index dc3505a563ecd68db7e16dbfc1249491c9e1005a..d9778da2ee864fbd1a2e1484fde6d60743a96d32 100644 (file)
@@ -3,12 +3,8 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include "unarchive.h"
 #include "libbb.h"
+#include "unarchive.h"
 
 void data_skip(archive_handle_t *archive_handle)
 {
index d605f61dd4a103f8e917ecc55bbbaefbf3c0194b..6cd2564186ee85098c4a6d309319624fc7b51c77 100644 (file)
@@ -3,11 +3,6 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <sys/types.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-
 #include "libbb.h"
 #include "unarchive.h"
 
index ad36051f9fcacfb52d4668ad849fd5d5153d9dfc..8d9c9827a8d984611aa46224ddc95abfddd350fe 100644 (file)
 
 #include <sys/types.h>
 #include <sys/stat.h>
-#include <unistd.h>
 #include <dirent.h>
-#include <errno.h>
-#include <stdlib.h>
 #include <getopt.h> /* struct option */
 #include "libbb.h"
 #include "libcoreutils/coreutils.h"
index 966257aedd71565f0d24b4983979872c658dc3b1..9e7ef7b4c79b511e5e08cac775a7457f3b526710 100644 (file)
  */
 
 #include "libbb.h"
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
 
 int mktemp_main(int argc, char **argv);
 int mktemp_main(int argc, char **argv)
index 5e0b438bef430149f2bdeb40f6c1173562608263..385b30f16225c715a2875234743f7e57562434c4 100644 (file)
 #endif
 
 
+#if defined(__GLIBC__)
+/* glibc uses __errno_location() to get a ptr to errno */
+/* We can just memorize it once - no multithreading in busybox :) */
+extern int *const bb_errno;
+#undef errno
+#define errno (*bb_errno)
+#endif
+
 #if defined(__GLIBC__) && __GLIBC__ < 2
 int vdprintf(int d, const char *format, va_list ap);
 #endif
index b2141f3a202dd360b503decab5f4c7134dfd8083..5f53f031188db89baadfa766a320311cd697618a 100644 (file)
@@ -7,10 +7,6 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
 #include "libbb.h"
 
 void bb_error_msg(const char *s, ...)
index 7fb0830be35d80d41948193c44d3493e2132fc69..5145795f52504b2f38df0e1dabb06f29a3dc9f4b 100644 (file)
@@ -7,10 +7,6 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
 #include "libbb.h"
 
 void bb_perror_msg(const char *s, ...)
index 6be09088d76d5308fbbc337b81b672e57d4db25b..25d55dd63b407a6cc171b5e0b49e03bbb179854b 100644 (file)
  * SUCH DAMAGE.
  */
 
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <ctype.h>
 #include "libbb.h"
-#ifdef CONFIG_SELINUX
+#if ENABLE_SELINUX
 #include <selinux/selinux.h>  /* for setexeccon  */
 #endif
 
-#ifdef CONFIG_SELINUX
+#if ENABLE_SELINUX
 static security_context_t current_sid;
 
 void
@@ -90,7 +83,7 @@ void run_shell(const char *shell, int loginshell, const char *command, const cha
                        args[argno++] = *additional_args;
        }
        args[argno] = NULL;
-#ifdef CONFIG_SELINUX
+#if ENABLE_SELINUX
        if (current_sid && !setexeccon(current_sid)) {
                freecon(current_sid);
                execve(shell, (char **) args, environ);
index c81f1247fb3429b87156ba34f2f300c9a553e4b7..5bbb82e84faf52e4d29b7aaadd2debe286ac105c 100644 (file)
@@ -7,13 +7,8 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
 #include "libbb.h"
 
-
-
 ssize_t safe_write(int fd, const void *buf, size_t count)
 {
        ssize_t n;
index d725466aa6d84b7e28be8790cd6a9599fce24c70..1426950084927dcb4e0ff0794687bc624fc0db8e 100644 (file)
@@ -12,7 +12,6 @@
 #include <selinux/selinux.h>  /* for is_selinux_enabled()  */
 #include <selinux/get_context_list.h> /* for get_default_context() */
 #include <selinux/flask.h> /* for security class definitions  */
-#include <errno.h>
 #endif
 
 enum {
index 0b08fb6e51c11eb3966a99fac720617fb3262226..994b80e7686f8c5bd6199235fafabdf1553bcc7e 100644 (file)
 
 #include "libbb.h"
 #include "xregex.h"
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-#include <sys/stat.h>
-#include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <dirent.h>
-#include <fcntl.h>
 #include <syslog.h>
-#include <signal.h>
-#include <errno.h>
 #include <sys/sysmacros.h>
 
 
index 5307cec2c9ede22459dc6b57d98e5b7bbdd0b56b..0f6040977d50d8462061ff8b4176d73aa7ce1c8d 100644 (file)
  *
  */
 
-#include "libbb.h"
 #include <sys/socket.h>
-
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
 #include <sys/uio.h>
 
+#include "libbb.h"
 #include "libnetlink.h"
 
 void rtnl_close(struct rtnl_handle *rth)
index b1d22e5d2fc2562ab3e3cd1c4363afec8de06c71..ea10a65cf0b5b57caf9fc92d75445ed7624c7082 100644 (file)
@@ -127,13 +127,6 @@ static char optlist[NOPTS];
 
 /* ============ Misc data */
 
-#ifdef __GLIBC__
-/* glibc sucks */
-static int *dash_errno;
-#undef errno
-#define errno (*dash_errno)
-#endif
-
 static char nullstr[1];                /* zero length string */
 static const char homestr[] = "HOME";
 static const char snlfmt[] = "%s\n";
@@ -12734,10 +12727,6 @@ int ash_main(int argc, char **argv)
        struct jmploc jmploc;
        struct stackmark smark;
 
-#ifdef __GLIBC__
-       dash_errno = __errno_location();
-#endif
-
 #if PROFILE
        monitor(4, etext, profile_buf, sizeof(profile_buf), 50);
 #endif
index 393f9483272a43c2f94881f083b927adce3da61a..d7d901921b7961baa036f747bd28f0fc69f8125d 100644 (file)
@@ -8,12 +8,6 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include "libbb.h"
-#include <errno.h>
-#include <time.h>
-#include <pwd.h>
-#include <grp.h>
-
 /* X/OPEN tells us to use <sys/{types,ipc,sem}.h> for semctl() */
 /* X/OPEN tells us to use <sys/{types,ipc,msg}.h> for msgctl() */
 /* X/OPEN tells us to use <sys/{types,ipc,shm}.h> for shmctl() */
@@ -23,7 +17,7 @@
 #include <sys/msg.h>
 #include <sys/shm.h>
 
-
+#include "libbb.h"
 
 /*-------------------------------------------------------------------*/
 /* SHM_DEST and SHM_LOCKED are defined in kernel headers,
index f6433d6ba5fb6033afd670fda1baa6c76f439f53..2fb47f9e8362a0722b8d582488614b3fa502d2b6 100644 (file)
@@ -7,11 +7,6 @@
  * Licensed under GPL v2 or later, see file License for details.
 */
 
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
 #include <sys/personality.h>
 
 #include "libbb.h"