Add more logging infrastructure
This commit is contained in:
parent
ff1f6fb734
commit
92606e58e2
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue