iSulad/0005-add-isulad-args.patch
zhangxiaoyu b7b149d14e sycn patches from openeuler/iSulad
Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
2022-09-07 16:11:25 +08:00

645 lines
36 KiB
Diff

From 5a0476a328a39764874257faa23696320656d3e3 Mon Sep 17 00:00:00 2001
From: zhangxiaoyu <zhangxiaoyu58@huawei.com>
Date: Tue, 6 Sep 2022 18:45:53 +0800
Subject: [PATCH 5/5] add isulad args
Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com>
---
src/cmd/isulad/isulad_commands.c | 18 +++++
src/cmd/isulad/isulad_commands.h | 80 ++++++++++++--------
src/cmd/isulad/main.c | 58 +++------------
src/daemon/config/daemon_arguments.c | 101 ++++++++++++++++++++------
src/daemon/config/daemon_arguments.h | 1 +
src/daemon/config/isulad_config.c | 61 ++++++++++++++--
src/daemon/modules/events/collector.c | 2 +-
7 files changed, 213 insertions(+), 108 deletions(-)
diff --git a/src/cmd/isulad/isulad_commands.c b/src/cmd/isulad/isulad_commands.c
index ba7ca0e7..42d0bde6 100644
--- a/src/cmd/isulad/isulad_commands.c
+++ b/src/cmd/isulad/isulad_commands.c
@@ -105,6 +105,24 @@ out:
return ret;
}
+int server_callback_cri_runtime(command_option_t *option, const char *value)
+{
+ struct service_arguments *args = NULL;
+
+ if (option == NULL || value == NULL) {
+ COMMAND_ERROR("Invalid input arguments");
+ return -1;
+ }
+
+ args = (struct service_arguments *)option->data;
+ if (server_cri_runtime_parser(args, value) != 0) {
+ COMMAND_ERROR("Invalid value \"%s\" for flag --%s", value, option->large);
+ return -1;
+ }
+
+ return 0;
+}
+
int server_callback_container_log_driver(command_option_t *option, const char *value)
{
int ret = 0;
diff --git a/src/cmd/isulad/isulad_commands.h b/src/cmd/isulad/isulad_commands.h
index 0d70da4c..dc278f9c 100644
--- a/src/cmd/isulad/isulad_commands.h
+++ b/src/cmd/isulad/isulad_commands.h
@@ -71,10 +71,10 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
"host", \
'H', \
&(cmdargs)->hosts, \
- "The socket name used to create gRPC server", \
+ "The socket name used to create gRPC server (default \"unix:///var/run/isulad.sock\")", \
command_valid_socket_append_array }, \
{ CMD_OPT_TYPE_STRING_DUP, false, "pidfile", 'p', &(cmdargs)->json_confs->pidfile, \
- "Save pid into this file", NULL }, \
+ "Save pid into this file (default \"/var/run/isulad.pid\")", NULL }, \
{ CMD_OPT_TYPE_BOOL, false, "help", 0, &(cmdargs)->help, "Show help", NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
@@ -88,14 +88,14 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
"graph", \
'g', \
&(cmdargs)->json_confs->graph, \
- "Root directory of the iSulad runtime", \
+ "Root directory of the iSulad runtime (default \"/var/lib/isulad\")", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"state", \
'S', \
&(cmdargs)->json_confs->state, \
- "Root directory for execution state files", \
+ "Root directory for execution state files (default \"/var/run/isulad\")", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
@@ -105,20 +105,20 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
"timeout duration for waiting on a container to start before it is killed", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, false, "engine", 'e', &(cmdargs)->json_confs->engine, \
- "Select backend engine", NULL }, \
+ "Select backend engine (default lcr)", NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"log-level", \
'l', \
&(cmdargs)->json_confs->log_level, \
- "Set log level, the levels can be: FATAL ALERT CRIT ERROR WARN NOTICE INFO DEBUG TRACE", \
+ "Set log level, the levels can be: FATAL ALERT CRIT ERROR WARN NOTICE INFO DEBUG TRACE (default INFO)", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"log-driver", \
0, \
&(cmdargs)->json_confs->log_driver, \
- "Set daemon log driver, such as: file", \
+ "Set daemon log driver, support stdout and file (default file)", \
NULL }, \
{ CMD_OPT_TYPE_CALLBACK, \
false, \
@@ -127,34 +127,34 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
(cmdargs), \
"Set daemon log driver options, such as: log-path=/tmp/logs/ to set directory where to store daemon logs", \
server_callback_log_opt }, \
- { CMD_OPT_TYPE_CALLBACK, \
- false, \
- "container-log-driver", \
- 0, \
- (cmdargs), \
- "Set default container log driver, such as: json-file", \
- server_callback_container_log_driver }, \
- { CMD_OPT_TYPE_CALLBACK, \
- false, \
- "container-log-opts", \
- 0, \
- (cmdargs), \
- "Set default container log driver options, such as: max-file=7 to set max number of container log files", \
- server_callback_container_log }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, \
+ "container-log-driver", \
+ 0, \
+ (cmdargs), \
+ "Set default container log driver, such as: json-file", \
+ server_callback_container_log_driver }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, \
+ "container-log-opts", \
+ 0, \
+ (cmdargs), \
+ "Set default container log driver options, such as: max-file=7 to set max number of container log files", \
+ server_callback_container_log }, \
{ CMD_OPT_TYPE_BOOL, false, "version", 'V', &(cmdargs)->version, "Print the version", NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"group", \
'G', \
&(cmdargs)->json_confs->group, \
- "Group for the unix socket(default is isula)", \
+ "Group for the unix socket (default isula)", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"storage-driver", \
0, \
&(cmdargs)->json_confs->storage_driver, \
- "Storage driver to use(default overlay2)", \
+ "Storage driver to use (default overlay2)", \
NULL }, \
{ CMD_OPT_TYPE_CALLBACK, \
false, \
@@ -166,7 +166,7 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
SUP_GROUPS_OPT(cmdargs) \
{ CMD_OPT_TYPE_CALLBACK, \
false, \
- "registry-mirrors", \
+ "registry-mirrors", \
0, \
&(cmdargs)->json_confs->registry_mirrors, \
"Registry to be prepended when pulling unqualified images, can be specified multiple times", \
@@ -197,28 +197,28 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
"pod-sandbox-image", \
0, \
&(cmdargs)->json_confs->pod_sandbox_image, \
- "The image whose network/ipc namespaces containers in each pod will use. (default \"pause-${machine}:3.0\")", \
+ "The image whose network/ipc namespaces containers in each pod will use (default \"pause-${machine}:3.0\")",\
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"network-plugin", \
0, \
&(cmdargs)->json_confs->network_plugin, \
- "Set network plugin, default is null, suppport null and cni", \
+ "Set network plugin, suppport null and cni (default null)", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"cni-bin-dir", \
0, \
&(cmdargs)->json_confs->cni_bin_dir, \
- "The full path of the directory in which to search for CNI plugin binaries. Default: /opt/cni/bin", \
+ "The full path of the directory in which to search for CNI plugin binaries (default \"/opt/cni/bin\")", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
"cni-conf-dir", \
0, \
&(cmdargs)->json_confs->cni_conf_dir, \
- "The full path of the directory in which to search for CNI config files. Default: /etc/cni/net.d", \
+ "The full path of the directory in which to search for CNI config files (default \"/etc/cni/net.d\")", \
NULL }, \
{ CMD_OPT_TYPE_BOOL, \
false, \
@@ -232,14 +232,14 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
"insecure-skip-verify-enforce", \
0, \
&(cmdargs)->json_confs->insecure_skip_verify_enforce, \
- "Force to skip the insecure verify(default false)", \
+ "Force to skip the insecure verify (default false)", \
NULL }, \
{ CMD_OPT_TYPE_BOOL, \
false, \
"use-decrypted-key", \
0, \
(cmdargs)->json_confs->use_decrypted_key, \
- "Use decrypted private key by default(default true)", \
+ "Use decrypted private key by default (default true)", \
NULL }, \
{ CMD_OPT_TYPE_STRING_DUP, \
false, \
@@ -296,6 +296,26 @@ int command_default_ulimit_append(command_option_t *option, const char *arg);
false, "selinux-enabled", 0, &(cmdargs)->json_confs->selinux_enabled, \
"Enable selinux support", NULL \
}, \
+ { CMD_OPT_TYPE_STRING_DUP, \
+ false, "default-runtime", 0, &(cmdargs)->json_confs->default_runtime, \
+ "Default container runtime (default lcr)", NULL \
+ }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, "cpu-rt-period", 0, &(cmdargs)->json_confs->cpu_rt_period, \
+ "Limit CPU real-time period in microseconds for all containers", command_convert_llong \
+ }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, "cpu-rt-runtime", 0, &(cmdargs)->json_confs->cpu_rt_runtime, \
+ "Limit CPU real-time runtime in microseconds for all containers", command_convert_llong \
+ }, \
+ { CMD_OPT_TYPE_STRING_DUP, \
+ false, "enable-plugins", 0, &(cmdargs)->json_confs->enable_plugins, \
+ "Enable plugins for all containers", NULL \
+ }, \
+ { CMD_OPT_TYPE_CALLBACK, \
+ false, "cri-runtime", 0, (cmdargs), \
+ "CRI runtime class transform", server_callback_cri_runtime \
+ }, \
#ifdef __cplusplus
}
diff --git a/src/cmd/isulad/main.c b/src/cmd/isulad/main.c
index ccba7107..d4f984d5 100644
--- a/src/cmd/isulad/main.c
+++ b/src/cmd/isulad/main.c
@@ -501,47 +501,6 @@ int check_and_set_default_isulad_log_file(struct service_arguments *args)
return 0;
}
-static int set_parent_mount_dir(struct service_arguments *args)
-{
- int ret = -1;
- int nret;
- size_t len;
- char *rootfsdir = NULL;
-
- if (args->json_confs == NULL) {
- ERROR("Empty json configs");
- goto out;
- }
- if (strlen(args->json_confs->graph) > (SIZE_MAX - strlen("/mnt/rootfs")) - 1) {
- ERROR("Root directory of the isulad runtime is too long");
- goto out;
- }
- len = strlen(args->json_confs->graph) + strlen("/mnt/rootfs") + 1;
- if (len > PATH_MAX) {
- ERROR("The size of path exceeds the limit");
- goto out;
- }
- rootfsdir = util_common_calloc_s(len);
- if (rootfsdir == NULL) {
- ERROR("Out of memory");
- goto out;
- }
- nret = snprintf(rootfsdir, len, "%s/mnt/rootfs", args->json_confs->graph);
- if (nret < 0 || (size_t)nret >= len) {
- ERROR("Failed to print string");
- goto out;
- }
-
- free(args->json_confs->rootfsmntdir);
- args->json_confs->rootfsmntdir = util_strdup_s(rootfsdir);
-
- ret = 0;
-
-out:
- free(rootfsdir);
- return ret;
-}
-
static int check_hook_spec_file(const char *hook_spec)
{
struct stat hookstat = { 0 };
@@ -1004,10 +963,6 @@ static int update_server_args(struct service_arguments *args)
return -1;
}
- if (set_parent_mount_dir(args)) {
- return -1;
- }
-
/* parse hook spec */
if (parse_conf_hooks(args) != 0) {
return -1;
@@ -1050,6 +1005,7 @@ static int server_conf_parse_save(int argc, const char **argv)
/* Step2: load json configs and merge into global configs */
if (merge_json_confs_into_global(args) != 0) {
+ ERROR("Failed to merge json conf into global");
ret = -1;
goto out;
}
@@ -1062,6 +1018,7 @@ static int server_conf_parse_save(int argc, const char **argv)
}
if (update_server_args(args) != 0) {
+ ERROR("Failed to update server args");
ret = -1;
goto out;
}
@@ -1165,6 +1122,7 @@ static int isulad_server_pre_init(const struct service_arguments *args, const ch
const char *fifo_full_path)
{
int ret = 0;
+ char *rootfs_mnt_dir = NULL;
#ifdef ENABLE_USERNS_REMAP
char* userns_remap = conf_get_isulad_userns_remap();
char *isulad_root = NULL;
@@ -1228,7 +1186,14 @@ static int isulad_server_pre_init(const struct service_arguments *args, const ch
}
#endif
- if (mount_rootfs_mnt_dir(args->json_confs->rootfsmntdir)) {
+ rootfs_mnt_dir = conf_get_isulad_mount_rootfs();
+ if (rootfs_mnt_dir == NULL) {
+ ERROR("Failed to get isulad mount rootfs");
+ ret = -1;
+ goto out;
+ }
+
+ if (mount_rootfs_mnt_dir(rootfs_mnt_dir)) {
ERROR("Create and mount parent directory failed");
ret = -1;
goto out;
@@ -1241,6 +1206,7 @@ static int isulad_server_pre_init(const struct service_arguments *args, const ch
}
out:
+ free(rootfs_mnt_dir);
#ifdef ENABLE_USERNS_REMAP
free(isulad_root);
free(userns_remap);
diff --git a/src/daemon/config/daemon_arguments.c b/src/daemon/config/daemon_arguments.c
index 719efef0..076c10a6 100644
--- a/src/daemon/config/daemon_arguments.c
+++ b/src/daemon/config/daemon_arguments.c
@@ -148,7 +148,6 @@ int service_arguments_init(struct service_arguments *args)
args->json_confs->pidfile = util_strdup_s(DEFAULT_PID_FILE);
args->json_confs->storage_driver = util_strdup_s("overlay2");
args->json_confs->native_umask = util_strdup_s(UMASK_SECURE);
- args->json_confs->image_service = true;
args->json_confs->image_layer_check = false;
args->json_confs->use_decrypted_key = (bool *)util_common_calloc_s(sizeof(bool));
if (args->json_confs->use_decrypted_key == NULL) {
@@ -165,6 +164,11 @@ int service_arguments_init(struct service_arguments *args)
args->default_ulimit_len = 0;
args->json_confs->websocket_server_listening_port = DEFAULT_WEBSOCKET_SERVER_LISTENING_PORT;
args->json_confs->selinux_enabled = false;
+ args->json_confs->default_runtime = util_strdup_s(DEFAULT_RUNTIME_NAME);
+ args->json_confs->cri_runtimes = (json_map_string_string *)util_common_calloc_s(sizeof(json_map_string_string));
+ if (args->json_confs->cri_runtimes == NULL) {
+ goto free_out;
+ }
ret = 0;
@@ -200,57 +204,108 @@ void service_arguments_free(struct service_arguments *args)
free_default_ulimit(args->default_ulimit);
args->default_ulimit = NULL;
args->default_ulimit_len = 0;
+
+ free(args->json_confs->default_runtime);
+ args->json_confs->default_runtime = NULL;
+
+ free_json_map_string_string(args->json_confs->cri_runtimes);
+ args->json_confs->cri_runtimes = NULL;
}
-/* server log opt parser */
-int server_log_opt_parser(struct service_arguments *args, const char *option)
+static int key_value_opt_parser(const char *option, char **key, char **value)
{
int ret = -1;
- char *key = NULL;
- char *value = NULL;
- char *tmp = NULL;
+ char *tmp_key = NULL;
+ char *tmp_value = NULL;
+ char *tmp_option = NULL;
size_t len = 0;
size_t total_len = 0;
- if (option == NULL || args == NULL) {
- goto out;
- }
-
// option format: key=value
total_len = strlen(option);
- if (args == NULL || total_len <= 2) {
- goto out;
+ if (total_len <= 2) {
+ return -1;
}
- tmp = util_strdup_s(option);
- key = tmp;
- value = strchr(tmp, '=');
+ tmp_option = util_strdup_s(option);
+ tmp_key = tmp_option;
+ tmp_value = strchr(tmp_option, '=');
// option do not contain '='
- if (value == NULL) {
+ if (tmp_value == NULL) {
goto out;
}
- len = (size_t)(value - key);
+ len = (size_t)(tmp_value - tmp_key);
// if option is '=key'
if (len == 0) {
goto out;
}
+
// if option is 'key='
if (total_len == len + 1) {
goto out;
}
- tmp[len] = '\0';
- value += 1;
- ret = parse_log_opts(args, key, value);
+ tmp_option[len] = '\0';
+ *key = util_strdup_s(tmp_key);
+ tmp_option[len] = '=';
+
+ tmp_value += 1;
+ *value = util_strdup_s(tmp_value);
+
+ ret = 0;
+
+out:
+ free(tmp_option);
+ return ret;
+}
+/* server log opt parser */
+int server_log_opt_parser(struct service_arguments *args, const char *option)
+{
+ int ret = -1;
+ char *key = NULL;
+ char *value = NULL;
+
+ if (option == NULL || args == NULL) {
+ return -1;
+ }
+
+ if (key_value_opt_parser(option, &key, &value) != 0) {
+ return -1;
+ }
+
+ ret = parse_log_opts(args, key, value);
if (ret == 0 && args->json_confs != NULL && args->json_confs->log_opts != NULL) {
ret = append_json_map_string_string(args->json_confs->log_opts, key, value);
}
- tmp[len] = '=';
-out:
- free(tmp);
+ free(key);
+ free(value);
+ return ret;
+}
+
+/* server cri runtime parser */
+int server_cri_runtime_parser(struct service_arguments *args, const char *option)
+{
+ int ret = 0;
+ char *key = NULL;
+ char *value = NULL;
+
+ if (option == NULL || args == NULL) {
+ return -1;
+ }
+
+ if (key_value_opt_parser(option, &key, &value) != 0) {
+ return -1;
+ }
+
+ if (args->json_confs != NULL && args->json_confs->cri_runtimes != NULL) {
+ ret = append_json_map_string_string(args->json_confs->cri_runtimes, key, value);
+ }
+
+ free(key);
+ free(value);
return ret;
}
diff --git a/src/daemon/config/daemon_arguments.h b/src/daemon/config/daemon_arguments.h
index 54099c81..49f5961e 100644
--- a/src/daemon/config/daemon_arguments.h
+++ b/src/daemon/config/daemon_arguments.h
@@ -71,6 +71,7 @@ struct service_arguments {
int service_arguments_init(struct service_arguments *args);
void service_arguments_free(struct service_arguments *args);
int server_log_opt_parser(struct service_arguments *args, const char *option);
+int server_cri_runtime_parser(struct service_arguments *args, const char *option);
size_t ulimit_array_len(host_config_ulimits_element **default_ulimit);
diff --git a/src/daemon/config/isulad_config.c b/src/daemon/config/isulad_config.c
index 6f17660b..86a9609a 100644
--- a/src/daemon/config/isulad_config.c
+++ b/src/daemon/config/isulad_config.c
@@ -529,6 +529,34 @@ out:
return result;
}
+static char *get_parent_mount_dir(char *graph)
+{
+ int nret;
+ size_t len;
+ char *rootfsdir = NULL;
+
+ len = strlen(graph) + strlen("/mnt/rootfs") + 1;
+ if (len > PATH_MAX) {
+ ERROR("The size of path exceeds the limit");
+ return NULL;
+ }
+
+ rootfsdir = util_common_calloc_s(len);
+ if (rootfsdir == NULL) {
+ ERROR("Out of memory");
+ return NULL;
+ }
+
+ nret = snprintf(rootfsdir, len, "%s/mnt/rootfs", graph);
+ if (nret < 0 || (size_t)nret >= len) {
+ ERROR("Failed to print string");
+ free(rootfsdir);
+ return NULL;
+ }
+
+ return rootfsdir;
+}
+
/* conf get isulad mount rootfs */
char *conf_get_isulad_mount_rootfs()
{
@@ -540,11 +568,11 @@ char *conf_get_isulad_mount_rootfs()
}
conf = conf_get_server_conf();
- if (conf == NULL || conf->json_confs->rootfsmntdir == NULL) {
+ if (conf == NULL || conf->json_confs == NULL || conf->json_confs->graph == NULL) {
goto out;
}
- path = util_strdup_s(conf->json_confs->rootfsmntdir);
+ path = get_parent_mount_dir(conf->json_confs->graph);
out:
(void)isulad_server_conf_unlock();
@@ -1449,6 +1477,25 @@ static int merge_logs_conf_into_global(struct service_arguments *args, isulad_da
return do_merge_container_logs_conf(args, tmp_json_confs);
}
+static int merge_cri_runtimes_into_global(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
+{
+ size_t i;
+
+ if (tmp_json_confs->cri_runtimes == NULL) {
+ return 0;
+ }
+
+ for (i = 0; i < tmp_json_confs->cri_runtimes->len; i++) {
+ if (append_json_map_string_string(args->json_confs->cri_runtimes, tmp_json_confs->cri_runtimes->keys[i],
+ tmp_json_confs->cri_runtimes->values[i]) != 0) {
+ ERROR("Out of memory");
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
static int merge_authorization_conf_into_global(struct service_arguments *args, isulad_daemon_configs *tmp_json_confs)
{
args->json_confs->tls = tmp_json_confs->tls;
@@ -1549,7 +1596,6 @@ int merge_json_confs_into_global(struct service_arguments *args)
#endif
override_string_value(&args->json_confs->native_umask, &tmp_json_confs->native_umask);
override_string_value(&args->json_confs->cgroup_parent, &tmp_json_confs->cgroup_parent);
- override_string_value(&args->json_confs->rootfsmntdir, &tmp_json_confs->rootfsmntdir);
override_string_value(&args->json_confs->start_timeout, &tmp_json_confs->start_timeout);
override_string_value(&args->json_confs->pod_sandbox_image, &tmp_json_confs->pod_sandbox_image);
override_string_value(&args->json_confs->network_plugin, &tmp_json_confs->network_plugin);
@@ -1559,8 +1605,10 @@ int merge_json_confs_into_global(struct service_arguments *args)
args->json_confs->runtimes = tmp_json_confs->runtimes;
tmp_json_confs->runtimes = NULL;
- args->json_confs->cri_runtimes = tmp_json_confs->cri_runtimes;
- tmp_json_confs->cri_runtimes = NULL;
+ if (merge_cri_runtimes_into_global(args, tmp_json_confs)) {
+ ret = -1;
+ goto out;
+ }
#ifdef ENABLE_SUP_GROUPS
args->json_confs->sup_groups = tmp_json_confs->sup_groups;
@@ -1588,9 +1636,6 @@ int merge_json_confs_into_global(struct service_arguments *args)
args->json_confs->cpu_rt_runtime = tmp_json_confs->cpu_rt_runtime;
}
- if (tmp_json_confs->image_service) {
- args->json_confs->image_service = tmp_json_confs->image_service;
- }
if (tmp_json_confs->image_layer_check) {
args->json_confs->image_layer_check = tmp_json_confs->image_layer_check;
}
diff --git a/src/daemon/modules/events/collector.c b/src/daemon/modules/events/collector.c
index 319e777a..9dc4dbe7 100644
--- a/src/daemon/modules/events/collector.c
+++ b/src/daemon/modules/events/collector.c
@@ -578,7 +578,7 @@ static int do_write_events(const stream_func_wrapper *stream, struct isulad_even
goto out;
}
if (!stream->write_func(stream->writer, event)) {
- ERROR("Failed to send exit event for 'events' client");
+ ERROR("Failed to send event for 'events' client");
ret = -1;
goto out;
}
--
2.25.1