Changes in uspace/app/init/init.c [ffa2c8ef:f019cc07] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/init/init.c
rffa2c8ef rf019cc07 37 37 #include <stdio.h> 38 38 #include <unistd.h> 39 #include <ipc/ipc.h> 39 40 #include <vfs/vfs.h> 40 41 #include <bool.h> … … 45 46 #include <malloc.h> 46 47 #include <macros.h> 47 #include <str .h>48 #include <string.h> 48 49 #include <devmap.h> 49 #include < str_error.h>50 #include <config.h> 50 51 #include "init.h" 51 52 52 #define ROOT_DEVICE "bd/initrd"53 #define ROOT_MOUNT_POINT "/"54 55 #define DEVFS_FS_TYPE "devfs"56 #define DEVFS_MOUNT_POINT "/dev"57 58 #define TMPFS_FS_TYPE "tmpfs"59 #define TMPFS_MOUNT_POINT "/tmp"60 61 #define DATA_FS_TYPE "fat"62 #define DATA_DEVICE "bd/ata1disk0"63 #define DATA_MOUNT_POINT "/data"64 65 #define SRV_CONSOLE "/srv/console"66 #define APP_GETTERM "/app/getterm"67 68 53 static void info_print(void) 69 54 { 70 printf("%s: HelenOS init\n", NAME); 71 } 72 73 static bool mount_report(const char *desc, const char *mntpt, 74 const char *fstype, const char *dev, int rc) 75 { 55 printf(NAME ": HelenOS init\n"); 56 } 57 58 static bool mount_root(const char *fstype) 59 { 60 char *opts = ""; 61 const char *root_dev = "initrd"; 62 63 if (str_cmp(fstype, "tmpfs") == 0) 64 opts = "restore"; 65 66 int rc = mount(fstype, "/", root_dev, opts, IPC_FLAG_BLOCKING); 67 76 68 switch (rc) { 77 69 case EOK: 78 if (dev != NULL) 79 printf("%s: %s mounted on %s (%s at %s)\n", NAME, desc, mntpt, 80 fstype, dev); 81 else 82 printf("%s: %s mounted on %s (%s)\n", NAME, desc, mntpt, fstype); 70 printf(NAME ": Root filesystem mounted, %s at %s\n", 71 fstype, root_dev); 83 72 break; 84 73 case EBUSY: 85 printf( "%s: %s already mounted on %s\n", NAME, desc, mntpt);74 printf(NAME ": Root filesystem already mounted\n"); 86 75 return false; 87 76 case ELIMIT: 88 printf( "%s: %s limit exceeded\n", NAME, desc);77 printf(NAME ": Unable to mount root filesystem\n"); 89 78 return false; 90 79 case ENOENT: 91 printf( "%s: %s unknown type (%s)\n", NAME, desc, fstype);80 printf(NAME ": Unknown filesystem type (%s)\n", fstype); 92 81 return false; 93 82 default: 94 printf("%s: %s not mounted on %s (%s)\n", NAME, desc, mntpt, 95 str_error(rc)); 83 printf(NAME ": Error mounting root filesystem (%d)\n", rc); 96 84 return false; 97 85 } … … 100 88 } 101 89 102 static bool mount_root(const char *fstype)103 {104 const char *opts = "";105 106 if (str_cmp(fstype, "tmpfs") == 0)107 opts = "restore";108 109 int rc = mount(fstype, ROOT_MOUNT_POINT, ROOT_DEVICE, opts,110 IPC_FLAG_BLOCKING);111 return mount_report("Root filesystem", ROOT_MOUNT_POINT, fstype,112 ROOT_DEVICE, rc);113 }114 115 90 static bool mount_devfs(void) 116 91 { 117 int rc = mount(DEVFS_FS_TYPE, DEVFS_MOUNT_POINT, "", "", 118 IPC_FLAG_BLOCKING); 119 return mount_report("Device filesystem", DEVFS_MOUNT_POINT, DEVFS_FS_TYPE, 120 NULL, rc); 121 } 122 123 static void spawn(const char *fname) 124 { 125 int rc; 92 char null[MAX_DEVICE_NAME]; 93 int null_id = devmap_null_create(); 94 95 if (null_id == -1) { 96 printf(NAME ": Unable to create null device\n"); 97 return false; 98 } 99 100 snprintf(null, MAX_DEVICE_NAME, "null%d", null_id); 101 int rc = mount("devfs", "/dev", null, "", IPC_FLAG_BLOCKING); 102 103 switch (rc) { 104 case EOK: 105 printf(NAME ": Device filesystem mounted\n"); 106 break; 107 case EBUSY: 108 printf(NAME ": Device filesystem already mounted\n"); 109 devmap_null_destroy(null_id); 110 return false; 111 case ELIMIT: 112 printf(NAME ": Unable to mount device filesystem\n"); 113 devmap_null_destroy(null_id); 114 return false; 115 case ENOENT: 116 printf(NAME ": Unknown filesystem type (devfs)\n"); 117 devmap_null_destroy(null_id); 118 return false; 119 default: 120 printf(NAME ": Error mounting device filesystem (%d)\n", rc); 121 devmap_null_destroy(null_id); 122 return false; 123 } 124 125 return true; 126 } 127 128 static void spawn(char *fname) 129 { 130 char *argv[2]; 126 131 struct stat s; 127 132 … … 129 134 return; 130 135 131 printf("%s: Spawning %s\n", NAME, fname); 132 rc = task_spawnl(NULL, fname, fname, NULL); 133 if (rc != EOK) { 134 printf("%s: Error spawning %s (%s)\n", NAME, fname, 135 str_error(rc)); 136 } 137 } 138 139 static void srv_start(const char *fname) 140 { 136 printf(NAME ": Spawning %s\n", fname); 137 138 argv[0] = fname; 139 argv[1] = NULL; 140 141 if (!task_spawn(fname, argv)) 142 printf(NAME ": Error spawning %s\n", fname); 143 } 144 145 static void srv_start(char *fname) 146 { 147 char *argv[2]; 141 148 task_id_t id; 142 149 task_exit_t texit; … … 147 154 return; 148 155 149 printf("%s: Starting %s\n", NAME, fname); 150 rc = task_spawnl(&id, fname, fname, NULL); 156 printf(NAME ": Starting %s\n", fname); 157 158 argv[0] = fname; 159 argv[1] = NULL; 160 161 id = task_spawn(fname, argv); 151 162 if (!id) { 152 printf("%s: Error spawning %s (%s)\n", NAME, fname, 153 str_error(rc)); 154 return; 155 } 156 163 printf(NAME ": Error spawning %s\n", fname); 164 return; 165 } 166 157 167 rc = task_wait(id, &texit, &retval); 158 168 if (rc != EOK) { 159 printf("%s: Error waiting for %s (%s(\n", NAME, fname, 160 str_error(rc)); 161 return; 162 } 163 164 if (texit != TASK_EXIT_NORMAL) { 165 printf("%s: Server %s failed to start (unexpectedly " 166 "terminated)\n", NAME, fname); 167 return; 168 } 169 170 if (retval != 0) { 171 printf("%s: Server %s failed to start (exit code %d)\n", NAME, 169 printf(NAME ": Error waiting for %s\n", fname); 170 return; 171 } 172 173 if (texit != TASK_EXIT_NORMAL || retval != 0) { 174 printf(NAME ": Server %s failed to start (returned %d)\n", 172 175 fname, retval); 173 176 } 174 177 } 175 178 176 static void console(const char *dev) 177 { 178 char hid_in[DEVMAP_NAME_MAXLEN]; 179 static void getvc(char *dev, char *app) 180 { 181 char *argv[4]; 182 char vc[MAX_DEVICE_NAME]; 179 183 int rc; 180 184 181 snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev); 182 183 printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, hid_in); 184 185 /* Wait for the input device to be ready */ 186 devmap_handle_t handle; 185 snprintf(vc, MAX_DEVICE_NAME, "/dev/%s", dev); 186 187 printf(NAME ": Spawning getvc on %s\n", vc); 188 189 dev_handle_t handle; 187 190 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING); 188 if (rc != EOK) {189 printf("%s: Error waiting on %s (%s)\n", NAME, hid_in,190 str_error(rc));191 return;192 }193 194 rc = task_spawnl(NULL, SRV_CONSOLE, SRV_CONSOLE, hid_in, NULL);195 if (rc != EOK) {196 printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,197 hid_in, str_error(rc));198 }199 }200 201 static void getterm(const char *dev, const char *app, bool wmsg) 202 { 203 char term[DEVMAP_NAME_MAXLEN]; 191 192 if (rc == EOK) { 193 argv[0] = "/app/getvc"; 194 argv[1] = vc; 195 argv[2] = app; 196 argv[3] = NULL; 197 198 if (!task_spawn("/app/getvc", argv)) 199 printf(NAME ": Error spawning getvc on %s\n", vc); 200 } else { 201 printf(NAME ": Error waiting on %s\n", vc); 202 } 203 } 204 205 static void mount_data(void) 206 { 204 207 int rc; 205 206 snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev); 207 208 printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app); 209 210 /* Wait for the terminal device to be ready */ 211 devmap_handle_t handle; 212 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING); 213 if (rc != EOK) { 214 printf("%s: Error waiting on %s (%s)\n", NAME, term, 215 str_error(rc)); 216 return; 217 } 218 219 if (wmsg) { 220 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, "-w", term, 221 app, NULL); 222 if (rc != EOK) { 223 printf("%s: Error spawning %s -w %s %s (%s)\n", NAME, 224 APP_GETTERM, term, app, str_error(rc)); 225 } 226 } else { 227 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, term, app, 228 NULL); 229 if (rc != EOK) { 230 printf("%s: Error spawning %s %s %s (%s)\n", NAME, 231 APP_GETTERM, term, app, str_error(rc)); 232 } 233 } 234 } 235 236 static bool mount_tmpfs(void) 237 { 238 int rc = mount(TMPFS_FS_TYPE, TMPFS_MOUNT_POINT, "", "", 0); 239 return mount_report("Temporary filesystem", TMPFS_MOUNT_POINT, 240 TMPFS_FS_TYPE, NULL, rc); 241 } 242 243 static bool mount_data(void) 244 { 245 int rc = mount(DATA_FS_TYPE, DATA_MOUNT_POINT, DATA_DEVICE, "wtcache", 0); 246 return mount_report("Data filesystem", DATA_MOUNT_POINT, DATA_FS_TYPE, 247 DATA_DEVICE, rc); 208 209 printf("Trying to mount disk0 on /data... "); 210 fflush(stdout); 211 212 rc = mount("fat", "/data", "disk0", "wtcache", 0); 213 if (rc == EOK) 214 printf("OK\n"); 215 else 216 printf("Failed\n"); 248 217 } 249 218 … … 253 222 254 223 if (!mount_root(STRING(RDFMT))) { 255 printf( "%s: Exiting\n", NAME);224 printf(NAME ": Exiting\n"); 256 225 return -1; 257 226 } 258 227 259 /* Make sure tmpfs is running. */260 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) {261 spawn("/srv/tmpfs");262 }263 264 228 spawn("/srv/devfs"); 265 spawn("/srv/taskmon");266 229 267 230 if (!mount_devfs()) { 268 printf( "%s: Exiting\n", NAME);231 printf(NAME ": Exiting\n"); 269 232 return -2; 270 233 } 271 234 272 mount_tmpfs(); 273 274 spawn("/srv/apic"); 275 spawn("/srv/i8259"); 235 spawn("/srv/fb"); 236 spawn("/srv/kbd"); 237 spawn("/srv/console"); 276 238 spawn("/srv/fhc"); 277 239 spawn("/srv/obio"); 278 srv_start("/srv/cuda_adb"); 279 srv_start("/srv/i8042"); 280 srv_start("/srv/s3c24ser"); 281 srv_start("/srv/adb_ms"); 282 srv_start("/srv/char_ms"); 283 srv_start("/srv/s3c24ts"); 284 285 spawn("/srv/fb"); 286 spawn("/srv/kbd"); 287 console("hid_in/kbd"); 288 289 spawn("/srv/clip"); 290 240 291 241 /* 292 242 * Start these synchronously so that mount_data() can be … … 299 249 (void) srv_start; 300 250 #endif 301 251 302 252 #ifdef CONFIG_MOUNT_DATA 303 253 mount_data(); … … 305 255 (void) mount_data; 306 256 #endif 307 308 get term("term/vc0", "/app/bdsh", true);309 get term("term/vc1", "/app/bdsh", false);310 get term("term/vc2", "/app/bdsh", false);311 get term("term/vc3", "/app/bdsh", false);312 get term("term/vc4", "/app/bdsh", false);313 get term("term/vc5", "/app/bdsh", false);314 get term("term/vc6", "/app/klog", false);257 258 getvc("vc0", "/app/bdsh"); 259 getvc("vc1", "/app/bdsh"); 260 getvc("vc2", "/app/bdsh"); 261 getvc("vc3", "/app/bdsh"); 262 getvc("vc4", "/app/bdsh"); 263 getvc("vc5", "/app/bdsh"); 264 getvc("vc6", "/app/klog"); 315 265 316 266 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.