summaryrefslogtreecommitdiff
path: root/src/daemon/dlt_daemon_unix_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/dlt_daemon_unix_socket.c')
-rw-r--r--src/daemon/dlt_daemon_unix_socket.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/daemon/dlt_daemon_unix_socket.c b/src/daemon/dlt_daemon_unix_socket.c
new file mode 100644
index 0000000..05af5cb
--- /dev/null
+++ b/src/daemon/dlt_daemon_unix_socket.c
@@ -0,0 +1,109 @@
+/*
+ * @licence app begin@
+ * SPDX license identifier: MPL-2.0
+ *
+ * Copyright (C) 2015, Advanced Driver Information Technology
+ * Copyright of Advanced Driver Information Technology, Bosch and Denso
+ *
+ * This file is part of GENIVI Project DLT - Diagnostic Log and Trace.
+ *
+ * This Source Code Form is subject to the terms of the
+ * Mozilla Public License (MPL), 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/.
+ *
+ * For further information see http://www.genivi.org/.
+ * @licence end@
+ */
+
+/*!
+ * \author
+ * Christoph Lipka <clipka@jp.adit-jv.com>
+ *
+ * \copyright Copyright © 2015 ADIT. \n
+ * License MPL-2.0: Mozilla Public License version 2.0 http://mozilla.org/MPL/2.0/.
+ *
+ * \file dlt_daemon_unix_socket.c
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/un.h>
+#include <sys/socket.h>
+#include <syslog.h>
+#include <errno.h>
+#include "dlt-daemon.h"
+#include "dlt_common.h"
+#include "dlt-daemon_cfg.h"
+#include "dlt_daemon_socket.h"
+#include "dlt_daemon_unix_socket.h"
+
+char err_string[DLT_DAEMON_TEXTBUFSIZE];
+
+int dlt_daemon_unix_socket_open(int *sock, char *sock_path)
+{
+ struct sockaddr_un addr;
+
+ if (sock == NULL || sock_path == NULL)
+ {
+ dlt_log(LOG_ERR, "dlt_daemon_unix_socket_open: arguments invalid");
+ return -1;
+ }
+
+ if ((*sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+ {
+ dlt_log(LOG_WARNING, "unix socket: socket() error");
+ return -1;
+ }
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ memcpy(addr.sun_path, sock_path, sizeof(addr.sun_path));
+
+ unlink(sock_path);
+
+ if (bind(*sock, (struct sockaddr *) &addr, sizeof(addr)) == -1)
+ {
+ dlt_log(LOG_WARNING, "unix socket: bind() error");
+ return -1;
+ }
+
+ if (listen(*sock, 1) == -1)
+ {
+ dlt_log(LOG_WARNING, "unix socket: listen error");
+ return -1;
+ }
+
+ return 0;
+}
+
+int dlt_daemon_unix_socket_close(int sock)
+{
+ int ret = close(sock);
+
+ if (ret != 0)
+ {
+ sprintf(err_string, "unix socket close failed: %s", strerror(errno));
+ dlt_log(LOG_WARNING, err_string);
+ }
+
+ 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);
+}