Changeset a35b458 in mainline for uspace/lib/c/generic/loader.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/loader.c
r3061bc1 ra35b458 65 65 if (ldr == NULL) 66 66 return NULL; 67 67 68 68 async_sess_t *sess = 69 69 service_connect_blocking(SERVICE_LOADER, INTERFACE_LOADER, 0); … … 72 72 return NULL; 73 73 } 74 74 75 75 ldr->sess = sess; 76 76 return ldr; … … 91 91 /* Get task ID. */ 92 92 async_exch_t *exch = async_exchange_begin(ldr->sess); 93 93 94 94 ipc_call_t answer; 95 95 aid_t req = async_send_0(exch, LOADER_GET_TASKID, &answer); 96 96 errno_t rc = async_data_read_start(exch, task_id, sizeof(task_id_t)); 97 98 async_exchange_end(exch); 99 97 98 async_exchange_end(exch); 99 100 100 if (rc != EOK) { 101 101 async_forget(req); 102 102 return (errno_t) rc; 103 103 } 104 104 105 105 async_wait_for(req, &rc); 106 106 return (errno_t) rc; … … 121 121 if (!cwd) 122 122 return ENOMEM; 123 123 124 124 if (vfs_cwd_get(cwd, MAX_PATH_LEN + 1) != EOK) 125 125 str_cpy(cwd, MAX_PATH_LEN + 1, "/"); 126 126 127 127 size_t len = str_length(cwd); 128 129 async_exch_t *exch = async_exchange_begin(ldr->sess); 130 128 129 async_exch_t *exch = async_exchange_begin(ldr->sess); 130 131 131 ipc_call_t answer; 132 132 aid_t req = async_send_0(exch, LOADER_SET_CWD, &answer); 133 133 errno_t rc = async_data_write_start(exch, cwd, len); 134 134 135 135 async_exchange_end(exch); 136 136 free(cwd); 137 137 138 138 if (rc != EOK) { 139 139 async_forget(req); 140 140 return (errno_t) rc; 141 141 } 142 142 143 143 async_wait_for(req, &rc); 144 144 return (errno_t) rc; … … 195 195 name++; 196 196 } 197 197 198 198 int fd; 199 199 errno_t rc = vfs_lookup(path, 0, &fd); … … 201 201 return rc; 202 202 } 203 203 204 204 rc = loader_set_program(ldr, name, fd); 205 205 vfs_put(fd); … … 232 232 ap++; 233 233 } 234 234 235 235 char *arg_buf = malloc(buffer_size); 236 236 if (arg_buf == NULL) 237 237 return ENOMEM; 238 238 239 239 /* Now fill the buffer with null-terminated argument strings */ 240 240 ap = argv; 241 241 char *dp = arg_buf; 242 242 243 243 while (*ap != NULL) { 244 244 str_cpy(dp, buffer_size - (dp - arg_buf), *ap); … … 246 246 ap++; 247 247 } 248 248 249 249 /* Send serialized arguments to the loader */ 250 250 async_exch_t *exch = async_exchange_begin(ldr->sess); 251 251 252 252 ipc_call_t answer; 253 253 aid_t req = async_send_0(exch, LOADER_SET_ARGS, &answer); 254 254 errno_t rc = async_data_write_start(exch, (void *) arg_buf, 255 255 buffer_size); 256 256 257 257 async_exchange_end(exch); 258 258 free(arg_buf); 259 259 260 260 if (rc != EOK) { 261 261 async_forget(req); 262 262 return (errno_t) rc; 263 263 } 264 264 265 265 async_wait_for(req, &rc); 266 266 return (errno_t) rc; … … 280 280 async_exch_t *exch = async_exchange_begin(ldr->sess); 281 281 async_exch_t *vfs_exch = vfs_exchange_begin(); 282 282 283 283 aid_t req = async_send_0(exch, LOADER_ADD_INBOX, NULL); 284 284 285 285 errno_t rc = async_data_write_start(exch, name, str_size(name) + 1); 286 286 if (rc == EOK) { 287 287 rc = vfs_pass_handle(vfs_exch, file, exch); 288 288 } 289 289 290 290 async_exchange_end(vfs_exch); 291 291 async_exchange_end(exch); 292 292 293 293 if (rc == EOK) { 294 294 async_wait_for(req, &rc); … … 296 296 async_forget(req); 297 297 } 298 298 299 299 return (errno_t) rc; 300 300 } … … 315 315 errno_t rc = async_req_0_0(exch, LOADER_LOAD); 316 316 async_exchange_end(exch); 317 317 318 318 return rc; 319 319 } … … 338 338 errno_t rc = async_req_0_0(exch, LOADER_RUN); 339 339 async_exchange_end(exch); 340 340 341 341 if (rc != EOK) 342 342 return rc; 343 343 344 344 async_hangup(ldr->sess); 345 345 free(ldr); 346 346 347 347 return EOK; 348 348 }
Note:
See TracChangeset
for help on using the changeset viewer.