aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2006-10-04 05:28:53 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2006-10-04 05:28:53 +0000
commit09f14fa85ca3ca1fde5febf63c653a196a2f4255 (patch)
treeb2e6254ba72076f15353ab5d063c4b8b83a6c33a
parentbe0fde1143e8707831cd6c71a3886f9eb1d161b8 (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--ChangeLog5
-rw-r--r--ChangeLog.ja5
-rw-r--r--libsylph/session.c10
-rw-r--r--libsylph/socket.c30
-rw-r--r--libsylph/socket.h1
5 files changed, 41 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 5725450d..b1268500 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;