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