154 lines
5.0 KiB
Diff
154 lines
5.0 KiB
Diff
|
|
From 4df32783e4a665bd639f8b3ccd1b8860614eefb3 Mon Sep 17 00:00:00 2001
|
||
|
|
From: wujing <wujing50@huawei.com>
|
||
|
|
Date: Sat, 14 May 2022 15:33:33 +0800
|
||
|
|
Subject: [PATCH 25/28] refactor parse_volume function
|
||
|
|
|
||
|
|
Signed-off-by: wujing <wujing50@huawei.com>
|
||
|
|
---
|
||
|
|
src/daemon/modules/spec/parse_volume.c | 91 ++++++++++++++------------
|
||
|
|
1 file changed, 50 insertions(+), 41 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/src/daemon/modules/spec/parse_volume.c b/src/daemon/modules/spec/parse_volume.c
|
||
|
|
index ef2d58e4..3afa0962 100644
|
||
|
|
--- a/src/daemon/modules/spec/parse_volume.c
|
||
|
|
+++ b/src/daemon/modules/spec/parse_volume.c
|
||
|
|
@@ -341,22 +341,60 @@ static int check_volume_element(const char *volume)
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
+static int set_volume_element_options(defs_mount *mount_element, const char **modes)
|
||
|
|
+{
|
||
|
|
+ const size_t max_options_len = 4;
|
||
|
|
+ size_t options_len = 0;
|
||
|
|
+ size_t i = 0;
|
||
|
|
+ bool with_rw = false;
|
||
|
|
+ bool with_pro = false;
|
||
|
|
+ bool with_label = false;
|
||
|
|
+
|
||
|
|
+ mount_element->options = util_common_calloc_s(max_options_len * sizeof(char *));
|
||
|
|
+ if (mount_element->options == NULL) {
|
||
|
|
+ ERROR("Out of memory");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ options_len = util_array_len((const char **)modes);
|
||
|
|
+ if (options_len > max_options_len) {
|
||
|
|
+ ERROR("Invalid volume element options");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ for (i = 0; i < options_len; i++) {
|
||
|
|
+ if (util_valid_rw_mode(modes[i])) {
|
||
|
|
+ with_rw = true;
|
||
|
|
+ mount_element->options[mount_element->options_len++] = util_strdup_s(modes[i]);
|
||
|
|
+ } else if (util_valid_propagation_mode(modes[i])) {
|
||
|
|
+ with_pro = true;
|
||
|
|
+ mount_element->options[mount_element->options_len++] = util_strdup_s(modes[i]);
|
||
|
|
+ } else if (util_valid_label_mode(modes[i])) {
|
||
|
|
+ with_label = true;
|
||
|
|
+ mount_element->options[mount_element->options_len++] = util_strdup_s(modes[i]);
|
||
|
|
+ } else if (util_valid_copy_mode(modes[i])) {
|
||
|
|
+ mount_element->options[mount_element->options_len++] = util_strdup_s(modes[i]);
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (append_default_mount_options(mount_element, with_rw, with_pro, with_label) != 0) {
|
||
|
|
+ ERROR("Failed to append default mount options");
|
||
|
|
+ return -1;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
defs_mount *parse_volume(const char *volume)
|
||
|
|
{
|
||
|
|
int ret = 0;
|
||
|
|
- size_t i = 0;
|
||
|
|
- size_t mlen = 0;
|
||
|
|
defs_mount *mount_element = NULL;
|
||
|
|
char **modes = NULL;
|
||
|
|
char path[PATH_MAX] = { 0x00 };
|
||
|
|
- char *rw = NULL;
|
||
|
|
- char *pro = NULL;
|
||
|
|
- char *label = NULL;
|
||
|
|
- size_t max_options_len = 4;
|
||
|
|
- char *nocopy = NULL;
|
||
|
|
|
||
|
|
ret = check_volume_element(volume);
|
||
|
|
if (ret != 0) {
|
||
|
|
+ ERROR("Invalid volume element");
|
||
|
|
goto free_out;
|
||
|
|
}
|
||
|
|
|
||
|
|
@@ -368,22 +406,10 @@ defs_mount *parse_volume(const char *volume)
|
||
|
|
|
||
|
|
ret = get_src_dst_mode_by_volume(volume, mount_element, &modes);
|
||
|
|
if (ret != 0) {
|
||
|
|
+ ERROR("Failed to parse volume");
|
||
|
|
goto free_out;
|
||
|
|
}
|
||
|
|
|
||
|
|
- mlen = util_array_len((const char **)modes);
|
||
|
|
- for (i = 0; i < mlen; i++) {
|
||
|
|
- if (util_valid_rw_mode(modes[i])) {
|
||
|
|
- rw = modes[i];
|
||
|
|
- } else if (util_valid_propagation_mode(modes[i])) {
|
||
|
|
- pro = modes[i];
|
||
|
|
- } else if (util_valid_label_mode(modes[i])) {
|
||
|
|
- label = modes[i];
|
||
|
|
- } else if (util_valid_copy_mode(modes[i])) {
|
||
|
|
- nocopy = modes[i];
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
if (!util_clean_path(mount_element->destination, path, sizeof(path))) {
|
||
|
|
ERROR("Failed to get clean path");
|
||
|
|
ret = -1;
|
||
|
|
@@ -402,25 +428,6 @@ defs_mount *parse_volume(const char *volume)
|
||
|
|
mount_element->source = util_strdup_s(path);
|
||
|
|
}
|
||
|
|
|
||
|
|
- mount_element->options = util_common_calloc_s(max_options_len * sizeof(char *));
|
||
|
|
- if (mount_element->options == NULL) {
|
||
|
|
- ERROR("Out of memory");
|
||
|
|
- mount_element->options_len = 0;
|
||
|
|
- ret = -1;
|
||
|
|
- goto free_out;
|
||
|
|
- }
|
||
|
|
- if (rw != NULL) {
|
||
|
|
- mount_element->options[mount_element->options_len++] = util_strdup_s(rw);
|
||
|
|
- }
|
||
|
|
- if (pro != NULL) {
|
||
|
|
- mount_element->options[mount_element->options_len++] = util_strdup_s(pro);
|
||
|
|
- }
|
||
|
|
- if (label != NULL) {
|
||
|
|
- mount_element->options[mount_element->options_len++] = util_strdup_s(label);
|
||
|
|
- }
|
||
|
|
- if (nocopy != NULL) {
|
||
|
|
- mount_element->options[mount_element->options_len++] = util_strdup_s(nocopy);
|
||
|
|
- }
|
||
|
|
if (mount_element->source != NULL && mount_element->source[0] == '/') {
|
||
|
|
mount_element->type = util_strdup_s(MOUNT_TYPE_BIND);
|
||
|
|
} else {
|
||
|
|
@@ -430,13 +437,15 @@ defs_mount *parse_volume(const char *volume)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
- ret = check_mount_element(volume, mount_element);
|
||
|
|
+ ret = set_volume_element_options(mount_element, (const char **)modes);
|
||
|
|
if (ret != 0) {
|
||
|
|
+ ERROR("Failed to set volume element options");
|
||
|
|
goto free_out;
|
||
|
|
}
|
||
|
|
|
||
|
|
- ret = append_default_mount_options(mount_element, rw != NULL, pro != NULL, label != NULL);
|
||
|
|
+ ret = check_mount_element(volume, mount_element);
|
||
|
|
if (ret != 0) {
|
||
|
|
+ ERROR("Invalid mount element");
|
||
|
|
goto free_out;
|
||
|
|
}
|
||
|
|
|
||
|
|
--
|
||
|
|
2.25.1
|
||
|
|
|