34 #include "lirc/lirc_log.h"
36 #define HOSTNAME_LEN 128
37 char hostname[HOSTNAME_LEN + 1];
42 static int use_syslog = 1;
44 const char* syslogident =
"lircd-" VERSION;
45 const char* logfile =
"syslog";
47 char progname[128] = {
'?',
'\0' };
48 static int nodaemon = 0;
50 static const int PRIO_LEN = 16;
53 static const char* prio2text(
int prio)
56 case LIRC_DEBUG:
return "Debug";
57 case LIRC_NOTICE:
return "Notice";
58 case LIRC_INFO:
return "Info";
59 case LIRC_WARNING:
return "Warning";
60 case LIRC_ERROR:
return "Error";
61 case LIRC_TRACE:
return "Trace";
62 case LIRC_TRACE1:
return "Trace1";
63 case LIRC_TRACE2:
return "Trace2";
64 default:
return "(Bad prio)";
77 if (strcmp(s,
"syslog") == 0) {
88 strncpy(progname, _progname,
sizeof(progname));
96 openlog(syslogident, LOG_CONS | LOG_PID | LOG_PERROR, LOG_LOCAL0);
98 openlog(syslogident, LOG_CONS | LOG_PID, LOG_LOCAL0);
100 lf = fopen(logfile,
"a");
102 fprintf(stderr,
"%s: could not open logfile \"%s\"\n",
107 if (getenv(
"SUDO_USER") != NULL && geteuid() == 0) {
108 user = getenv(
"SUDO_USER");
109 user = user == NULL ?
"root" : user;
111 if (chown(logfile, pw->pw_uid, pw->pw_gid) == -1)
112 perror(
"Cannot reset log file owner.");
114 gethostname(hostname, HOSTNAME_LEN);
133 int lirc_log_reopen(
void)
142 if (-1 == fstat(fileno(lf), &s)) {
143 perror(
"Invalid logfile!");
147 lf = fopen(logfile,
"a");
150 perror(
"Can't open logfile");
153 logprintf(LIRC_INFO,
"reopened logfile");
154 if (-1 == fchmod(fileno(lf), s.st_mode)) {
155 logprintf(LIRC_WARNING,
"could not set file permissions");
173 static loglevel_t symbol2loglevel(
const char* levelstring)
175 static const struct {
const char* label;
int value; } options[] = {
176 {
"TRACE2", LIRC_TRACE2 },
177 {
"TRACE1", LIRC_TRACE1 },
178 {
"TRACE", LIRC_TRACE },
179 {
"DEBUG", LIRC_DEBUG },
180 {
"INFO", LIRC_INFO },
181 {
"NOTICE", LIRC_NOTICE },
182 {
"WARNING", LIRC_WARNING },
183 {
"ERROR", LIRC_ERROR },
190 if (levelstring == NULL || !*levelstring)
191 return LIRC_BADLEVEL;
192 for (i = 0; i <
sizeof(label) && levelstring[i]; i += 1)
193 label[i] = toupper(levelstring[i]);
196 while (options[i].label && strcmp(options[i].label, label) != 0)
198 return options[i].label ? options[i].value : -1;
206 const char*
const level = getenv(
"LIRC_LOGLEVEL");
219 long level = LONG_MAX;
221 if (s == NULL || *s ==
'\0')
222 return LIRC_BADLEVEL;
223 while (isspace(*s) && *s)
226 level = strtol(s, NULL, 10);
228 return LIRC_BADLEVEL;
232 return symbol2loglevel(s);
245 int save_errno = errno;
247 char buff[PRIO_LEN + strlen(format_str)];
249 #ifdef SYSTEMD_LOGPERROR_FIX
251 fprintf(stderr,
"%s: %s ", progname, prio2text(prio));
252 va_start(ap, format_str);
253 vfprintf(stderr, format_str, ap);
260 snprintf(buff,
sizeof(buff),
261 "%s: %s", prio2text(prio), format_str);
262 va_start(ap, format_str);
263 vsyslog(prio, buff, ap);
265 }
else if (lf && prio <=
loglevel) {
269 current = time(¤t);
270 currents = ctime(¤t);
272 fprintf(lf,
"%15.15s %s %s: ",
273 currents + 4, hostname, progname);
274 fprintf(lf,
"%s: ", prio2text(prio));
275 va_start(ap, format_str);
276 vfprintf(lf, format_str, ap);
295 vsnprintf(s,
sizeof(s), fmt, ap);
299 syslog(prio,
"%s: %m\n", s);
301 syslog(prio,
"%m\n");
304 logprintf(prio,
"%s: %s", s, strerror(errno));
318 if (getenv(
"XDG_CACHE_HOME") != NULL) {
319 strncpy(buffer, getenv(
"XDG_CACHE_HOME"), size);
320 buffer[size - 1] =
'\0';
321 }
else if (getenv(
"SUDO_USER") != NULL && geteuid() == 0) {
322 user = getenv(
"SUDO_USER");
326 snprintf(buffer, size,
"%s/.cache", pw->pw_dir);
328 home = getenv(
"HOME");
329 home = home != NULL ? home :
"/tmp";
330 snprintf(buffer, size,
"%s/.cache", home);
332 if (access(buffer, F_OK) != 0) {
333 r = mkdir(buffer, 0777);
336 "Cannot create log directory %s", buffer);
337 syslog(LOG_WARNING,
"Falling back to using /tmp");
338 strcpy(buffer,
"/tmp");
341 strncat(buffer,
"/", size - strlen(buffer) - 1);
342 strncat(buffer, basename, size - strlen(buffer) - 1);
343 strncat(buffer,
".log", size - strlen(buffer) - 1);
348 void hexdump(
char* prefix,
unsigned char* buf,
int len)
355 if (prefix != NULL) {
356 strncpy(str, prefix,
sizeof(str));
357 pos = strnlen(str,
sizeof(str));
360 for (i = 0; i < len; i++) {
361 if (pos + 3 >=
sizeof(str))
367 sprintf(str + pos,
"%02x ", buf[i]);
372 strncpy(str + pos,
"NO DATA",
sizeof(str));
#define LIRC_MAX_LOGLEVEL
int lirc_log_open(const char *_progname, int _nodaemon, loglevel_t level)
void lirc_log_set_file(const char *s)
int lirc_log_use_syslog(void)
#define LIRC_MIN_LOGLEVEL
int lirc_log_setlevel(loglevel_t level)
#define LOGPRINTF(level, fmt, args...)
void hexdump(char *prefix, unsigned char *buf, int len)
loglevel_t lirc_log_defaultlevel(void)
void logperror(loglevel_t prio, const char *fmt,...)
int lirc_log_get_clientlog(const char *basename, char *buffer, ssize_t size)
loglevel_t string2loglevel(const char *s)
void logprintf(loglevel_t prio, const char *format_str,...)