strings: implement -t radix
[oweals/busybox.git] / util-linux / setarch.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * linux32/linux64 allows for changing uname emulation.
4  *
5  * Copyright 2002 Andi Kleen, SuSE Labs.
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8  */
9 //config:config SETARCH
10 //config:       bool "setarch"
11 //config:       default y
12 //config:       select PLATFORM_LINUX
13 //config:       help
14 //config:         The linux32 utility is used to create a 32bit environment for the
15 //config:         specified program (usually a shell). It only makes sense to have
16 //config:         this util on a system that supports both 64bit and 32bit userland
17 //config:         (like amd64/x86, ppc64/ppc, sparc64/sparc, etc...).
18
19 //applet:IF_SETARCH(APPLET(setarch, BB_DIR_BIN, BB_SUID_DROP))
20 //applet:IF_SETARCH(APPLET_ODDNAME(linux32, setarch, BB_DIR_BIN, BB_SUID_DROP, linux32))
21 //applet:IF_SETARCH(APPLET_ODDNAME(linux64, setarch, BB_DIR_BIN, BB_SUID_DROP, linux64))
22
23 //kbuild:lib-$(CONFIG_SETARCH) += setarch.o
24
25 //usage:#define setarch_trivial_usage
26 //usage:       "PERSONALITY [-R] PROG ARGS"
27 //usage:#define setarch_full_usage "\n\n"
28 //usage:       "PERSONALITY may be:"
29 //usage:   "\n""        linux32 Set 32bit uname emulation"
30 //usage:   "\n""        linux64 Set 64bit uname emulation"
31 //usage:   "\n"
32 //usage:   "\n""        -R      Disable address space randomization"
33 //usage:
34 //usage:#define linux32_trivial_usage NOUSAGE_STR
35 //usage:#define linux32_full_usage ""
36 //usage:
37 //usage:#define linux64_trivial_usage NOUSAGE_STR
38 //usage:#define linux64_full_usage ""
39
40 #include "libbb.h"
41 #include <sys/personality.h>
42
43 #ifndef ADDR_NO_RANDOMIZE
44 # define ADDR_NO_RANDOMIZE       0x0040000
45 #endif
46
47 int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
48 int setarch_main(int argc UNUSED_PARAM, char **argv)
49 {
50         unsigned opts;
51         unsigned long pers;
52
53         /* Figure out what personality we are supposed to switch to ...
54          * we can be invoked as either:
55          * argv[0],argv[1] == "setarch","personality"
56          * argv[0]         == "personality"
57          */
58         if (ENABLE_SETARCH && applet_name[0] == 's'
59          && argv[1] && is_prefixed_with(argv[1], "linux")
60         ) {
61                 applet_name = argv[1];
62                 argv++;
63         }
64         if (applet_name[5] == '6') /* linux64 */
65                 pers = PER_LINUX;
66         else if (applet_name[5] == '3') /* linux32 */
67                 pers = PER_LINUX32;
68         else
69                 bb_show_usage();
70
71         opts = getopt32(argv, "+R"); /* '+': stop at first non-option */
72         if (opts)
73                 pers |= ADDR_NO_RANDOMIZE;
74
75         /* Try to set personality */
76         if (personality(pers) < 0)
77                 bb_perror_msg_and_die("personality(0x%lx)", pers);
78
79         argv += optind;
80         if (!argv[0])
81                 (--argv)[0] = (char*)"/bin/sh";
82
83         /* Try to execute the program */
84         BB_EXECVP_or_die(argv);
85 }