Bump to version 1.22.1
[platform/upstream/busybox.git] / util-linux / setarch.c
index 33588e4..7b9421a 100644 (file)
@@ -1,53 +1,61 @@
 /* vi: set sw=4 ts=4: */
 /*
- * Linux32/linux64 allows for changing uname emulation.
+ * 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 <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+
+//usage:#define setarch_trivial_usage
+//usage:       "personality PROG ARGS"
+//usage:#define setarch_full_usage "\n\n"
+//usage:       "Personality may be:\n"
+//usage:       "       linux32         Set 32bit uname emulation\n"
+//usage:       "       linux64         Set 64bit uname emulation"
+//usage:
+//usage:#define linux32_trivial_usage NOUSAGE_STR
+//usage:#define linux32_full_usage ""
+//usage:
+//usage:#define linux64_trivial_usage NOUSAGE_STR
+//usage:#define linux64_full_usage ""
+
 #include <sys/personality.h>
 
-#include "busybox.h"
+#include "libbb.h"
 
-int setarch_main(int argc, char **argv)
+int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int setarch_main(int argc UNUSED_PARAM, char **argv)
 {
-       int pers = -1;
+       int pers;
 
        /* 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"
+        * argv[0],argv[1] == "setarch","personality"
+        * argv[0]         == "personality"
         */
-retry:
-       if (!strcmp(argv[0], "linux64"))
+       if (ENABLE_SETARCH && applet_name[0] == 's'
+        && argv[1] && strncpy(argv[1], "linux", 5)
+       ) {
+               applet_name = argv[1];
+               argv++;
+       }
+       if (applet_name[5] == '6') /* linux64 */
                pers = PER_LINUX;
-       else if (!strcmp(argv[0], "linux32"))
+       else if (applet_name[5] == '3') /* linux32 */
                pers = PER_LINUX32;
-       else if (pers == -1 && argv[1] != NULL) {
-               pers = PER_LINUX32;
-               ++argv;
-               goto retry;
-       }
+       else
+               bb_show_usage();
 
-       /* make user actually gave us something to do */
-       ++argv;
+       argv++;
        if (argv[0] == NULL)
                bb_show_usage();
 
        /* Try to set personality */
-       if (personality(pers) < 0)
-               goto failure;
-
-       /* Try to execute the program */
-       execvp(argv[0], argv);
+       if (personality(pers) >= 0) {
+               /* Try to execute the program */
+               BB_EXECVP(argv[0], argv);
+       }
 
-failure:
-       bb_perror_msg_and_die("%s", argv[0]);
+       bb_simple_perror_msg_and_die(argv[0]);
 }