busybox/util-linux/setarch.c
Denis Vlasenko fad2b86c9e use "glibc errno" trick not only for ash, but for entire busybox
(add/remove: 1/1 grow/shrink: 37/37 up/down: 139/-228)        Total: -89 bytes
2007-05-31 22:16:38 +00:00

49 lines
1.0 KiB
C

/* vi: set sw=4 ts=4: */
/*
* Linux32/linux64 allows for changing uname emulation.
*
* Copyright 2002 Andi Kleen, SuSE Labs.
*
* Licensed under GPL v2 or later, see file License for details.
*/
#include <sys/personality.h>
#include "libbb.h"
int setarch_main(int ATTRIBUTE_UNUSED argc, char **argv);
int setarch_main(int ATTRIBUTE_UNUSED argc, char **argv)
{
int pers = -1;
/* Figure out what personality we are supposed to switch to ...
* we can be invoked as either:
* argv[0],argv[1] -> "setarch","personality"
* argv[0] -> "personality"
*/
retry:
if (argv[0][5] == '6') /* linux64 */
pers = PER_LINUX;
else if (argv[0][5] == '3') /* linux32 */
pers = PER_LINUX32;
else if (pers == -1 && argv[1] != NULL) {
pers = PER_LINUX32;
++argv;
goto retry;
}
/* make user actually gave us something to do */
++argv;
if (argv[0] == NULL)
bb_show_usage();
/* Try to set personality */
if (personality(pers) >= 0) {
/* Try to execute the program */
BB_EXECVP(argv[0], argv);
}
bb_perror_msg_and_die("%s", argv[0]);
}