#include #include #include #include "demux.h" void sighandler (int sig) { printf ("Signal: %d\n", sig); } static void cb_timer (void *data) { printf ("Timer: %lu\n", *(unsigned long int *)data); free (data); dmx_remove_signal (SIGUSR2); } static void cb_periodic (void *data) { printf ("Alarm: %lu\n", *(unsigned long int *)data); } static void cb_input (int fd, void *data) { unsigned long int seconds; unsigned long int shift; unsigned long int *datum; timer_id id; int c, i; static timer_id timer[1024]; static int ntim = 0; # define ADD_TIMER(id) if (ntim < 1024) timer[ntim++] = (id) switch (c = getchar()) { case 't': scanf ("%lu", &seconds); datum = malloc (sizeof(unsigned long int)); *datum = seconds; id = dmx_add_timer (seconds, cb_timer, datum); ADD_TIMER (id); printf ("Timer added: %08x\n", id); break; case 'p': scanf ("%lu %lu", &seconds, &shift); datum = malloc (sizeof(unsigned long int)); *datum = seconds; id = dmx_add_periodic_alarm (seconds, shift, cb_periodic, datum); ADD_TIMER (id); printf ("Periodic alarm added: %08x\n", id); break; case 'r': scanf ("%x", &id); datum = dmx_remove_timer (id); printf ("Timer/alarm removed: %08x\n", id); if (datum) free (datum); for (i = 0; i < ntim; i++) if (timer[i] == id) timer[i] = NULL; break; case 'l': printf ("--\n"); for (i = 0; i < ntim; i++) if (timer[i]) printf ("%08x\n", timer[i]); printf ("--\n"); break; case 'q': dmx_stop (); printf ("Demultiplexer stoped.\n"); for (i = 0; i < ntim; i++) { if (timer[i]) { datum = dmx_remove_timer (timer[i]); if (datum) free (datum); } } break; } } int main() { dmx_signal (SIGUSR1, sighandler); dmx_signal (SIGUSR2, sighandler); dmx_signal (SIGHUP, sighandler); dmx_add_input_fd (0, cb_input, NULL); dmx_main_loop (); dmx_cleanup (); return 0; }