Subversion Repositories HelenOS

Rev

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

Rev 4736 Rev 4743
Line 308... Line 308...
308
 
308
 
309
    while( true ){
309
    while( true ){
310
 
310
 
311
        callid = async_get_call( & call );
311
        callid = async_get_call( & call );
312
        switch( IPC_GET_METHOD( call )){
312
        switch( IPC_GET_METHOD( call )){
313
                // TODO remember the data_fragment_size
-
 
314
            case NET_SOCKET_RECEIVED:
313
            case NET_SOCKET_RECEIVED:
315
                fibril_rwlock_read_lock( & socket_globals.lock );
314
                fibril_rwlock_read_lock( & socket_globals.lock );
316
                // find the socket
315
                // find the socket
317
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( call ));
316
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( call ));
318
                if( ! socket ){
317
                if( ! socket ){
Line 338... Line 337...
338
                    // create a new scoket
337
                    // create a new scoket
339
                    new_socket = ( socket_ref ) malloc( sizeof( socket_t ));
338
                    new_socket = ( socket_ref ) malloc( sizeof( socket_t ));
340
                    if( ! new_socket ){
339
                    if( ! new_socket ){
341
                        ERROR_CODE = ENOMEM;
340
                        ERROR_CODE = ENOMEM;
342
                    }else{
341
                    }else{
343
                        bzero( socket, sizeof( * socket ));
342
                        bzero( new_socket, sizeof( * new_socket ));
344
                        socket_initialize( new_socket, SOCKET_GET_SOCKET_ID( call ), socket->phone, socket->service );
343
                        socket_initialize( new_socket, SOCKET_GET_NEW_SOCKET_ID( call ), socket->phone, socket->service );
345
                        ERROR_CODE = sockets_add( socket_get_sockets(), new_socket->socket_id, new_socket );
344
                        ERROR_CODE = sockets_add( socket_get_sockets(), new_socket->socket_id, new_socket );
346
                        if( ERROR_CODE < 0 ){
345
                        if( ERROR_CODE < 0 ){
347
                            free( new_socket );
346
                            free( new_socket );
348
                        }else{
347
                        }else{
349
                            // push the new socket identifier
348
                            // push the new socket identifier
350
                            fibril_mutex_lock( & socket->accept_lock );
349
                            fibril_mutex_lock( & socket->accept_lock );
351
                            if( ERROR_OCCURRED( dyn_fifo_push( & socket->accepted, new_socket->socket_id, SOCKET_MAX_ACCEPTED_SIZE ))){
350
                            if( ERROR_OCCURRED( dyn_fifo_push( & socket->accepted, new_socket->socket_id, SOCKET_MAX_ACCEPTED_SIZE ))){
352
                                sockets_exclude( socket_get_sockets(), new_socket->socket_id );
351
                                sockets_exclude( socket_get_sockets(), new_socket->socket_id );
353
                                free( new_socket );
-
 
354
                            }else{
352
                            }else{
355
                                // signal the accepted socket
353
                                // signal the accepted socket
356
                                fibril_condvar_signal( & socket->accept_signal );
354
                                fibril_condvar_signal( & socket->accept_signal );
357
                            }
355
                            }
358
                            fibril_mutex_unlock( & socket->accept_lock );
356
                            fibril_mutex_unlock( & socket->accept_lock );
Line 360... Line 358...
360
                        }
358
                        }
361
                    }
359
                    }
362
                }
360
                }
363
                fibril_rwlock_read_unlock( & socket_globals.lock );
361
                fibril_rwlock_read_unlock( & socket_globals.lock );
364
                break;
362
                break;
365
            // TODO obsolete?
-
 
366
            case NET_SOCKET_DATA_FRAGMENT_SIZE:
363
            case NET_SOCKET_DATA_FRAGMENT_SIZE:
367
                fibril_rwlock_read_lock( & socket_globals.lock );
364
                fibril_rwlock_read_lock( & socket_globals.lock );
368
                // find the socket
365
                // find the socket
369
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( call ));
366
                socket = sockets_find( socket_get_sockets(), SOCKET_GET_SOCKET_ID( call ));
370
                if( ! socket ){
367
                if( ! socket ){
Line 504... Line 501...
504
 
501
 
505
int accept( int socket_id, struct sockaddr * cliaddr, socklen_t * addrlen ){
502
int accept( int socket_id, struct sockaddr * cliaddr, socklen_t * addrlen ){
506
    socket_ref      socket;
503
    socket_ref      socket;
507
    aid_t           message_id;
504
    aid_t           message_id;
508
    int             result;
505
    int             result;
-
 
506
    ipc_call_t      answer;
509
 
507
 
510
    if(( ! cliaddr ) || ( ! addrlen )) return EBADMEM;
508
    if(( ! cliaddr ) || ( ! addrlen )) return EBADMEM;
511
 
509
 
512
    fibril_rwlock_read_lock( & socket_globals.lock );
510
    fibril_rwlock_read_lock( & socket_globals.lock );
513
    // find the socket
511
    // find the socket
Line 524... Line 522...
524
        fibril_condvar_wait( & socket->accept_signal, & socket->accept_lock );
522
        fibril_condvar_wait( & socket->accept_signal, & socket->accept_lock );
525
        fibril_rwlock_read_lock( & socket_globals.lock );
523
        fibril_rwlock_read_lock( & socket_globals.lock );
526
    }
524
    }
527
    -- socket->blocked;
525
    -- socket->blocked;
528
    // request accept
526
    // request accept
529
    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 );
527
    message_id = async_send_3( socket->phone, NET_SOCKET_ACCEPT, ( ipcarg_t ) socket->socket_id, 0, socket->service, & answer );
530
    // read address
528
    // read address
531
    ipc_data_read_start( socket->phone, cliaddr, * addrlen );
529
    ipc_data_read_start( socket->phone, cliaddr, * addrlen );
532
    fibril_rwlock_read_unlock( & socket_globals.lock );
530
    fibril_rwlock_read_unlock( & socket_globals.lock );
533
    async_wait_for( message_id, ( ipcarg_t * ) & result );
531
    async_wait_for( message_id, ( ipcarg_t * ) & result );
534
    if( result > 0 ){
532
    if( result > 0 ){
535
        // dequeue the accepted apcket if successful
533
        // dequeue the accepted socket if successful
536
        dyn_fifo_pop( & socket->accepted );
534
        dyn_fifo_pop( & socket->accepted );
-
 
535
        // set address length
-
 
536
        * addrlen = SOCKET_GET_ADDRESS_LENGTH( answer );
-
 
537
    }else if( result == ENOTSOCK ){
-
 
538
        // empty the queue if no accepted sockets
-
 
539
        while( dyn_fifo_pop( & socket->accepted ) > 0 );
537
    }
540
    }
538
    fibril_mutex_unlock( & socket->accept_lock );
541
    fibril_mutex_unlock( & socket->accept_lock );
539
    return result;
542
    return result;
540
}
543
}
541
 
544