Rev 3787 | Rev 3983 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3787 | Rev 3896 | ||
---|---|---|---|
Line 48... | Line 48... | ||
48 | #include <unistd.h> |
48 | #include <unistd.h> |
49 | #include <bool.h> |
49 | #include <bool.h> |
50 | #include <fcntl.h> |
50 | #include <fcntl.h> |
51 | #include <sys/types.h> |
51 | #include <sys/types.h> |
52 | #include <ipc/ipc.h> |
52 | #include <ipc/ipc.h> |
- | 53 | #include <ipc/services.h> |
|
53 | #include <ipc/loader.h> |
54 | #include <ipc/loader.h> |
54 | #include <loader/pcb.h> |
55 | #include <loader/pcb.h> |
55 | #include <errno.h> |
56 | #include <errno.h> |
56 | #include <async.h> |
57 | #include <async.h> |
57 | #include <as.h> |
58 | #include <as.h> |
Line 77... | Line 78... | ||
77 | static elf_info_t prog_info; |
78 | static elf_info_t prog_info; |
78 | static elf_info_t interp_info; |
79 | static elf_info_t interp_info; |
79 | 80 | ||
80 | static bool is_dyn_linked; |
81 | static bool is_dyn_linked; |
81 | 82 | ||
- | 83 | /** Used to limit number of connections to one. */ |
|
- | 84 | static bool connected; |
|
82 | 85 | ||
83 | static void loader_get_taskid(ipc_callid_t rid, ipc_call_t *request) |
86 | static void loader_get_taskid(ipc_callid_t rid, ipc_call_t *request) |
84 | { |
87 | { |
85 | ipc_callid_t callid; |
88 | ipc_callid_t callid; |
86 | task_id_t task_id; |
89 | task_id_t task_id; |
Line 295... | Line 298... | ||
295 | { |
298 | { |
296 | ipc_callid_t callid; |
299 | ipc_callid_t callid; |
297 | ipc_call_t call; |
300 | ipc_call_t call; |
298 | int retval; |
301 | int retval; |
299 | 302 | ||
- | 303 | /* Already have a connection? */ |
|
- | 304 | if (connected) { |
|
- | 305 | ipc_answer_0(iid, ELIMIT); |
|
- | 306 | return; |
|
- | 307 | } |
|
- | 308 | ||
- | 309 | connected = true; |
|
- | 310 | ||
- | 311 | /* Accept the connection */ |
|
- | 312 | ipc_answer_0(iid, EOK); |
|
- | 313 | ||
300 | /* Ignore parameters, the connection is already open */ |
314 | /* Ignore parameters, the connection is already open */ |
301 | (void)iid; (void)icall; |
315 | (void)iid; (void)icall; |
302 | 316 | ||
303 | while (1) { |
317 | while (1) { |
304 | callid = async_get_call(&call); |
318 | callid = async_get_call(&call); |
Line 336... | Line 350... | ||
336 | 350 | ||
337 | /** Program loader main function. |
351 | /** Program loader main function. |
338 | */ |
352 | */ |
339 | int main(int argc, char *argv[]) |
353 | int main(int argc, char *argv[]) |
340 | { |
354 | { |
341 | ipc_callid_t callid; |
- | |
342 | ipc_call_t call; |
- | |
343 | ipcarg_t phone_hash; |
355 | ipcarg_t phonead; |
344 | - | ||
345 | /* The first call only communicates the incoming phone hash */ |
- | |
346 | callid = ipc_wait_for_call(&call); |
- | |
347 | 356 | ||
348 | if (IPC_GET_METHOD(call) != LOADER_HELLO) { |
- | |
349 | if (IPC_GET_METHOD(call) != IPC_M_PHONE_HUNGUP) |
- | |
350 | ipc_answer_0(callid, EINVAL); |
- | |
351 | return 1; |
357 | connected = false; |
352 | } |
358 | |
353 | - | ||
354 | ipc_answer_0(callid, EOK); |
359 | /* Set a handler of incomming connections. */ |
355 | phone_hash = call.in_phone_hash; |
360 | async_set_client_connection(loader_connection); |
356 | 361 | ||
357 | /* |
- | |
358 | * Up until now async must not be used as it couldn't |
362 | /* Register at naming service. */ |
359 | * handle incoming requests. (Which means e.g. printf() |
363 | if (ipc_connect_to_me(PHONE_NS, SERVICE_LOAD, 0, 0, &phonead) != 0) |
360 | * cannot be used) |
364 | return -1; |
361 | */ |
365 | |
362 | async_new_connection(phone_hash, 0, NULL, loader_connection); |
- | |
363 | async_manager(); |
366 | async_manager(); |
364 | 367 | ||
365 | /* not reached */ |
368 | /* Never reached */ |
366 | return 0; |
369 | return 0; |
367 | } |
370 | } |
368 | 371 | ||
369 | /** @} |
372 | /** @} |
370 | */ |
373 | */ |