Subversion Repositories HelenOS

Rev

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

Rev 4589 Rev 4603
Line 452... Line 452...
452
    int             index;
452
    int             index;
453
    ipc_call_t      answer;
453
    ipc_call_t      answer;
454
 
454
 
455
    if( ! data ) return EBADMEM;
455
    if( ! data ) return EBADMEM;
456
    if( ! datalength ) return NO_DATA;
456
    if( ! datalength ) return NO_DATA;
-
 
457
    if( fromaddr && (( ! addrlen ) || ( * addrlen < sizeof( struct sockaddr_in )))) return EINVAL;
457
    // find the socket
458
    // find the socket
458
    socket = sockets_find( socket_get_sockets(), socket_id );
459
    socket = sockets_find( socket_get_sockets(), socket_id );
459
    if( ! socket ) return ENOTSOCK;
460
    if( ! socket ) return ENOTSOCK;
460
    fibril_mutex_lock( & socket->receive_lock );
461
    fibril_mutex_lock( & socket->receive_lock );
461
    // wait for a received packet
462
    // wait for a received packet
Line 471... Line 472...
471
        }
472
        }
472
    }
473
    }
473
    // request packet data
474
    // request packet data
474
    message_id = async_send_4( socket->phone, message, socket->socket_id, 0, socket->service, flags, & answer );
475
    message_id = async_send_4( socket->phone, message, socket->socket_id, 0, socket->service, flags, & answer );
475
    // read the address if desired
476
    // read the address if desired
476
    if( fromaddr ){
-
 
477
        * addrlen = sizeof( struct sockaddr_in );
-
 
478
    }
-
 
479
    if(( ! fromaddr ) || ( ipc_data_read_start( socket->phone, fromaddr, * addrlen ) == EOK )){
477
    if(( ! fromaddr ) || ( ipc_data_read_start( socket->phone, fromaddr, * addrlen ) == EOK )){
480
        if( fragments == 1 ){
478
        if( fragments == 1 ){
481
            // read all if only one fragment
479
            // read all if only one fragment
482
            ipc_data_read_start( socket->phone, data, datalength );
480
            ipc_data_read_start( socket->phone, data, datalength );
483
        }else{
481
        }else{
Line 501... Line 499...
501
    if( result == EOK ){
499
    if( result == EOK ){
502
        // dequeue the received packet
500
        // dequeue the received packet
503
        dyn_fifo_pop( & socket->received );
501
        dyn_fifo_pop( & socket->received );
504
        // return read data length
502
        // return read data length
505
        result = SOCKET_GET_READ_DATA_LENGTH( & answer );
503
        result = SOCKET_GET_READ_DATA_LENGTH( & answer );
-
 
504
        // set address length
-
 
505
        if( fromaddr && addrlen ) * addrlen = SOCKET_GET_ADDRESS_LENGTH( & answer );
506
    }
506
    }
507
    fibril_mutex_unlock( & socket->receive_lock );
507
    fibril_mutex_unlock( & socket->receive_lock );
508
    return result;
508
    return result;
509
}
509
}
510
 
510