diff options
author | Hannes Reinecke <hare@suse.de> | 2022-04-11 12:33:52 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2022-04-22 14:52:30 +0200 |
commit | e5a8f42c1a8bd2ae29d3e826fb3a7cf71a0c3068 (patch) | |
tree | 604f6643fc4242127d36900370f12ea8559214b4 /amtider.c | |
parent | dbc54da5c73d9e8dd1b8a258a4723279423e6e58 (diff) | |
download | amtterm-e5a8f42c1a8bd2ae29d3e826fb3a7cf71a0c3068.tar.gz |
amtider: handle SIGTERM
Diffstat (limited to 'amtider.c')
-rw-r--r-- | amtider.c | 37 |
1 files changed, 34 insertions, 3 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; } |