}
if (idata->state == IMAP_IDLE)
{
- while ((result = mutt_socket_poll (idata->conn)) > 0)
+ while ((result = mutt_socket_poll (idata->conn, 0)) > 0)
{
if (imap_cmd_step (idata) != IMAP_CMD_CONTINUE)
{
static int mutt_sasl_conn_read (CONNECTION* conn, char* buf, size_t len);
static int mutt_sasl_conn_write (CONNECTION* conn, const char* buf,
size_t count);
-static int mutt_sasl_conn_poll (CONNECTION* conn);
+static int mutt_sasl_conn_poll (CONNECTION* conn, time_t wait_secs);
/* utility function, stolen from sasl2 sample code */
static int iptostring(const struct sockaddr *addr, socklen_t addrlen,
return -1;
}
-static int mutt_sasl_conn_poll (CONNECTION* conn)
+static int mutt_sasl_conn_poll (CONNECTION* conn, time_t wait_secs)
{
SASL_DATA* sasldata = conn->sockdata;
int rc;
conn->sockdata = sasldata->sockdata;
- rc = sasldata->msasl_poll (conn);
+ rc = sasldata->msasl_poll (conn, wait_secs);
conn->sockdata = sasldata;
return rc;
int (*msasl_close) (CONNECTION* conn);
int (*msasl_read) (CONNECTION* conn, char* buf, size_t len);
int (*msasl_write) (CONNECTION* conn, const char* buf, size_t count);
- int (*msasl_poll) (CONNECTION* conn);
+ int (*msasl_poll) (CONNECTION* conn, time_t wait_secs);
}
SASL_DATA;
* Returns: >0 if there is data to read,
* 0 if a read would block,
* -1 if this connection doesn't support polling */
-int mutt_socket_poll (CONNECTION* conn)
+int mutt_socket_poll (CONNECTION* conn, time_t wait_secs)
{
if (conn->bufpos < conn->available)
return conn->available - conn->bufpos;
if (conn->conn_poll)
- return conn->conn_poll (conn);
+ return conn->conn_poll (conn, wait_secs);
return -1;
}
return rc;
}
-int raw_socket_poll (CONNECTION* conn)
+int raw_socket_poll (CONNECTION* conn, time_t wait_secs)
{
fd_set rfds;
- struct timeval tv = { 0, 0 };
+ struct timeval tv;
+ struct timespec pre_t, post_t;
+ time_t sleep_secs;
+ int rv;
if (conn->fd < 0)
return -1;
- FD_ZERO (&rfds);
- FD_SET (conn->fd, &rfds);
-
- return select (conn->fd + 1, &rfds, NULL, NULL, &tv);
+ FOREVER
+ {
+ tv.tv_sec = wait_secs;
+ tv.tv_usec = 0;
+
+ FD_ZERO (&rfds);
+ FD_SET (conn->fd, &rfds);
+
+ clock_gettime (CLOCK_MONOTONIC, &pre_t);
+ rv = select (conn->fd + 1, &rfds, NULL, NULL, &tv);
+ clock_gettime (CLOCK_MONOTONIC, &post_t);
+
+ if (rv > 0 ||
+ (rv < 0 && errno != EINTR))
+ return rv;
+
+ if (SigInt)
+ mutt_query_exit ();
+
+ sleep_secs = post_t.tv_sec - pre_t.tv_sec;
+ if (wait_secs <= sleep_secs)
+ return 0;
+ wait_secs -= sleep_secs;
+ }
}
int raw_socket_open (CONNECTION* conn)
int (*conn_write) (struct _connection *conn, const char *buf, size_t count);
int (*conn_open) (struct _connection *conn);
int (*conn_close) (struct _connection *conn);
- int (*conn_poll) (struct _connection *conn);
+ int (*conn_poll) (struct _connection *conn, time_t wait_secs);
} CONNECTION;
int mutt_socket_open (CONNECTION* conn);
int mutt_socket_close (CONNECTION* conn);
int mutt_socket_read (CONNECTION* conn, char* buf, size_t len);
-int mutt_socket_poll (CONNECTION* conn);
+int mutt_socket_poll (CONNECTION* conn, time_t wait_secs);
int mutt_socket_readchar (CONNECTION *conn, char *c);
#define mutt_socket_readln(A,B,C) mutt_socket_readln_d(A,B,C,MUTT_SOCK_LOG_CMD)
int mutt_socket_readln_d (char *buf, size_t buflen, CONNECTION *conn, int dbg);
int raw_socket_write (CONNECTION* conn, const char* buf, size_t count);
int raw_socket_open (CONNECTION *conn);
int raw_socket_close (CONNECTION *conn);
-int raw_socket_poll (CONNECTION* conn);
+int raw_socket_poll (CONNECTION* conn, time_t wait_secs);
#endif /* _MUTT_SOCKET_H_ */
static int tunnel_socket_close (CONNECTION*);
static int tunnel_socket_read (CONNECTION* conn, char* buf, size_t len);
static int tunnel_socket_write (CONNECTION* conn, const char* buf, size_t len);
-static int tunnel_socket_poll (CONNECTION* conn);
+static int tunnel_socket_poll (CONNECTION* conn, time_t wait_secs);
/* -- public functions -- */
int mutt_tunnel_socket_setup (CONNECTION *conn)
return rc;
}
-static int tunnel_socket_poll (CONNECTION* conn)
+static int tunnel_socket_poll (CONNECTION* conn, time_t wait_secs)
{
TUNNEL_DATA* tunnel = (TUNNEL_DATA*) conn->sockdata;
int ofd;
ofd = conn->fd;
conn->fd = tunnel->readfd;
- rc = raw_socket_poll (conn);
+ rc = raw_socket_poll (conn, wait_secs);
conn->fd = ofd;
return rc;