Changes in uspace/app/init/init.c [2480e19:d9fae235] in mainline
- File:
-
- 1 edited
-
uspace/app/init/init.c (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/init/init.c
r2480e19 rd9fae235 46 46 #include <malloc.h> 47 47 #include <macros.h> 48 #include <str ing.h>48 #include <str.h> 49 49 #include <devmap.h> 50 #include <str_error.h> 50 51 #include "init.h" 51 52 53 #define ROOT_DEVICE "bd/initrd" 54 #define ROOT_MOUNT_POINT "/" 55 56 #define DEVFS_FS_TYPE "devfs" 52 57 #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" 53 65 54 66 #define SRV_CONSOLE "/srv/console" … … 57 69 static void info_print(void) 58 70 { 59 printf(NAME ": HelenOS init\n"); 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 { 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; 60 101 } 61 102 62 103 static bool mount_root(const char *fstype) 63 104 { 64 char *opts = ""; 65 const char *root_dev = "bd/initrd"; 105 const char *opts = ""; 66 106 67 107 if (str_cmp(fstype, "tmpfs") == 0) 68 108 opts = "restore"; 69 109 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); 92 114 } 93 115 94 116 static bool mount_devfs(void) 95 117 { 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 123 static void spawn(char *fname) 124 { 125 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 124 static void spawn(const char *fname) 125 { 126 const char *argv[2]; 126 127 struct stat s; 127 128 … … 129 130 return; 130 131 131 printf( NAME ": Spawning %s\n", fname);132 printf("%s: Spawning %s\n", NAME, fname); 132 133 133 134 argv[0] = fname; 134 135 argv[1] = NULL; 135 136 136 if (!task_spawn(fname, argv)) 137 printf(NAME ": Error spawning %s\n", fname); 138 } 139 140 static void srv_start(char *fname) 141 { 142 char *argv[2]; 137 int err; 138 if (!task_spawn(fname, argv, &err)) 139 printf("%s: Error spawning %s (%s)\n", NAME, fname, 140 str_error(err)); 141 } 142 143 static void srv_start(const char *fname) 144 { 145 const char *argv[2]; 143 146 task_id_t id; 144 147 task_exit_t texit; … … 149 152 return; 150 153 151 printf( NAME ": Starting %s\n", fname);154 printf("%s: Starting %s\n", NAME, fname); 152 155 153 156 argv[0] = fname; 154 157 argv[1] = NULL; 155 158 156 id = task_spawn(fname, argv );159 id = task_spawn(fname, argv, &retval); 157 160 if (!id) { 158 printf(NAME ": Error spawning %s\n", fname); 161 printf("%s: Error spawning %s (%s)\n", NAME, fname, 162 str_error(retval)); 159 163 return; 160 164 } 161 165 162 166 rc = task_wait(id, &texit, &retval); 163 167 if (rc != EOK) { 164 printf(NAME ": Error waiting for %s\n", fname); 168 printf("%s: Error waiting for %s (%s(\n", NAME, fname, 169 str_error(retval)); 165 170 return; 166 171 } 167 172 168 173 if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) { 169 printf( NAME ": Server %s failed to start (returned %d)\n",170 fname, retval);171 } 172 } 173 174 static void console(c har *dev)175 { 176 c har *argv[3];174 printf("%s: Server %s failed to start (%s)\n", NAME, 175 fname, str_error(retval)); 176 } 177 } 178 179 static void console(const char *dev) 180 { 181 const char *argv[3]; 177 182 char hid_in[DEVMAP_NAME_MAXLEN]; 178 183 int rc; … … 180 185 snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev); 181 186 182 printf( NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);187 printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, hid_in); 183 188 184 189 /* Wait for the input device to be ready */ … … 191 196 argv[2] = NULL; 192 197 193 if (!task_spawn(SRV_CONSOLE, argv)) 194 printf(NAME ": Error spawning %s with %s\n", SRV_CONSOLE, hid_in); 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)); 195 201 } else 196 printf(NAME ": Error waiting on %s\n", hid_in); 197 } 198 199 static void getterm(char *dev, char *app) 200 { 201 char *argv[4]; 202 printf("%s: Error waiting on %s (%s)\n", NAME, hid_in, 203 str_error(rc)); 204 } 205 206 static void getterm(const char *dev, const char *app) 207 { 208 const char *argv[4]; 202 209 char term[DEVMAP_NAME_MAXLEN]; 203 210 int rc; … … 205 212 snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev); 206 213 207 printf( NAME ": Spawning %s with %s %s\n", APP_GETTERM, term, app);214 printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app); 208 215 209 216 /* Wait for the terminal device to be ready */ … … 217 224 argv[3] = NULL; 218 225 219 if (!task_spawn(APP_GETTERM, argv ))220 printf( NAME ": Error spawning %s with %s %s\n", APP_GETTERM,221 term, app );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)); 222 229 } else 223 printf(NAME ": Error waiting on %s\n", term); 224 } 225 226 static 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 240 static 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"); 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); 252 246 } 253 247 … … 257 251 258 252 if (!mount_root(STRING(RDFMT))) { 259 printf( NAME ": Exiting\n");253 printf("%s: Exiting\n", NAME); 260 254 return -1; 261 255 } 262 256 263 257 /* Make sure tmpfs is running. */ 264 258 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) { … … 270 264 271 265 if (!mount_devfs()) { 272 printf( NAME ": Exiting\n");266 printf("%s: Exiting\n", NAME); 273 267 return -2; 274 268 } 275 269 276 270 mount_scratch(); 277 271 … … 282 276 srv_start("/srv/adb_ms"); 283 277 srv_start("/srv/char_ms"); 284 278 285 279 spawn("/srv/fb"); 286 280 spawn("/srv/kbd"); … … 288 282 289 283 spawn("/srv/clip"); 290 284 291 285 /* 292 286 * Start these synchronously so that mount_data() can be … … 299 293 (void) srv_start; 300 294 #endif 301 295 302 296 #ifdef CONFIG_MOUNT_DATA 303 297 mount_data(); … … 305 299 (void) mount_data; 306 300 #endif 307 301 308 302 getterm("term/vc0", "/app/bdsh"); 309 303 getterm("term/vc1", "/app/bdsh"); … … 313 307 getterm("term/vc5", "/app/bdsh"); 314 308 getterm("term/vc6", "/app/klog"); 315 getterm("term/vc7", "/srv/devman");316 317 //usleep(1000000);318 //spawn("/srv/dd");319 320 309 321 310 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.
