summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2011-04-12 11:57:02 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-04-12 11:57:02 +0200
commitbb7c9c517f81d263d0d9d8281924e70f77143a10 (patch)
treec581abc1c1d8bb023bb85d7aa01aadefae6a5835
parenta8fba8e8d68134421bbc5027318d06591588c114 (diff)
downloadgnutls-bb7c9c517f81d263d0d9d8281924e70f77143a10.tar.gz
Do not rely on lowat being set.
-rw-r--r--src/cli.c65
1 files changed, 47 insertions, 18 deletions
diff --git a/src/cli.c b/src/cli.c
index 3ff25d5ae0..d886a86b35 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -674,19 +674,58 @@ tls_log_func (int level, const char *str)
fprintf (stderr, "|<%d>| %s", level, str);
}
+#define IN_KEYBOARD 1
+#define IN_NET 2
+#define IN_NONE 0
+/* returns IN_KEYBOARD for keyboard input and IN_NET for network input
+ */
+static int check_net_or_keyboard_input(socket_st* hd)
+{
+ int maxfd;
+ fd_set rset;
+ int err;
+ struct timeval tv;
+
+ do
+ {
+ FD_ZERO (&rset);
+ FD_SET (fileno (stdin), &rset);
+ FD_SET (hd->fd, &rset);
+
+ maxfd = MAX (fileno (stdin), hd->fd);
+ tv.tv_sec = 0;
+ tv.tv_usec = 500 * 1000;
+
+ if (hd->secure == 1)
+ if (gnutls_record_check_pending(hd->session))
+ return IN_NET;
+
+ err = select (maxfd + 1, &rset, NULL, NULL, &tv);
+ if (err < 0)
+ continue;
+
+ if (FD_ISSET (hd->fd, &rset))
+ return IN_NET;
+
+
+ if (FD_ISSET (fileno (stdin), &rset))
+ return IN_KEYBOARD;
+ }
+ while(err == 0);
+
+ return IN_NONE;
+}
+
int
main (int argc, char **argv)
{
- int err, ret;
- int ii, i;
+ int ret;
+ int ii, i, inp;
char buffer[MAX_BUF + 1];
char *session_data = NULL;
char *session_id = NULL;
size_t session_data_size;
size_t session_id_size = 0;
- fd_set rset;
- int maxfd;
- struct timeval tv;
int user_term = 0, retval = 0;
socket_st hd;
ssize_t bytes;
@@ -845,19 +884,9 @@ after_handshake:
}
}
- FD_ZERO (&rset);
- FD_SET (fileno (stdin), &rset);
- FD_SET (hd.fd, &rset);
+ inp = check_net_or_keyboard_input(&hd);
- maxfd = MAX (fileno (stdin), hd.fd);
- tv.tv_sec = 3;
- tv.tv_usec = 0;
-
- err = select (maxfd + 1, &rset, NULL, NULL, &tv);
- if (err < 0)
- continue;
-
- if (FD_ISSET (hd.fd, &rset))
+ if (inp == IN_NET)
{
memset (buffer, 0, MAX_BUF + 1);
ret = socket_recv (&hd, buffer, MAX_BUF);
@@ -889,7 +918,7 @@ after_handshake:
break;
}
- if (FD_ISSET (fileno (stdin), &rset))
+ if (inp == IN_KEYBOARD)
{
if ((bytes = read (fileno (stdin), buffer, MAX_BUF - 1)) <= 0)
{