source: mainline/uspace/app/init/init.c@ 08d9c4e6

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 08d9c4e6 was 08d9c4e6, checked in by Lenka Trochtova <trochtova.lenka@…>, 15 years ago

device manager - initialization of the list of available drivers

  • Property mode set to 100644
File size: 7.0 KB
Line 
1/*
2 * Copyright (c) 2005 Martin Decky
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
29/** @addtogroup init Init
30 * @brief Init process for user space environment configuration.
31 * @{
32 */
33/**
34 * @file
35 */
36
37#include <stdio.h>
38#include <unistd.h>
39#include <ipc/ipc.h>
40#include <vfs/vfs.h>
41#include <bool.h>
42#include <errno.h>
43#include <fcntl.h>
44#include <sys/stat.h>
45#include <task.h>
46#include <malloc.h>
47#include <macros.h>
48#include <string.h>
49#include <devmap.h>
50#include "init.h"
51
52#define DEVFS_MOUNT_POINT "/dev"
53
54#define SRV_CONSOLE "/srv/console"
55#define APP_GETTERM "/app/getterm"
56
57static void info_print(void)
58{
59 printf(NAME ": HelenOS init\n");
60}
61
62static bool mount_root(const char *fstype)
63{
64 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
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;
92}
93
94static bool mount_devfs(void)
95{
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
105 return false;
106 case ELIMIT:
107 printf(NAME ": Unable to mount device filesystem\n");
108
109 return false;
110 case ENOENT:
111 printf(NAME ": Unknown filesystem type (devfs)\n");
112
113 return false;
114 default:
115 printf(NAME ": Error mounting device filesystem (%d)\n", rc);
116
117 return false;
118 }
119
120 return true;
121}
122
123static void spawn(char *fname)
124{
125 char *argv[2];
126 struct stat s;
127
128 if (stat(fname, &s) == ENOENT)
129 return;
130
131 printf(NAME ": Spawning %s\n", fname);
132
133 argv[0] = fname;
134 argv[1] = NULL;
135
136 if (!task_spawn(fname, argv))
137 printf(NAME ": Error spawning %s\n", fname);
138}
139
140static void srv_start(char *fname)
141{
142 char *argv[2];
143 task_id_t id;
144 task_exit_t texit;
145 int rc, retval;
146 struct stat s;
147
148 if (stat(fname, &s) == ENOENT)
149 return;
150
151 printf(NAME ": Starting %s\n", fname);
152
153 argv[0] = fname;
154 argv[1] = NULL;
155
156 id = task_spawn(fname, argv);
157 if (!id) {
158 printf(NAME ": Error spawning %s\n", fname);
159 return;
160 }
161
162 rc = task_wait(id, &texit, &retval);
163 if (rc != EOK) {
164 printf(NAME ": Error waiting for %s\n", fname);
165 return;
166 }
167
168 if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) {
169 printf(NAME ": Server %s failed to start (returned %d)\n",
170 fname, retval);
171 }
172}
173
174static void console(char *dev)
175{
176 char *argv[3];
177 char hid_in[DEVMAP_NAME_MAXLEN];
178 int rc;
179
180 snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
181
182 printf(NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);
183
184 /* Wait for the input device to be ready */
185 dev_handle_t handle;
186 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
187
188 if (rc == EOK) {
189 argv[0] = SRV_CONSOLE;
190 argv[1] = hid_in;
191 argv[2] = NULL;
192
193 if (!task_spawn(SRV_CONSOLE, argv))
194 printf(NAME ": Error spawning %s with %s\n", SRV_CONSOLE, hid_in);
195 } else
196 printf(NAME ": Error waiting on %s\n", hid_in);
197}
198
199static void getterm(char *dev, char *app)
200{
201 char *argv[4];
202 char term[DEVMAP_NAME_MAXLEN];
203 int rc;
204
205 snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev);
206
207 printf(NAME ": Spawning %s with %s %s\n", APP_GETTERM, term, app);
208
209 /* Wait for the terminal device to be ready */
210 dev_handle_t handle;
211 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
212
213 if (rc == EOK) {
214 argv[0] = APP_GETTERM;
215 argv[1] = term;
216 argv[2] = app;
217 argv[3] = NULL;
218
219 if (!task_spawn(APP_GETTERM, argv))
220 printf(NAME ": Error spawning %s with %s %s\n", APP_GETTERM,
221 term, app);
222 } else
223 printf(NAME ": Error waiting on %s\n", term);
224}
225
226static void mount_scratch(void)
227{
228 int rc;
229
230 printf("Trying to mount null/0 on /scratch... ");
231 fflush(stdout);
232
233 rc = mount("tmpfs", "/scratch", "null/0", "", 0);
234 if (rc == EOK)
235 printf("OK\n");
236 else
237 printf("Failed\n");
238}
239
240static void mount_data(void)
241{
242 int rc;
243
244 printf("Trying to mount bd/disk0 on /data... ");
245 fflush(stdout);
246
247 rc = mount("fat", "/data", "bd/disk0", "wtcache", 0);
248 if (rc == EOK)
249 printf("OK\n");
250 else
251 printf("Failed\n");
252}
253
254int main(int argc, char *argv[])
255{
256 info_print();
257
258 if (!mount_root(STRING(RDFMT))) {
259 printf(NAME ": Exiting\n");
260 return -1;
261 }
262
263 /* Make sure tmpfs is running. */
264 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {
265 spawn("/srv/tmpfs");
266 }
267
268 spawn("/srv/devfs");
269 spawn("/srv/taskmon");
270
271 if (!mount_devfs()) {
272 printf(NAME ": Exiting\n");
273 return -2;
274 }
275
276 mount_scratch();
277
278 spawn("/srv/fhc");
279 spawn("/srv/obio");
280 srv_start("/srv/cuda_adb");
281 srv_start("/srv/i8042");
282 srv_start("/srv/adb_ms");
283 srv_start("/srv/char_ms");
284
285 spawn("/srv/fb");
286 spawn("/srv/kbd");
287 console("hid_in/kbd");
288
289 spawn("/srv/clip");
290
291 /*
292 * Start these synchronously so that mount_data() can be
293 * non-blocking.
294 */
295#ifdef CONFIG_START_BD
296 srv_start("/srv/ata_bd");
297 srv_start("/srv/gxe_bd");
298#else
299 (void) srv_start;
300#endif
301
302#ifdef CONFIG_MOUNT_DATA
303 mount_data();
304#else
305 (void) mount_data;
306#endif
307
308 getterm("term/vc0", "/app/bdsh");
309 getterm("term/vc1", "/app/bdsh");
310 getterm("term/vc2", "/app/bdsh");
311 getterm("term/vc3", "/app/bdsh");
312 getterm("term/vc4", "/app/bdsh");
313 getterm("term/vc5", "/app/bdsh");
314 getterm("term/vc6", "/app/klog");
315
316 usleep(1000000);
317 //spawn("/srv/dd");
318
319 srv_start("/srv/devman");
320
321 return 0;
322}
323
324/** @}
325 */
Note: See TracBrowser for help on using the repository browser.