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