diff options
Diffstat (limited to 'src/daemon')
-rw-r--r-- | src/daemon/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/daemon/dlt-daemon.c | 252 | ||||
-rw-r--r-- | src/daemon/dlt-daemon.h | 11 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_common.c | 35 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_common.h | 3 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_common_cfg.h | 5 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_connection.c | 9 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_connection_types.h | 2 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_unix_socket.c | 31 | ||||
-rw-r--r-- | src/daemon/dlt_daemon_unix_socket.h | 5 |
10 files changed, 272 insertions, 82 deletions
diff --git a/src/daemon/CMakeLists.txt b/src/daemon/CMakeLists.txt index 83d4302..063913b 100644 --- a/src/daemon/CMakeLists.txt +++ b/src/daemon/CMakeLists.txt @@ -44,3 +44,4 @@ endif(WITH_DLT_UNIT_TESTS) INSTALL(FILES dlt.conf DESTINATION ${CONFIGURATION_FILES_DIR} COMPONENT base) + diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c index 064a008..6611015 100644 --- a/src/daemon/dlt-daemon.c +++ b/src/daemon/dlt-daemon.c @@ -132,7 +132,7 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) /* default values */ daemon_local->flags.port = DLT_DAEMON_TCP_PORT; - strncpy(dltFifoBaseDir, "/tmp", NAME_MAX); + strncpy(dltFifoBaseDir, DLT_USER_IPC_PATH, sizeof(DLT_USER_IPC_PATH)); opterr = 0; @@ -196,7 +196,9 @@ int option_handling(DltDaemonLocal *daemon_local,int argc, char* argv[]) } /* switch() */ } +#ifndef DLT_USE_UNIX_SOCKET_IPC snprintf(daemon_local->flags.userPipesDir, NAME_MAX + 1, "%s/dltpipes", dltFifoBaseDir); +#endif snprintf(daemon_local->flags.daemonFifoName, NAME_MAX + 1, "%s/dlt", dltFifoBaseDir); return 0; @@ -248,6 +250,14 @@ int option_file_parser(DltDaemonLocal *daemon_local) strncpy(daemon_local->flags.ctrlSockPath, DLT_DAEMON_DEFAULT_CTRL_SOCK_PATH, sizeof(daemon_local->flags.ctrlSockPath) - 1); +#ifdef DLT_USE_UNIX_SOCKET_IPC + snprintf(daemon_local->flags.appSockPath, DLT_IPC_PATH_MAX, "%s/dlt", DLT_USER_IPC_PATH); + if (strlen(DLT_USER_IPC_PATH) > DLT_IPC_PATH_MAX) + { + fprintf(stderr,"Provided path too long...trimming it to path[%s]\n", + daemon_local->flags.appSockPath); + } +#endif daemon_local->flags.gatewayMode = 0; strncpy(daemon_local->flags.gatewayConfigFile, DLT_GATEWAY_CONFIG_PATH, @@ -577,6 +587,49 @@ int option_file_parser(DltDaemonLocal *daemon_local) return 0; } +#ifndef DLT_USE_UNIX_SOCKET_IPC +static DltReturnValue dlt_daemon_create_pipes_dir(char *dir) +{ + int ret = DLT_RETURN_OK; + + if (dir == NULL) + { + dlt_vlog(LOG_ERR, "%s: Invalid parameter\n", __func__); + return DLT_RETURN_WRONG_PARAMETER; + } + + /* create dlt pipes directory */ + ret = mkdir(dir, + S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH|S_ISVTX); + + if ((ret == -1) && (errno != EEXIST)) + { + dlt_vlog(LOG_ERR, + "FIFO user dir %s cannot be created (%s)!\n", + dir, + strerror(errno)); + + return DLT_RETURN_ERROR; + } + + // S_ISGID cannot be set by mkdir, let's reassign right bits + ret = chmod(dir, + S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH|S_ISGID|S_ISVTX); + + if (ret == -1) + { + dlt_vlog(LOG_ERR, + "FIFO user dir %s cannot be chmoded (%s)!\n", + dir, + strerror(errno)); + + return DLT_RETURN_ERROR; + } + + return ret; +} +#endif + /** * Main function of tool. */ @@ -621,6 +674,7 @@ int main(int argc, char* argv[]) PRINT_FUNCTION_VERBOSE(daemon_local.flags.vflag); +#ifndef DLT_USE_UNIX_SOCKET_IPC /* Make sure the parent user directory is created */ if (dlt_mkdir_recursive(dltFifoBaseDir) != 0) { @@ -628,6 +682,7 @@ int main(int argc, char* argv[]) dlt_log(LOG_ERR, str); return -1; } +#endif /* --- Daemon init phase 1 begin --- */ if (dlt_daemon_local_init_p1(&daemon, &daemon_local, daemon_local.flags.vflag)==-1) @@ -747,9 +802,8 @@ int main(int argc, char* argv[]) int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose) { - int ret; - PRINT_FUNCTION_VERBOSE(verbose); + int ret = DLT_RETURN_OK; if ((daemon==0) || (daemon_local==0)) { @@ -760,9 +814,9 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in #if defined(DLT_SYSTEMD_WATCHDOG_ENABLE) || defined(DLT_SYSTEMD_ENABLE) ret = sd_booted(); - if(ret == 0){ + if (ret == 0) + { dlt_log(LOG_CRIT, "System not booted with systemd!\n"); -// return -1; } else if(ret < 0) { @@ -775,25 +829,12 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in } #endif - const char *tmpFifo = daemon_local->flags.userPipesDir; - - /* create dlt pipes directory */ - ret=mkdir(tmpFifo, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH | S_ISVTX ); - if (ret==-1 && errno != EEXIST) +#ifndef DLT_USE_UNIX_SOCKET_IPC + if (dlt_daemon_create_pipes_dir(daemon_local->flags.userPipesDir) == DLT_RETURN_ERROR) { - snprintf(str,DLT_DAEMON_TEXTBUFSIZE,"FIFO user dir %s cannot be created (%s)!\n", tmpFifo, strerror(errno)); - dlt_log(LOG_WARNING, str); - return -1; - } - - // S_ISGID cannot be set by mkdir, let's reassign right bits - ret=chmod(tmpFifo, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH | S_ISGID | S_ISVTX ); - if (ret==-1) - { - snprintf(str,DLT_DAEMON_TEXTBUFSIZE,"FIFO user dir %s cannot be chmoded (%s)!\n", tmpFifo, strerror(errno)); - dlt_log(LOG_WARNING, str); - return -1; + return DLT_RETURN_ERROR; } +#endif /* Check for daemon mode */ if (daemon_local->flags.dflag) @@ -802,12 +843,13 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in } /* initialise structure to use DLT file */ - if (dlt_file_init(&(daemon_local->file),daemon_local->flags.vflag) == DLT_RETURN_ERROR) + ret = dlt_file_init(&(daemon_local->file),daemon_local->flags.vflag); + if (ret == DLT_RETURN_ERROR) { dlt_log(LOG_ERR,"Could not initialize file structure\n"); /* Return value ignored, dlt daemon will exit */ dlt_file_free(&(daemon_local->file),daemon_local->flags.vflag); - return -1; + return ret; } signal(SIGPIPE,SIG_IGN); @@ -817,7 +859,7 @@ int dlt_daemon_local_init_p1(DltDaemon *daemon, DltDaemonLocal *daemon_local, in signal(SIGQUIT, dlt_daemon_signal_handler); signal(SIGINT, dlt_daemon_signal_handler); - return 0; + return DLT_RETURN_OK; } int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose) @@ -993,6 +1035,7 @@ static int dlt_daemon_init_serial(DltDaemonLocal *daemon_local) DLT_CONNECTION_CLIENT_MSG_SERIAL); } +#ifndef DLT_USE_UNIX_SOCKET_IPC static int dlt_daemon_init_fifo(DltDaemonLocal *daemon_local) { int ret; @@ -1063,6 +1106,7 @@ static int dlt_daemon_init_fifo(DltDaemonLocal *daemon_local) EPOLLIN, DLT_CONNECTION_APP_MSG); } +#endif int dlt_daemon_local_connection_init(DltDaemon *daemon, DltDaemonLocal *daemon_local, @@ -1070,6 +1114,8 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon, { char local_str[DLT_DAEMON_TEXTBUFSIZE]; int fd = -1; + int mask = 0; + PRINT_FUNCTION_VERBOSE(verbose); if ((daemon == NULL) || (daemon_local == NULL)) @@ -1083,43 +1129,88 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon, return -1; } +#ifdef DLT_USE_UNIX_SOCKET_IPC + /* create and open socket to receive incoming connections from user application + * socket access permission set to srw-rw-rw- (666) */ + mask = S_IXUSR | S_IXGRP | S_IXOTH; + if (dlt_daemon_unix_socket_open(&fd, + daemon_local->flags.appSockPath, + SOCK_STREAM, + mask) == DLT_RETURN_OK) + { + if (dlt_connection_create(daemon_local, + &daemon_local->pEvent, + fd, + EPOLLIN, + DLT_CONNECTION_APP_CONNECT)) + { + dlt_log(LOG_CRIT, "Could not initialize app socket.\n"); + return DLT_RETURN_ERROR; + } + } + else + { + dlt_log(LOG_CRIT, "Could not initialize app socket.\n"); + return DLT_RETURN_ERROR; + } +#else if (dlt_daemon_init_fifo(daemon_local)) { dlt_log(LOG_ERR, "Unable to initialize fifo.\n"); - return -1; + return DLT_RETURN_ERROR; } +#endif /* create and open socket to receive incoming connections from client */ daemon_local->client_connections = 0; - if(dlt_daemon_socket_open(&fd, daemon_local->flags.port) || - dlt_connection_create(daemon_local, - &daemon_local->pEvent, - fd, - EPOLLIN, - DLT_CONNECTION_CLIENT_CONNECT)) + if (dlt_daemon_socket_open(&fd, daemon_local->flags.port) == DLT_RETURN_OK) + { + if (dlt_connection_create(daemon_local, + &daemon_local->pEvent, + fd, + EPOLLIN, + DLT_CONNECTION_CLIENT_CONNECT)) + { + dlt_log(LOG_ERR,"Could not initialize main socket.\n"); + return DLT_RETURN_ERROR; + } + } + else { dlt_log(LOG_ERR,"Could not initialize main socket.\n"); - return -1; + return DLT_RETURN_ERROR; } /* create and open unix socket to receive incoming connections from - * control application */ - if (dlt_daemon_unix_socket_open(&fd, daemon_local->flags.ctrlSockPath) || - dlt_connection_create(daemon_local, - &daemon_local->pEvent, - fd, - EPOLLIN, - DLT_CONNECTION_CONTROL_CONNECT)) + * control application + * socket access permission set to srw-rw---- (660) */ + mask = S_IXUSR | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH; + if (dlt_daemon_unix_socket_open(&fd, + daemon_local->flags.ctrlSockPath, + SOCK_STREAM, + mask) == DLT_RETURN_OK) + { + if (dlt_connection_create(daemon_local, + &daemon_local->pEvent, + fd, + EPOLLIN, + DLT_CONNECTION_CONTROL_CONNECT)) + { + dlt_log(LOG_ERR, "Could not initialize control socket.\n"); + return DLT_RETURN_ERROR; + } + } + else { dlt_log(LOG_ERR, "Could not initialize control socket.\n"); - return -1; + return DLT_RETURN_ERROR; } /* Init serial */ if (dlt_daemon_init_serial(daemon_local) < 0) { dlt_log(LOG_ERR,"Could not initialize daemon data\n"); - return -1; + return DLT_RETURN_ERROR; } return 0; @@ -1813,7 +1904,62 @@ int dlt_daemon_process_control_connect( return 0; } -// FIXME: More or less copy of dlt_daemon_process_control_messages +#ifdef DLT_USE_UNIX_SOCKET_IPC +int dlt_daemon_process_app_connect( + DltDaemon *daemon, + DltDaemonLocal *daemon_local, + DltReceiver *receiver, + int verbose) +{ + socklen_t app_size; + struct sockaddr_un app; + int in_sock = -1; + + PRINT_FUNCTION_VERBOSE(verbose); + + if ((daemon == NULL) || (daemon_local == NULL) || (receiver == NULL)) + { + dlt_vlog(LOG_ERR, + "%s: Invalid parameters\n", + __func__); + return DLT_RETURN_WRONG_PARAMETER; + } + + /* event from UNIX server socket, new connection */ + app_size = sizeof(app); + if ((in_sock = accept(receiver->fd, &app, &app_size)) < 0) + { + dlt_log(LOG_ERR, "accept() on UNIX socket failed!\n"); + return -1 ; + } + + /* check if file file descriptor was already used, and make it invalid if it + * is reused. This prevents sending messages to wrong file descriptor */ + dlt_daemon_applications_invalidate_fd(daemon, in_sock, verbose); + dlt_daemon_contexts_invalidate_fd(daemon, in_sock, verbose); + + if (dlt_connection_create(daemon_local, + &daemon_local->pEvent, + in_sock, + EPOLLIN, + DLT_CONNECTION_APP_MSG)) + { + dlt_log(LOG_ERR, "Failed to register new application. \n"); + close(in_sock); + return -1; + } + + if (verbose) + { + snprintf(str,DLT_DAEMON_TEXTBUFSIZE, + "New connection to application established\n"); + dlt_log(LOG_INFO, str); + } + + return 0; +} +#endif + int dlt_daemon_process_control_messages( DltDaemon *daemon, DltDaemonLocal *daemon_local, @@ -1954,6 +2100,7 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon, int run_loop = 1; int32_t min_size = (int32_t)sizeof(DltUserHeader); DltUserHeader *userheader; + int recv; PRINT_FUNCTION_VERBOSE(verbose); @@ -1965,13 +2112,25 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon, return -1; } - /* read data from FIFO */ - if (dlt_receiver_receive_fd(receiver) < 0) + recv = dlt_receiver_receive(receiver); +#ifdef DLT_USE_UNIX_SOCKET_IPC + if (recv <= 0) + { + dlt_daemon_close_socket(receiver->fd, + daemon, + daemon_local, + verbose); + receiver->fd = -1; + return 0; + } +#else + if (recv < 0) { dlt_log(LOG_WARNING, "dlt_receiver_receive_fd() for user messages failed!\n"); return -1; } +#endif /* look through buffer as long as data is in there */ while ((receiver->bytesRcvd >= min_size) && run_loop) @@ -2177,6 +2336,7 @@ int dlt_daemon_process_user_message_register_application(DltDaemon *daemon, userapp.apid, userapp.pid, description, + rec->fd, verbose); /* send log state to new application */ @@ -2258,8 +2418,8 @@ int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, if (len > DLT_DAEMON_DESCSIZE) { + dlt_vlog(LOG_WARNING, "Context description exceeds limit: %d\n", len); len = DLT_DAEMON_DESCSIZE; - dlt_log(LOG_WARNING, "Context description exceeds limit\n"); } /* adjust buffer pointer */ diff --git a/src/daemon/dlt-daemon.h b/src/daemon/dlt-daemon.h index 03b062e..80b0760 100644 --- a/src/daemon/dlt-daemon.h +++ b/src/daemon/dlt-daemon.h @@ -70,14 +70,14 @@ #define DLT_DAEMON_H #include <limits.h> /* for NAME_MAX */ +#include <sys/time.h> #include "dlt_daemon_common.h" #include "dlt_user_shared.h" #include "dlt_user_shared_cfg.h" #include "dlt_daemon_event_handler_types.h" #include "dlt_gateway_types.h" -#include <dlt_offline_trace.h> -#include <sys/time.h> +#include "dlt_offline_trace.h" #define DLT_DAEMON_FLAG_MAX 256 @@ -119,7 +119,11 @@ typedef struct unsigned int offlineLogstorageMaxCounter; /**< (int) Maximum offline logstorage file counter index until wraparound */ unsigned int offlineLogstorageMaxCounterIdx; /**< (int) String len of offlineLogstorageMaxCounter*/ unsigned int offlineLogstorageCacheSize; /**< Max cache size offline logstorage cache */ +#ifdef DLT_USE_UNIX_SOCKET_IPC + char appSockPath[DLT_DAEMON_FLAG_MAX]; /**< Path to User socket */ +#else char userPipesDir[NAME_MAX + 1]; /**< (String: Directory) directory where dltpipes reside (Default: /tmp/dltpipes) */ +#endif char daemonFifoName[NAME_MAX + 1]; /**< (String: Filename) name of local fifo (Default: /tmp/dlt) */ unsigned int port; /**< port number */ char ctrlSockPath[DLT_DAEMON_FLAG_MAX]; /**< Path to Control socket */ @@ -191,6 +195,9 @@ int dlt_daemon_process_sixty_s_timer(DltDaemon *daemon, DltDaemonLocal *daemon_l int dlt_daemon_process_systemd_timer(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *recv, int verbose); int dlt_daemon_process_control_connect(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *recv, int verbose); +#ifdef DLT_USE_UNIX_SOCKET_IPC +int dlt_daemon_process_app_connect(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *recv, int verbose); +#endif int dlt_daemon_process_control_messages(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *recv, int verbose); typedef int (*dlt_daemon_process_user_message_func)(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose); diff --git a/src/daemon/dlt_daemon_common.c b/src/daemon/dlt_daemon_common.c index 40d8d5c..f67a162 100644 --- a/src/daemon/dlt_daemon_common.c +++ b/src/daemon/dlt_daemon_common.c @@ -295,13 +295,16 @@ int dlt_daemon_applications_clear(DltDaemon *daemon, int verbose) return 0; } -DltDaemonApplication* dlt_daemon_application_add(DltDaemon *daemon, char *apid, pid_t pid, char *description, int verbose) +DltDaemonApplication* dlt_daemon_application_add(DltDaemon *daemon, char *apid, pid_t pid, char *description, int fd, int verbose) { DltDaemonApplication *application; DltDaemonApplication *old; int new_application; int dlt_user_handle; +#ifndef DLT_USE_UNIX_SOCKET_IPC + (void) fd; /* To avoid compiler warning : unused variable */ char filename[DLT_DAEMON_COMMON_TEXTBUFSIZE]; +#endif if ((daemon == NULL) || (apid == NULL) || (apid[0]=='\0')) { @@ -382,12 +385,13 @@ DltDaemonApplication* dlt_daemon_application_add(DltDaemon *daemon, char *apid, { if( application->pid != pid ) { +#ifndef DLT_USE_UNIX_SOCKET_IPC if ( close(application->user_handle) < 0 ) { snprintf(str,DLT_DAEMON_COMMON_TEXTBUFSIZE, "close() failed to %s/dltpipes/dlt%d, errno=%d (%s)!\n",dltFifoBaseDir,pid,errno,strerror(errno)); /* errno 2: ENOENT - No such file or directory */ dlt_log(LOG_WARNING, str); } - +#endif application->user_handle = DLT_FD_INIT; application->pid = 0; } @@ -396,22 +400,29 @@ DltDaemonApplication* dlt_daemon_application_add(DltDaemon *daemon, char *apid, /* open user pipe only if it is not yet opened */ if (application->user_handle == DLT_FD_INIT && pid != 0) { - snprintf(filename,DLT_DAEMON_COMMON_TEXTBUFSIZE,"%s/dltpipes/dlt%d",dltFifoBaseDir,pid); +#ifdef DLT_USE_UNIX_SOCKET_IPC + dlt_user_handle = fd; +#else + snprintf(filename, + DLT_DAEMON_COMMON_TEXTBUFSIZE, + "%s/dltpipes/dlt%d", + dltFifoBaseDir, + pid); dlt_user_handle = open(filename, O_WRONLY|O_NONBLOCK); - if ( dlt_user_handle < 0 ) + if (dlt_user_handle < 0) { int prio = (errno == ENOENT) ? LOG_INFO : LOG_WARNING; dlt_vlog(prio, "open() failed to %s, errno=%d (%s)!\n", filename, errno, strerror(errno)); } /* if */ - - /* check if file file descriptor was already used, and make it invalid if it is reused */ - /* This prevents sending messages to wrong file descriptor */ +#endif + /* check if file descriptor was already used, and make it invalid if it + * is reused. This prevents sending messages to wrong file descriptor */ dlt_daemon_applications_invalidate_fd(daemon,dlt_user_handle,verbose); dlt_daemon_contexts_invalidate_fd(daemon,dlt_user_handle,verbose); - application->pid = pid; application->user_handle = dlt_user_handle; + application->pid = pid; } /* Sort */ @@ -442,7 +453,9 @@ int dlt_daemon_application_del(DltDaemon *daemon, DltDaemonApplication *applicat /* Check if user handle is open; if yes, close it */ if (application->user_handle >= DLT_FD_MINIMUM) { +#ifndef DLT_USE_UNIX_SOCKET_IPC close(application->user_handle); +#endif application->user_handle = DLT_FD_INIT; } @@ -556,7 +569,7 @@ int dlt_daemon_applications_load(DltDaemon *daemon, const char *filename, int ve { /* pb contains now the description */ /* pid is unknown at loading time */ - if (dlt_daemon_application_add(daemon, apid, 0, pb, verbose) == 0) + if (dlt_daemon_application_add(daemon, apid, 0, pb, -1, verbose) == 0) { dlt_log(LOG_WARNING, "dlt_daemon_applications_load dlt_daemon_application_add failed\n"); fclose(fd); @@ -1162,8 +1175,10 @@ int dlt_daemon_user_send_log_level(DltDaemon *daemon, DltDaemonContext *context, if (errno == EPIPE) { +#ifndef DLT_USE_UNIX_SOCKET_IPC /* Close connection */ close(context->user_handle); +#endif context->user_handle = DLT_FD_INIT; } } @@ -1196,8 +1211,10 @@ int dlt_daemon_user_send_log_state(DltDaemon *daemon, DltDaemonApplication *app, { if (errno==EPIPE) { +#ifndef DLT_USE_UNIX_SOCKET_IPC /* Close connection */ close(app->user_handle); +#endif app->user_handle=DLT_FD_INIT; } } diff --git a/src/daemon/dlt_daemon_common.h b/src/daemon/dlt_daemon_common.h index d79febb..5df66ed 100644 --- a/src/daemon/dlt_daemon_common.h +++ b/src/daemon/dlt_daemon_common.h @@ -196,10 +196,11 @@ int dlt_daemon_free(DltDaemon *daemon,int verbose); * @param apid pointer to application id * @param pid process id of user application * @param description description of application + * @param fd file descriptor of application * @param verbose if set to true verbose information is printed out. * @return Pointer to added context, null pointer on error */ -DltDaemonApplication* dlt_daemon_application_add(DltDaemon *daemon,char *apid,pid_t pid,char *description, int verbose); +DltDaemonApplication* dlt_daemon_application_add(DltDaemon *daemon, char *apid, pid_t pid, char *description, int fd, int verbose); /** * Delete application from internal application management * @param daemon pointer to dlt daemon structure diff --git a/src/daemon/dlt_daemon_common_cfg.h b/src/daemon/dlt_daemon_common_cfg.h index 5df87fa..468ed41 100644 --- a/src/daemon/dlt_daemon_common_cfg.h +++ b/src/daemon/dlt_daemon_common_cfg.h @@ -88,6 +88,11 @@ #define DLT_DAEMON_DEFAULT_CTRL_SOCK_PATH DLT_RUNTIME_DEFAULT_DIRECTORY \ "/dlt-ctrl.sock" +#ifdef DLT_USE_UNIX_SOCKET_IPC +#define DLT_DAEMON_DEFAULT_APP_SOCK_PATH DLT_RUNTIME_DEFAULT_DIRECTORY \ + "/dlt-app.sock" +#endif + /* Size of text buffer */ #define DLT_DAEMON_COMMON_TEXTBUFSIZE 255 diff --git a/src/daemon/dlt_daemon_connection.c b/src/daemon/dlt_daemon_connection.c index 58b8a72..8a3913a 100644 --- a/src/daemon/dlt_daemon_connection.c +++ b/src/daemon/dlt_daemon_connection.c @@ -216,6 +216,10 @@ STATIC DltReceiver *dlt_connection_get_receiver(DltDaemonLocal *daemon_local, dlt_receiver_init(ret, fd, DLT_DAEMON_RCVBUFSIZESERIAL); } break; +#ifdef DLT_USE_UNIX_SOCKET_IPC + case DLT_CONNECTION_APP_CONNECT: + /* FALL THROUGH */ +#endif case DLT_CONNECTION_APP_MSG: /* FALL THROUGH */ case DLT_CONNECTION_ONE_S_TIMER: @@ -275,6 +279,11 @@ void *dlt_connection_get_callback(DltConnection *con) case DLT_CONNECTION_CLIENT_MSG_SERIAL: ret = dlt_daemon_process_client_messages_serial; break; +#ifdef DLT_USE_UNIX_SOCKET_IPC + case DLT_CONNECTION_APP_CONNECT: + ret = dlt_daemon_process_app_connect; + break; +#endif case DLT_CONNECTION_APP_MSG: ret = dlt_daemon_process_user_messages; break; diff --git a/src/daemon/dlt_daemon_connection_types.h b/src/daemon/dlt_daemon_connection_types.h index 1887acc..bd89998 100644 --- a/src/daemon/dlt_daemon_connection_types.h +++ b/src/daemon/dlt_daemon_connection_types.h @@ -43,6 +43,7 @@ typedef enum { DLT_CONNECTION_CLIENT_CONNECT = 0, DLT_CONNECTION_CLIENT_MSG_TCP, DLT_CONNECTION_CLIENT_MSG_SERIAL, + DLT_CONNECTION_APP_CONNECT, DLT_CONNECTION_APP_MSG, DLT_CONNECTION_ONE_S_TIMER, DLT_CONNECTION_SIXTY_S_TIMER, @@ -58,6 +59,7 @@ typedef enum { #define DLT_CON_MASK_CLIENT_MSG_TCP (1 << DLT_CONNECTION_CLIENT_MSG_TCP) #define DLT_CON_MASK_CLIENT_MSG_SERIAL (1 << DLT_CONNECTION_CLIENT_MSG_SERIAL) #define DLT_CON_MASK_APP_MSG (1 << DLT_CONNECTION_APP_MSG) +#define DLT_CON_MASK_APP_CONNECT (1 << DLT_CONNECTION_APP_CONNECT) #define DLT_CON_MASK_ONE_S_TIMER (1 << DLT_CONNECTION_ONE_S_TIMER) #define DLT_CON_MASK_SIXTY_S_TIMER (1 << DLT_CONNECTION_SIXTY_S_TIMER) #define DLT_CON_MASK_SYSTEMD_TIMER (1 << DLT_CONNECTION_SYSTEMD_TIMER) diff --git a/src/daemon/dlt_daemon_unix_socket.c b/src/daemon/dlt_daemon_unix_socket.c index 05af5cb..0ed92ad 100644 --- a/src/daemon/dlt_daemon_unix_socket.c +++ b/src/daemon/dlt_daemon_unix_socket.c @@ -30,6 +30,8 @@ #include <stdlib.h> #include <sys/un.h> #include <sys/socket.h> +#include <sys/types.h> +#include <sys/stat.h> #include <syslog.h> #include <errno.h> #include "dlt-daemon.h" @@ -40,9 +42,10 @@ char err_string[DLT_DAEMON_TEXTBUFSIZE]; -int dlt_daemon_unix_socket_open(int *sock, char *sock_path) +int dlt_daemon_unix_socket_open(int *sock, char *sock_path, int type, int mask) { struct sockaddr_un addr; + int old_mask; if (sock == NULL || sock_path == NULL) { @@ -50,7 +53,7 @@ int dlt_daemon_unix_socket_open(int *sock, char *sock_path) return -1; } - if ((*sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + if ((*sock = socket(AF_UNIX, type, 0)) == -1) { dlt_log(LOG_WARNING, "unix socket: socket() error"); return -1; @@ -62,6 +65,9 @@ int dlt_daemon_unix_socket_open(int *sock, char *sock_path) unlink(sock_path); + /* set appropriate access permissions */ + old_mask = umask(mask); + if (bind(*sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) { dlt_log(LOG_WARNING, "unix socket: bind() error"); @@ -74,6 +80,9 @@ int dlt_daemon_unix_socket_open(int *sock, char *sock_path) return -1; } + /* restore permissions */ + umask(old_mask); + return 0; } @@ -89,21 +98,3 @@ int dlt_daemon_unix_socket_close(int sock) return ret; } - -int dlt_daemon_unix_socket_send( - int sock, - void *data1, - int size1, - void *data2, - int size2, - char serialheader) -{ - /* re-use socket send function */ - return dlt_daemon_socket_send( - sock, - data1, - size1, - data2, - size2, - serialheader); -} diff --git a/src/daemon/dlt_daemon_unix_socket.h b/src/daemon/dlt_daemon_unix_socket.h index ec12eba..dec6b86 100644 --- a/src/daemon/dlt_daemon_unix_socket.h +++ b/src/daemon/dlt_daemon_unix_socket.h @@ -58,10 +58,7 @@ #ifndef DLT_DAEMON_UNIX_SOCKET_H #define DLT_DAEMON_UNIX_SOCKET_H -int dlt_daemon_unix_socket_open(int *sock, char *socket_path); +int dlt_daemon_unix_socket_open(int *sock, char *socket_path, int type, int mask); int dlt_daemon_unix_socket_close(int sock); -int dlt_daemon_unix_socket_send(int sock,void* data1,int size1,void* data2, - int size2,char serialheader); - #endif /* DLT_DAEMON_UNIX_SOCKET_H */ |