summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorDamian Hobson-Garcia <dhobsong@igel.co.jp>2020-11-24 17:16:39 +0900
committerDamian Hobson-Garcia <dhobsong@igel.co.jp>2021-02-19 10:48:23 +0000
commitf991de200799118355fd75237a740321bda7aaa7 (patch)
tree589f536d835d81f1166410e67aedb578d6e70395 /common
parent464ec461237b36e03c4cdb175e9d87ab502ee1d5 (diff)
Add initial version
The initial version implements the basic functionality of the client/server communication and lease management. For now, one lease is created per valid connector (dependent on CRTC availablity). Bug-AGL: SPEC-3729 Signed-off-by: Damian Hobson-Garcia <dhobsong@igel.co.jp> Change-Id: I2b37a892742cc22bdc53a5172c8ad3d8a7bb5e66
Diffstat (limited to 'common')
-rw-r--r--common/log.c38
-rw-r--r--common/log.h33
-rw-r--r--common/meson.build22
-rw-r--r--common/socket-path.c48
-rw-r--r--common/socket-path.h26
-rw-r--r--common/test/test-helpers.c56
-rw-r--r--common/test/test-helpers.h34
7 files changed, 257 insertions, 0 deletions
diff --git a/common/log.c b/common/log.c
new file mode 100644
index 0000000..f3f8899
--- /dev/null
+++ b/common/log.c
@@ -0,0 +1,38 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "log.h"
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+static bool debug_log = false;
+
+void dlm_log_enable_debug(bool enable)
+{
+ debug_log = enable;
+}
+
+void dlm_log_print(bool debug, FILE *stream, char *fmt, ...)
+{
+ if (debug && !debug_log)
+ return;
+
+ va_list argl;
+ va_start(argl, fmt);
+ vfprintf(stream, fmt, argl);
+ va_end(argl);
+}
diff --git a/common/log.h b/common/log.h
new file mode 100644
index 0000000..cd0c0e3
--- /dev/null
+++ b/common/log.h
@@ -0,0 +1,33 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef LOG_H
+#define LOG_H
+
+#include <stdbool.h>
+#include <stdio.h>
+
+#define DEBUG_LOG(FMT, ...) \
+ dlm_log_print(true, stdout, "DEBUG: %s: " FMT, __func__, ##__VA_ARGS__)
+#define INFO_LOG(FMT, ...) \
+ dlm_log_print(false, stdout, "INFO: " FMT, ##__VA_ARGS__)
+#define WARN_LOG(FMT, ...) \
+ dlm_log_print(false, stderr, "WARNING: " FMT, ##__VA_ARGS__)
+#define ERROR_LOG(FMT, ...) \
+ dlm_log_print(false, stderr, "ERROR: " FMT, ##__VA_ARGS__)
+
+void dlm_log_enable_debug(bool enable);
+void dlm_log_print(bool debug, FILE *stream, char *fmt, ...);
+#endif
diff --git a/common/meson.build b/common/meson.build
new file mode 100644
index 0000000..e465fa5
--- /dev/null
+++ b/common/meson.build
@@ -0,0 +1,22 @@
+libdlmcommon_sources = [
+ 'socket-path.c',
+ 'log.c'
+]
+
+libdlmcommon_inc = [include_directories('.')]
+
+if enable_tests
+ libdlmcommon_inc += include_directories('test')
+ libdlmcommon_sources += ['test/test-helpers.c']
+endif
+
+libdlmcommon = static_library(
+ 'common',
+ sources: libdlmcommon_sources,
+ include_directories : configuration_inc,
+)
+
+dlmcommon_dep = declare_dependency(
+ link_with : libdlmcommon,
+ include_directories : libdlmcommon_inc
+)
diff --git a/common/socket-path.c b/common/socket-path.c
new file mode 100644
index 0000000..7a412da
--- /dev/null
+++ b/common/socket-path.c
@@ -0,0 +1,48 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "socket-path.h"
+#include "config.h"
+#include "log.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define RUNTIME_PATH DLM_DEFAULT_RUNTIME_PATH
+
+bool sockaddr_set_lease_server_path(struct sockaddr_un *sa,
+ const char *lease_name)
+{
+ int maxlen = sizeof(sa->sun_path);
+ char *socket_dir = getenv("DLM_RUNTIME_PATH") ?: RUNTIME_PATH;
+
+ int len =
+ snprintf(sa->sun_path, maxlen, "%s/%s", socket_dir, lease_name);
+
+ if (len < 0) {
+ DEBUG_LOG("Socket path creation failed: %s\n", strerror(errno));
+ return false;
+ }
+ if (len >= maxlen) {
+ errno = ENAMETOOLONG;
+ DEBUG_LOG("Socket directoy path too long. "
+ "Full path to socket must be less than %d bytes\n",
+ maxlen);
+ return false;
+ }
+ return true;
+}
diff --git a/common/socket-path.h b/common/socket-path.h
new file mode 100644
index 0000000..b05c60f
--- /dev/null
+++ b/common/socket-path.h
@@ -0,0 +1,26 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SOCKET_PATH_H
+#define SOCKET_PATH_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <sys/un.h>
+
+bool sockaddr_set_lease_server_path(struct sockaddr_un *dest,
+ const char *lease_name);
+
+#endif
diff --git a/common/test/test-helpers.c b/common/test/test-helpers.c
new file mode 100644
index 0000000..ea37a89
--- /dev/null
+++ b/common/test/test-helpers.c
@@ -0,0 +1,56 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test-helpers.h"
+#include <check.h>
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+int get_dummy_fd(void)
+{
+ return dup(STDIN_FILENO);
+}
+
+void check_fd_equality(int fd1, int fd2)
+{
+ struct stat s1, s2;
+ ck_assert_int_eq(fstat(fd1, &s1), 0);
+ ck_assert_int_eq(fstat(fd2, &s2), 0);
+ ck_assert_int_eq(s1.st_dev, s2.st_dev);
+ ck_assert_int_eq(s1.st_ino, s2.st_ino);
+}
+
+void check_fd_is_open(int fd)
+{
+ struct stat st;
+ ck_assert_int_eq(fstat(fd, &st), 0);
+}
+
+void check_fd_is_closed(int fd)
+{
+ struct stat st;
+ ck_assert_int_ne(fstat(fd, &st), 0);
+ ck_assert_int_eq(errno, EBADF);
+}
+
+void check_uint_array_eq(const uint32_t *a, const uint32_t *b, int cnt)
+{
+ for (int i = 0; i < cnt; i++) {
+ ck_assert_msg(a[i] == b[i], "Array diff at index %d (%u != %u)",
+ i, a[i], b[i]);
+ }
+}
diff --git a/common/test/test-helpers.h b/common/test/test-helpers.h
new file mode 100644
index 0000000..8886acd
--- /dev/null
+++ b/common/test/test-helpers.h
@@ -0,0 +1,34 @@
+/* Copyright 2020-2021 IGEL Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef TEST_HELPERS_H
+#define TEST_HELPERS_H
+
+#include <stdint.h>
+
+#define UNUSED(x) (void)(x)
+#define ARRAY_LEN(x) ((int)(sizeof(x) / sizeof(x[0])))
+
+/* Get a vaild fd to use a a placeholder.
+ * The dummy fd should never be used for anything other
+ * than comparing the fd value or the referenced file description. */
+int get_dummy_fd(void);
+
+void check_fd_equality(int fd1, int fd2);
+void check_fd_is_open(int fd);
+void check_fd_is_closed(int fd);
+
+void check_uint_array_eq(const uint32_t *a, const uint32_t *b, int cnt);
+#endif