From eccb685c7402702b778810a4e82469a8419c06ae Mon Sep 17 00:00:00 2001 From: Alexander Wenzel Date: Tue, 10 Jun 2014 17:43:09 +0200 Subject: Added configuration of dbus filter. Signed-off-by: Alexander Wenzel --- src/dbus/CMakeLists.txt | 2 +- src/dbus/dlt-dbus-options.c | 243 ++++++++++++++++++++++++++++++++++++++++++++ src/dbus/dlt-dbus.c | 176 +++++++++++++++++--------------- src/dbus/dlt-dbus.conf | 18 +++- src/dbus/dlt-dbus.h | 40 ++++++++ 5 files changed, 393 insertions(+), 86 deletions(-) create mode 100644 src/dbus/dlt-dbus-options.c diff --git a/src/dbus/CMakeLists.txt b/src/dbus/CMakeLists.txt index 4d26358..284a17b 100644 --- a/src/dbus/CMakeLists.txt +++ b/src/dbus/CMakeLists.txt @@ -20,7 +20,7 @@ include_directories( ${DBUS_INCLUDE_DIRS} ) -set(dlt_dbus_SRCS dlt-dbus.c) +set(dlt_dbus_SRCS dlt-dbus.c dlt-dbus-options.c) add_executable(dlt-dbus ${dlt_dbus_SRCS}) target_link_libraries(dlt-dbus dlt ${DBUS_LIBRARIES}) diff --git a/src/dbus/dlt-dbus-options.c b/src/dbus/dlt-dbus-options.c new file mode 100644 index 0000000..f1c72dd --- /dev/null +++ b/src/dbus/dlt-dbus-options.c @@ -0,0 +1,243 @@ +/** + * @licence app begin@ + * Copyright (C) 2014 BMW AG + * + * This file is part of GENIVI Project Dlt - Diagnostic Log and Trace console apps. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * \author Alexander Wenzel + * + * \file dlt-dbus-options.c + * For further information see http://www.genivi.org/. + * @licence end@ + */ + +#include "dlt-dbus.h" + +#include +#include + +/** + * Print information how to use this program. + */ +void usage(char *prog_name) +{ + char version[255]; + dlt_get_version(version,255); + + printf("Usage: %s [options]\n", prog_name); + printf("Application to forward dbus messages to DLT.\n"); + printf("%s\n", version); + printf("Options:\n"); + printf(" -d Daemonize. Detach from terminal and run in background.\n"); + printf(" -c filename Use configuration file. \n"); + printf(" -a appid Used application id. \n"); + printf(" Default: %s\n", DEFAULT_CONF_FILE); + printf(" -b type Used bus type. \n"); + printf(" Session = 0, System = 1.\n"); + printf(" -h This help message.\n"); +} + +/** + * Initialize command line options with default values. + */ +void init_cli_options(DltDBusCliOptions *options) +{ + options->ConfigurationFileName = DEFAULT_CONF_FILE; + options->ApplicationId = 0; + options->BusType = 0; + options->Daemonize = 0; +} + +/** + * Read command line options and set the values in provided structure + */ +int read_command_line(DltDBusCliOptions *options, int argc, char *argv[]) +{ + init_cli_options(options); + int opt; + + while((opt = getopt(argc, argv, "c:b:a:hd")) != -1) + { + switch(opt) { + case 'd': + { + options->Daemonize = 1; + break; + } + case 'b': + { + options->BusType = malloc(strlen(optarg)+1); + MALLOC_ASSERT(options->BusType); + strcpy(options->BusType, optarg); /* strcpy unritical here, because size matches exactly the size to be copied */ + break; + } + case 'a': + { + options->ApplicationId = malloc(strlen(optarg)+1); + MALLOC_ASSERT(options->ApplicationId); + strcpy(options->ApplicationId, optarg); /* strcpy unritical here, because size matches exactly the size to be copied */ + break; + } + case 'c': + { + options->ConfigurationFileName = malloc(strlen(optarg)+1); + MALLOC_ASSERT(options->ConfigurationFileName); + strcpy(options->ConfigurationFileName, optarg); /* strcpy unritical here, because size matches exactly the size to be copied */ + break; + } + case 'h': + { + usage(argv[0]); + exit(0); + return -1;//for parasoft + } + default: + { + fprintf(stderr, "Unknown option '%c'\n", optopt); + usage(argv[0]); + return -1; + } + } + } + return 0; +} + +/** + * Initialize configuration to default values. + */ +void init_configuration(DltDBusConfiguration *config) +{ + // Common + config->ApplicationId = "IPC0"; + + // DBus + config->DBus.ContextId = "ALL"; + config->DBus.BusType = 0; + config->DBus.FilterCount = 0; + +} + +/** + * Read options from the configuration file + */ +int read_configuration_file(DltDBusConfiguration *config, char *file_name) +{ + FILE *file; + char *line, *token, *value, *filter, *pch; + int ret = 0; + char *filterBegin,*filterEnd; + + init_configuration(config); + + file = fopen(file_name, "r"); + + if(file == NULL) + { + fprintf(stderr, "dlt-dbus-options, could not open configuration file.\n"); + return -1; + } + + line = malloc(MAX_LINE); + token = malloc(MAX_LINE); + value = malloc(MAX_LINE); + filter = malloc(MAX_LINE); + + MALLOC_ASSERT(line); + MALLOC_ASSERT(token); + MALLOC_ASSERT(value); + MALLOC_ASSERT(filter); + + while(fgets(line, MAX_LINE, file) != NULL) + { + token[0] = 0; + value[0] = 0; + filter[0] = 0; + + filterBegin = strchr(line,'='); + filterEnd = strpbrk (line,"\r\n"); + + if(filterBegin) + { + if(filterEnd && (filterEnd>filterBegin)) + { + strncpy(filter,filterBegin+1,filterEnd-filterBegin-1); + filter[filterEnd-filterBegin-1]=0; + } + else + { + strcpy(filter,filterBegin+1); + } + } + + pch = strtok (line, " =\r\n"); + while(pch != NULL) + { + if(pch[0] == '#') + break; + + if(token[0] == 0) + { + strncpy(token, pch, MAX_LINE-1); + token[MAX_LINE-1]=0; + } + else + { + strncpy(value, pch, MAX_LINE); + value[MAX_LINE-1]=0; + break; + } + + pch = strtok (NULL, " =\r\n"); + } + + if(token[0] && value[0]) + { + // Common + if(strcmp(token, "ApplicationId") == 0) + { + config->ApplicationId = malloc(strlen(value)+1); + MALLOC_ASSERT(config->ApplicationId); + strcpy(config->ApplicationId, value); /* strcpy unritical here, because size matches exactly the size to be copied */ + } + // ContextId + else if(strcmp(token, "ContextId") == 0) + { + config->DBus.ContextId = malloc(strlen(value)+1); + MALLOC_ASSERT(config->DBus.ContextId); + strcpy(config->DBus.ContextId, value); /* strcpy unritical here, because size matches exactly the size to be copied */ + } + // BusType + else if(strcmp(token, "BusType") == 0) + { + config->DBus.BusType = malloc(strlen(value)+1); + MALLOC_ASSERT(config->DBus.BusType); + strcpy(config->DBus.BusType, value); /* strcpy unritical here, because size matches exactly the size to be copied */ + } + // BusType + else if(strcmp(token, "FilterMatch") == 0) + { + if(config->DBus.FilterCountDBus.FilterMatch[config->DBus.FilterCount]= malloc(strlen(filter)+1); + MALLOC_ASSERT(config->DBus.FilterMatch[config->DBus.FilterCount]); + strcpy(config->DBus.FilterMatch[config->DBus.FilterCount], filter); + config->DBus.FilterCount++; + } + } + } + } + fclose(file); + free(value); + free(token); + free(filter); + free(line); + return ret; +} diff --git a/src/dbus/dlt-dbus.c b/src/dbus/dlt-dbus.c index 53eb94c..5cbba85 100644 --- a/src/dbus/dlt-dbus.c +++ b/src/dbus/dlt-dbus.c @@ -12,7 +12,6 @@ * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with * this file, You can obtain one at http://mozilla.org/MPL/2.0/. * - * * \author Alexander Wenzel * * \file dlt-dbus.c @@ -37,41 +36,20 @@ #define EAVESDROPPING_RULE "" #endif +DLT_DECLARE_CONTEXT(dbusLog); DLT_DECLARE_CONTEXT(dbusContext); static char dbus_message_buffer[DBUS_MAXIMUM_MESSAGE_LENGTH]; -static const char* -type_to_name (int message_type) -{ - switch (message_type) - { - case DBUS_MESSAGE_TYPE_SIGNAL: - return "signal"; - case DBUS_MESSAGE_TYPE_METHOD_CALL: - return "method call"; - case DBUS_MESSAGE_TYPE_METHOD_RETURN: - return "method return"; - case DBUS_MESSAGE_TYPE_ERROR: - return "error"; - default: - return "(unknown message type)"; - } -} - static DBusHandlerResult filter_func (DBusConnection *con, DBusMessage *message, void *data) { - DBusMessageIter iter; - const char *sender; - const char *destination; char **buf; - int message_type; - char *log_message; - int log_type; int len_p; + UNUSED(con); + UNUSED(data); buf = (char**)&dbus_message_buffer; if (!dbus_message_marshal(message, @@ -81,7 +59,7 @@ filter_func (DBusConnection *con, fprintf (stderr, "Failed to serialize DBus message!\n"); return DBUS_HANDLER_RESULT_HANDLED; } - //DLT_LOG (dbusContext, DLT_LOG_INFO, DLT_STRING("dbus message"), DLT_RAW ((void *)*buf, len_p)); + DLT_TRACE_NETWORK_SEGMENTED(dbusContext,DLT_NW_TRACE_IPC,0,0,len_p,(void *)*buf); if (dbus_message_is_signal (message, @@ -103,66 +81,96 @@ filter_func (DBusConnection *con, int main (int argc, char *argv[]) { - /* DLT initialisation */ - DLT_REGISTER_APP ("IPC0", "DBus Logging"); - DLT_REGISTER_CONTEXT(dbusContext, "ALL", "DBus Context for Logging"); - - DBusConnection *connection; - DBusError error; - DBusBusType type = DBUS_BUS_SESSION; - //DBusBusType type = DBUS_BUS_SYSTEM; - - dbus_error_init (&error); - - connection = dbus_bus_get (type, &error); - if (NULL == connection) - { - fprintf (stderr, "Failed to open connection to %s: %s\n", - DBUS_BUS_SYSTEM, - error.message); - dbus_error_free (&error); - exit (1); - } - - dbus_bus_add_match (connection, - EAVESDROPPING_RULE "type='signal'", - &error); - if (dbus_error_is_set (&error)) - goto fail; - dbus_bus_add_match (connection, - EAVESDROPPING_RULE "type='method_call'", - &error); - if (dbus_error_is_set (&error)) - goto fail; - dbus_bus_add_match (connection, - EAVESDROPPING_RULE "type='method_return'", - &error); - if (dbus_error_is_set (&error)) - goto fail; - dbus_bus_add_match (connection, - EAVESDROPPING_RULE "type='error'", - &error); - if (dbus_error_is_set (&error)) - goto fail; - - if (!dbus_connection_add_filter (connection, filter_func, NULL, NULL)) { - fprintf (stderr, "Couldn't add filter!\n"); - exit (1); - } - - while (dbus_connection_read_write_dispatch(connection, -1)) - ; - - DLT_UNREGISTER_CONTEXT (dbusContext); - DLT_UNREGISTER_APP (); - exit(1); + DltDBusCliOptions options; + DltDBusConfiguration config; + + DBusConnection *connection; + DBusError error; + DBusBusType type; + + int num; + + if(read_command_line(&options, argc, argv) < 0) + { + fprintf(stderr, "Failed to read command line!\n"); + return -1; + } + + if(read_configuration_file(&config, options.ConfigurationFileName) < 0) + { + fprintf(stderr, "Failed to read configuration file!\n"); + return -1; + } + + // register application + if(options.ApplicationId) + DLT_REGISTER_APP (options.ApplicationId, "DBus Logging"); + else + DLT_REGISTER_APP (config.ApplicationId, "DBus Logging"); + + // register context + DLT_REGISTER_CONTEXT(dbusContext, config.DBus.ContextId, "DBus Context for Logging"); + DLT_REGISTER_CONTEXT(dbusLog, "Log", "DBus Context for Logging Generic information"); + + // initialise error handler + dbus_error_init (&error); + + // set DBus bus type + if(options.BusType) + type = (DBusBusType) atoi(options.BusType); + else + type = (DBusBusType) atoi(config.DBus.BusType); + + // get connection + connection = dbus_bus_get (type, &error); + + if(type==0) + DLT_LOG(dbusLog,DLT_LOG_INFO,DLT_STRING("BusType"),DLT_STRING("Session Bus")); + else if(type==1) + DLT_LOG(dbusLog,DLT_LOG_INFO,DLT_STRING("BusType"),DLT_STRING("System Bus")); + else + DLT_LOG(dbusLog,DLT_LOG_INFO,DLT_STRING("BusType"),DLT_INT(type)); + + if (NULL == connection) + { + fprintf (stderr, "Failed to open connection to %d: %s\n", + DBUS_BUS_SYSTEM, + error.message); + dbus_error_free (&error); + exit (1); + } + + for(num=0;num