Changes in uspace/app/init/init.c [28be7fa:991f645] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/init/init.c

    r28be7fa r991f645  
    4646#include <malloc.h>
    4747#include <macros.h>
    48 #include <string.h>
     48#include <str.h>
    4949#include <devmap.h>
     50#include <str_error.h>
    5051#include "init.h"
    5152
     53#define ROOT_DEVICE       "bd/initrd"
     54#define ROOT_MOUNT_POINT  "/"
     55
     56#define DEVFS_FS_TYPE      "devfs"
    5257#define DEVFS_MOUNT_POINT  "/dev"
     58
     59#define SCRATCH_FS_TYPE      "tmpfs"
     60#define SCRATCH_MOUNT_POINT  "/scratch"
     61
     62#define DATA_FS_TYPE      "fat"
     63#define DATA_DEVICE       "bd/disk0"
     64#define DATA_MOUNT_POINT  "/data"
    5365
    5466#define SRV_CONSOLE  "/srv/console"
     
    5769static void info_print(void)
    5870{
    59         printf(NAME ": HelenOS init\n");
     71        printf("%s: HelenOS init\n", NAME);
     72}
     73
     74static bool mount_report(const char *desc, const char *mntpt,
     75    const char *fstype, const char *dev, int rc)
     76{
     77        switch (rc) {
     78        case EOK:
     79                if (dev != NULL)
     80                        printf("%s: %s mounted on %s (%s at %s)\n", NAME, desc, mntpt,
     81                            fstype, dev);
     82                else
     83                        printf("%s: %s mounted on %s (%s)\n", NAME, desc, mntpt, fstype);
     84                break;
     85        case EBUSY:
     86                printf("%s: %s already mounted on %s\n", NAME, desc, mntpt);
     87                return false;
     88        case ELIMIT:
     89                printf("%s: %s limit exceeded\n", NAME, desc);
     90                return false;
     91        case ENOENT:
     92                printf("%s: %s unknown type (%s)\n", NAME, desc, fstype);
     93                return false;
     94        default:
     95                printf("%s: %s not mounted on %s (%s)\n", NAME, desc, mntpt,
     96                    str_error(rc));
     97                return false;
     98        }
     99       
     100        return true;
    60101}
    61102
    62103static bool mount_root(const char *fstype)
    63104{
    64         char *opts = "";
    65         const char *root_dev = "bd/initrd";
     105        const char *opts = "";
    66106       
    67107        if (str_cmp(fstype, "tmpfs") == 0)
    68108                opts = "restore";
    69109       
    70         int rc = mount(fstype, "/", root_dev, opts, IPC_FLAG_BLOCKING);
    71        
    72         switch (rc) {
    73         case EOK:
    74                 printf(NAME ": Root filesystem mounted, %s at %s\n",
    75                     fstype, root_dev);
    76                 break;
    77         case EBUSY:
    78                 printf(NAME ": Root filesystem already mounted\n");
    79                 return false;
    80         case ELIMIT:
    81                 printf(NAME ": Unable to mount root filesystem\n");
    82                 return false;
    83         case ENOENT:
    84                 printf(NAME ": Unknown filesystem type (%s)\n", fstype);
    85                 return false;
    86         default:
    87                 printf(NAME ": Error mounting root filesystem (%d)\n", rc);
    88                 return false;
    89         }
    90        
    91         return true;
     110        int rc = mount(fstype, ROOT_MOUNT_POINT, ROOT_DEVICE, opts,
     111            IPC_FLAG_BLOCKING);
     112        return mount_report("Root filesystem", ROOT_MOUNT_POINT, fstype,
     113            ROOT_DEVICE, rc);
    92114}
    93115
    94116static bool mount_devfs(void)
    95117{
    96         int rc = mount("devfs", DEVFS_MOUNT_POINT, "", "", IPC_FLAG_BLOCKING);
    97        
    98         switch (rc) {
    99         case EOK:
    100                 printf(NAME ": Device filesystem mounted\n");
    101                 break;
    102         case EBUSY:
    103                 printf(NAME ": Device filesystem already mounted\n");
    104                 return false;
    105         case ELIMIT:
    106                 printf(NAME ": Unable to mount device filesystem\n");
    107                 return false;
    108         case ENOENT:
    109                 printf(NAME ": Unknown filesystem type (devfs)\n");
    110                 return false;
    111         default:
    112                 printf(NAME ": Error mounting device filesystem (%d)\n", rc);
    113                 return false;
    114         }
    115        
    116         return true;
    117 }
    118 
    119 static void spawn(char *fname)
    120 {
    121         char *argv[2];
     118        int rc = mount(DEVFS_FS_TYPE, DEVFS_MOUNT_POINT, "", "",
     119            IPC_FLAG_BLOCKING);
     120        return mount_report("Device filesystem", DEVFS_MOUNT_POINT, DEVFS_FS_TYPE,
     121            NULL, rc);
     122}
     123
     124static void spawn(const char *fname)
     125{
     126        int rc;
    122127        struct stat s;
    123128       
     
    125130                return;
    126131       
    127         printf(NAME ": Spawning %s\n", fname);
    128        
    129         argv[0] = fname;
    130         argv[1] = NULL;
    131        
    132         if (!task_spawn(fname, argv))
    133                 printf(NAME ": Error spawning %s\n", fname);
    134 }
    135 
    136 static void srv_start(char *fname)
    137 {
    138         char *argv[2];
     132        printf("%s: Spawning %s\n", NAME, fname);
     133        rc = task_spawnl(NULL, fname, fname, NULL);
     134        if (rc != EOK) {
     135                printf("%s: Error spawning %s (%s)\n", NAME, fname,
     136                    str_error(rc));
     137        }
     138}
     139
     140static void srv_start(const char *fname)
     141{
    139142        task_id_t id;
    140143        task_exit_t texit;
     
    145148                return;
    146149       
    147         printf(NAME ": Starting %s\n", fname);
    148        
    149         argv[0] = fname;
    150         argv[1] = NULL;
    151        
    152         id = task_spawn(fname, argv);
     150        printf("%s: Starting %s\n", NAME, fname);
     151        rc = task_spawnl(&id, fname, fname, NULL);
    153152        if (!id) {
    154                 printf(NAME ": Error spawning %s\n", fname);
    155                 return;
    156         }
    157 
     153                printf("%s: Error spawning %s (%s)\n", NAME, fname,
     154                    str_error(rc));
     155                return;
     156        }
     157       
    158158        rc = task_wait(id, &texit, &retval);
    159159        if (rc != EOK) {
    160                 printf(NAME ": Error waiting for %s\n", fname);
    161                 return;
    162         }
    163 
    164         if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) {
    165                 printf(NAME ": Server %s failed to start (returned %d)\n",
     160                printf("%s: Error waiting for %s (%s(\n", NAME, fname,
     161                    str_error(rc));
     162                return;
     163        }
     164       
     165        if (texit != TASK_EXIT_NORMAL) {
     166                printf("%s: Server %s failed to start (unexpectedly "
     167                    "terminated)\n", NAME, fname);
     168                return;
     169        }
     170
     171        if (retval != 0) {
     172                printf("%s: Server %s failed to start (exit code %d)\n", NAME,
    166173                        fname, retval);
    167174        }
    168175}
    169176
    170 static void console(char *dev)
    171 {
    172         char *argv[3];
     177static void console(const char *dev)
     178{
    173179        char hid_in[DEVMAP_NAME_MAXLEN];
    174180        int rc;
     
    176182        snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
    177183       
    178         printf(NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);
     184        printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, hid_in);
    179185       
    180186        /* Wait for the input device to be ready */
    181         dev_handle_t handle;
     187        devmap_handle_t handle;
    182188        rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
    183        
    184         if (rc == EOK) {
    185                 argv[0] = SRV_CONSOLE;
    186                 argv[1] = hid_in;
    187                 argv[2] = NULL;
    188                
    189                 if (!task_spawn(SRV_CONSOLE, argv))
    190                         printf(NAME ": Error spawning %s with %s\n", SRV_CONSOLE, hid_in);
    191         } else
    192                 printf(NAME ": Error waiting on %s\n", hid_in);
    193 }
    194 
    195 static void getterm(char *dev, char *app)
    196 {
    197         char *argv[4];
     189        if (rc != EOK) {
     190                printf("%s: Error waiting on %s (%s)\n", NAME, hid_in,
     191                    str_error(rc));
     192                return;
     193        }
     194       
     195        rc = task_spawnl(NULL, SRV_CONSOLE, SRV_CONSOLE, hid_in, NULL);
     196        if (rc != EOK) {
     197                printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,
     198                    hid_in, str_error(rc));
     199        }
     200}
     201
     202static void getterm(const char *dev, const char *app, bool wmsg)
     203{
    198204        char term[DEVMAP_NAME_MAXLEN];
    199205        int rc;
     
    201207        snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
    202208       
    203         printf(NAME ": Spawning %s with %s %s\n", APP_GETTERM, term, app);
     209        printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app);
    204210       
    205211        /* Wait for the terminal device to be ready */
    206         dev_handle_t handle;
     212        devmap_handle_t handle;
    207213        rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
    208        
    209         if (rc == EOK) {
    210                 argv[0] = APP_GETTERM;
    211                 argv[1] = term;
    212                 argv[2] = app;
    213                 argv[3] = NULL;
    214                
    215                 if (!task_spawn(APP_GETTERM, argv))
    216                         printf(NAME ": Error spawning %s with %s %s\n", APP_GETTERM,
    217                             term, app);
    218         } else
    219                 printf(NAME ": Error waiting on %s\n", term);
    220 }
    221 
    222 static void mount_scratch(void)
    223 {
    224         int rc;
    225 
    226         printf("Trying to mount null/0 on /scratch... ");
    227         fflush(stdout);
    228 
    229         rc = mount("tmpfs", "/scratch", "null/0", "", 0);
    230         if (rc == EOK)
    231                 printf("OK\n");
    232         else
    233                 printf("Failed\n");
    234 }
    235 
    236 static void mount_data(void)
    237 {
    238         int rc;
    239 
    240         printf("Trying to mount bd/disk0 on /data... ");
    241         fflush(stdout);
    242 
    243         rc = mount("fat", "/data", "bd/disk0", "wtcache", 0);
    244         if (rc == EOK)
    245                 printf("OK\n");
    246         else
    247                 printf("Failed\n");
     214        if (rc != EOK) {
     215                printf("%s: Error waiting on %s (%s)\n", NAME, term,
     216                    str_error(rc));
     217                return;
     218        }
     219       
     220        if (wmsg) {
     221                rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, "-w", term,
     222                    app, NULL);
     223                if (rc != EOK) {
     224                        printf("%s: Error spawning %s -w %s %s (%s)\n", NAME,
     225                            APP_GETTERM, term, app, str_error(rc));
     226                }
     227        } else {
     228                rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, term, app,
     229                    NULL);
     230                if (rc != EOK) {
     231                        printf("%s: Error spawning %s %s %s (%s)\n", NAME,
     232                            APP_GETTERM, term, app, str_error(rc));
     233                }
     234        }
     235}
     236
     237static bool mount_scratch(void)
     238{
     239        int rc = mount(SCRATCH_FS_TYPE, SCRATCH_MOUNT_POINT, "", "", 0);
     240        return mount_report("Scratch filesystem", SCRATCH_MOUNT_POINT,
     241            SCRATCH_FS_TYPE, NULL, rc);
     242}
     243
     244static bool mount_data(void)
     245{
     246        int rc = mount(DATA_FS_TYPE, DATA_MOUNT_POINT, DATA_DEVICE, "wtcache", 0);
     247        return mount_report("Data filesystem", DATA_MOUNT_POINT, DATA_FS_TYPE,
     248            DATA_DEVICE, rc);
    248249}
    249250
     
    253254       
    254255        if (!mount_root(STRING(RDFMT))) {
    255                 printf(NAME ": Exiting\n");
     256                printf("%s: Exiting\n", NAME);
    256257                return -1;
    257258        }
    258 
     259       
    259260        /* Make sure tmpfs is running. */
    260261        if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
     
    266267       
    267268        if (!mount_devfs()) {
    268                 printf(NAME ": Exiting\n");
     269                printf("%s: Exiting\n", NAME);
    269270                return -2;
    270271        }
    271 
     272       
    272273        mount_scratch();
    273274       
     
    276277        srv_start("/srv/cuda_adb");
    277278        srv_start("/srv/i8042");
     279        srv_start("/srv/s3c24ser");
    278280        srv_start("/srv/adb_ms");
    279281        srv_start("/srv/char_ms");
    280 
     282        srv_start("/srv/s3c24ts");
     283       
    281284        spawn("/srv/fb");
    282285        spawn("/srv/kbd");
     
    284287       
    285288        spawn("/srv/clip");
    286 
     289       
    287290        /*
    288291         * Start these synchronously so that mount_data() can be
     
    295298        (void) srv_start;
    296299#endif
    297 
     300       
    298301#ifdef CONFIG_MOUNT_DATA
    299302        mount_data();
     
    301304        (void) mount_data;
    302305#endif
    303 
    304         getterm("term/vc0", "/app/bdsh");
    305         getterm("term/vc1", "/app/bdsh");
    306         getterm("term/vc2", "/app/bdsh");
    307         getterm("term/vc3", "/app/bdsh");
    308         getterm("term/vc4", "/app/bdsh");
    309         getterm("term/vc5", "/app/bdsh");
    310         getterm("term/vc6", "/app/klog");
    311 
     306       
     307        getterm("term/vc0", "/app/bdsh", true);
     308        getterm("term/vc1", "/app/bdsh", false);
     309        getterm("term/vc2", "/app/bdsh", false);
     310        getterm("term/vc3", "/app/bdsh", false);
     311        getterm("term/vc4", "/app/bdsh", false);
     312        getterm("term/vc5", "/app/bdsh", false);
     313        getterm("term/vc6", "/app/klog", false);
     314       
    312315        return 0;
    313316}
Note: See TracChangeset for help on using the changeset viewer.