aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ChangeLog.ja6
-rw-r--r--libsylph/session.c8
-rw-r--r--libsylph/socket.c21
-rw-r--r--libsylph/socket.h2
5 files changed, 42 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 4779b5cd..e36fb9ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-02-14
+
+ * libsylph/session.c
+ libsylph/socket.[ch]: win32: avoid blocking when reading from
+ socket.
+
2006-02-13
* version 2.2.0
diff --git a/ChangeLog.ja b/ChangeLog.ja
index d4ced626..b3e01f1a 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,3 +1,9 @@
+2006-02-14
+
+ * libsylph/session.c
+ libsylph/socket.[ch]: win32: ソケットから読み込むときにブロックする
+ のを回避。
+
2006-02-13
* version 2.2.0
diff --git a/libsylph/session.c b/libsylph/session.c
index 7a526765..8e7cd835 100644
--- a/libsylph/session.c
+++ b/libsylph/session.c
@@ -1,6 +1,6 @@
/*
* LibSylph -- E-Mail client library
- * Copyright (C) 1999-2005 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2006 Hiroyuki Yamamoto
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -512,6 +512,8 @@ static gboolean session_read_msg_cb(SockInfo *source, GIOCondition condition,
if (session->read_buf_len == 0) {
gint read_len;
+ if (!sock_has_read_data(session->sock))
+ return TRUE;
read_len = sock_read(session->sock, session->read_buf,
SESSION_BUFFSIZE - 1);
@@ -598,6 +600,8 @@ static gboolean session_read_data_cb(SockInfo *source, GIOCondition condition,
if (session->read_buf_len == 0) {
gint read_len;
+ if (!sock_has_read_data(session->sock))
+ return TRUE;
read_len = sock_read(session->sock, session->read_buf,
SESSION_BUFFSIZE);
@@ -709,6 +713,8 @@ static gboolean session_read_data_as_file_cb(SockInfo *source,
session_set_timeout(session, session->timeout_interval);
if (session->read_buf_len == 0) {
+ if (!sock_has_read_data(session->sock))
+ return TRUE;
read_len = sock_read(session->sock, session->read_buf_p,
READ_BUF_LEFT());
diff --git a/libsylph/socket.c b/libsylph/socket.c
index 954c33f0..7ddde9e5 100644
--- a/libsylph/socket.c
+++ b/libsylph/socket.c
@@ -398,6 +398,27 @@ gboolean sock_is_nonblocking_mode(SockInfo *sock)
return is_nonblocking_mode(sock->sock);
}
+gboolean sock_has_read_data(SockInfo *sock)
+{
+#ifdef G_OS_WIN32
+ gulong val;
+
+#if USE_SSL
+ if (sock->ssl)
+ return TRUE;
+#endif
+ if (ioctlsocket(sock->sock, FIONREAD, &val) < 0)
+ return TRUE;
+
+ if (val == 0)
+ return FALSE;
+ else
+ return TRUE;
+#else
+ return TRUE;
+#endif
+}
+
static gboolean sock_prepare(GSource *source, gint *timeout)
{
diff --git a/libsylph/socket.h b/libsylph/socket.h
index 5f627c67..c3b773ef 100644
--- a/libsylph/socket.h
+++ b/libsylph/socket.h
@@ -75,6 +75,8 @@ gint sock_set_io_timeout (guint sec);
gint sock_set_nonblocking_mode (SockInfo *sock, gboolean nonblock);
gboolean sock_is_nonblocking_mode (SockInfo *sock);
+gboolean sock_has_read_data (SockInfo *sock);
+
guint sock_add_watch (SockInfo *sock, GIOCondition condition,
SockFunc func, gpointer data);