kopia lustrzana https://github.com/FreeSpacenav/spacenavd
made log target a commandline option
rodzic
af9b3a1060
commit
28a39b9219
|
|
@ -66,9 +66,6 @@ void default_cfg(struct cfg *cfg)
|
||||||
cfg->devname[i] = 0;
|
cfg->devname[i] = 0;
|
||||||
cfg->devid[i][0] = cfg->devid[i][1] = -1;
|
cfg->devid[i][0] = cfg->devid[i][1] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg->use_logfile = 1;
|
|
||||||
cfg->use_syslog = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EXPECT(cond) \
|
#define EXPECT(cond) \
|
||||||
|
|
@ -315,13 +312,6 @@ int read_cfg(const char *fname, struct cfg *cfg)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if(strcmp(key_str, "logfile") == 0) {
|
|
||||||
strncpy(cfg->logfile, val_str, PATH_MAX - 1);
|
|
||||||
|
|
||||||
} else if(strcmp(key_str, "log") == 0) {
|
|
||||||
cfg->use_logfile = strstr(val_str, "file") == 0 ? 1 : 0;
|
|
||||||
cfg->use_syslog = strstr(val_str, "syslog") == 0 ? 1 : 0;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
logmsg(LOG_WARNING, "unrecognized config option: %s\n", key_str);
|
logmsg(LOG_WARNING, "unrecognized config option: %s\n", key_str);
|
||||||
}
|
}
|
||||||
|
|
@ -473,33 +463,6 @@ int write_cfg(const char *fname, struct cfg *cfg)
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
|
|
||||||
fprintf(fp, "# Log file path\n");
|
|
||||||
if(cfg->logfile[0]) {
|
|
||||||
fprintf(fp, "logfile = %s\n\n", cfg->logfile);
|
|
||||||
} else {
|
|
||||||
fprintf(fp, "#logfile = " DEF_LOGFILE "\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(fp, "# Log targets\n");
|
|
||||||
fprintf(fp, "#\n");
|
|
||||||
fprintf(fp, "# Valid options are:\n");
|
|
||||||
fprintf(fp, "# - file: log messages to a file defined by the logfile option.\n");
|
|
||||||
fprintf(fp, "# - syslog: log messages to the system logging daemon.\n");
|
|
||||||
fprintf(fp, "# Combine multiple options by listing them on the same line.\n");
|
|
||||||
fprintf(fp, "#\n");
|
|
||||||
if(cfg->use_logfile || cfg->use_syslog) {
|
|
||||||
fprintf(fp, "log =");
|
|
||||||
if(cfg->use_logfile) {
|
|
||||||
fprintf(fp, " file");
|
|
||||||
}
|
|
||||||
if(cfg->use_syslog) {
|
|
||||||
fprintf(fp, " syslog");
|
|
||||||
}
|
|
||||||
fputc('\n', fp);
|
|
||||||
} else {
|
|
||||||
fprintf(fp, "#log = file, syslog\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* unlock */
|
/* unlock */
|
||||||
flk.l_type = F_UNLCK;
|
flk.l_type = F_UNLCK;
|
||||||
flk.l_start = flk.l_len = 0;
|
flk.l_start = flk.l_len = 0;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
spacenavd - a free software replacement driver for 6dof space-mice.
|
spacenavd - a free software replacement driver for 6dof space-mice.
|
||||||
Copyright (C) 2007-2018 John Tsiombikas <nuclear@member.fsf.org>
|
Copyright (C) 2007-2019 John Tsiombikas <nuclear@member.fsf.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -45,9 +45,6 @@ struct cfg {
|
||||||
|
|
||||||
char *devname[MAX_CUSTOM]; /* custom USB device name list */
|
char *devname[MAX_CUSTOM]; /* custom USB device name list */
|
||||||
int devid[MAX_CUSTOM][2]; /* custom USB vendor/product id list */
|
int devid[MAX_CUSTOM][2]; /* custom USB vendor/product id list */
|
||||||
|
|
||||||
char logfile[PATH_MAX];
|
|
||||||
int use_logfile, use_syslog;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void default_cfg(struct cfg *cfg);
|
void default_cfg(struct cfg *cfg);
|
||||||
|
|
|
||||||
|
|
@ -311,7 +311,7 @@ struct usb_device_info *find_usb_devices(int (*match)(const struct usb_device_in
|
||||||
buf_len = sizeof(buf) - 1;
|
buf_len = sizeof(buf) - 1;
|
||||||
if(!(fp = fopen(PROC_DEV, "r"))) {
|
if(!(fp = fopen(PROC_DEV, "r"))) {
|
||||||
if(verbose) {
|
if(verbose) {
|
||||||
logmsg(LOG_ERR, "failed to open " PROC_DEV);
|
logmsg(LOG_ERR, "failed to open " PROC_DEV ": %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
goto alt_detect;
|
goto alt_detect;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
src/logger.c
16
src/logger.c
|
|
@ -36,6 +36,7 @@ int start_logfile(const char *fname)
|
||||||
int start_syslog(const char *id)
|
int start_syslog(const char *id)
|
||||||
{
|
{
|
||||||
openlog(id, LOG_NDELAY, LOG_DAEMON);
|
openlog(id, LOG_NDELAY, LOG_DAEMON);
|
||||||
|
use_syslog = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,22 +44,11 @@ void logmsg(int prio, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
/* if a logfile isn't open, assume we are not daemonized, and try to output
|
|
||||||
* to stdout/stderr as usual. If we are daemonized but don't have a log file
|
|
||||||
* this will end up writing harmlessly to /dev/null (see daemonize in spnavd.c)
|
|
||||||
*/
|
|
||||||
va_start(ap, fmt);
|
|
||||||
if(logfile) {
|
if(logfile) {
|
||||||
|
va_start(ap, fmt);
|
||||||
vfprintf(logfile, fmt, ap);
|
vfprintf(logfile, fmt, ap);
|
||||||
} else {
|
|
||||||
if(prio <= LOG_WARNING) {
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
} else {
|
|
||||||
vprintf(fmt, ap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
}
|
||||||
if(use_syslog) {
|
if(use_syslog) {
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
vsyslog(prio, fmt, ap);
|
vsyslog(prio, fmt, ap);
|
||||||
|
|
|
||||||
45
src/spnavd.c
45
src/spnavd.c
|
|
@ -45,6 +45,7 @@ static void handle_events(fd_set *rset);
|
||||||
static void sig_handler(int s);
|
static void sig_handler(int s);
|
||||||
|
|
||||||
static const char *cfgfile = DEF_CFGFILE;
|
static const char *cfgfile = DEF_CFGFILE;
|
||||||
|
static const char *logfile = DEF_LOGFILE;
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
@ -65,6 +66,18 @@ int main(int argc, char **argv)
|
||||||
cfgfile = argv[i];
|
cfgfile = argv[i];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
if(!argv[++i]) {
|
||||||
|
fprintf(stderr, "-l must be followed by a logfile name or \"syslog\"\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if(strcmp(argv[i], "syslog") == 0) {
|
||||||
|
logfile = 0;
|
||||||
|
} else {
|
||||||
|
logfile = argv[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -72,10 +85,11 @@ int main(int argc, char **argv)
|
||||||
case 'h':
|
case 'h':
|
||||||
printf("usage: %s [options]\n", argv[0]);
|
printf("usage: %s [options]\n", argv[0]);
|
||||||
printf("options:\n");
|
printf("options:\n");
|
||||||
printf(" -d do not daemonize\n");
|
printf(" -d: do not daemonize\n");
|
||||||
printf(" -c <file> config file path (default: " DEF_CFGFILE ")\n");
|
printf(" -c <file>: config file path (default: " DEF_CFGFILE ")\n");
|
||||||
printf(" -v verbose output\n");
|
printf(" -l <file>|syslog: log file path or log to syslog (default: " DEF_LOGFILE ")\n");
|
||||||
printf(" -h print usage information and exit\n");
|
printf(" -v: verbose output\n");
|
||||||
|
printf(" -h: print usage information and exit\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -102,15 +116,6 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
read_cfg(cfgfile, &cfg);
|
read_cfg(cfgfile, &cfg);
|
||||||
|
|
||||||
if(become_daemon) {
|
|
||||||
if(cfg.use_syslog) {
|
|
||||||
start_syslog(SYSLOG_ID);
|
|
||||||
}
|
|
||||||
if(cfg.use_logfile) {
|
|
||||||
start_logfile(cfg.logfile[0] ? cfg.logfile : DEF_LOGFILE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
signal(SIGINT, sig_handler);
|
signal(SIGINT, sig_handler);
|
||||||
signal(SIGTERM, sig_handler);
|
signal(SIGTERM, sig_handler);
|
||||||
signal(SIGSEGV, sig_handler);
|
signal(SIGSEGV, sig_handler);
|
||||||
|
|
@ -250,14 +255,24 @@ static void daemonize(void)
|
||||||
setsid();
|
setsid();
|
||||||
chdir("/");
|
chdir("/");
|
||||||
|
|
||||||
/* redirect standard input/output/error */
|
/* redirect standard input/output/error
|
||||||
|
* best effort attempt to make either the logfile or the syslog socket
|
||||||
|
* accessible through stdout/stderr, just in case any printfs survived
|
||||||
|
* the logmsg conversion.
|
||||||
|
*/
|
||||||
for(i=0; i<3; i++) {
|
for(i=0; i<3; i++) {
|
||||||
close(i);
|
close(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
open("/dev/zero", O_RDONLY);
|
open("/dev/zero", O_RDONLY);
|
||||||
open("/dev/null", O_WRONLY);
|
|
||||||
|
if(!logfile || start_logfile(logfile) == -1) {
|
||||||
|
start_syslog(SYSLOG_ID);
|
||||||
|
}
|
||||||
dup(1);
|
dup(1);
|
||||||
|
|
||||||
|
setvbuf(stdout, 0, _IOLBF, 0);
|
||||||
|
setvbuf(stderr, 0, _IONBF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int write_pid_file(void)
|
static int write_pid_file(void)
|
||||||
|
|
|
||||||
Ładowanie…
Reference in New Issue