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; }
static int load_callback(Pool *pool, Repodata *data, void *cbdata) { FILE *fp; const char *location = repodata_lookup_str(data, SOLVID_META, REPOSITORY_LOCATION); int r; if (!location) return 0; printf("loading %s\n", location); fp = fopen (location, "r"); if (!fp) { perror(location); return 0; } r = repo_add_solv_flags(data->repo, fp, REPO_USE_LOADING|REPO_LOCALPOOL); fclose(fp); return r ? 0 : 1; }
const char * repo_lookup_str(Repo *repo, Id entry, Id keyname) { Pool *pool = repo->pool; Repodata *data; int i; const char *str; if (entry >= 0) { switch (keyname) { case SOLVABLE_NAME: return pool_id2str(pool, pool->solvables[entry].name); case SOLVABLE_ARCH: return pool_id2str(pool, pool->solvables[entry].arch); case SOLVABLE_EVR: return pool_id2str(pool, pool->solvables[entry].evr); case SOLVABLE_VENDOR: return pool_id2str(pool, pool->solvables[entry].vendor); } } FOR_REPODATAS(repo, i, data) { if (entry != SOLVID_META && (entry < data->start || entry >= data->end)) continue; if (!repodata_precheck_keyname(data, keyname)) continue; str = repodata_lookup_str(data, entry, keyname); if (str) return str; if (repodata_lookup_type(data, entry, keyname)) return 0; } return 0; }