mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-17 23:08:40 +02:00
Don't make SIGINT kill a background process; don't call printf from a signal-handler; use sigaction instead of signal
This commit is contained in:
18
src/main.c
18
src/main.c
@@ -1357,13 +1357,23 @@ void UTCToLocal(int utcdate, int utctime, int *locdate, int *loctime)
|
|||||||
/* command-line flag is supplied. */
|
/* command-line flag is supplied. */
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
|
static sig_atomic_t got_sigint = 0;
|
||||||
|
|
||||||
void SigIntHandler(int d)
|
void
|
||||||
|
SigIntHandler(int d)
|
||||||
{
|
{
|
||||||
UNUSED(d);
|
UNUSED(d);
|
||||||
signal(SIGINT, SigIntHandler);
|
got_sigint = 1;
|
||||||
GotSigInt();
|
}
|
||||||
exit(0);
|
|
||||||
|
int
|
||||||
|
GotSigInt(void)
|
||||||
|
{
|
||||||
|
if (got_sigint) {
|
||||||
|
got_sigint = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ int MoonPhase (int date, int time);
|
|||||||
void HuntPhase (int startdate, int starttim, int phas, int *date, int *time);
|
void HuntPhase (int startdate, int starttim, int phas, int *date, int *time);
|
||||||
int CompareRems (int dat1, int tim1, int prio1, int dat2, int tim2, int prio2, int bydate, int bytime, int byprio, int untimed_first);
|
int CompareRems (int dat1, int tim1, int prio1, int dat2, int tim2, int prio2, int bydate, int bytime, int byprio, int untimed_first);
|
||||||
void SigIntHandler (int d);
|
void SigIntHandler (int d);
|
||||||
void GotSigInt (void);
|
int GotSigInt (void);
|
||||||
void PurgeEchoLine(char const *fmt, ...);
|
void PurgeEchoLine(char const *fmt, ...);
|
||||||
void FreeTrig(Trigger *t);
|
void FreeTrig(Trigger *t);
|
||||||
void AppendTag(DynamicBuffer *buf, char const *s);
|
void AppendTag(DynamicBuffer *buf, char const *s);
|
||||||
|
|||||||
20
src/queue.c
20
src/queue.c
@@ -59,6 +59,7 @@ static QueuedRem *FindNextReminder (void);
|
|||||||
static int CalculateNextTimeUsingSched (QueuedRem *q);
|
static int CalculateNextTimeUsingSched (QueuedRem *q);
|
||||||
static void DaemonWait (struct timeval *sleep_tv);
|
static void DaemonWait (struct timeval *sleep_tv);
|
||||||
static void reread (void);
|
static void reread (void);
|
||||||
|
static void PrintQueue(void);
|
||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* */
|
/* */
|
||||||
@@ -123,6 +124,7 @@ void HandleQueuedReminders(void)
|
|||||||
Trigger trig;
|
Trigger trig;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct timeval sleep_tv;
|
struct timeval sleep_tv;
|
||||||
|
struct sigaction sa;
|
||||||
|
|
||||||
/* Suppress the BANNER from being issued */
|
/* Suppress the BANNER from being issued */
|
||||||
NumTriggered = 1;
|
NumTriggered = 1;
|
||||||
@@ -161,7 +163,11 @@ void HandleQueuedReminders(void)
|
|||||||
q = q->next;
|
q = q->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DontFork || Daemon) signal(SIGINT, SigIntHandler);
|
if (!DontFork || Daemon) {
|
||||||
|
sa.sa_handler = SigIntHandler;
|
||||||
|
sa.sa_flags = 0;
|
||||||
|
(void) sigaction(SIGINT, &sa, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Sit in a loop, issuing reminders when necessary */
|
/* Sit in a loop, issuing reminders when necessary */
|
||||||
while(1) {
|
while(1) {
|
||||||
@@ -205,6 +211,10 @@ void HandleQueuedReminders(void)
|
|||||||
sleep(SleepTime);
|
sleep(SleepTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GotSigInt()) {
|
||||||
|
PrintQueue();
|
||||||
|
}
|
||||||
|
|
||||||
/* If not in daemon mode and day has rolled around,
|
/* If not in daemon mode and day has rolled around,
|
||||||
exit -- not much we can do. */
|
exit -- not much we can do. */
|
||||||
if (!Daemon) {
|
if (!Daemon) {
|
||||||
@@ -337,13 +347,13 @@ static QueuedRem *FindNextReminder(void)
|
|||||||
|
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
/* */
|
/* */
|
||||||
/* GotSigInt */
|
/* PrintQueue */
|
||||||
/* */
|
/* */
|
||||||
/* Split out what's done on a SIGINT from the SIGINT Handler. */
|
/* For debugging: Print queue contents to STDOUT */
|
||||||
/* This will be necessary for OS/2 multithreaded. */
|
|
||||||
/* */
|
/* */
|
||||||
/***************************************************************/
|
/***************************************************************/
|
||||||
void GotSigInt(void)
|
static
|
||||||
|
void PrintQueue(void)
|
||||||
{
|
{
|
||||||
QueuedRem *q = QueueHead;
|
QueuedRem *q = QueueHead;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user