From e5a8f42c1a8bd2ae29d3e826fb3a7cf71a0c3068 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Mon, 11 Apr 2022 12:33:52 +0200 Subject: amtider: handle SIGTERM --- amtider.c | 37 ++++++++++++++++++++++++++++++++++--- redir.c | 12 +++++++++++- redir.h | 2 ++ 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 #include #include +#include #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]; -- cgit