Subversion Repositories HelenOS

Rev

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

Rev 2622 Rev 2635
Line 189... Line 189...
189
                (unative_t) &TASK->phones[phoneid]);
189
                (unative_t) &TASK->phones[phoneid]);
190
        }
190
        }
191
    } else if (IPC_GET_METHOD(*olddata) == IPC_M_CONNECT_ME_TO) {
191
    } else if (IPC_GET_METHOD(*olddata) == IPC_M_CONNECT_ME_TO) {
192
        /* If the users accepted call, connect */
192
        /* If the users accepted call, connect */
193
        if (!IPC_GET_RETVAL(answer->data)) {
193
        if (!IPC_GET_RETVAL(answer->data)) {
194
            ipc_phone_connect((phone_t *) IPC_GET_ARG3(*olddata),
194
            ipc_phone_connect((phone_t *) IPC_GET_ARG5(*olddata),
195
                &TASK->answerbox);
195
                &TASK->answerbox);
196
        }
196
        }
197
    } else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_AREA_SEND) {
197
    } else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_AREA_SEND) {
198
        if (!IPC_GET_RETVAL(answer->data)) {
198
        if (!IPC_GET_RETVAL(answer->data)) {
199
            /* Accepted, handle as_area receipt */
199
            /* Accepted, handle as_area receipt */
Line 268... Line 268...
268
    case IPC_M_CONNECT_ME_TO:
268
    case IPC_M_CONNECT_ME_TO:
269
        newphid = phone_alloc();
269
        newphid = phone_alloc();
270
        if (newphid < 0)
270
        if (newphid < 0)
271
            return ELIMIT;
271
            return ELIMIT;
272
        /* Set arg3 for server */
272
        /* Set arg3 for server */
273
        IPC_SET_ARG3(call->data, (unative_t) &TASK->phones[newphid]);
273
        IPC_SET_ARG5(call->data, (unative_t) &TASK->phones[newphid]);
274
        call->flags |= IPC_CALL_CONN_ME_TO;
274
        call->flags |= IPC_CALL_CONN_ME_TO;
275
        call->priv = newphid;
275
        call->priv = newphid;
276
        break;
276
        break;
277
    case IPC_M_AS_AREA_SEND:
277
    case IPC_M_AS_AREA_SEND:
278
        size = as_area_get_size(IPC_GET_ARG1(call->data));
278
        size = as_area_get_size(IPC_GET_ARG1(call->data));
Line 316... Line 316...
316
 
316
 
317
    if (call->flags & IPC_CALL_CONN_ME_TO) {
317
    if (call->flags & IPC_CALL_CONN_ME_TO) {
318
        if (IPC_GET_RETVAL(call->data))
318
        if (IPC_GET_RETVAL(call->data))
319
            phone_dealloc(call->priv);
319
            phone_dealloc(call->priv);
320
        else
320
        else
321
            IPC_SET_ARG3(call->data, call->priv);
321
            IPC_SET_ARG5(call->data, call->priv);
322
    }
322
    }
323
}
323
}
324
 
324
 
325
/** Do basic kernel processing of received call request.
325
/** Do basic kernel processing of received call request.
326
 *
326
 *
Line 550... Line 550...
550
 * Warning: When implementing support for changing additional payload
550
 * Warning: When implementing support for changing additional payload
551
 *      arguments, make sure that ARG3 is not rewritten for certain
551
 *      arguments, make sure that ARG3 is not rewritten for certain
552
 *      system IPC
552
 *      system IPC
553
 */
553
 */
554
unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid,
554
unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid,
555
    unative_t method, unative_t arg1, int mode)
555
    unative_t method, unative_t arg1, unative_t arg2, int mode)
556
{
556
{
557
    call_t *call;
557
    call_t *call;
558
    phone_t *phone;
558
    phone_t *phone;
559
 
559
 
560
    call = get_call(callid);
560
    call = get_call(callid);
Line 575... Line 575...
575
        return EPERM;
575
        return EPERM;
576
    }
576
    }
577
 
577
 
578
    /*
578
    /*
579
     * Userspace is not allowed to change method of system methods on
579
     * Userspace is not allowed to change method of system methods on
580
     * forward, allow changing ARG1 and ARG2 by means of method and arg1.
580
     * forward, allow changing ARG1, ARG2 and ARG3 by means of method,
-
 
581
     * arg1 and arg2.
581
     * If the method is immutable, don't change anything.
582
     * If the method is immutable, don't change anything.
582
     */
583
     */
583
    if (!method_is_immutable(IPC_GET_METHOD(call->data))) {
584
    if (!method_is_immutable(IPC_GET_METHOD(call->data))) {
584
        if (method_is_system(IPC_GET_METHOD(call->data))) {
585
        if (method_is_system(IPC_GET_METHOD(call->data))) {
585
            if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_TO_ME)
586
            if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_TO_ME)
586
                phone_dealloc(IPC_GET_ARG3(call->data));
587
                phone_dealloc(IPC_GET_ARG5(call->data));
587
 
588
 
588
            IPC_SET_ARG1(call->data, method);
589
            IPC_SET_ARG1(call->data, method);
589
            IPC_SET_ARG2(call->data, arg1);
590
            IPC_SET_ARG2(call->data, arg1);
-
 
591
            IPC_SET_ARG3(call->data, arg2);
590
        } else {
592
        } else {
591
            IPC_SET_METHOD(call->data, method);
593
            IPC_SET_METHOD(call->data, method);
592
            IPC_SET_ARG1(call->data, arg1);
594
            IPC_SET_ARG1(call->data, arg1);
-
 
595
            IPC_SET_ARG2(call->data, arg2);
593
        }
596
        }
594
    }
597
    }
595
 
598
 
596
    return ipc_forward(call, phone, &TASK->answerbox, mode);
599
    return ipc_forward(call, phone, &TASK->answerbox, mode);
597
}
600
}