Changeset 2f57690 in mainline for uspace/srv
- Timestamp:
- 2009-03-03T12:41:39Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- deca67b
- Parents:
- 561db3f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loader/main.c
r561db3f r2f57690 28 28 29 29 /** @addtogroup loader 30 * @brief 30 * @brief Loads and runs programs from VFS. 31 31 * @{ 32 */ 32 */ 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Loads and runs programs from VFS. 36 36 * 37 37 * The program loader is a special init binary. Its image is used … … 89 89 task_id_t task_id; 90 90 size_t len; 91 91 92 92 task_id = task_get_id(); 93 93 94 94 if (!ipc_data_read_receive(&callid, &len)) { 95 95 ipc_answer_0(callid, EINVAL); … … 97 97 return; 98 98 } 99 100 if (len > sizeof(task_id)) len = sizeof(task_id); 101 99 100 if (len > sizeof(task_id)) 101 len = sizeof(task_id); 102 102 103 ipc_data_read_finalize(callid, &task_id, len); 103 104 ipc_answer_0(rid, EOK); … … 115 116 size_t len; 116 117 char *name_buf; 117 118 118 119 if (!ipc_data_write_receive(&callid, &len)) { 119 120 ipc_answer_0(callid, EINVAL); … … 121 122 return; 122 123 } 123 124 124 125 name_buf = malloc(len + 1); 125 126 if (!name_buf) { … … 128 129 return; 129 130 } 130 131 131 132 ipc_data_write_finalize(callid, name_buf, len); 132 133 ipc_answer_0(rid, EOK); 133 134 134 135 if (pathname != NULL) { 135 136 free(pathname); 136 137 pathname = NULL; 137 138 } 138 139 139 140 name_buf[len] = '\0'; 140 141 pathname = name_buf; … … 152 153 char *p; 153 154 int n; 154 155 155 156 if (!ipc_data_write_receive(&callid, &buf_len)) { 156 157 ipc_answer_0(callid, EINVAL); … … 158 159 return; 159 160 } 160 161 161 162 if (arg_buf != NULL) { 162 163 free(arg_buf); 163 164 arg_buf = NULL; 164 165 } 165 166 166 167 if (argv != NULL) { 167 168 free(argv); 168 169 argv = NULL; 169 170 } 170 171 171 172 arg_buf = malloc(buf_len + 1); 172 173 if (!arg_buf) { … … 175 176 return; 176 177 } 177 178 178 179 ipc_data_write_finalize(callid, arg_buf, buf_len); 179 180 ipc_answer_0(rid, EOK); 180 181 181 182 arg_buf[buf_len] = '\0'; 182 183 183 184 /* 184 185 * Count number of arguments … … 191 192 ++n; 192 193 } 193 194 194 195 /* Allocate argv */ 195 196 argv = malloc((n + 1) * sizeof(char *)); 196 197 197 198 if (argv == NULL) { 198 199 free(arg_buf); … … 201 202 return; 202 203 } 203 204 204 205 /* 205 206 * Fill argv with argument pointers … … 209 210 while (p < arg_buf + buf_len) { 210 211 argv[n] = p; 211 212 212 213 arg_len = strlen(p); 213 214 p = p + arg_len + 1; 214 215 ++n; 215 216 } 216 217 217 218 argc = n; 218 219 argv[n] = NULL; … … 228 229 { 229 230 int rc; 230 231 231 232 rc = elf_load_file(pathname, 0, &prog_info); 232 233 if (rc < 0) { … … 235 236 return 1; 236 237 } 237 238 238 239 elf_create_pcb(&prog_info, &pcb); 239 240 240 241 pcb.argc = argc; 241 242 pcb.argv = argv; 242 243 243 244 if (prog_info.interp == NULL) { 244 245 /* Statically linked program */ … … 247 248 return 0; 248 249 } 249 250 250 251 rc = elf_load_file(prog_info.interp, 0, &interp_info); 251 252 if (rc < 0) { … … 255 256 return 1; 256 257 } 257 258 258 259 is_dyn_linked = true; 259 260 ipc_answer_0(rid, EOK); 260 261 261 262 return 0; 262 263 } … … 272 273 { 273 274 const char *cp; 274 275 275 276 /* Set the task name. */ 276 277 cp = strrchr(pathname, '/'); 277 278 cp = (cp == NULL) ? pathname : (cp + 1); 278 279 task_set_name(cp); 279 280 280 281 if (is_dyn_linked == true) { 281 282 /* Dynamically linked program */ … … 283 284 DPRINTF("Entry point: 0x%lx\n", interp_info.entry); 284 285 close_console(); 285 286 286 287 ipc_answer_0(rid, EOK); 287 288 elf_run(&interp_info, &pcb); 288 289 289 } else { 290 290 /* Statically linked program */ … … 307 307 ipc_call_t call; 308 308 int retval; 309 309 310 310 /* Already have a connection? */ 311 311 if (connected) { … … 313 313 return; 314 314 } 315 315 316 316 connected = true; 317 317 318 318 /* Accept the connection */ 319 319 ipc_answer_0(iid, EOK); 320 320 321 321 /* Ignore parameters, the connection is already open */ 322 (void)iid; (void)icall; 323 322 (void) iid; 323 (void) icall; 324 324 325 while (1) { 325 326 callid = async_get_call(&call); 326 327 327 328 switch (IPC_GET_METHOD(call)) { 328 329 case IPC_M_PHONE_HUNGUP: … … 361 362 { 362 363 ipcarg_t phonead; 363 364 364 365 connected = false; 365 366 366 367 /* Set a handler of incomming connections. */ 367 368 async_set_client_connection(loader_connection); 368 369 369 370 /* Register at naming service. */ 370 371 if (ipc_connect_to_me(PHONE_NS, SERVICE_LOAD, 0, 0, &phonead) != 0) … … 372 373 373 374 async_manager(); 374 375 375 376 /* Never reached */ 376 377 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.