summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--amtider.c37
-rw-r--r--redir.c12
-rw-r--r--redir.h2
3 files changed, 47 insertions, 4 deletions
diff --git a/amtider.c b/amtider.c
index 6393804..9601132 100644
--- a/amtider.c
+++ b/amtider.c
@@ -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;
}
diff --git a/redir.c b/redir.c
index bd54637..b191f65 100644
--- a/redir.c
+++ b/redir.c
@@ -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",
diff --git a/redir.h b/redir.h
index 06822d4..618154f 100644
--- a/redir.h
+++ b/redir.h
@@ -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];