--- globus_2_4_3_adv2003_fix892_fix956_more/io/source/library/globus_io_tcp.c Mon Apr 7 16:44:56 2003 +++ globus_2_4_3_adv2003_fix892_fix956_plus/io/source/library/globus_io_tcp.c Sun Jan 4 05:49:03 2004 @@ -584,6 +584,7 @@ { globus_result_t rc; int save_errno; + globus_bool_t retry_listen; globus_object_t * err = GLOBUS_SUCCESS; struct sockaddr_in my_addr; static char * myname = @@ -612,81 +613,94 @@ myname)); } - rc = globus_i_io_initialize_handle(handle, - GLOBUS_IO_HANDLE_TYPE_TCP_CONNECTED); - if(rc != GLOBUS_SUCCESS) + do { - return rc; - } - globus_i_io_debug_printf(3, - (stderr, "%s(): entering\n", myname)); - - rc = globus_i_io_copy_tcpattr_to_handle(attr, - handle); - if(rc != GLOBUS_SUCCESS) - { - return rc; - } - - /* - * For now set net logger info to null. - * Only use for reads and writes, not listen - * - * NETLOGGER - */ - handle->nl_event_id = GLOBUS_NULL; - handle->nl_handle = GLOBUS_NULL; - - handle->state = GLOBUS_IO_HANDLE_STATE_INVALID; - - len = sizeof(my_addr); - rc = globus_l_io_tcp_create_socket(handle); - if(rc != GLOBUS_SUCCESS) - { - return rc; - } - /* get it ready for nonblocking I/O */ - if ((rc = globus_i_io_setup_nonblocking(handle)) != GLOBUS_SUCCESS) - { - err = globus_error_get(rc); - - globus_i_io_debug_printf(2, - (stderr, "%s(): " - "globus_i_io_setup_nonblocking() failed\n", - myname)); - - goto error_exit; - } - - err = globus_l_io_tcp_bind_socket(handle, attr, port); + retry_listen = GLOBUS_FALSE; - if(err != GLOBUS_SUCCESS) - { + rc = globus_i_io_initialize_handle(handle, + GLOBUS_IO_HANDLE_TYPE_TCP_CONNECTED); + if(rc != GLOBUS_SUCCESS) + { + return rc; + } + globus_i_io_debug_printf(3, + (stderr, "%s(): entering\n", myname)); + + rc = globus_i_io_copy_tcpattr_to_handle(attr, + handle); + if(rc != GLOBUS_SUCCESS) + { + return rc; + } + + /* + * For now set net logger info to null. + * Only use for reads and writes, not listen + * + * NETLOGGER + */ + + handle->nl_event_id = GLOBUS_NULL; + handle->nl_handle = GLOBUS_NULL; + + handle->state = GLOBUS_IO_HANDLE_STATE_INVALID; + + len = sizeof(my_addr); + rc = globus_l_io_tcp_create_socket(handle); + if(rc != GLOBUS_SUCCESS) + { + return rc; + } + /* get it ready for nonblocking I/O */ + if ((rc = globus_i_io_setup_nonblocking(handle)) != GLOBUS_SUCCESS) + { + err = globus_error_get(rc); + + globus_i_io_debug_printf(2, + (stderr, "%s(): " + "globus_i_io_setup_nonblocking() failed\n", + myname)); + goto error_exit; + } + + err = globus_l_io_tcp_bind_socket(handle, attr, port); + + if(err != GLOBUS_SUCCESS) + { + goto error_exit; + } - goto error_exit; - } - #ifndef TARGET_ARCH_WIN32 - if(listen(handle->fd, - (backlog < 0 ? SOMAXCONN : backlog)) < 0) - { + if(listen(handle->fd, + (backlog < 0 ? SOMAXCONN : backlog)) < 0) + { #else - if(listen( (SOCKET)handle->io_handle, - (backlog < 0 ? SOMAXCONN : backlog)) == SOCKET_ERROR ) - { - globus_i_io_winsock_get_last_error(); + if(listen( (SOCKET)handle->io_handle, + (backlog < 0 ? SOMAXCONN : backlog)) == SOCKET_ERROR ) + { + globus_i_io_winsock_get_last_error(); #endif /*TARGET_ARCH_WIN32 */ - save_errno = errno; - - globus_assert(GLOBUS_FALSE && "listen() failed"); + save_errno = errno; - err = globus_io_error_construct_internal_error( - GLOBUS_IO_MODULE, - GLOBUS_NULL, - myname); - - goto error_exit; - } + if (save_errno == EADDRINUSE) + { + retry_listen = GLOBUS_TRUE; + globus_libc_close(handle->fd); + globus_l_io_tcp_handle_destroy(handle); + } + else + { + globus_assert(GLOBUS_FALSE && "listen() failed"); + + err = globus_io_error_construct_internal_error( + GLOBUS_IO_MODULE, + GLOBUS_NULL, + myname); + + goto error_exit; + } + } + } while(retry_listen); #ifndef TARGET_ARCH_WIN32 if(getsockname(handle->fd,