void lr_yum_repo_update(lr_YumRepo repo, const char *type, const char *path) { assert(repo); assert(type); assert(path); for (int x = 0; x < repo->nop; x++) if (!strcmp(repo->paths[x]->type, type)) { lr_free(repo->paths[x]->path); repo->paths[x]->path = lr_strdup(path); return; } lr_yum_repo_append(repo, type, path); }
static void lr_yum_repo_update(LrYumRepo *repo, const char *type, const char *path) { assert(repo); assert(type); assert(path); for (GSList *elem = repo->paths; elem; elem = g_slist_next(elem)) { LrYumRepoPath *yumrepopath = elem->data; assert(yumrepopath); if (!strcmp(yumrepopath->type, type)) { lr_free(yumrepopath->path); yumrepopath->path = g_strdup(path); return; } } lr_yum_repo_append(repo, type, path); }
/* Do not duplicate repoata, just locate the local one */ static gboolean lr_yum_use_local(LrHandle *handle, LrResult *result, GError **err) { char *baseurl; LrYumRepo *repo; LrYumRepoMd *repomd; assert(!err || *err == NULL); g_debug("%s: Locating repo..", __func__); // Shortcuts repo = result->yum_repo; repomd = result->yum_repomd; baseurl = handle->urls[0]; // Skip "file://" prefix if present if (g_str_has_prefix(baseurl, "file://")) baseurl += 7; else if (g_str_has_prefix(baseurl, "file:")) baseurl += 5; // Check sanity if (strstr(baseurl, "://")) { g_set_error(err, LR_YUM_ERROR, LRE_NOTLOCAL, "URL: %s doesn't seem to be a local repository", baseurl); return FALSE; } if (!handle->update) { // Load repomd.xml and mirrorlist+metalink if locally available if (!lr_yum_use_local_load_base(handle, result, repo, repomd, baseurl, err)) return FALSE; } // Locate rest of metadata files for (GSList *elem = repomd->records; elem; elem = g_slist_next(elem)) { _cleanup_free_ char *path = NULL; LrYumRepoMdRecord *record = elem->data; assert(record); if (!lr_yum_repomd_record_enabled(handle, record->type)) continue; // Caller isn't interested in this record type if (lr_yum_repo_path(repo, record->type)) continue; // This path already exists in repo path = lr_pathconcat(baseurl, record->location_href, NULL); if (access(path, F_OK) == -1) { // A repo file is missing if (!handle->ignoremissing) { g_debug("%s: Incomplete repository - %s is missing", __func__, path); g_set_error(err, LR_YUM_ERROR, LRE_INCOMPLETEREPO, "Incomplete repository - %s is missing", path); return FALSE; } continue; } lr_yum_repo_append(repo, record->type, path); } g_debug("%s: Repository was successfully located", __func__); return TRUE; }
int lr_yum_use_local(lr_Handle handle, lr_Result result) { char *path; int rc = LRE_OK; int fd; char *baseurl; lr_YumRepo repo; lr_YumRepoMd repomd; DPRINTF("%s: Locating repo..\n", __func__); repo = result->yum_repo; repomd = result->yum_repomd; baseurl = handle->baseurl; /* Do not duplicate repoata, just locate the local one */ if (strncmp(baseurl, "file://", 7)) { if (strstr(baseurl, "://")) return LRE_NOTLOCAL; } else { /* Skip file:// in baseurl */ baseurl = baseurl+7; } if (!handle->update) { /* Open and parse repomd */ char *sig; path = lr_pathconcat(baseurl, "repodata/repomd.xml", NULL); fd = open(path, O_RDONLY); if (fd < 0) { DPRINTF("%s: open(%s): %s\n", __func__, path, strerror(errno)); lr_free(path); return LRE_IO; } DPRINTF("%s: Parsing repomd.xml\n", __func__); rc = lr_yum_repomd_parse_file(repomd, fd); if (rc != LRE_OK) { DPRINTF("%s: Parsing unsuccessful (%d)\n", __func__, rc); lr_free(path); return rc; } close(fd); /* Fill result object */ result->destdir = lr_strdup(baseurl); repo->destdir = lr_strdup(baseurl); repo->repomd = path; /* Check if signature file exists */ sig = lr_pathconcat(baseurl, "repodata/repomd.xml.asc", NULL); if (access(sig, F_OK) == 0) repo->signature = sig; // File with key exists else lr_free(sig); /* Signature checking */ if (handle->checks & LR_CHECK_GPG && repo->signature) { rc = lr_gpg_check_signature(repo->signature, repo->repomd, NULL); if (rc != LRE_OK) { DPRINTF("%s: GPG signature verification failed\n", __func__); return rc; } } DPRINTF("%s: Repomd revision: %s\n", __func__, repomd->revision); } /* Locate rest of metadata files */ for (int x = 0; x < repomd->nor; x++) { char *path; lr_YumRepoMdRecord record = repomd->records[x]; if (!lr_yum_repomd_record_enabled(handle, record->type)) continue; if (lr_yum_repo_path(repo, record->type)) continue; /* This path already exists in repo */ path = lr_pathconcat(baseurl, record->location_href, NULL); if (path) { if (access(path, F_OK) == -1) { /* A repo file is missing */ if (!handle->ignoremissing) { DPRINTF("%s: Incomplete repository\n", __func__); lr_free(path); return LRE_INCOMPLETEREPO; } } else lr_yum_repo_append(repo, record->type, path); lr_free(path); } } DPRINTF("%s: Repository was successfully located\n", __func__); return LRE_OK; }