46 #include "lirc/lirc_log.h"
48 #define HOSTNAME_LEN 128
49 char hostname[HOSTNAME_LEN + 1];
54 static int use_syslog = 1;
56 const char *syslogident =
"lircd-" VERSION;
57 const char *logfile =
"syslog";
59 char progname[128] = {
'?',
'\0'};
60 static int nodaemon = 0;
63 static const char* prio2text(
int prio)
66 case LIRC_DEBUG:
return "Debug";
67 case LIRC_NOTICE:
return "Notice";
68 case LIRC_INFO:
return "Info";
69 case LIRC_WARNING:
return "Warning";
70 case LIRC_ERROR:
return "Error";
71 case LIRC_TRACE:
return "Trace";
72 case LIRC_TRACE1:
return "Trace1";
73 case LIRC_TRACE2:
return "Trace2";
74 default:
return "(Bad prio)";
87 if (strcmp(s,
"syslog") == 0) {
98 strncpy(progname, _progname,
sizeof(progname));
104 openlog(syslogident, LOG_CONS | LOG_PID | LOG_PERROR, LOG_LOCAL0);
106 openlog(syslogident, LOG_CONS | LOG_PID, LOG_LOCAL0);
109 lf = fopen(logfile,
"a");
111 fprintf(stderr,
"%s: could not open logfile \"%s\"\n",
116 gethostname(hostname, HOSTNAME_LEN);
135 int lirc_log_reopen(
void)
144 if (-1 == fstat(fileno(lf), &s)) {
145 perror(
"Invalid logfile!");
149 lf = fopen(logfile,
"a");
152 perror(
"Can't open logfile");
155 logprintf(LIRC_INFO,
"reopened logfile");
156 if (-1 == fchmod(fileno(lf), s.st_mode)) {
157 logprintf(LIRC_WARNING,
"could not set file permissions");
175 static loglevel_t symbol2loglevel(
const char* levelstring)
177 static const struct {
const char* label;
int value;} options[] = {
178 {
"TRACE2" , LIRC_TRACE2},
179 {
"TRACE1" , LIRC_TRACE1},
180 {
"TRACE" , LIRC_TRACE},
181 {
"DEBUG" , LIRC_DEBUG},
182 {
"INFO" , LIRC_INFO},
183 {
"NOTICE" , LIRC_NOTICE},
184 {
"WARNING" , LIRC_WARNING},
185 {
"ERROR" , LIRC_ERROR},
192 if (levelstring == NULL || ! *levelstring)
193 return LIRC_BADLEVEL;
194 for (i = 0; i <
sizeof(label) && levelstring[i]; i += 1)
195 label[i] = toupper(levelstring[i]);
198 while (options[i].label && strcmp(options[i].label, label) != 0)
200 return options[i].label ? options[i].value : -1;
208 const char*
const level = getenv(
"LIRC_LOGLEVEL");
221 long level = LONG_MAX;
223 if (s == NULL || *s ==
'\0')
224 return LIRC_BADLEVEL;
225 while (isspace(*s) && *s)
228 level = strtol(s, NULL, 10);
230 return LIRC_BADLEVEL;
234 return symbol2loglevel(s);
247 int save_errno = errno;
250 #ifdef SYSTEMD_LOGPERROR_FIX
252 fprintf(stderr,
"%s: %s ", progname, prio2text(prio));
253 va_start(ap, format_str);
254 vfprintf(stderr, format_str, ap);
261 va_start(ap, format_str);
262 vsyslog(prio, format_str, ap);
264 }
else if (lf && prio <=
loglevel) {
268 current = time(¤t);
269 currents = ctime(¤t);
271 fprintf(lf,
"%15.15s %s %s: ",
272 currents + 4, hostname, progname);
273 fprintf(lf,
"%s: ", prio2text(prio));
274 va_start(ap, format_str);
275 vfprintf(lf, format_str, ap);
294 vsnprintf(s,
sizeof(s), fmt, ap);
298 syslog(prio,
"%s: %m\n", s);
300 syslog(prio,
"%m\n");
303 logprintf(prio,
"%s: %s", s, strerror(errno));
315 if (getenv(
"XDG_CACHE_HOME") != NULL ) {
316 strncpy(buffer, getenv(
"XDG_CACHE_HOME"), size);
317 buffer[size - 1] =
'\0';
318 strncat(buffer,
"/", size - strlen(buffer) - 1);
320 home = getenv(
"HOME");
321 home = home != NULL ? home :
"/";
322 strncpy(buffer, home, size);
323 buffer[size - 1] =
'\0';
324 strncat(buffer,
"/.cache/", size - strlen(buffer) - 1);
326 strncat(buffer, basename, size - strlen(buffer) - 1);
327 strncat(buffer,
".log", size - strlen(buffer) - 1);
332 void hexdump(
char *prefix,
unsigned char* buf,
int len)
338 if (prefix != NULL) {
339 strncpy(str, prefix,
sizeof(str));
340 pos = strnlen(str,
sizeof(str));
343 for (i = 0; i < len; i++) {
344 if (pos + 3 >=
sizeof(str)) {
352 sprintf(str + pos,
"%02x ", buf[i]);
357 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)
#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)
int lirc_log_use_syslog()
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,...)