Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4743 → Rev 4738

/branches/network/uspace/srv/net/socket/socket_client.c
310,6 → 310,7
 
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
339,8 → 340,8
if( ! new_socket ){
ERROR_CODE = ENOMEM;
}else{
bzero( new_socket, sizeof( * new_socket ));
socket_initialize( new_socket, SOCKET_GET_NEW_SOCKET_ID( call ), socket->phone, socket->service );
bzero( socket, sizeof( * socket ));
socket_initialize( new_socket, SOCKET_GET_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 );
349,6 → 350,7
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 );
360,6 → 362,7
}
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
503,7 → 506,6
socket_ref socket;
aid_t message_id;
int result;
ipc_call_t answer;
 
if(( ! cliaddr ) || ( ! addrlen )) return EBADMEM;
 
524,19 → 526,14
}
-- socket->blocked;
// request accept
message_id = async_send_3( socket->phone, NET_SOCKET_ACCEPT, ( ipcarg_t ) socket->socket_id, 0, socket->service, & answer );
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 );
// 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 socket if successful
// dequeue the accepted apcket 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;
/branches/network/uspace/srv/net/socket/socket_messages.h
87,7 → 87,6
#define SOCKET_GET_OPT_NAME( call ) ( int ) IPC_GET_ARG4( call )
 
#define SOCKET_GET_DATA_FRAGMENTS( call ) ( int ) IPC_GET_ARG5( call )
#define SOCKET_GET_NEW_SOCKET_ID( call ) ( int ) IPC_GET_ARG5( call )
 
/*@}*/