diff options
-rw-r--r-- | amtider.c | 37 | ||||
-rw-r--r-- | redir.c | 12 | ||||
-rw-r--r-- | redir.h | 2 |
3 files changed, 47 insertions, 4 deletions
@@ -27,6 +27,7 @@ #include <termios.h> #include <signal.h> #include <sys/ioctl.h> +#include <sys/signalfd.h> #include "redir.h" @@ -70,6 +71,24 @@ static int redir_loop(struct redir *r) { struct timeval tv; fd_set set; + sigset_t mask; + int max_fd = r->sock, sfd; + int interval = HEARTBEAT_INTERVAL * 4 / 1000; + + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGQUIT); + + if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) { + perror("sigprocmask"); + exit(1); + } + sfd = signalfd(-1, &mask, 0); + if (sfd < 0) { + perror("signalfd"); + exit(1); + } + for(;;) { if (r->state == REDIR_CLOSED || @@ -77,10 +96,14 @@ static int redir_loop(struct redir *r) break; FD_ZERO(&set); - FD_SET(r->sock,&set); - tv.tv_sec = HEARTBEAT_INTERVAL * 4 / 1000; + FD_SET(r->sock, &set); + if (sfd > 0) { + FD_SET(sfd, &set); + max_fd = sfd > r->sock? sfd : r->sock; + } + tv.tv_sec = interval; tv.tv_usec = 0; - switch (select(r->sock+1,&set,NULL,NULL,&tv)) { + switch (select(max_fd+1,&set,NULL,NULL,&tv)) { case -1: perror("select"); return -1; @@ -93,6 +116,14 @@ static int redir_loop(struct redir *r) if (-1 == redir_data(r)) return -1; } + if (FD_ISSET(sfd, &set)) { + close(sfd); + sfd = -1; + if (-1 == redir_ider_stop(r)) + return -1; + interval = 2; + fprintf(stderr, "Wait %d seconds for reply\n", interval); + } } return 0; } @@ -568,6 +568,12 @@ repeat: snprintf(r->err, sizeof(r->err), "IDE redirection failed"); goto err; } + r->tx_bufsize = (unsigned int)r->buf[16] | + (unsigned int)r->buf[17] << 8; + r->rx_bufsize = (unsigned int)r->buf[18] | + (unsigned int)r->buf[19] << 8; + fprintf(stderr,"IDE redirection enabled, features %d iana %02x%02x%02x%02x\n", + r->buf[21], r->buf[25], r->buf[26], r->buf[27], r->buf[28]); redir_state(r, REDIR_RUN_IDER); break; case IDER_DATA_FROM_HOST: @@ -581,7 +587,11 @@ repeat: bshift = r->blen; /* FIXME */ if (r->blen < bshift) goto again; - redir_stop(r); + redir_state(r, REDIR_CLOSED); + sslexit(r->ctx); + r->ctx = NULL; + close(r->sock); + r->sock = -1; break; default: snprintf(r->err, sizeof(r->err), "%s: unknown r->buf 0x%02x", @@ -32,6 +32,8 @@ struct redir { /* ide-redirection */ unsigned char filename[256]; + unsigned int tx_bufsize; + unsigned int rx_bufsize; int sock; unsigned char buf[64]; |