diff --git a/daemon.c b/daemon.c new file mode 100644 --- /dev/null +++ b/daemon.c @@ -0,0 +1,103 @@ +/** + * test/demos/daemon.c + * Copyright (C) 2008 Markus Broeker + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define MAXLEN 80 +#define TIME_OUT 60 +#define INPUT_FILE "/proc/meminfo" +#define OUTPUT_FILE "/tmp/meminfo.log" +#define LOCK_FILE "/tmp/.daemon.lock" + +void check (int fd, char *buffer) +{ + char response[1024]; + char time_stamp[40]; + int len; + + time_t t; + + t = time (NULL); + strftime (time_stamp, sizeof (time_stamp), "%a %d %T", localtime (&t)); + len = snprintf (response, sizeof (response), "%s %s", time_stamp, buffer); + + write (fd, response, len); +} + +void sigproc () +{ + if (unlink (LOCK_FILE) == 0) + exit (EXIT_SUCCESS); + exit (EXIT_FAILURE); +} + +void sanity_check (int argc, char **argv) +{ + struct stat st; + int fd; + + if (argc == 2) { + if (!strcmp (argv[1], "-h")) { + printf ("Usage: %s [-f|]\n", argv[0]); + printf ("Report bugs to mbroeker@largo.homelinux.org\n"); + exit (EXIT_SUCCESS); + } else if (!strcmp (argv[1], "-f")) { + if (unlink (LOCK_FILE) != 0) + exit (EXIT_FAILURE); + } else { + fprintf (stderr, "Unknown Option %s\n", argv[1]); + exit (EXIT_FAILURE); + } + } + + if (stat (LOCK_FILE, &st) < 0) { + fd = open (LOCK_FILE, O_WRONLY | O_CREAT, 0); + close (fd); + } else { + fprintf (stderr, "%s is already running\n", argv[0]); + exit (EXIT_FAILURE); + } + + fprintf (stderr, "%s monitors %s every %d seconds into %s\n", argv[0], INPUT_FILE, TIME_OUT, OUTPUT_FILE); +} + +int main (int argc, char **argv) +{ + FILE *fin; + static char buffer[MAXLEN]; + int fd; + + sanity_check (argc, argv); + + daemon (0, 0); + signal (SIGTERM, sigproc); + + for (;;) { + if ((fd = open (OUTPUT_FILE, O_WRONLY | O_CREAT, 0644)) < 0) + return EXIT_FAILURE; + + if ((fin = fopen (INPUT_FILE, "r")) == NULL) + return EXIT_FAILURE; + + while (fgets (buffer, sizeof (buffer), fin)) + check (fd, buffer); + + fclose (fin); + close (fd); + + sleep (TIME_OUT); + } + + return EXIT_SUCCESS; +}