summaryrefslogtreecommitdiffstats
path: root/amtider.c
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2022-04-11 12:33:52 +0200
committerGerd Hoffmann <kraxel@redhat.com>2022-04-22 14:52:30 +0200
commite5a8f42c1a8bd2ae29d3e826fb3a7cf71a0c3068 (patch)
tree604f6643fc4242127d36900370f12ea8559214b4 /amtider.c
parentdbc54da5c73d9e8dd1b8a258a4723279423e6e58 (diff)
downloadamtterm-e5a8f42c1a8bd2ae29d3e826fb3a7cf71a0c3068.tar.gz
amtider: handle SIGTERM
Diffstat (limited to 'amtider.c')
-rw-r--r--amtider.c37
1 files changed, 34 insertions, 3 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;
}