uml: formatting fixes
[powerpc.git] / arch / um / os-Linux / main.c
index 90912aa..2c089c2 100644 (file)
 #include "choose-mode.h"
 #include "uml-config.h"
 #include "os.h"
+#include "um_malloc.h"
 
-/* Set in set_stklim, which is called from main and __wrap_malloc.
- * __wrap_malloc only calls it if main hasn't started.
- */
-unsigned long stacksizelim;
-
-/* Set in main */
+/* Set in main, unchanged thereafter */
 char *linux_prog;
 
 #define PGD_BOUND (4 * 1024 * 1024)
@@ -51,7 +47,6 @@ static void set_stklim(void)
                        exit(1);
                }
        }
-       stacksizelim = (lim.rlim_cur + PGD_BOUND - 1) & ~(PGD_BOUND - 1);
 }
 
 static __init void do_uml_initcalls(void)
@@ -67,13 +62,32 @@ static __init void do_uml_initcalls(void)
 
 static void last_ditch_exit(int sig)
 {
-       signal(SIGINT, SIG_DFL);
-       signal(SIGTERM, SIG_DFL);
-       signal(SIGHUP, SIG_DFL);
        uml_cleanup();
        exit(1);
 }
 
+static void install_fatal_handler(int sig)
+{
+       struct sigaction action;
+
+       /* All signals are enabled in this handler ... */
+       sigemptyset(&action.sa_mask);
+
+       /* ... including the signal being handled, plus we want the
+        * handler reset to the default behavior, so that if an exit
+        * handler is hanging for some reason, the UML will just die
+        * after this signal is sent a second time.
+        */
+       action.sa_flags = SA_RESETHAND | SA_NODEFER;
+       action.sa_restorer = NULL;
+       action.sa_handler = last_ditch_exit;
+       if(sigaction(sig, &action, NULL) < 0){
+               printf("failed to install handler for signal %d - errno = %d\n",
+                      errno);
+               exit(1);
+       }
+}
+
 #define UML_LIB_PATH   ":/usr/lib/uml"
 
 static void setup_env_path(void)
@@ -158,9 +172,12 @@ int main(int argc, char **argv, char **envp)
        }
        new_argv[argc] = NULL;
 
-       set_handler(SIGINT, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1);
-       set_handler(SIGTERM, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1);
-       set_handler(SIGHUP, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1);
+       /* Allow these signals to bring down a UML if all other
+        * methods of control fail.
+        */
+       install_fatal_handler(SIGINT);
+       install_fatal_handler(SIGTERM);
+       install_fatal_handler(SIGHUP);
 
        scan_elf_aux( envp);
 
@@ -201,7 +218,7 @@ int main(int argc, char **argv, char **envp)
                ret = 1;
        }
        printf("\n");
-       return(uml_exitcode);
+       return uml_exitcode;
 }
 
 #define CAN_KMALLOC() \
@@ -214,7 +231,7 @@ void *__wrap_malloc(int size)
        void *ret;
 
        if(!CAN_KMALLOC())
-               return(__real_malloc(size));
+               return __real_malloc(size);
        else if(size <= PAGE_SIZE) /* finding contiguos pages can be hard*/
                ret = um_kmalloc(size);
        else ret = um_vmalloc(size);
@@ -225,16 +242,17 @@ void *__wrap_malloc(int size)
        if(ret == NULL)
                errno = ENOMEM;
 
-       return(ret);
+       return ret;
 }
 
 void *__wrap_calloc(int n, int size)
 {
        void *ptr = __wrap_malloc(n * size);
 
-       if(ptr == NULL) return(NULL);
+       if(ptr == NULL)
+               return NULL;
        memset(ptr, 0, n * size);
-       return(ptr);
+       return ptr;
 }
 
 extern void __real_free(void *);