Changes in uspace/app/init/init.c [28be7fa:991f645] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/init/init.c
r28be7fa r991f645 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 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; 117 } 118 119 static void spawn(char *fname) 120 { 121 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 int rc; 122 127 struct stat s; 123 128 … … 125 130 return; 126 131 127 printf(NAME ": Spawning %s\n", fname); 128 129 argv[0] = fname; 130 argv[1] = NULL; 131 132 if (!task_spawn(fname, argv)) 133 printf(NAME ": Error spawning %s\n", fname); 134 } 135 136 static void srv_start(char *fname) 137 { 138 char *argv[2]; 132 printf("%s: Spawning %s\n", NAME, fname); 133 rc = task_spawnl(NULL, fname, fname, NULL); 134 if (rc != EOK) { 135 printf("%s: Error spawning %s (%s)\n", NAME, fname, 136 str_error(rc)); 137 } 138 } 139 140 static void srv_start(const char *fname) 141 { 139 142 task_id_t id; 140 143 task_exit_t texit; … … 145 148 return; 146 149 147 printf(NAME ": Starting %s\n", fname); 148 149 argv[0] = fname; 150 argv[1] = NULL; 151 152 id = task_spawn(fname, argv); 150 printf("%s: Starting %s\n", NAME, fname); 151 rc = task_spawnl(&id, fname, fname, NULL); 153 152 if (!id) { 154 printf(NAME ": Error spawning %s\n", fname); 155 return; 156 } 157 153 printf("%s: Error spawning %s (%s)\n", NAME, fname, 154 str_error(rc)); 155 return; 156 } 157 158 158 rc = task_wait(id, &texit, &retval); 159 159 if (rc != EOK) { 160 printf(NAME ": Error waiting for %s\n", fname); 161 return; 162 } 163 164 if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) { 165 printf(NAME ": Server %s failed to start (returned %d)\n", 160 printf("%s: Error waiting for %s (%s(\n", NAME, fname, 161 str_error(rc)); 162 return; 163 } 164 165 if (texit != TASK_EXIT_NORMAL) { 166 printf("%s: Server %s failed to start (unexpectedly " 167 "terminated)\n", NAME, fname); 168 return; 169 } 170 171 if (retval != 0) { 172 printf("%s: Server %s failed to start (exit code %d)\n", NAME, 166 173 fname, retval); 167 174 } 168 175 } 169 176 170 static void console(char *dev) 171 { 172 char *argv[3]; 177 static void console(const char *dev) 178 { 173 179 char hid_in[DEVMAP_NAME_MAXLEN]; 174 180 int rc; … … 176 182 snprintf(hid_in, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev); 177 183 178 printf( NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);184 printf("%s: Spawning %s %s\n", NAME, SRV_CONSOLE, hid_in); 179 185 180 186 /* Wait for the input device to be ready */ 181 dev _handle_t handle;187 devmap_handle_t handle; 182 188 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 } else192 printf(NAME ": Error waiting on %s\n", hid_in);193 }194 195 static void getterm(char *dev, char *app) 196 { 197 char *argv[4]; 189 if (rc != EOK) { 190 printf("%s: Error waiting on %s (%s)\n", NAME, hid_in, 191 str_error(rc)); 192 return; 193 } 194 195 rc = task_spawnl(NULL, SRV_CONSOLE, SRV_CONSOLE, hid_in, NULL); 196 if (rc != EOK) { 197 printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE, 198 hid_in, str_error(rc)); 199 } 200 } 201 202 static void getterm(const char *dev, const char *app, bool wmsg) 203 { 198 204 char term[DEVMAP_NAME_MAXLEN]; 199 205 int rc; … … 201 207 snprintf(term, DEVMAP_NAME_MAXLEN, "%s/%s", DEVFS_MOUNT_POINT, dev); 202 208 203 printf( NAME ": Spawning %s with %s %s\n", APP_GETTERM, term, app);209 printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app); 204 210 205 211 /* Wait for the terminal device to be ready */ 206 dev _handle_t handle;212 devmap_handle_t handle; 207 213 rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING); 208 209 if (rc == EOK) { 210 argv[0] = APP_GETTERM; 211 argv[1] = term; 212 argv[2] = app; 213 argv[3] = NULL; 214 215 if (!task_spawn(APP_GETTERM, argv)) 216 printf(NAME ": Error spawning %s with %s %s\n", APP_GETTERM, 217 term, app); 218 } else 219 printf(NAME ": Error waiting on %s\n", term); 220 } 221 222 static 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 236 static 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"); 214 if (rc != EOK) { 215 printf("%s: Error waiting on %s (%s)\n", NAME, term, 216 str_error(rc)); 217 return; 218 } 219 220 if (wmsg) { 221 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, "-w", term, 222 app, NULL); 223 if (rc != EOK) { 224 printf("%s: Error spawning %s -w %s %s (%s)\n", NAME, 225 APP_GETTERM, term, app, str_error(rc)); 226 } 227 } else { 228 rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, term, app, 229 NULL); 230 if (rc != EOK) { 231 printf("%s: Error spawning %s %s %s (%s)\n", NAME, 232 APP_GETTERM, term, app, str_error(rc)); 233 } 234 } 235 } 236 237 static bool mount_scratch(void) 238 { 239 int rc = mount(SCRATCH_FS_TYPE, SCRATCH_MOUNT_POINT, "", "", 0); 240 return mount_report("Scratch filesystem", SCRATCH_MOUNT_POINT, 241 SCRATCH_FS_TYPE, NULL, rc); 242 } 243 244 static bool mount_data(void) 245 { 246 int rc = mount(DATA_FS_TYPE, DATA_MOUNT_POINT, DATA_DEVICE, "wtcache", 0); 247 return mount_report("Data filesystem", DATA_MOUNT_POINT, DATA_FS_TYPE, 248 DATA_DEVICE, rc); 248 249 } 249 250 … … 253 254 254 255 if (!mount_root(STRING(RDFMT))) { 255 printf( NAME ": Exiting\n");256 printf("%s: Exiting\n", NAME); 256 257 return -1; 257 258 } 258 259 259 260 /* Make sure tmpfs is running. */ 260 261 if (str_cmp(STRING(RDFMT), "tmpfs") != 0) { … … 266 267 267 268 if (!mount_devfs()) { 268 printf( NAME ": Exiting\n");269 printf("%s: Exiting\n", NAME); 269 270 return -2; 270 271 } 271 272 272 273 mount_scratch(); 273 274 … … 276 277 srv_start("/srv/cuda_adb"); 277 278 srv_start("/srv/i8042"); 279 srv_start("/srv/s3c24ser"); 278 280 srv_start("/srv/adb_ms"); 279 281 srv_start("/srv/char_ms"); 280 282 srv_start("/srv/s3c24ts"); 283 281 284 spawn("/srv/fb"); 282 285 spawn("/srv/kbd"); … … 284 287 285 288 spawn("/srv/clip"); 286 289 287 290 /* 288 291 * Start these synchronously so that mount_data() can be … … 295 298 (void) srv_start; 296 299 #endif 297 300 298 301 #ifdef CONFIG_MOUNT_DATA 299 302 mount_data(); … … 301 304 (void) mount_data; 302 305 #endif 303 304 getterm("term/vc0", "/app/bdsh" );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" );310 getterm("term/vc6", "/app/klog" );311 306 307 getterm("term/vc0", "/app/bdsh", true); 308 getterm("term/vc1", "/app/bdsh", false); 309 getterm("term/vc2", "/app/bdsh", false); 310 getterm("term/vc3", "/app/bdsh", false); 311 getterm("term/vc4", "/app/bdsh", false); 312 getterm("term/vc5", "/app/bdsh", false); 313 getterm("term/vc6", "/app/klog", false); 314 312 315 return 0; 313 316 }
Note:
See TracChangeset
for help on using the changeset viewer.