From: Chengyu Zhu <hudson...@tencent.com> move parse_oci_ref to oci.c.
Signed-off-by: Chengyu Zhu <hudson...@tencent.com> --- lib/liberofs_oci.h | 12 +++-- lib/remotes/oci.c | 110 +++++++++++++++++++++++++++++++++++++++++ mkfs/main.c | 121 +-------------------------------------------- 3 files changed, 120 insertions(+), 123 deletions(-) diff --git a/lib/liberofs_oci.h b/lib/liberofs_oci.h index 3a8108b..bce63ef 100644 --- a/lib/liberofs_oci.h +++ b/lib/liberofs_oci.h @@ -8,9 +8,6 @@ #include <stdbool.h> -#define DOCKER_REGISTRY "docker.io" -#define DOCKER_API_REGISTRY "registry-1.docker.io" - #ifdef __cplusplus extern "C" { #endif @@ -79,6 +76,15 @@ void ocierofs_cleanup(struct erofs_oci *oci); */ int erofs_oci_params_set_string(char **field, const char *value); +/* + * ocierofs_parse_ref - Parse OCI image reference string + * @oci: OCI client structure + * @ref_str: OCI image reference string + * + * Return: 0 on success, negative errno on failure + */ +int ocierofs_parse_ref(struct erofs_oci *oci, const char *ref_str); + /* * ocierofs_build_trees - Build file trees from OCI container image layers * @root: root inode to build the file tree under diff --git a/lib/remotes/oci.c b/lib/remotes/oci.c index 0fb8c1f..e6f0c23 100644 --- a/lib/remotes/oci.c +++ b/lib/remotes/oci.c @@ -21,6 +21,9 @@ #include "liberofs_oci.h" #include "liberofs_private.h" +#define DOCKER_REGISTRY "docker.io" +#define DOCKER_API_REGISTRY "registry-1.docker.io" + #define DOCKER_MEDIATYPE_MANIFEST_V2 \ "application/vnd.docker.distribution.manifest.v2+json" #define DOCKER_MEDIATYPE_MANIFEST_V1 \ @@ -1066,3 +1069,110 @@ int erofs_oci_params_set_string(char **field, const char *value) *field = new_value; return 0; } + +int ocierofs_parse_ref(struct erofs_oci *oci, const char *ref_str) +{ + char *slash, *colon, *dot; + const char *repo_part; + size_t len; + + slash = strchr(ref_str, '/'); + if (slash) { + dot = strchr(ref_str, '.'); + if (dot && dot < slash) { + char *registry_str; + + len = slash - ref_str; + registry_str = strndup(ref_str, len); + + if (!registry_str) { + erofs_err("failed to allocate memory for registry"); + return -ENOMEM; + } + if (erofs_oci_params_set_string(&oci->params.registry, + registry_str)) { + free(registry_str); + erofs_err("failed to set registry"); + return -ENOMEM; + } + free(registry_str); + repo_part = slash + 1; + } else { + repo_part = ref_str; + } + } else { + repo_part = ref_str; + } + + colon = strchr(repo_part, ':'); + if (colon) { + char *repo_str; + + len = colon - repo_part; + repo_str = strndup(repo_part, len); + + if (!repo_str) { + erofs_err("failed to allocate memory for repository"); + return -ENOMEM; + } + + if (!strchr(repo_str, '/') && + (!strcmp(oci->params.registry, DOCKER_API_REGISTRY) || + !strcmp(oci->params.registry, DOCKER_REGISTRY))) { + char *full_repo; + + if (asprintf(&full_repo, "library/%s", repo_str) == -1) { + free(repo_str); + erofs_err("failed to allocate memory for full repository name"); + return -ENOMEM; + } + free(repo_str); + repo_str = full_repo; + } + + if (erofs_oci_params_set_string(&oci->params.repository, + repo_str)) { + free(repo_str); + erofs_err("failed to set repository"); + return -ENOMEM; + } + free(repo_str); + + if (erofs_oci_params_set_string(&oci->params.tag, + colon + 1)) { + erofs_err("failed to set tag"); + return -ENOMEM; + } + } else { + char *repo_str = strdup(repo_part); + + if (!repo_str) { + erofs_err("failed to allocate memory for repository"); + return -ENOMEM; + } + + if (!strchr(repo_str, '/') && + (!strcmp(oci->params.registry, DOCKER_API_REGISTRY) || + !strcmp(oci->params.registry, DOCKER_REGISTRY))) { + char *full_repo; + + if (asprintf(&full_repo, "library/%s", repo_str) == -1) { + free(repo_str); + erofs_err("failed to allocate memory for full repository name"); + return -ENOMEM; + } + free(repo_str); + repo_str = full_repo; + } + + if (erofs_oci_params_set_string(&oci->params.repository, + repo_str)) { + free(repo_str); + erofs_err("failed to set repository"); + return -ENOMEM; + } + free(repo_str); + } + + return 0; +} diff --git a/mkfs/main.c b/mkfs/main.c index bc895f1..064392d 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -763,125 +763,6 @@ static int mkfs_parse_oci_options(char *options_str) return 0; } - -/** - * mkfs_parse_oci_ref - Parse OCI image reference string - * @ref_str: OCI image reference in various formats - * - * Parse OCI image reference which can be in formats: - * - registry.example.com/namespace/repo:tag - * - namespace/repo:tag (uses default registry) - * - repo:tag (adds library/ prefix for Docker Hub) - * - repo (uses default tag "latest") - * - * Return: 0 on success, negative errno on failure - */ -static int mkfs_parse_oci_ref(const char *ref_str) -{ - char *slash, *colon, *dot; - const char *repo_part; - size_t len; - - slash = strchr(ref_str, '/'); - if (slash) { - dot = strchr(ref_str, '.'); - if (dot && dot < slash) { - char *registry_str; - - len = slash - ref_str; - registry_str = strndup(ref_str, len); - - if (!registry_str) { - erofs_err("failed to allocate memory for registry"); - return -ENOMEM; - } - if (erofs_oci_params_set_string(&ocicfg.params.registry, - registry_str)) { - free(registry_str); - erofs_err("failed to set registry"); - return -ENOMEM; - } - free(registry_str); - repo_part = slash + 1; - } else { - repo_part = ref_str; - } - } else { - repo_part = ref_str; - } - - colon = strchr(repo_part, ':'); - if (colon) { - char *repo_str; - - len = colon - repo_part; - repo_str = strndup(repo_part, len); - - if (!repo_str) { - erofs_err("failed to allocate memory for repository"); - return -ENOMEM; - } - - if (!strchr(repo_str, '/') && - (!strcmp(ocicfg.params.registry, DOCKER_API_REGISTRY) || - !strcmp(ocicfg.params.registry, DOCKER_REGISTRY))) { - char *full_repo; - - if (asprintf(&full_repo, "library/%s", repo_str) == -1) { - free(repo_str); - erofs_err("failed to allocate memory for full repository name"); - return -ENOMEM; - } - free(repo_str); - repo_str = full_repo; - } - - if (erofs_oci_params_set_string(&ocicfg.params.repository, - repo_str)) { - free(repo_str); - erofs_err("failed to set repository"); - return -ENOMEM; - } - free(repo_str); - - if (erofs_oci_params_set_string(&ocicfg.params.tag, - colon + 1)) { - erofs_err("failed to set tag"); - return -ENOMEM; - } - } else { - char *repo_str = strdup(repo_part); - - if (!repo_str) { - erofs_err("failed to allocate memory for repository"); - return -ENOMEM; - } - - if (!strchr(repo_str, '/') && - (!strcmp(ocicfg.params.registry, DOCKER_API_REGISTRY) || - !strcmp(ocicfg.params.registry, DOCKER_REGISTRY))) { - char *full_repo; - - if (asprintf(&full_repo, "library/%s", repo_str) == -1) { - free(repo_str); - erofs_err("failed to allocate memory for full repository name"); - return -ENOMEM; - } - free(repo_str); - repo_str = full_repo; - } - - if (erofs_oci_params_set_string(&ocicfg.params.repository, - repo_str)) { - free(repo_str); - erofs_err("failed to set repository"); - return -ENOMEM; - } - free(repo_str); - } - - return 0; -} #endif static int mkfs_parse_one_compress_alg(char *alg, @@ -1958,7 +1839,7 @@ int main(int argc, char **argv) err = mkfs_parse_oci_options(mkfs_oci_options); if (err) goto exit; - err = mkfs_parse_oci_ref(cfg.c_src_path); + err = ocierofs_parse_ref(&ocicfg, cfg.c_src_path); if (err) goto exit; -- 2.51.0