Add more logging infrastructure

This commit is contained in:
Laurence Withers 2008-07-26 15:33:56 +00:00
parent ff1f6fb734
commit 92606e58e2
3 changed files with 114 additions and 1 deletions

View File

@ -7,9 +7,11 @@
/* Below are all the includes used throughout the application. */ /* Below are all the includes used throughout the application. */
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <getopt.h> #include <getopt.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h>
#include <syslog.h> #include <syslog.h>
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> #include <sys/types.h>

View File

@ -157,6 +157,48 @@ void log_func_syslog(int level, const char* fmt, ...)
/* log_destination_set()
* Set `log_func' function pointer.
*/
void log_destination_set(enum log_destination_t dest)
{
switch(dest) {
case log_destination_stdout:
log_func_fd = STDOUT_FILENO;
log_func = log_func_file;
break;
case log_destination_stderr:
log_func_fd = STDERR_FILENO;
log_func = log_func_file;
break;
case log_destination_syslog:
log_func = log_func_syslog;
break;
case log_destination_file:
/* log_func_fd() must be set by log_destination_set_file() */
log_func = log_func_file;
break;
}
}
/* log_destination_set_file()
* Open `filename' for writing, return 0 on success and -1 on error. sets `log_func_fd'.
*/
int log_destination_set_file(const char* filename) __attribute__((nonnull,warn_unused_result));
int log_destination_set_file(const char* filename)
{
log_func_fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, 0666);
if(log_func_fd == -1) return -1;
return 0;
}
/* options for text editors /* options for text editors
kate: replace-trailing-space-save true; space-indent true; tab-width 4; kate: replace-trailing-space-save true; space-indent true; tab-width 4;
vim: expandtab:ts=4:sw=4 vim: expandtab:ts=4:sw=4

View File

@ -7,8 +7,77 @@
int main(void) /* usage()
* Display the usage info.
*/
void usage(void)
{ {
fputs("Usage:\n\n"
" daemonitor [options] -- /path/to/program [args]\n\n"
"Valid options:\n"
" -h, --help Display this screen.\n"
" -V, --version Display version number.\n"
" -l, --log <dest> Log file destination, may be one of:\n"
" SYSLOG - log to syslog (default)\n"
" STDOUT - log to stdout\n"
" STDERR - log to stderr\n"
" file path - log to file\n"
"", stderr);
}
/* options[]
* The array of long commandline options for getopt(3).
*/
struct option options[] = {
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'V' },
{ "log", required_argument, 0, 'l' },
{ 0, 0, 0, 0 }
};
/* optstr
* The list of short commandline options for getopt(3). Sorted alphabetically, lowercase first.
*/
const char* optstr = "hl:V";
/* main()
* The program driver. Parses the commandline options, sets up the environment, and starts the
* daemon monitoring process.
*/
int main(int argc, char* argv[])
{
const char* log_argument = 0;
while(1) {
switch(getopt_long(argc, argv, optstr, options, 0)) {
case -1: goto opts_done;
case '?': LOG_ANYWHERE("Invalid commandline options."); return 1;
case 'h': usage(); return 1;
case 'V': fputs("daemonitor " VERSION "\n", stderr); return 1;
case 'l': log_argument = optarg; break;
}
}
opts_done:
/* set up logging */
if(!log_argument || !strcmp(log_argument, "SYSLOG")) {
log_destination_set(log_destination_syslog);
} else if(!strcmp(log_argument, "STDOUT")) {
log_destination_set(log_destination_stdout);
} else if(!strcmp(log_argument, "STDERR")) {
log_destination_set(log_destination_stderr);
} else {
if(log_destination_set_file(log_argument)) {
LOG_ANYWHERE("Error logging to file `%s' (%m).", log_argument);
return 1;
}
}
return 0; return 0;
} }