Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4738 → Rev 4743

/branches/network/uspace/srv/net/socket/socket_messages.h
87,6 → 87,7
#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 )
 
/*@}*/
 
/branches/network/uspace/srv/net/socket/socket_client.c
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;