busybox/util-linux/setarch.c
<<
>>
Prefs
   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 <sys/personality.h>
  11
  12#include "libbb.h"
  13
  14int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  15int setarch_main(int argc UNUSED_PARAM, char **argv)
  16{
  17        int pers;
  18
  19        /* Figure out what personality we are supposed to switch to ...
  20         * we can be invoked as either:
  21         * argv[0],argv[1] == "setarch","personality"
  22         * argv[0]         == "personality"
  23         */
  24        if (ENABLE_SETARCH && applet_name[0] == 's'
  25         && argv[1] && strncpy(argv[1], "linux", 5)
  26        ) {
  27                applet_name = argv[1];
  28                argv++;
  29        }
  30        if (applet_name[5] == '6') /* linux64 */
  31                pers = PER_LINUX;
  32        else if (applet_name[5] == '3') /* linux32 */
  33                pers = PER_LINUX32;
  34        else
  35                bb_show_usage();
  36
  37        argv++;
  38        if (argv[0] == NULL)
  39                bb_show_usage();
  40
  41        /* Try to set personality */
  42        if (personality(pers) >= 0) {
  43                /* Try to execute the program */
  44                BB_EXECVP(argv[0], argv);
  45        }
  46
  47        bb_simple_perror_msg_and_die(argv[0]);
  48}
  49