Rev 4589 | Rev 4701 | Go to most recent revision | Show entire file | Regard 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 |