Prex Home / Browse Source - Prex Version: 0.9.0

root/usr/sbin/init/init.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /*
   2  * Copyright (c) 2005-2008, Kohsuke Ohtani
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  * 1. Redistributions of source code must retain the above copyright
   9  *    notice, this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  * 3. Neither the name of the author nor the names of any co-contibutors
  14  *    may be used to endorse or promote products derived from this software
  15  *    without specific prior written permission.
  16  *
  17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27  * SUCH DAMAGE.
  28  */
  29 
  30 /*
  31  * init.c - traditional POSIX init.
  32  *
  33  * Required capabilities:
  34  *      CAP_NICE, CAP_KILL, CAP_RAWIO
  35  */
  36 
  37 #include <sys/prex.h>
  38 #include <sys/wait.h>
  39 #include <unistd.h>
  40 #include <signal.h>
  41 #include <termios.h>
  42 #include <errno.h>
  43 #include <fcntl.h>
  44 #include <stdio.h>
  45 #include <stdlib.h>
  46 #include <setjmp.h>
  47 
  48 static const char cmdbox[] = "/boot/cmdbox";
  49 static const char sh[]     = "sh";
  50 static const char runcom[] = "/etc/rc";
  51 static const char ctty[]   = "/dev/console";
  52 
  53 static jmp_buf jbuf;
  54 
  55 /*
  56  * The mother of all processes.
  57  */
  58 int
  59 main(int argc, char *argv[])
  60 {
  61         pid_t pid;
  62 
  63         sys_log("init: booting\n");
  64         setsid();
  65 
  66         setjmp(jbuf);
  67 
  68         close(0);
  69         close(1);
  70         close(2);
  71 
  72         pid = vfork();
  73 
  74         if (pid == -1)
  75                 exit(1);
  76 
  77         if (pid == 0) {
  78                 /*
  79                  * Child
  80                  */
  81                 signal(SIGHUP, SIG_DFL);
  82                 signal(SIGINT, SIG_DFL);
  83                 signal(SIGALRM, SIG_DFL);
  84                 setsid();
  85                 open(ctty, O_RDWR);     /* stdin */
  86                 dup(0);                 /* stdout */
  87                 dup(0);                 /* stderr */
  88 
  89                 sys_log("init: running boot script\n");
  90                 execl(cmdbox, sh, runcom);
  91                 sys_panic("init: no shell");
  92         }
  93 
  94         thread_setpri(thread_self(), 254);
  95         while (wait((int *)0) != pid)
  96                 ;
  97 
  98         /*
  99          * Login shell is terminated.
 100          */
 101         sys_log("init: restarting...\n");
 102         sync();
 103         kill(-1, SIGTERM);
 104         sleep(1);
 105         longjmp(jbuf, 1);
 106 
 107         /* NOTREACHED */
 108         return 0;
 109 }

/* [<][>][^][v][top][bottom][index][help] */