310,7 → 310,6 |
|
callid = async_get_call( & call ); |
switch( IPC_GET_METHOD( call )){ |
// TODO remember the data_fragment_size |
case NET_SOCKET_RECEIVED: |
fibril_rwlock_read_lock( & socket_globals.lock ); |
// find the socket |
340,8 → 339,8 |
if( ! new_socket ){ |
ERROR_CODE = ENOMEM; |
}else{ |
bzero( socket, sizeof( * socket )); |
socket_initialize( new_socket, SOCKET_GET_SOCKET_ID( call ), socket->phone, socket->service ); |
bzero( new_socket, sizeof( * new_socket )); |
socket_initialize( new_socket, SOCKET_GET_NEW_SOCKET_ID( call ), socket->phone, socket->service ); |
ERROR_CODE = sockets_add( socket_get_sockets(), new_socket->socket_id, new_socket ); |
if( ERROR_CODE < 0 ){ |
free( new_socket ); |
350,7 → 349,6 |
fibril_mutex_lock( & socket->accept_lock ); |
if( ERROR_OCCURRED( dyn_fifo_push( & socket->accepted, new_socket->socket_id, SOCKET_MAX_ACCEPTED_SIZE ))){ |
sockets_exclude( socket_get_sockets(), new_socket->socket_id ); |
free( new_socket ); |
}else{ |
// signal the accepted socket |
fibril_condvar_signal( & socket->accept_signal ); |
362,7 → 360,6 |
} |
fibril_rwlock_read_unlock( & socket_globals.lock ); |
break; |
// TODO obsolete? |
case NET_SOCKET_DATA_FRAGMENT_SIZE: |
fibril_rwlock_read_lock( & socket_globals.lock ); |
// find the socket |
506,6 → 503,7 |
socket_ref socket; |
aid_t message_id; |
int result; |
ipc_call_t answer; |
|
if(( ! cliaddr ) || ( ! addrlen )) return EBADMEM; |
|
526,14 → 524,19 |
} |
-- socket->blocked; |
// request accept |
message_id = async_send_3( socket->phone, NET_SOCKET_ACCEPT, ( ipcarg_t ) socket->socket_id, ( ipcarg_t ) dyn_fifo_value( & socket->accepted ), socket->service, NULL ); |
message_id = async_send_3( socket->phone, NET_SOCKET_ACCEPT, ( ipcarg_t ) socket->socket_id, 0, socket->service, & answer ); |
// read address |
ipc_data_read_start( socket->phone, cliaddr, * addrlen ); |
fibril_rwlock_read_unlock( & socket_globals.lock ); |
async_wait_for( message_id, ( ipcarg_t * ) & result ); |
if( result > 0 ){ |
// dequeue the accepted apcket if successful |
// dequeue the accepted socket if successful |
dyn_fifo_pop( & socket->accepted ); |
// set address length |
* addrlen = SOCKET_GET_ADDRESS_LENGTH( answer ); |
}else if( result == ENOTSOCK ){ |
// empty the queue if no accepted sockets |
while( dyn_fifo_pop( & socket->accepted ) > 0 ); |
} |
fibril_mutex_unlock( & socket->accept_lock ); |
return result; |