source: mainline/uspace/app/init/init.c@ 210e50a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 210e50a was 210e50a, checked in by Martin Decky <martin@…>, 15 years ago

understand an empty fqdn as the device argument to mount() as an implicit request to create a fresh null/%d device

  • Property mode set to 100644
File size: 6.9 KB
RevLine 
[3eddaff]1/*
[df4ed85]2 * Copyright (c) 2005 Martin Decky
[3eddaff]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 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[b2951e2]29/** @addtogroup init Init
[c91c9fb]30 * @brief Init process for user space environment configuration.
[b2951e2]31 * @{
[c91c9fb]32 */
[b2951e2]33/**
34 * @file
35 */
36
[00c4994]37#include <stdio.h>
[860271d4]38#include <unistd.h>
[c91c9fb]39#include <ipc/ipc.h>
[860271d4]40#include <vfs/vfs.h>
41#include <bool.h>
42#include <errno.h>
43#include <fcntl.h>
[1757ffce]44#include <sys/stat.h>
[860271d4]45#include <task.h>
46#include <malloc.h>
[c91c9fb]47#include <macros.h>
[594303b]48#include <string.h>
[36b8100a]49#include <devmap.h>
[860271d4]50#include "init.h"
51
[47a350f]52#define DEVFS_MOUNT_POINT "/dev"
53
54#define SRV_CONSOLE "/srv/console"
[df747bd8]55#define APP_GETTERM "/app/getterm"
[47a350f]56
[36b8100a]57static void info_print(void)
58{
59 printf(NAME ": HelenOS init\n");
60}
61
62static bool mount_root(const char *fstype)
[860271d4]63{
[594303b]64 char *opts = "";
[1313ee9]65 const char *root_dev = "bd/initrd";
[860271d4]66
[594303b]67 if (str_cmp(fstype, "tmpfs") == 0)
68 opts = "restore";
[f49cf64]69
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;
[860271d4]89 }
90
91 return true;
92}
93
[a095d20]94static bool mount_devfs(void)
95{
[210e50a]96 int rc = mount("devfs", DEVFS_MOUNT_POINT, "", "", IPC_FLAG_BLOCKING);
[f49cf64]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;
[a095d20]114 }
115
116 return true;
117}
118
[860271d4]119static void spawn(char *fname)
120{
[c98e6ee]121 char *argv[2];
[1757ffce]122 struct stat s;
123
124 if (stat(fname, &s) == ENOENT)
125 return;
[c91c9fb]126
[860271d4]127 printf(NAME ": Spawning %s\n", fname);
[c91c9fb]128
[c98e6ee]129 argv[0] = fname;
130 argv[1] = NULL;
[c91c9fb]131
[566f4cfb]132 if (!task_spawn(fname, argv))
[c91c9fb]133 printf(NAME ": Error spawning %s\n", fname);
[b27a97bb]134}
135
[95bc57c]136static void srv_start(char *fname)
137{
138 char *argv[2];
139 task_id_t id;
140 task_exit_t texit;
141 int rc, retval;
[1757ffce]142 struct stat s;
143
144 if (stat(fname, &s) == ENOENT)
145 return;
[95bc57c]146
147 printf(NAME ": Starting %s\n", fname);
148
149 argv[0] = fname;
150 argv[1] = NULL;
151
152 id = task_spawn(fname, argv);
153 if (!id) {
154 printf(NAME ": Error spawning %s\n", fname);
155 return;
156 }
157
158 rc = task_wait(id, &texit, &retval);
159 if (rc != EOK) {
160 printf(NAME ": Error waiting for %s\n", fname);
161 return;
162 }
163
[1313ee9]164 if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) {
[95bc57c]165 printf(NAME ": Server %s failed to start (returned %d)\n",
166 fname, retval);
167 }
168}
169
[47a350f]170static void console(char *dev)
171{
172 char *argv[3];
173 char hid_in[MAX_DEVICE_NAME];
174 int rc;
175
176 snprintf(hid_in, MAX_DEVICE_NAME, "%s/%s", DEVFS_MOUNT_POINT, dev);
177
178 printf(NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);
179
180 /* Wait for the input device to be ready */
181 dev_handle_t handle;
182 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
[df747bd8]195static void getterm(char *dev, char *app)
[36b8100a]196{
197 char *argv[4];
[df747bd8]198 char term[MAX_DEVICE_NAME];
[62140db]199 int rc;
[36b8100a]200
[df747bd8]201 snprintf(term, MAX_DEVICE_NAME, "%s/%s", DEVFS_MOUNT_POINT, dev);
[36b8100a]202
[c26eb39]203 printf(NAME ": Spawning %s with %s %s\n", APP_GETTERM, term, app);
[36b8100a]204
[47a350f]205 /* Wait for the terminal device to be ready */
[36b8100a]206 dev_handle_t handle;
[62140db]207 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
[36b8100a]208
[62140db]209 if (rc == EOK) {
[df747bd8]210 argv[0] = APP_GETTERM;
211 argv[1] = term;
[36b8100a]212 argv[2] = app;
213 argv[3] = NULL;
214
[df747bd8]215 if (!task_spawn(APP_GETTERM, argv))
[c26eb39]216 printf(NAME ": Error spawning %s with %s %s\n", APP_GETTERM,
217 term, app);
[47a350f]218 } else
[df747bd8]219 printf(NAME ": Error waiting on %s\n", term);
[36b8100a]220}
221
[03333bc]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
[f019cc07]236static void mount_data(void)
[00fe6bb]237{
238 int rc;
239
[1313ee9]240 printf("Trying to mount bd/disk0 on /data... ");
[00fe6bb]241 fflush(stdout);
242
[1313ee9]243 rc = mount("fat", "/data", "bd/disk0", "wtcache", 0);
[00fe6bb]244 if (rc == EOK)
245 printf("OK\n");
246 else
247 printf("Failed\n");
248}
249
[5106e98]250int main(int argc, char *argv[])
251{
[860271d4]252 info_print();
253
[36b8100a]254 if (!mount_root(STRING(RDFMT))) {
[860271d4]255 printf(NAME ": Exiting\n");
256 return -1;
257 }
[03333bc]258
259 /* Make sure tmpfs is running. */
260 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
261 spawn("/srv/tmpfs");
262 }
[860271d4]263
[a095d20]264 spawn("/srv/devfs");
[a074b4f]265 spawn("/srv/taskmon");
[a095d20]266
267 if (!mount_devfs()) {
[62140db]268 printf(NAME ": Exiting\n");
[a095d20]269 return -2;
270 }
[03333bc]271
272 mount_scratch();
[a095d20]273
[bb2dbf8]274 spawn("/srv/fhc");
275 spawn("/srv/obio");
[3a2f8aa]276 srv_start("/srv/cuda_adb");
[9f51afc]277 srv_start("/srv/i8042");
[b73c26d]278 srv_start("/srv/adb_ms");
279 srv_start("/srv/char_ms");
[bb2dbf8]280
[de9c5cb]281 spawn("/srv/fb");
282 spawn("/srv/kbd");
[47a350f]283 console("hid_in/kbd");
284
[fb623e2]285 spawn("/srv/clip");
[95bc57c]286
287 /*
288 * Start these synchronously so that mount_data() can be
289 * non-blocking.
290 */
[1641eb0]291#ifdef CONFIG_START_BD
[95bc57c]292 srv_start("/srv/ata_bd");
293 srv_start("/srv/gxe_bd");
[f019cc07]294#else
295 (void) srv_start;
296#endif
297
[1641eb0]298#ifdef CONFIG_MOUNT_DATA
[f49cf64]299 mount_data();
[f019cc07]300#else
301 (void) mount_data;
[1641eb0]302#endif
303
[b73c26d]304 getterm("term/vc0", "/app/bdsh");
[df747bd8]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");
[b73c26d]310 getterm("term/vc6", "/app/klog");
311
[3eddaff]312 return 0;
313}
[b2951e2]314
315/** @}
316 */
Note: See TracBrowser for help on using the repository browser.