tcsetattr(slave, TCSANOW, &tt);
}
+/* ************************************************************* */
+
+static int dgl_signal_blocked = 0;
+static sigset_t dgl_signal_blockmask;
+static sigset_t dgl_signal_oldmask;
+
+void
+signals_block()
+{
+ if (!dgl_signal_blocked) {
+ sigemptyset(&dgl_signal_blockmask);
+ sigaddset(&dgl_signal_blockmask, SIGHUP);
+ sigaddset(&dgl_signal_blockmask, SIGINT);
+ sigaddset(&dgl_signal_blockmask, SIGQUIT);
+ sigaddset(&dgl_signal_blockmask, SIGTERM);
+ sigprocmask(SIG_BLOCK, &dgl_signal_blockmask, &dgl_signal_oldmask);
+ dgl_signal_blocked = 1;
+ }
+}
+
+void
+signals_release()
+{
+ if (dgl_signal_blocked) {
+ sigprocmask(SIG_SETMASK, &dgl_signal_oldmask, NULL);
+ dgl_signal_blocked = 0;
+ }
+}
+
+
/* ************************************************************* */
char*
sleep (5);
}
#ifdef USE_SHMEM
+ signals_block();
if (hup_shm_idx != -1) {
struct dg_shm *shm_dg_data = NULL;
struct dg_shm_game *shm_dg_game = NULL;
hup_shm_idx = -1;
free(hup_shm_ttyrec_fn);
}
+ signals_release();
#endif
debug_write("catchup sighup");
graceful_exit (2);
refresh ();
endwin ();
#ifdef USE_SHMEM
+ signals_block();
if (games[idx]->is_in_shm) {
shm_idx = games[idx]->shm_idx;
shm_sem_wait(shm_dg_data);
hup_shm_ttyrec_fn = strdup(games[idx]->ttyrec_fn);
shm_sem_post(shm_dg_data);
}
+ signals_release();
#endif
resizey = games[idx]->ws_row;
resizex = games[idx]->ws_col;
else
setproctitle("<Anonymous>");
#ifdef USE_SHMEM
+ signals_block();
if (games[idx]->is_in_shm) {
hup_shm_idx = -1;
free(hup_shm_ttyrec_fn);
}
shm_sem_post(shm_dg_data);
}
+ signals_release();
#endif
initcurses ();
}
int i = 0;
int my_done = 0;
struct flock fl = { 0 };
- sigset_t oldmask, toblock;
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
- sigemptyset(&toblock);
- sigaddset(&toblock, SIGHUP);
- sigaddset(&toblock, SIGINT);
- sigaddset(&toblock, SIGQUIT);
- sigaddset(&toblock, SIGTERM);
- sigprocmask(SIG_BLOCK, &toblock, &oldmask);
+ signals_block();
fpl = fopen (globalconfig.lockfile, "r+");
if (!fpl)
{
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ signals_release();
debug_write("writefile locking failed");
graceful_exit (115);
}
if (fcntl (fileno (fpl), F_SETLK, &fl))
{
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ signals_release();
debug_write("writefile fcntl failed");
graceful_exit (107);
}
fp = fopen (globalconfig.passwd, "w");
if (!fp)
{
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ signals_release();
debug_write("passwd file fopen failed");
graceful_exit (104);
}
* as someone else. just die. */
fclose(fp);
fclose(fpl);
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ signals_release();
debug_write("two users registering at the same time");
graceful_exit (111);
}
{
fclose(fp);
fclose(fpl);
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ signals_release();
debug_write("too many users in passwd db already");
graceful_exit (116);
}
fclose (fp);
fclose (fpl);
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
+ signals_release();
}
#else
void
/* signal handlers */
signal (SIGHUP, catch_sighup);
+ signal (SIGINT, catch_sighup);
+ signal (SIGQUIT, catch_sighup);
+ signal (SIGTERM, catch_sighup);
+
signal(SIGWINCH, sigwinch_func);
(void) tcgetattr (0, &tt);