a7a45ec4d5d0d8f6ccd38964d65a02e29183d8d0
[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 GPL v2 or later, see file License for details.
8 */
9
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <string.h>
13 #include <errno.h>
14 #include <stdio.h>
15 #include <sys/personality.h>
16
17 #include "busybox.h"
18
19 int setarch_main(int ATTRIBUTE_UNUSED argc, char **argv);
20 int setarch_main(int ATTRIBUTE_UNUSED argc, char **argv)
21 {
22         int pers = -1;
23
24         /* Figure out what personality we are supposed to switch to ...
25          * we can be invoked as either:
26          * argv[0],argv[1] -> "setarch","personality"
27          * argv[0]         -> "personality"
28          */
29 retry:
30         if (argv[0][5] == '6') /* linux64 */
31                 pers = PER_LINUX;
32         else if (argv[0][5] == '3') /* linux32 */
33                 pers = PER_LINUX32;
34         else if (pers == -1 && argv[1] != NULL) {
35                 pers = PER_LINUX32;
36                 ++argv;
37                 goto retry;
38         }
39
40         /* make user actually gave us something to do */
41         ++argv;
42         if (argv[0] == NULL)
43                 bb_show_usage();
44
45         /* Try to set personality */
46         if (personality(pers) >= 0) {
47
48                 /* Try to execute the program */
49                 BB_EXECVP(argv[0], argv);
50         }
51
52         bb_perror_msg_and_die("%s", argv[0]);
53 }