diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-04-12 11:57:02 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-04-12 11:57:02 +0200 |
commit | bb7c9c517f81d263d0d9d8281924e70f77143a10 (patch) | |
tree | c581abc1c1d8bb023bb85d7aa01aadefae6a5835 | |
parent | a8fba8e8d68134421bbc5027318d06591588c114 (diff) | |
download | gnutls-bb7c9c517f81d263d0d9d8281924e70f77143a10.tar.gz |
Do not rely on lowat being set.
-rw-r--r-- | src/cli.c | 65 |
1 files changed, 47 insertions, 18 deletions
@@ -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) { |