.ra_piofolder_fd = -1,
.uci_cfgfile = "dhcp",
.log_level = LOG_WARNING,
+ .log_level_cmdline = false,
+ .log_syslog = true,
};
#define START_DEFAULT 100
if ((c = tb[ODHCPD_ATTR_LOGLEVEL])) {
int log_level = (blobmsg_get_u32(c) & LOG_PRIMASK);
- if (config.log_level != log_level) {
+ if (config.log_level != log_level && config.log_level_cmdline) {
config.log_level = log_level;
- setlogmask(LOG_UPTO(config.log_level));
+ if (config.log_syslog)
+ setlogmask(LOG_UPTO(config.log_level));
+ notice("Log level set to %d\n", config.log_level);
}
}
}
"\n"
" -c <path> Use an alternative configuration file\n"
" -l <int> Specify log level 0..7 (default %d)\n"
+ " -f Log to stderr instead of syslog\n"
" -h Print this help text and exit\n",
app, config.log_level);
}
int main(int argc, char **argv)
{
- openlog("odhcpd", LOG_PERROR | LOG_PID, LOG_DAEMON);
int opt;
- while ((opt = getopt(argc, argv, "c:l:h")) != -1) {
+ while ((opt = getopt(argc, argv, "c:l:fh")) != -1) {
switch (opt) {
case 'c':
config.uci_cfgfile = realpath(optarg, NULL);
break;
case 'l':
config.log_level = (atoi(optarg) & LOG_PRIMASK);
+ config.log_level_cmdline = true;
fprintf(stderr, "Log level set to %d\n", config.log_level);
break;
+ case 'f':
+ config.log_syslog = false;
+ fprintf(stderr, "Logging to stderr\n");
+ break;
case 'h':
print_usage(argv[0]);
return 0;
}
}
- setlogmask(LOG_UPTO(config.log_level));
+
+ if (config.log_syslog) {
+ openlog("odhcpd", LOG_PERROR | LOG_PID, LOG_DAEMON);
+ setlogmask(LOG_UPTO(config.log_level));
+ }
+
uloop_init();
if (getuid() != 0) {
extern struct vlist_tree leases;
extern struct config config;
-#define __iflog(lvl, fmt, ...) \
- do { \
- if (lvl <= config.log_level) \
- syslog(lvl, fmt __VA_OPT__(, ) __VA_ARGS__); \
+#define __iflog(lvl, fmt, ...) \
+ do { \
+ if (lvl > config.log_level) \
+ break; \
+ if (config.log_syslog) \
+ syslog(lvl, fmt __VA_OPT__(, ) __VA_ARGS__); \
+ else \
+ fprintf(stderr, fmt "\n" __VA_OPT__(, ) __VA_ARGS__); \
} while(0)
#define debug(fmt, ...) __iflog(LOG_DEBUG, fmt __VA_OPT__(, ) __VA_ARGS__)
char *uci_cfgfile;
int log_level;
+ bool log_level_cmdline;
+ bool log_syslog;
};
/* 2-byte type + 128-byte DUID, RFC8415, §11.1 */