Handle signals in poll loop
parent
a65841c3cb
commit
5e9863fa82
25
chat.c
25
chat.c
|
@ -18,6 +18,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
#include <signal.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -34,7 +35,7 @@ char *idNames[IDCap] = {
|
||||||
|
|
||||||
enum Color idColors[IDCap] = {
|
enum Color idColors[IDCap] = {
|
||||||
[None] = Black,
|
[None] = Black,
|
||||||
[Debug] = Red,
|
[Debug] = Green,
|
||||||
[Network] = Gray,
|
[Network] = Gray,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -42,6 +43,11 @@ size_t idNext = Network + 1;
|
||||||
|
|
||||||
struct Self self;
|
struct Self self;
|
||||||
|
|
||||||
|
static volatile sig_atomic_t signals[NSIG];
|
||||||
|
static void signalHandler(int signal) {
|
||||||
|
signals[signal] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
setlocale(LC_CTYPE, "");
|
setlocale(LC_CTYPE, "");
|
||||||
|
|
||||||
|
@ -100,6 +106,11 @@ int main(int argc, char *argv[]) {
|
||||||
ircFormat("NICK :%s\r\n", nick);
|
ircFormat("NICK :%s\r\n", nick);
|
||||||
ircFormat("USER %s 0 * :%s\r\n", user, real);
|
ircFormat("USER %s 0 * :%s\r\n", user, real);
|
||||||
|
|
||||||
|
signal(SIGHUP, signalHandler);
|
||||||
|
signal(SIGINT, signalHandler);
|
||||||
|
signal(SIGTERM, signalHandler);
|
||||||
|
sig_t cursesWinch = signal(SIGWINCH, signalHandler);
|
||||||
|
|
||||||
struct pollfd fds[2] = {
|
struct pollfd fds[2] = {
|
||||||
{ .events = POLLIN, .fd = STDIN_FILENO },
|
{ .events = POLLIN, .fd = STDIN_FILENO },
|
||||||
{ .events = POLLIN, .fd = irc },
|
{ .events = POLLIN, .fd = irc },
|
||||||
|
@ -108,8 +119,20 @@ int main(int argc, char *argv[]) {
|
||||||
int nfds = poll(fds, 2, -1);
|
int nfds = poll(fds, 2, -1);
|
||||||
if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll");
|
if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll");
|
||||||
|
|
||||||
|
if (signals[SIGHUP] || signals[SIGINT] || signals[SIGTERM]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (signals[SIGWINCH]) {
|
||||||
|
signals[SIGWINCH] = 0;
|
||||||
|
cursesWinch(SIGWINCH);
|
||||||
|
fds[0].revents = POLLIN;
|
||||||
|
}
|
||||||
|
|
||||||
if (fds[0].revents) uiRead();
|
if (fds[0].revents) uiRead();
|
||||||
if (fds[1].revents) ircRecv();
|
if (fds[1].revents) ircRecv();
|
||||||
uiDraw();
|
uiDraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ircFormat("QUIT\r\n");
|
||||||
|
uiHide();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue