From ca68fbc455b10f80b3216b4e6604655756ecbe05 Mon Sep 17 00:00:00 2001 From: wujing Date: Fri, 8 May 2020 23:08:26 -0400 Subject: [PATCH] image common code extraction Signed-off-by: wujing --- src/cutils/utils.h | 1 + src/cutils/utils_images.c | 292 ++++++++++++++++++ src/cutils/utils_images.h | 48 +++ src/image/oci/oci_common_operators.c | 271 ---------------- src/image/oci/oci_common_operators.h | 12 +- src/image/oci/registry/http_request.c | 2 - src/image/oci/registry/registry.c | 2 +- .../oci/storage/image_store/image_store.c | 58 +--- .../storage/layer_store/graphdriver/driver.c | 2 +- test/image/oci/storage/images/CMakeLists.txt | 1 + 10 files changed, 346 insertions(+), 343 deletions(-) create mode 100644 src/cutils/utils_images.c create mode 100644 src/cutils/utils_images.h diff --git a/src/cutils/utils.h b/src/cutils/utils.h index f1baa90..5f8c096 100644 --- a/src/cutils/utils.h +++ b/src/cutils/utils.h @@ -37,6 +37,7 @@ #include "utils_fs.h" #include "utils_base64.h" #include "utils_aes.h" +#include "utils_images.h" #ifdef __cplusplus extern "C" { diff --git a/src/cutils/utils_images.c b/src/cutils/utils_images.c new file mode 100644 index 0000000..c19f604 --- /dev/null +++ b/src/cutils/utils_images.c @@ -0,0 +1,292 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * iSulad licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Author: WuJing + * Create: 2020-05-09 + * Description: provide isula image common functions + *******************************************************************************/ + +#define _GNU_SOURCE +#include +#include + +#include "log.h" +#include "utils.h" +#include "utils_images.h" + + +char *get_last_part(char **parts) +{ + char *last_part = NULL; + char **p; + + for (p = parts; p != NULL && *p != NULL; p++) { + last_part = *p; + } + + return last_part; +} + +char *oci_get_host(const char *name) +{ + char **parts = NULL; + char *host = NULL; + + if (name == NULL) { + ERROR("Invalid NULL param"); + return NULL; + } + + parts = util_string_split(name, '/'); + if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") && + strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) { + util_free_array(parts); + return NULL; + } + + if (parts != NULL) { + host = util_strdup_s(parts[0]); + util_free_array(parts); + } + + return host; +} + +char *oci_default_tag(const char *name) +{ + char temp[PATH_MAX] = { 0 }; + char **parts = NULL; + char *last_part = NULL; + char *add_default_tag = ""; + + if (name == NULL) { + ERROR("Invalid NULL param"); + return NULL; + } + + parts = util_string_split(name, '/'); + if (parts == NULL) { + ERROR("split %s by '/' failed", name); + return NULL; + } + + last_part = get_last_part(parts); + if (last_part != NULL && strrchr(last_part, ':') == NULL) { + add_default_tag = DEFAULT_TAG; + } + + util_free_array(parts); + + // Add image's default tag + int nret = snprintf(temp, sizeof(temp), "%s%s", name, add_default_tag); + if (nret < 0 || (size_t)nret >= sizeof(temp)) { + ERROR("sprint temp image name failed"); + return NULL; + } + + return util_strdup_s(temp); +} + +char *oci_host_from_mirror(const char *mirror) +{ + const char *host = mirror; + + if (mirror == NULL) { + ERROR("Invalid NULL param"); + return NULL; + } + + if (util_has_prefix(mirror, HTTPS_PREFIX)) { + host = mirror + strlen(HTTPS_PREFIX); + } else if (util_has_prefix(mirror, HTTPS_PREFIX)) { + host = mirror + strlen(HTTP_PREFIX); + } + + return util_strdup_s(host); +} + +char *oci_add_host(const char *host, const char *name) +{ + char *with_host = NULL; + bool need_repo_prefix = false; + + if (host == NULL || name == NULL) { + ERROR("Invalid NULL param"); + return NULL; + } + + if (strchr(name, '/') == NULL) { + need_repo_prefix = true; + } + + with_host = util_common_calloc_s(strlen(host) + strlen("/") + strlen(DEFAULT_REPO_PREFIX) + strlen(name) + 1); + if (with_host == NULL) { + ERROR("out of memory"); + return NULL; + } + (void)strcat(with_host, host); + (void)strcat(with_host, "/"); + if (need_repo_prefix) { + (void)strcat(with_host, DEFAULT_REPO_PREFIX); + } + (void)strcat(with_host, name); + + return with_host; +} + +// normalize the unqualified image to be domain/repo/image... +char *oci_normalize_image_name(const char *name) +{ + char temp[PATH_MAX] = { 0 }; + char **parts = NULL; + char *last_part = NULL; + char *add_dockerio = ""; + char *add_library = ""; + char *add_default_tag = ""; + + // Add prefix docker.io if necessary + parts = util_string_split(name, '/'); + if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") && + strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) { + add_dockerio = DEFAULT_HOSTNAME; + } + + // Add library if necessary + if (strlen(add_dockerio) != 0 && strstr(name, "/") == NULL) { + add_library = DEFAULT_REPO_PREFIX; + } + + // Add default tag if necessary + last_part = get_last_part(parts); + if (last_part != NULL && strrchr(last_part, ':') == NULL) { + add_default_tag = DEFAULT_TAG; + } + + util_free_array(parts); + + // Normalize image name + int nret = snprintf(temp, sizeof(temp), "%s%s%s%s", add_dockerio, add_library, name, add_default_tag); + if (nret < 0 || (size_t)nret >= sizeof(temp)) { + ERROR("sprint temp image name failed"); + return NULL; + } + + return util_strdup_s(temp); +} + +int oci_split_image_name(const char *image_name, char **host, char **name, char **tag) +{ + char *tag_pos = NULL; + char *name_pos = NULL; + char *tmp_image_name = NULL; + + if (!util_valid_image_name(image_name)) { + ERROR("Invalid full image name %s", image_name); + return -1; + } + + tmp_image_name = util_strdup_s(image_name); + tag_pos = util_tag_pos(tmp_image_name); + if (tag_pos != NULL) { + *tag_pos = 0; + tag_pos++; + if (tag != NULL) { + *tag = util_strdup_s(tag_pos); + } + } + + name_pos = strchr(tmp_image_name, '/'); + if (name_pos != NULL) { + *name_pos = 0; + name_pos++; + if (name != NULL) { + *name = util_strdup_s(name_pos); + } + if (host != NULL) { + *host = util_strdup_s(tmp_image_name); + } + } + + free(tmp_image_name); + tmp_image_name = NULL; + + return 0; +} + +char *oci_full_image_name(const char *host, const char *name, const char *tag) +{ + char temp[PATH_MAX] = { 0 }; + const char *tmp_host = ""; + const char *tmp_sep = ""; + const char *tmp_prefix = ""; + const char *tmp_colon = ""; + const char *tmp_tag = DEFAULT_TAG; + + if (name == NULL) { + ERROR("Invalid NULL name found when getting full image name"); + return NULL; + } + + if (host != NULL) { + tmp_host = host; + tmp_sep = "/"; + } + if (strchr(name, '/') == NULL) { + tmp_prefix = DEFAULT_REPO_PREFIX; + } + if (tag != NULL) { + tmp_colon = ":"; + tmp_tag = tag; + } + int nret = snprintf(temp, sizeof(temp), "%s%s%s%s%s%s", tmp_host, tmp_sep, tmp_prefix, name, tmp_colon, tmp_tag); + if (nret < 0 || (size_t)nret >= sizeof(temp)) { + ERROR("sprint temp image name failed, host %s, name %s, tag %s", host, name, tag); + return NULL; + } + + if (!util_valid_image_name(temp)) { + ERROR("Invalid full image name %s, host %s, name %s, tag %s", temp, host, name, tag); + return NULL; + } + + return util_strdup_s(temp); +} + +char *oci_strip_dockerio_prefix(const char *name) +{ + char prefix[PATH_MAX] = { 0 }; + size_t size = 0; + + if (name == NULL) { + ERROR("NULL image name"); + return NULL; + } + + int nret = snprintf(prefix, sizeof(prefix), "%s%s", DEFAULT_HOSTNAME, DEFAULT_REPO_PREFIX); + if (nret < 0 || (size_t)nret >= sizeof(prefix)) { + ERROR("sprint prefix prefix failed"); + return NULL; + } + + // Strip docker.io/library + size = strlen(prefix); + if (strncmp(name, prefix, size) == 0 && strlen(name) > size) { + return util_strdup_s(name + size); + } + + // Strip docker.io + size = strlen(DEFAULT_HOSTNAME); + if (strncmp(name, DEFAULT_HOSTNAME, size) == 0 && strlen(name) > size) { + return util_strdup_s(name + size); + } + + return util_strdup_s(name); +} + diff --git a/src/cutils/utils_images.h b/src/cutils/utils_images.h new file mode 100644 index 0000000..2c4bb69 --- /dev/null +++ b/src/cutils/utils_images.h @@ -0,0 +1,48 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * iSulad licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Author: WuJing + * Create: 2020-05-09 + * Description: provide isula image common functions + ********************************************************************************/ + +#ifndef __UTILS_IMAGES_H +#define __UTILS_IMAGE_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define HTTPS_PREFIX "https://" +#define HTTP_PREFIX "http://" + +#define DEFAULT_TAG ":latest" +#define DEFAULT_HOSTNAME "docker.io/" +#define DEFAULT_REPO_PREFIX "library/" + +char *oci_get_host(const char *name); +char *oci_host_from_mirror(const char *mirror); +char *oci_default_tag(const char *name); +char *oci_add_host(const char *domain, const char *name); +char *oci_normalize_image_name(const char *name); +int oci_split_image_name(const char *image_name, char **host, char **name, char **tag); +char *oci_full_image_name(const char *host, const char *name, const char *tag); +char *oci_strip_dockerio_prefix(const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __UTILS_IMAGES_H */ + diff --git a/src/image/oci/oci_common_operators.c b/src/image/oci/oci_common_operators.c index 36c31c0..4ad8c6e 100644 --- a/src/image/oci/oci_common_operators.c +++ b/src/image/oci/oci_common_operators.c @@ -28,10 +28,6 @@ #include "filters.h" -#define DEFAULT_TAG ":latest" -#define DEFAULT_HOSTNAME "docker.io/" -#define DEFAULT_REPO_PREFIX "library/" - bool oci_detect(const char *image_name) { if (image_name == NULL) { @@ -41,165 +37,6 @@ bool oci_detect(const char *image_name) return storage_image_exist(image_name); } -char *get_last_part(char **parts) -{ - char *last_part = NULL; - char **p; - - for (p = parts; p != NULL && *p != NULL; p++) { - last_part = *p; - } - - return last_part; -} - -char *oci_get_host(const char *name) -{ - char **parts = NULL; - char *host = NULL; - - if (name == NULL) { - ERROR("Invalid NULL param"); - return NULL; - } - - parts = util_string_split(name, '/'); - if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") && - strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) { - util_free_array(parts); - return NULL; - } - - if (parts != NULL) { - host = util_strdup_s(parts[0]); - util_free_array(parts); - } - - return host; -} - -char *oci_default_tag(const char *name) -{ - char temp[PATH_MAX] = { 0 }; - char **parts = NULL; - char *last_part = NULL; - char *add_default_tag = ""; - - if (name == NULL) { - ERROR("Invalid NULL param"); - return NULL; - } - - parts = util_string_split(name, '/'); - if (parts == NULL) { - ERROR("split %s by '/' failed", name); - return NULL; - } - - last_part = get_last_part(parts); - if (last_part != NULL && strrchr(last_part, ':') == NULL) { - add_default_tag = DEFAULT_TAG; - } - - util_free_array(parts); - - // Add image's default tag - int nret = snprintf(temp, sizeof(temp), "%s%s", name, add_default_tag); - if (nret < 0 || (size_t)nret >= sizeof(temp)) { - ERROR("sprint temp image name failed"); - return NULL; - } - - return util_strdup_s(temp); -} - -char *oci_host_from_mirror(const char *mirror) -{ - const char *host = mirror; - - if (mirror == NULL) { - ERROR("Invalid NULL param"); - return NULL; - } - - if (util_has_prefix(mirror, HTTPS_PREFIX)) { - host = mirror + strlen(HTTPS_PREFIX); - } else if (util_has_prefix(mirror, HTTPS_PREFIX)) { - host = mirror + strlen(HTTP_PREFIX); - } - - return util_strdup_s(host); -} - -char *oci_add_host(const char *host, const char *name) -{ - char *with_host = NULL; - bool need_repo_prefix = false; - - if (host == NULL || name == NULL) { - ERROR("Invalid NULL param"); - return NULL; - } - - if (strchr(name, '/') == NULL) { - need_repo_prefix = true; - } - - with_host = util_common_calloc_s(strlen(host) + strlen("/") + strlen(DEFAULT_REPO_PREFIX) + strlen(name) + 1); - if (with_host == NULL) { - ERROR("out of memory"); - return NULL; - } - (void)strcat(with_host, host); - (void)strcat(with_host, "/"); - if (need_repo_prefix) { - (void)strcat(with_host, DEFAULT_REPO_PREFIX); - } - (void)strcat(with_host, name); - - return with_host; -} - -// normalize the unqualified image to be domain/repo/image... -char *oci_normalize_image_name(const char *name) -{ - char temp[PATH_MAX] = { 0 }; - char **parts = NULL; - char *last_part = NULL; - char *add_dockerio = ""; - char *add_library = ""; - char *add_default_tag = ""; - - // Add prefix docker.io if necessary - parts = util_string_split(name, '/'); - if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") && - strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) { - add_dockerio = DEFAULT_HOSTNAME; - } - - // Add library if necessary - if (strlen(add_dockerio) != 0 && strstr(name, "/") == NULL) { - add_library = DEFAULT_REPO_PREFIX; - } - - // Add default tag if necessary - last_part = get_last_part(parts); - if (last_part != NULL && strrchr(last_part, ':') == NULL) { - add_default_tag = DEFAULT_TAG; - } - - util_free_array(parts); - - // Normalize image name - int nret = snprintf(temp, sizeof(temp), "%s%s%s%s", add_dockerio, add_library, name, add_default_tag); - if (nret < 0 || (size_t)nret >= sizeof(temp)) { - ERROR("sprint temp image name failed"); - return NULL; - } - - return util_strdup_s(temp); -} - char *oci_resolve_image_name(const char *name) { if (util_valid_short_sha256_id(name) && storage_image_exist(name)) { @@ -209,114 +46,6 @@ char *oci_resolve_image_name(const char *name) return oci_normalize_image_name(name); } -int oci_split_image_name(const char *image_name, char **host, char **name, char **tag) -{ - char *tag_pos = NULL; - char *name_pos = NULL; - char *tmp_image_name = NULL; - - if (!util_valid_image_name(image_name)) { - ERROR("Invalid full image name %s", image_name); - return -1; - } - - tmp_image_name = util_strdup_s(image_name); - tag_pos = util_tag_pos(tmp_image_name); - if (tag_pos != NULL) { - *tag_pos = 0; - tag_pos++; - if (tag != NULL) { - *tag = util_strdup_s(tag_pos); - } - } - - name_pos = strchr(tmp_image_name, '/'); - if (name_pos != NULL) { - *name_pos = 0; - name_pos++; - if (name != NULL) { - *name = util_strdup_s(name_pos); - } - if (host != NULL) { - *host = util_strdup_s(tmp_image_name); - } - } - - free(tmp_image_name); - tmp_image_name = NULL; - - return 0; -} - -char *oci_full_image_name(const char *host, const char *name, const char *tag) -{ - char temp[PATH_MAX] = { 0 }; - const char *tmp_host = ""; - const char *tmp_sep = ""; - const char *tmp_prefix = ""; - const char *tmp_colon = ""; - const char *tmp_tag = DEFAULT_TAG; - - if (name == NULL) { - ERROR("Invalid NULL name found when getting full image name"); - return NULL; - } - - if (host != NULL) { - tmp_host = host; - tmp_sep = "/"; - } - if (strchr(name, '/') == NULL) { - tmp_prefix = DEFAULT_REPO_PREFIX; - } - if (tag != NULL) { - tmp_colon = ":"; - tmp_tag = tag; - } - int nret = snprintf(temp, sizeof(temp), "%s%s%s%s%s%s", tmp_host, tmp_sep, tmp_prefix, name, tmp_colon, tmp_tag); - if (nret < 0 || (size_t)nret >= sizeof(temp)) { - ERROR("sprint temp image name failed, host %s, name %s, tag %s", host, name, tag); - return NULL; - } - - if (!util_valid_image_name(temp)) { - ERROR("Invalid full image name %s, host %s, name %s, tag %s", temp, host, name, tag); - return NULL; - } - - return util_strdup_s(temp); -} - -static char *oci_strip_dockerio_prefix(const char *name) -{ - char prefix[PATH_MAX] = { 0 }; - size_t size = 0; - - if (name == NULL) { - ERROR("NULL image name"); - return NULL; - } - - int nret = snprintf(prefix, sizeof(prefix), "%s%s", DEFAULT_HOSTNAME, DEFAULT_REPO_PREFIX); - if (nret < 0 || (size_t)nret >= sizeof(prefix)) { - ERROR("sprint prefix prefix failed"); - return NULL; - } - - // Strip docker.io/library - size = strlen(prefix); - if (strncmp(name, prefix, size) == 0 && strlen(name) > size) { - return util_strdup_s(name + size); - } - - // Strip docker.io - size = strlen(DEFAULT_HOSTNAME); - if (strncmp(name, DEFAULT_HOSTNAME, size) == 0 && strlen(name) > size) { - return util_strdup_s(name + size); - } - - return util_strdup_s(name); -} static void oci_strip_dockerio(const imagetool_image *image) { diff --git a/src/image/oci/oci_common_operators.h b/src/image/oci/oci_common_operators.h index bec4e4a..1d2e25f 100644 --- a/src/image/oci/oci_common_operators.h +++ b/src/image/oci/oci_common_operators.h @@ -20,22 +20,12 @@ #include "isula_libutils/imagetool_image.h" #include "isula_libutils/oci_image_spec.h" -#define HTTPS_PREFIX "https://" -#define HTTP_PREFIX "http://" - #ifdef __cplusplus extern "C" { #endif -char *oci_get_host(const char *name); -char *oci_host_from_mirror(const char *mirror); -char *oci_default_tag(const char *name); -char *oci_add_host(const char *domain, const char *name); -char *oci_normalize_image_name(const char *name); -int oci_split_image_name(const char *image_name, char **host, char **name, char **tag); -char *oci_full_image_name(const char *host, const char *name, const char *tag); -bool oci_detect(const char *image_name); char *oci_resolve_image_name(const char *name); +bool oci_detect(const char *image_name); int oci_get_user_conf(const char *basefs, host_config *hc, const char *userstr, defs_process_user *puser); int oci_list_images(const im_list_request *request, imagetool_images_list **images); int oci_status_image(im_status_request *request, im_status_response **response); diff --git a/src/image/oci/registry/http_request.c b/src/image/oci/registry/http_request.c index 920b38b..805f34f 100644 --- a/src/image/oci/registry/http_request.c +++ b/src/image/oci/registry/http_request.c @@ -30,8 +30,6 @@ #include "auths.h" #include "registry_token.h" -#define HTTPS_PREFIX "https://" -#define HTTP_PREFIX "https://" #define MIN_TOKEN_EXPIRES_IN 60 static int http_request_get_token(pull_descriptor *desc, challenge *c, char **output); diff --git a/src/image/oci/registry/registry.c b/src/image/oci/registry/registry.c index c3dca8b..0ee2d1a 100644 --- a/src/image/oci/registry/registry.c +++ b/src/image/oci/registry/registry.c @@ -744,7 +744,7 @@ static int register_image(pull_descriptor *desc) ret = storage_img_set_image_size(image_id); if (ret != 0) { ERROR("set image size failed for %s failed", image_id); - goto out; + goto out; } out: diff --git a/src/image/oci/storage/image_store/image_store.c b/src/image/oci/storage/image_store/image_store.c index 2dbdc06..fbf1b82 100644 --- a/src/image/oci/storage/image_store/image_store.c +++ b/src/image/oci/storage/image_store/image_store.c @@ -2205,62 +2205,6 @@ out: return ret; } -#define DEFAULT_TAG ":latest" -#define DEFAULT_HOSTNAME "docker.io/" -#define DEFAULT_REPO_PREFIX "library/" - -static char *get_last_part(char **parts) -{ - char *last_part = NULL; - char **p; - - for (p = parts; p != NULL && *p != NULL; p++) { - last_part = *p; - } - - return last_part; -} - -// normalize the unqualified image to be domain/repo/image... -static char *normalize_image_name(const char *name) -{ - char temp[PATH_MAX] = { 0 }; - char **parts = NULL; - char *last_part = NULL; - char *add_dockerio = ""; - char *add_library = ""; - char *add_default_tag = ""; - - // Add prefix docker.io if necessary - parts = util_string_split(name, '/'); - if ((parts != NULL && *parts != NULL && !strings_contains_any(*parts, ".:") && - strcmp(*parts, "localhost")) || (strstr(name, "/") == NULL)) { - add_dockerio = DEFAULT_HOSTNAME; - } - - // Add library if necessary - if (strlen(add_dockerio) != 0 && strstr(name, "/") == NULL) { - add_library = DEFAULT_REPO_PREFIX; - } - - // Add default tag if necessary - last_part = get_last_part(parts); - if (last_part != NULL && strrchr(last_part, ':') == NULL) { - add_default_tag = DEFAULT_TAG; - } - - util_free_array(parts); - - // Normalize image name - int nret = snprintf(temp, sizeof(temp), "%s%s%s%s", add_dockerio, add_library, name, add_default_tag); - if (nret < 0 || (size_t)nret >= sizeof(temp)) { - ERROR("sprint temp image name failed"); - return NULL; - } - - return util_strdup_s(temp); -} - // Parsing a reference string as a possible identifier, full digest, or familiar name. static char *parse_digest_reference(const char *ref) { @@ -2274,7 +2218,7 @@ static char *parse_digest_reference(const char *ref) return util_strdup_s(ref); } - return normalize_image_name(ref); + return oci_normalize_image_name(ref); } static int pack_repo_digest(char ***old_repo_digests, const char **image_tags, const char *digest, char ***repo_digests) diff --git a/src/image/oci/storage/layer_store/graphdriver/driver.c b/src/image/oci/storage/layer_store/graphdriver/driver.c index 1b5373b..729aa2e 100644 --- a/src/image/oci/storage/layer_store/graphdriver/driver.c +++ b/src/image/oci/storage/layer_store/graphdriver/driver.c @@ -265,7 +265,7 @@ container_inspect_graph_driver *graphdriver_get_metadata(const char *id) } inspect_driver->name = util_strdup_s(g_graphdriver->name); - + if (!strcmp(g_graphdriver->name, DRIVER_OVERLAY_NAME) || !strcmp(g_graphdriver->name, DRIVER_OVERLAY2_NAME)) { for (i = 0; i < metadata->len; i++) { if (!strcmp(metadata->keys[i], "LowerDir")) { diff --git a/test/image/oci/storage/images/CMakeLists.txt b/test/image/oci/storage/images/CMakeLists.txt index d139f62..b7b8c79 100644 --- a/test/image/oci/storage/images/CMakeLists.txt +++ b/test/image/oci/storage/images/CMakeLists.txt @@ -10,6 +10,7 @@ add_executable(${EXE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_string.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_convert.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_file.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/utils_images.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/cutils/util_atomic.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/log.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../src/sha256/sha256.c -- GitLab