gint sock_close(SockInfo *sock) { GList *cur; if (!sock) return 0; #if USE_SSL if (sock->ssl) ssl_done_socket(sock); #endif if (sock->sock_ch) { g_io_channel_shutdown(sock->sock_ch, FALSE, NULL); g_io_channel_unref(sock->sock_ch); } for (cur = sock_list; cur != NULL; cur = cur->next) { if ((SockInfo *)cur->data == sock) { sock_list = g_list_remove(sock_list, sock); break; } } g_free(sock->hostname); g_free(sock); return 0; }
gint sock_close(SockInfo *sock) { gint ret; if (!sock) return 0; if (sock->sock_ch) g_io_channel_unref(sock->sock_ch); #ifdef USE_GNUTLS if (sock->ssl) ssl_done_socket(sock); if (sock->g_source != 0) g_source_remove(sock->g_source); sock->g_source = 0; #endif #ifdef G_OS_WIN32 shutdown(sock->sock, 1); /* complete transfer before close */ ret = closesocket(sock->sock); #else ret = fd_close(sock->sock); #endif g_free(sock->canonical_name); g_free(sock->hostname); g_free(sock); return ret; }