// Copyright (c) 2001  David Muse
// See the file COPYING for more information

#include <rudiments/signalclasses.h>
#include <rudiments/stdio.h>

bool    gotsigterm=false;

void handleSigterm(int32_t sig) {
        stdoutput.printf("Got a SIGTERM!\n");
        gotsigterm=true;
}

#ifdef SIGALRM
void handleAlarm(int32_t sig) {
        stdoutput.printf("alarm!\n");
}
#endif

int main(int argc, const char **argv) {

        // ignore all signals except SIGTERM and SIGALRM
        signalset       ignoreset;
        ignoreset.addAllSignals();
        ignoreset.removeSignal(SIGTERM);
        #ifdef SIGALRM
        ignoreset.removeSignal(SIGALRM);
        #endif
        signalmanager::ignoreSignals(&ignoreset);

        // run handleSigterm() when a SIGTERM is received
        signalhandler   termhandler;
        termhandler.setHandler(handleSigterm);
        termhandler.handleSignal(SIGTERM);

        // run handleAlarm() when a SIGALRM is received
        #ifdef SIGALRM
        signalhandler   alarmhandler;
        alarmhandler.setHandler(handleAlarm);
        alarmhandler.handleSignal(SIGALRM);
        #endif

        // Loop forever, waiting to receive a signal that we are not ignoring.
        signalmanager::alarm(2);
        while (!gotsigterm) {
                signalmanager::waitForSignals(&ignoreset);
                signalmanager::alarm(2);
        }
}