int susetags_load_ext(Repo *repo, Repodata *data) { const char *filename, *descrdir; Id defvendor; char ext[3]; FILE *fp; struct repoinfo *cinfo; const unsigned char *filechksum; Id filechksumtype; int flags; cinfo = repo->appdata; filename = repodata_lookup_str(data, SOLVID_META, SUSETAGS_FILE_NAME); if (!filename) return 0; /* susetags load */ ext[0] = filename[9]; ext[1] = filename[10]; ext[2] = 0; printf("[%s:%s", repo->name, ext); if (usecachedrepo(cinfo, ext, 0)) { printf(" cached]\n"); fflush(stdout); return 1; } printf(" fetching]\n"); fflush(stdout); defvendor = repo_lookup_id(repo, SOLVID_META, SUSETAGS_DEFAULTVENDOR); descrdir = repo_lookup_str(repo, SOLVID_META, SUSETAGS_DESCRDIR); if (!descrdir) descrdir = "suse/setup/descr"; filechksumtype = 0; filechksum = repodata_lookup_bin_checksum(data, SOLVID_META, SUSETAGS_FILE_CHECKSUM, &filechksumtype); if ((fp = curlfopen(cinfo, pool_tmpjoin(repo->pool, descrdir, "/", filename), 1, filechksum, filechksumtype, 0)) == 0) return 0; flags = REPO_USE_LOADING|REPO_EXTEND_SOLVABLES; if (strcmp(ext, "DL") != 0) flags |= REPO_LOCALPOOL; if (repo_add_susetags(repo, fp, defvendor, ext, flags)) { fclose(fp); printf("%s\n", pool_errstr(repo->pool)); return 0; } fclose(fp); writecachedrepo(cinfo, ext, data); return 1; }
const unsigned char * repo_lookup_bin_checksum(Repo *repo, Id entry, Id keyname, Id *typep) { Repodata *data; int i; const unsigned char *chk; FOR_REPODATAS(repo, i, data) { if (entry != SOLVID_META && (entry < data->start || entry >= data->end)) continue; if (!repodata_precheck_keyname(data, keyname)) continue; chk = repodata_lookup_bin_checksum(data, entry, keyname, typep); if (chk) return chk; if (repodata_lookup_type(data, entry, keyname)) return 0; } *typep = 0; return 0; }