Subversion Repositories HelenOS

Rev

Rev 4338 | Rev 4344 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4338 Rev 4343
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 79... Line 80...
79
static elf_info_t prog_info;
80
static elf_info_t prog_info;
80
static elf_info_t interp_info;
81
static elf_info_t interp_info;
81
 
82
 
82
static bool is_dyn_linked;
83
static bool is_dyn_linked;
83
 
84
 
-
 
85
/** Used to limit number of connections to one. */
-
 
86
static bool connected;
84
 
87
 
85
static void loader_get_taskid(ipc_callid_t rid, ipc_call_t *request)
88
static void loader_get_taskid(ipc_callid_t rid, ipc_call_t *request)
86
{
89
{
87
    ipc_callid_t callid;
90
    ipc_callid_t callid;
88
    task_id_t task_id;
91
    task_id_t task_id;
Line 303... Line 306...
303
{
306
{
304
    ipc_callid_t callid;
307
    ipc_callid_t callid;
305
    ipc_call_t call;
308
    ipc_call_t call;
306
    int retval;
309
    int retval;
307
 
310
 
-
 
311
    /* Already have a connection? */
-
 
312
    if (connected) {
-
 
313
        ipc_answer_0(iid, ELIMIT);
-
 
314
        return;
-
 
315
    }
-
 
316
 
-
 
317
    connected = true;
-
 
318
   
-
 
319
    /* Accept the connection */
-
 
320
    ipc_answer_0(iid, EOK);
-
 
321
 
308
    /* Ignore parameters, the connection is already open */
322
    /* Ignore parameters, the connection is already open */
309
    (void)iid; (void)icall;
323
    (void)iid; (void)icall;
310
 
324
 
311
    while (1) {
325
    while (1) {
312
        callid = async_get_call(&call);
326
        callid = async_get_call(&call);
Line 344... Line 358...
344
 
358
 
345
/** Program loader main function.
359
/** Program loader main function.
346
 */
360
 */
347
int main(int argc, char *argv[])
361
int main(int argc, char *argv[])
348
{
362
{
349
    ipc_callid_t callid;
-
 
350
    ipc_call_t call;
-
 
351
    ipcarg_t phone_hash;
363
    ipcarg_t phonead;
352
 
-
 
353
    /* The first call only communicates the incoming phone hash */
-
 
354
    callid = ipc_wait_for_call(&call);
-
 
355
 
364
 
356
    if (IPC_GET_METHOD(call) != LOADER_HELLO) {
-
 
357
        if (IPC_GET_METHOD(call) != IPC_M_PHONE_HUNGUP)
-
 
358
            ipc_answer_0(callid, EINVAL);
-
 
359
        return 1;
365
    connected = false;
360
    }
366
   
361
 
-
 
362
    ipc_answer_0(callid, EOK);
367
    /* Set a handler of incomming connections. */
363
    phone_hash = call.in_phone_hash;
368
    async_set_client_connection(loader_connection);
364
 
369
 
365
    /*
-
 
366
     * Up until now async must not be used as it couldn't
370
    /* Register at naming service. */
367
     * handle incoming requests. (Which means e.g. printf()
371
    if (ipc_connect_to_me(PHONE_NS, SERVICE_LOAD, 0, 0, &phonead) != 0)
368
     * cannot be used)
372
        return -1;
369
     */
373
   
370
    async_new_connection(phone_hash, 0, NULL, loader_connection);
-
 
371
    async_manager();
374
    async_manager();
372
 
375
 
373
    /* not reached */
376
    /* Never reached */
374
    return 0;
377
    return 0;
375
}
378
}
376
 
379
 
377
/** @}
380
/** @}
378
 */
381
 */