xref: /dpdk/lib/log/log_syslog.c (revision 985130369be32dd68ca104c1ccc86716f6e2bb7b)
1*98513036SStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause
2*98513036SStephen Hemminger  * Copyright(c) 2010-2014 Intel Corporation
3*98513036SStephen Hemminger  */
4*98513036SStephen Hemminger 
5*98513036SStephen Hemminger #include <stdbool.h>
6*98513036SStephen Hemminger #include <stdio.h>
7*98513036SStephen Hemminger #include <string.h>
8*98513036SStephen Hemminger #include <sys/types.h>
9*98513036SStephen Hemminger #include <syslog.h>
10*98513036SStephen Hemminger 
11*98513036SStephen Hemminger #include <rte_common.h>
12*98513036SStephen Hemminger #include <rte_log.h>
13*98513036SStephen Hemminger 
14*98513036SStephen Hemminger #include "log_internal.h"
15*98513036SStephen Hemminger #include "log_private.h"
16*98513036SStephen Hemminger 
17*98513036SStephen Hemminger static int log_facility;
18*98513036SStephen Hemminger 
19*98513036SStephen Hemminger /*
20*98513036SStephen Hemminger  * Usable list of facilities
21*98513036SStephen Hemminger  * Skip kern, mark, and security
22*98513036SStephen Hemminger  */
23*98513036SStephen Hemminger static const struct {
24*98513036SStephen Hemminger 	const char *name;
25*98513036SStephen Hemminger 	int value;
26*98513036SStephen Hemminger } facilitys[] = {
27*98513036SStephen Hemminger 	{ "auth", LOG_AUTH },
28*98513036SStephen Hemminger 	{ "cron", LOG_CRON },
29*98513036SStephen Hemminger 	{ "daemon", LOG_DAEMON },
30*98513036SStephen Hemminger 	{ "ftp", LOG_FTP },
31*98513036SStephen Hemminger 	{ "kern", LOG_KERN },
32*98513036SStephen Hemminger 	{ "lpr", LOG_LPR },
33*98513036SStephen Hemminger 	{ "mail", LOG_MAIL },
34*98513036SStephen Hemminger 	{ "news", LOG_NEWS },
35*98513036SStephen Hemminger 	{ "syslog", LOG_SYSLOG },
36*98513036SStephen Hemminger 	{ "user", LOG_USER },
37*98513036SStephen Hemminger 	{ "uucp", LOG_UUCP },
38*98513036SStephen Hemminger 	{ "local0", LOG_LOCAL0 },
39*98513036SStephen Hemminger 	{ "local1", LOG_LOCAL1 },
40*98513036SStephen Hemminger 	{ "local2", LOG_LOCAL2 },
41*98513036SStephen Hemminger 	{ "local3", LOG_LOCAL3 },
42*98513036SStephen Hemminger 	{ "local4", LOG_LOCAL4 },
43*98513036SStephen Hemminger 	{ "local5", LOG_LOCAL5 },
44*98513036SStephen Hemminger 	{ "local6", LOG_LOCAL6 },
45*98513036SStephen Hemminger 	{ "local7", LOG_LOCAL7 },
46*98513036SStephen Hemminger };
47*98513036SStephen Hemminger 
48*98513036SStephen Hemminger int
49*98513036SStephen Hemminger eal_log_syslog(const char *name)
50*98513036SStephen Hemminger {
51*98513036SStephen Hemminger 	unsigned int i;
52*98513036SStephen Hemminger 
53*98513036SStephen Hemminger 	if (name == NULL) {
54*98513036SStephen Hemminger 		log_facility = LOG_DAEMON;
55*98513036SStephen Hemminger 		return 0;
56*98513036SStephen Hemminger 	}
57*98513036SStephen Hemminger 
58*98513036SStephen Hemminger 	for (i = 0; i < RTE_DIM(facilitys); i++) {
59*98513036SStephen Hemminger 		if (!strcmp(name, facilitys[i].name)) {
60*98513036SStephen Hemminger 			log_facility = facilitys[i].value;
61*98513036SStephen Hemminger 			return 0;
62*98513036SStephen Hemminger 		}
63*98513036SStephen Hemminger 	}
64*98513036SStephen Hemminger 	return -1;
65*98513036SStephen Hemminger }
66*98513036SStephen Hemminger 
67*98513036SStephen Hemminger /* syslog is enabled if facility is set */
68*98513036SStephen Hemminger bool
69*98513036SStephen Hemminger log_syslog_enabled(void)
70*98513036SStephen Hemminger {
71*98513036SStephen Hemminger 	return log_facility != 0; /* LOG_KERN is 0 */
72*98513036SStephen Hemminger }
73*98513036SStephen Hemminger 
74*98513036SStephen Hemminger /*
75*98513036SStephen Hemminger  * default log function
76*98513036SStephen Hemminger  */
77*98513036SStephen Hemminger static ssize_t
78*98513036SStephen Hemminger log_syslog_write(__rte_unused void *c, const char *buf, size_t size)
79*98513036SStephen Hemminger {
80*98513036SStephen Hemminger 	/* Syslog error levels are from 0 to 7, so subtract 1 to convert */
81*98513036SStephen Hemminger 	syslog(rte_log_cur_msg_loglevel() - 1, "%.*s", (int)size, buf);
82*98513036SStephen Hemminger 
83*98513036SStephen Hemminger 	return size;
84*98513036SStephen Hemminger }
85*98513036SStephen Hemminger 
86*98513036SStephen Hemminger static int
87*98513036SStephen Hemminger log_syslog_close(__rte_unused void *c)
88*98513036SStephen Hemminger {
89*98513036SStephen Hemminger 	closelog();
90*98513036SStephen Hemminger 	return 0;
91*98513036SStephen Hemminger }
92*98513036SStephen Hemminger 
93*98513036SStephen Hemminger static cookie_io_functions_t log_syslog_func = {
94*98513036SStephen Hemminger 	.write = log_syslog_write,
95*98513036SStephen Hemminger 	.close = log_syslog_close,
96*98513036SStephen Hemminger };
97*98513036SStephen Hemminger 
98*98513036SStephen Hemminger 
99*98513036SStephen Hemminger FILE *
100*98513036SStephen Hemminger log_syslog_open(const char *id)
101*98513036SStephen Hemminger {
102*98513036SStephen Hemminger 	int option = LOG_CONS | LOG_NDELAY | LOG_PID | LOG_PERROR;
103*98513036SStephen Hemminger 
104*98513036SStephen Hemminger 	openlog(id, option, log_facility);
105*98513036SStephen Hemminger 
106*98513036SStephen Hemminger 	/* redirect other log messages to syslog as well */
107*98513036SStephen Hemminger 	return fopencookie(NULL, "w", log_syslog_func);
108*98513036SStephen Hemminger }
109