By default, DPDK based applications would only allow logging to syslog as "rte", DAEMON; but for any production application more control is desired to allow using actual application name and overriding the facility. Signed-off-by: Stephen Hemminger --- lib/librte_eal/common/include/eal_private.h | 2 lib/librte_eal/linuxapp/eal/eal.c | 58 ++++++++++++++++- lib/librte_eal/linuxapp/eal/eal_log.c | 4 - lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h | 1 4 files changed, 61 insertions(+), 4 deletions(-) --- a/lib/librte_eal/common/include/eal_private.h 2013-05-29 17:03:20.167850142 -0700 +++ b/lib/librte_eal/common/include/eal_private.h 2013-05-29 17:05:15.066310021 -0700 @@ -115,7 +115,7 @@ int rte_eal_log_early_init(void); * @return * 0 on success, negative on error */ -int rte_eal_log_init(void); +int rte_eal_log_init(const char *id, int facility); /** * Init the default log stream --- a/lib/librte_eal/linuxapp/eal/eal.c 2013-05-29 17:03:20.167850142 -0700 +++ b/lib/librte_eal/linuxapp/eal/eal.c 2013-05-29 17:12:09.317086933 -0700 @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,7 @@ #define OPT_NO_PCI "no-pci" #define OPT_NO_HUGE "no-huge" #define OPT_FILE_PREFIX "file-prefix" +#define OPT_SYSLOG "syslog" #define RTE_EAL_BLACKLIST_SIZE 0x100 @@ -265,6 +267,7 @@ eal_usage(const char *prgname) " (multiple -b options are alowed)\n" " -m MB : memory to allocate (default = size of hugemem)\n" " -r NUM : force number of memory ranks (don't detect)\n" + " --"OPT_SYSLOG" : set syslog facility\n" " --"OPT_HUGE_DIR" : directory where hugetlbfs is mounted\n" " --"OPT_PROC_TYPE": type of this process\n" " --"OPT_FILE_PREFIX": prefix for hugepage filenames\n" @@ -369,6 +372,45 @@ eal_parse_blacklist_opt(const char *opta return (idx); } +static int +eal_parse_syslog(const char *facility) +{ + int i; + static struct { + const char *name; + int value; + } map[] = { + { "auth", LOG_AUTH }, + { "cron", LOG_CRON }, + { "daemon", LOG_DAEMON }, + { "ftp", LOG_FTP }, + { "kern", LOG_KERN }, + { "lpr", LOG_LPR }, + { "mail", LOG_MAIL }, + { "news", LOG_NEWS }, + { "syslog", LOG_SYSLOG }, + { "user", LOG_USER }, + { "uucp", LOG_UUCP }, + { "local0", LOG_LOCAL0 }, + { "local1", LOG_LOCAL1 }, + { "local2", LOG_LOCAL2 }, + { "local3", LOG_LOCAL3 }, + { "local4", LOG_LOCAL4 }, + { "local5", LOG_LOCAL5 }, + { "local6", LOG_LOCAL6 }, + { "local7", LOG_LOCAL7 }, + { NULL, 0 } + }; + + for (i = 0; map[i].name; i++) { + if (!strcmp(facility, map[i].name)) { + internal_config.syslog_facility = map[i].value; + return 0; + } + } + return -1; +} + /* Parse the argument given in the command line of the application */ static int @@ -389,6 +431,7 @@ eal_parse_args(int argc, char **argv) {OPT_NO_SHCONF, 0, 0, 0}, {OPT_PROC_TYPE, 1, 0, 0}, {OPT_FILE_PREFIX, 1, 0, 0}, + {OPT_SYSLOG, 1, 0, 0}, {0, 0, 0, 0} }; @@ -399,6 +442,7 @@ eal_parse_args(int argc, char **argv) internal_config.force_nchannel = 0; internal_config.hugefile_prefix = HUGEFILE_PREFIX_DEFAULT; internal_config.hugepage_dir = NULL; + internal_config.syslog_facility = LOG_DAEMON; #ifdef RTE_LIBEAL_USE_HPET internal_config.no_hpet = 0; #else @@ -487,6 +531,14 @@ eal_parse_args(int argc, char **argv) else if (!strcmp(lgopts[option_index].name, OPT_FILE_PREFIX)) { internal_config.hugefile_prefix = optarg; } + else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) { + if (eal_parse_syslog(optarg) < 0) { + RTE_LOG(ERR, EAL, "invalid parameters for --" + OPT_SYSLOG "\n"); + eal_usage(prgname); + return -1; + } + } break; default: @@ -538,6 +590,10 @@ rte_eal_init(int argc, char **argv) { int i, fctret, ret; pthread_t thread_id; + const char *logid; + + logid = strrchr(argv[0], '/'); + logid = strdup(logid ? logid + 1: argv[0]); thread_id = pthread_self(); @@ -585,7 +641,7 @@ rte_eal_init(int argc, char **argv) if (rte_eal_tailqs_init() < 0) rte_panic("Cannot init tail queues for objects\n"); - if (rte_eal_log_init() < 0) + if (rte_eal_log_init(logid, internal_config.syslog_facility) < 0) rte_panic("Cannot init logs\n"); if (rte_eal_alarm_init() < 0) --- a/lib/librte_eal/linuxapp/eal/eal_log.c 2013-05-29 17:03:20.167850142 -0700 +++ b/lib/librte_eal/linuxapp/eal/eal_log.c 2013-05-29 17:05:15.066310021 -0700 @@ -119,7 +119,7 @@ static cookie_io_functions_t console_log * once memzones are available. */ int -rte_eal_log_init(void) +rte_eal_log_init(const char *id, int facility) { FILE *log_stream; @@ -127,7 +127,7 @@ rte_eal_log_init(void) if (log_stream == NULL) return -1; - openlog("rte", LOG_NDELAY | LOG_PID, LOG_DAEMON); + openlog(id, LOG_NDELAY | LOG_PID, facility); if (rte_eal_common_log_init(log_stream) < 0) return -1; --- a/lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h 2013-05-29 17:03:20.167850142 -0700 +++ b/lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h 2013-05-29 17:05:15.066310021 -0700 @@ -65,6 +65,7 @@ struct internal_config { volatile unsigned no_hpet; /* true to disable HPET */ volatile unsigned vmware_tsc_map; /* true to use VMware TSC mapping instead of native TSC */ volatile unsigned no_shconf; /* true if there is no shared config */ + volatile int syslog_facility; /* facility passed to openlog() */ volatile enum rte_proc_type_t process_type; /* multi-process proc type */ const char *hugefile_prefix; /* the base filename of hugetlbfs files */ const char *hugepage_dir; /* specific hugetlbfs directory to use */