source: MondoRescue/branches/3.3/mindi-busybox/util-linux/setarch.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 2.5 KB
Line 
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
47int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
48int 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}
Note: See TracBrowser for help on using the repository browser.