SIGTYPE sigint (int signo);
SIGTYPE sigterm (int signo);
SIGTYPE sighup (int signo);
-void unalarm (void);
+void checksigs(void);
void init (void);
void set_tty_parameters (void);
int echo_stderr (int);
void chat_expect (register char *s);
char *clean (register char *s, int sending);
void break_sequence (void);
-void terminate (int status);
void pack_array (char **array, int end);
char *expect_strtok (char *, char *);
int vfmtmsg (char *, int, const char *, va_list); /* vsprintf++ */
report_fp = stderr;
if (to_log) {
-#ifdef ultrix
- openlog("chat", LOG_PID);
-#else
openlog("chat", LOG_PID | LOG_NDELAY, LOG_LOCAL2);
if (verbose)
setlogmask(LOG_UPTO(LOG_INFO));
else
setlogmask(LOG_UPTO(LOG_WARNING));
-#endif
}
init();
if ((arg = ARG(argc, argv)) != NULL)
chat_send(arg);
+ checksigs();
}
}
else
chat_expect (arg);
sendflg = !sendflg;
+ checksigs();
}
}
+ checksigs();
fclose (cfp);
}
}
int alarmed = 0;
+int alarmsig = 0;
SIGTYPE sigalrm(int signo)
{
int flags;
alarm(1);
- alarmed = 1; /* Reset alarm to avoid race window */
- signal(SIGALRM, sigalrm); /* that can cause hanging in read() */
-
- if ((flags = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin: %m");
-
- if (fcntl(0, F_SETFL, flags | O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-
- if (verbose)
- msgf("alarm");
+ alarmed = 1;
+ alarmsig = 1;
}
-void unalarm(void)
-{
- int flags;
-
- if ((flags = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin: %m");
-
- if (fcntl(0, F_SETFL, flags & ~O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-}
+const char *fatalsig = NULL;
SIGTYPE sigint(int signo)
{
- fatal(2, "SIGINT");
+ fatalsig = "SIGINT";
}
SIGTYPE sigterm(int signo)
{
- fatal(2, "SIGTERM");
+ fatalsig = "SIGTERM";
}
SIGTYPE sighup(int signo)
{
- fatal(2, "SIGHUP");
+ fatalsig = "SIGHUP";
+}
+
+void checksigs(void)
+{
+ int err;
+ const char *signame;
+
+ if (fatalsig) {
+ signame = fatalsig;
+ fatalsig = NULL;
+ alarmsig = 0;
+ fatal(2, signame);
+ }
+ if (alarmsig && verbose) {
+ err = errno;
+ msgf("alarm");
+ errno = err;
+ alarmsig = 0;
+ }
}
void init(void)
{
- signal(SIGINT, sigint);
- signal(SIGTERM, sigterm);
- signal(SIGHUP, sighup);
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = sigint;
+ sigaction(SIGINT, &sa, NULL);
+ sa.sa_handler = sigterm;
+ sigaction(SIGTERM, &sa, NULL);
+ sa.sa_handler = sighup;
+ sigaction(SIGHUP, &sa, NULL);
set_tty_parameters();
- signal(SIGALRM, sigalrm);
+ sa.sa_handler = sigalrm;
+ sigaction(SIGALRM, &sa, NULL);
alarm(0);
alarmed = 0;
}
break;
chat_send (reply);
+ checksigs();
}
/*
{
char file_data[STR_LEN];
int len, ret = 0;
+ struct sigaction sa;
if (say_next) {
say_next = 0;
if (hup_next) {
hup_next = 0;
+ memset(&sa, 0, sizeof(sa));
+
if (strcmp(s, "OFF") == 0)
- signal(SIGHUP, SIG_IGN);
+ sa.sa_handler = SIG_IGN;
else
- signal(SIGHUP, sighup);
+ sa.sa_handler = sighup;
+ sigaction(SIGHUP, &sa, NULL);
return 0;
}
char c;
status = read(0, &c, 1);
+ checksigs();
switch (status) {
case 1:
msgf("warning: read() on stdin returned %d", status);
case -1:
- if ((status = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin: %m");
-
- if (fcntl(0, F_SETFL, status & ~O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-
return (-1);
}
}
char ch = c;
usleep(10000); /* inter-character typing delay (?) */
+ checksigs();
status = write(1, &ch, 1);
+ checksigs();
switch (status) {
case 1:
msgf("warning: write() on stdout returned %d", status);
case -1:
- if ((status = fcntl(0, F_GETFL, 0)) == -1)
- fatal(2, "Can't get file mode flags on stdin, %m");
-
- if (fcntl(0, F_SETFL, status & ~O_NONBLOCK) == -1)
- fatal(2, "Can't set file mode flags on stdin: %m");
-
return (-1);
}
}
return 0;
break;
}
+ checksigs();
}
alarm(0);
need_lf = 1;
break;
}
+ checksigs();
return ret;
}