Ignore:
File:
1 edited

Legend:

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

    rd9fae235 r19f857a  
    4848#include <str.h>
    4949#include <devmap.h>
    50 #include <str_error.h>
    5150#include "init.h"
    5251
    53 #define ROOT_DEVICE       "bd/initrd"
    54 #define ROOT_MOUNT_POINT  "/"
    55 
    56 #define DEVFS_FS_TYPE      "devfs"
    5752#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"
    6553
    6654#define SRV_CONSOLE  "/srv/console"
     
    6957static void info_print(void)
    7058{
    71         printf("%s: HelenOS init\n", NAME);
    72 }
    73 
    74 static bool mount_report(const char *desc, const char *mntpt,
    75     const char *fstype, const char *dev, int rc)
    76 {
     59        printf(NAME ": HelenOS init\n");
     60}
     61
     62static bool mount_root(const char *fstype)
     63{
     64        const char *opts = "";
     65        const char *root_dev = "bd/initrd";
     66       
     67        if (str_cmp(fstype, "tmpfs") == 0)
     68                opts = "restore";
     69       
     70        int rc = mount(fstype, "/", root_dev, opts, IPC_FLAG_BLOCKING);
     71       
    7772        switch (rc) {
    7873        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);
     74                printf(NAME ": Root filesystem mounted, %s at %s\n",
     75                    fstype, root_dev);
    8476                break;
    8577        case EBUSY:
    86                 printf("%s: %s already mounted on %s\n", NAME, desc, mntpt);
     78                printf(NAME ": Root filesystem already mounted\n");
    8779                return false;
    8880        case ELIMIT:
    89                 printf("%s: %s limit exceeded\n", NAME, desc);
     81                printf(NAME ": Unable to mount root filesystem\n");
    9082                return false;
    9183        case ENOENT:
    92                 printf("%s: %s unknown type (%s)\n", NAME, desc, fstype);
     84                printf(NAME ": Unknown filesystem type (%s)\n", fstype);
    9385                return false;
    9486        default:
    95                 printf("%s: %s not mounted on %s (%s)\n", NAME, desc, mntpt,
    96                     str_error(rc));
     87                printf(NAME ": Error mounting root filesystem (%d)\n", rc);
    9788                return false;
    9889        }
     
    10192}
    10293
    103 static bool mount_root(const char *fstype)
    104 {
    105         const char *opts = "";
    106        
    107         if (str_cmp(fstype, "tmpfs") == 0)
    108                 opts = "restore";
    109        
    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);
    114 }
    115 
    11694static bool mount_devfs(void)
    11795{
    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);
     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;
    122117}
    123118
     
    130125                return;
    131126       
    132         printf("%s: Spawning %s\n", NAME, fname);
     127        printf(NAME ": Spawning %s\n", fname);
    133128       
    134129        argv[0] = fname;
    135130        argv[1] = NULL;
    136131       
    137         int err;
    138         if (!task_spawn(fname, argv, &err))
    139                 printf("%s: Error spawning %s (%s)\n", NAME, fname,
    140                     str_error(err));
     132        if (!task_spawn(fname, argv))
     133                printf(NAME ": Error spawning %s\n", fname);
    141134}
    142135
     
    152145                return;
    153146       
    154         printf("%s: Starting %s\n", NAME, fname);
     147        printf(NAME ": Starting %s\n", fname);
    155148       
    156149        argv[0] = fname;
    157150        argv[1] = NULL;
    158151       
    159         id = task_spawn(fname, argv, &retval);
     152        id = task_spawn(fname, argv);
    160153        if (!id) {
    161                 printf("%s: Error spawning %s (%s)\n", NAME, fname,
    162                     str_error(retval));
     154                printf(NAME ": Error spawning %s\n", fname);
    163155                return;
    164156        }
    165        
     157
    166158        rc = task_wait(id, &texit, &retval);
    167159        if (rc != EOK) {
    168                 printf("%s: Error waiting for %s (%s(\n", NAME, fname,
    169                     str_error(retval));
     160                printf(NAME ": Error waiting for %s\n", fname);
    170161                return;
    171162        }
    172        
     163
    173164        if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) {
    174                 printf("%s: Server %s failed to start (%s)\n", NAME,
    175                         fname, str_error(retval));
     165                printf(NAME ": Server %s failed to start (returned %d)\n",
     166                        fname, retval);
    176167        }
    177168}
     
    185176        snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
    186177       
    187         printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, hid_in);
     178        printf(NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);
    188179       
    189180        /* Wait for the input device to be ready */
     
    196187                argv[2] = NULL;
    197188               
    198                 if (!task_spawn(SRV_CONSOLE, argv, &rc))
    199                         printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,
    200                             hid_in, str_error(rc));
     189                if (!task_spawn(SRV_CONSOLE, argv))
     190                        printf(NAME ": Error spawning %s with %s\n", SRV_CONSOLE, hid_in);
    201191        } else
    202                 printf("%s: Error waiting on %s (%s)\n", NAME, hid_in,
    203                     str_error(rc));
     192                printf(NAME ": Error waiting on %s\n", hid_in);
    204193}
    205194
     
    212201        snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
    213202       
    214         printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app);
     203        printf(NAME ": Spawning %s with %s %s\n", APP_GETTERM, term, app);
    215204       
    216205        /* Wait for the terminal device to be ready */
     
    224213                argv[3] = NULL;
    225214               
    226                 if (!task_spawn(APP_GETTERM, argv, &rc))
    227                         printf("%s: Error spawning %s %s %s (%s)\n", NAME, APP_GETTERM,
    228                             term, app, str_error(rc));
     215                if (!task_spawn(APP_GETTERM, argv))
     216                        printf(NAME ": Error spawning %s with %s %s\n", APP_GETTERM,
     217                            term, app);
    229218        } else
    230                 printf("%s: Error waiting on %s (%s)\n", NAME, term,
    231                     str_error(rc));
    232 }
    233 
    234 static bool mount_scratch(void)
    235 {
    236         int rc = mount(SCRATCH_FS_TYPE, SCRATCH_MOUNT_POINT, "", "", 0);
    237         return mount_report("Scratch filesystem", SCRATCH_MOUNT_POINT,
    238             SCRATCH_FS_TYPE, NULL, rc);
    239 }
    240 
    241 static bool mount_data(void)
    242 {
    243         int rc = mount(DATA_FS_TYPE, DATA_MOUNT_POINT, DATA_DEVICE, "wtcache", 0);
    244         return mount_report("Data filesystem", DATA_MOUNT_POINT, DATA_FS_TYPE,
    245             DATA_DEVICE, rc);
     219                printf(NAME ": Error waiting on %s\n", term);
     220}
     221
     222static 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
     236static 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");
    246248}
    247249
     
    251253       
    252254        if (!mount_root(STRING(RDFMT))) {
    253                 printf("%s: Exiting\n", NAME);
     255                printf(NAME ": Exiting\n");
    254256                return -1;
    255257        }
    256        
     258
    257259        /* Make sure tmpfs is running. */
    258260        if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
     
    264266       
    265267        if (!mount_devfs()) {
    266                 printf("%s: Exiting\n", NAME);
     268                printf(NAME ": Exiting\n");
    267269                return -2;
    268270        }
    269        
     271
    270272        mount_scratch();
    271273       
     
    276278        srv_start("/srv/adb_ms");
    277279        srv_start("/srv/char_ms");
    278        
     280
    279281        spawn("/srv/fb");
    280282        spawn("/srv/kbd");
     
    282284       
    283285        spawn("/srv/clip");
    284        
     286
    285287        /*
    286288         * Start these synchronously so that mount_data() can be
     
    293295        (void) srv_start;
    294296#endif
    295        
     297
    296298#ifdef CONFIG_MOUNT_DATA
    297299        mount_data();
     
    299301        (void) mount_data;
    300302#endif
    301        
     303
    302304        getterm("term/vc0", "/app/bdsh");
    303305        getterm("term/vc1", "/app/bdsh");
     
    307309        getterm("term/vc5", "/app/bdsh");
    308310        getterm("term/vc6", "/app/klog");
    309        
     311
    310312        return 0;
    311313}
Note: See TracChangeset for help on using the changeset viewer.