diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2006-10-04 05:28:53 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2006-10-04 05:28:53 +0000 |
commit | 09f14fa85ca3ca1fde5febf63c653a196a2f4255 (patch) | |
tree | b2e6254ba72076f15353ab5d063c4b8b83a6c33a | |
parent | be0fde1143e8707831cd6c71a3886f9eb1d161b8 (diff) |
win32: implemented sock_set_nonblocking_mode().
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@1211 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ChangeLog.ja | 5 | ||||
-rw-r--r-- | libsylph/session.c | 10 | ||||
-rw-r--r-- | libsylph/socket.c | 30 | ||||
-rw-r--r-- | libsylph/socket.h | 1 |
5 files changed, 41 insertions, 10 deletions
@@ -1,5 +1,10 @@ 2006-10-04 + * libsylph/session.c + libsylph/socket.[ch]: win32: implemented sock_set_nonblocking_mode(). + +2006-10-04 + * src/inc.c: inc_drop_message(): exclude junk mails from the number of new messages. diff --git a/ChangeLog.ja b/ChangeLog.ja index 62a00234..f3779ba2 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,5 +1,10 @@ 2006-10-04 + * libsylph/session.c + libsylph/socket.[ch]: win32: sock_set_nonblocking_mode() を実装。 + +2006-10-04 + * src/inc.c: inc_drop_message(): 新着メッセージ数から迷惑メールを除外。 2006-10-03 diff --git a/libsylph/session.c b/libsylph/session.c index 1d1300e5..5852cfeb 100644 --- a/libsylph/session.c +++ b/libsylph/session.c @@ -173,10 +173,10 @@ static gint session_connect_cb(SockInfo *sock, gpointer data) } #endif - sock_set_nonblocking_mode(sock, session->nonblocking); - debug_print("session (%p): connected\n", session); + sock_set_nonblocking_mode(sock, session->nonblocking); + session->state = SESSION_RECV; session->io_tag = sock_add_watch(session->sock, G_IO_IN, session_read_msg_cb, @@ -353,8 +353,7 @@ gint session_start_tls(Session *session) nb_mode = sock_is_nonblocking_mode(session->sock); - if (nb_mode) - sock_set_nonblocking_mode(session->sock, FALSE); + sock_set_nonblocking_mode(session->sock, FALSE); if (!ssl_init_socket_with_method(session->sock, SSL_METHOD_TLSv1)) { g_warning("can't start TLS session.\n"); @@ -363,8 +362,7 @@ gint session_start_tls(Session *session) return -1; } - if (nb_mode) - sock_set_nonblocking_mode(session->sock, session->nonblocking); + sock_set_nonblocking_mode(session->sock, session->nonblocking); return 0; } diff --git a/libsylph/socket.c b/libsylph/socket.c index 6d982c2d..c0395177 100644 --- a/libsylph/socket.c +++ b/libsylph/socket.c @@ -347,7 +347,19 @@ gint fd_accept(gint sock) static gint set_nonblocking_mode(gint fd, gboolean nonblock) { -#ifdef G_OS_UNIX +#ifdef G_OS_WIN32 + gulong val = nonblock ? 1 : 0; + + if (!nonblock) + WSAEventSelect(fd, NULL, 0); + if (ioctlsocket(fd, FIONBIO, &val) == SOCKET_ERROR) { + g_warning("set_nonblocking_mode(): ioctlsocket() failed: %ld\n", WSAGetLastError()); + return -1; + } + debug_print("set nonblocking mode to %d\n", nonblock); + + return 0; +#else gint flags; flags = fcntl(fd, F_GETFL, 0); @@ -362,16 +374,20 @@ static gint set_nonblocking_mode(gint fd, gboolean nonblock) flags &= ~O_NONBLOCK; return fcntl(fd, F_SETFL, flags); -#else - return -1; #endif } gint sock_set_nonblocking_mode(SockInfo *sock, gboolean nonblock) { + gint ret; + g_return_val_if_fail(sock != NULL, -1); - return set_nonblocking_mode(sock->sock, nonblock); + ret = set_nonblocking_mode(sock->sock, nonblock); + if (ret == 0) + sock->nonblock = nonblock; + + return ret; } static gboolean is_nonblocking_mode(gint fd) @@ -395,7 +411,11 @@ gboolean sock_is_nonblocking_mode(SockInfo *sock) { g_return_val_if_fail(sock != NULL, FALSE); +#ifdef G_OS_WIN32 + return sock->nonblock; +#else return is_nonblocking_mode(sock->sock); +#endif } gboolean sock_has_read_data(SockInfo *sock) @@ -748,6 +768,7 @@ SockInfo *sock_connect(const gchar *hostname, gushort port) sockinfo->hostname = g_strdup(hostname); sockinfo->port = port; sockinfo->state = CONN_ESTABLISHED; + sockinfo->nonblock = FALSE; g_usleep(100000); @@ -805,6 +826,7 @@ static gboolean sock_connect_async_cb(GIOChannel *source, sockinfo->hostname = g_strdup(conn_data->hostname); sockinfo->port = conn_data->port; sockinfo->state = CONN_ESTABLISHED; + sockinfo->nonblock = TRUE; conn_data->func(sockinfo, conn_data->data); diff --git a/libsylph/socket.h b/libsylph/socket.h index c3b773ef..7955005a 100644 --- a/libsylph/socket.h +++ b/libsylph/socket.h @@ -61,6 +61,7 @@ struct _SockInfo gchar *hostname; gushort port; ConnectionState state; + gboolean nonblock; gpointer data; SockFunc callback; |