const char * solvable_lookup_str(Solvable *s, Id keyname) { const char *str; if (!s->repo) return 0; str = repo_lookup_str(s->repo, s - s->repo->pool->solvables, keyname); if (!str && (keyname == SOLVABLE_LICENSE || keyname == SOLVABLE_GROUP)) str = solvable_lookup_str_joinarray(s, keyname, ", "); return str; }
/* content file query */ static void doquery(Pool *pool, Repo *repo, const char *arg) { char qbuf[256]; const char *str; Id id; snprintf(qbuf, sizeof(qbuf), "susetags:%s", arg); id = pool_str2id(pool, qbuf, 0); if (!id) return; str = repo_lookup_str(repo, SOLVID_META, id); if (str) printf("%s\n", str); }
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; }
FILE * downloadpackage(Solvable *s, const char *loc) { const unsigned char *chksum; Id chksumtype; struct repoinfo *cinfo = s->repo->appdata; #ifdef ENABLE_SUSEREPO if (cinfo->type == TYPE_SUSETAGS) { const char *datadir = repo_lookup_str(cinfo->repo, SOLVID_META, SUSETAGS_DATADIR); loc = pool_tmpjoin(s->repo->pool, datadir ? datadir : "suse", "/", loc); } #endif chksumtype = 0; chksum = solvable_lookup_bin_checksum(s, SOLVABLE_CHECKSUM, &chksumtype); return curlfopen(cinfo, loc, 0, chksum, chksumtype, 0); }
int susetags_load(struct repoinfo *cinfo, Pool **sigpoolp) { Repo *repo = cinfo->repo; Pool *pool = repo->pool; Repodata *data; const char *filename; const unsigned char *filechksum; Id filechksumtype; FILE *fp; const char *descrdir; int defvendor; printf("susetags repo '%s':", cinfo->alias); fflush(stdout); descrdir = 0; defvendor = 0; if ((fp = curlfopen(cinfo, "content", 0, 0, 0, 0)) == 0) { printf(" no content file\n"); cinfo->incomplete = 1; return 0; } calc_cookie_fp(fp, REPOKEY_TYPE_SHA256, cinfo->cookie); cinfo->cookieset = 1; if (usecachedrepo(cinfo, 0, 1)) { printf(" cached\n"); fclose(fp); return 1; } if (cinfo->repo_gpgcheck && !downloadchecksig(cinfo, fp, "content.asc", sigpoolp)) { fclose(fp); cinfo->incomplete = 1; return 0; } if (repo_add_content(repo, fp, 0)) { printf("content: %s\n", pool_errstr(pool)); fclose(fp); cinfo->incomplete = 1; return 0; } fclose(fp); defvendor = repo_lookup_id(repo, SOLVID_META, SUSETAGS_DEFAULTVENDOR); descrdir = repo_lookup_str(repo, SOLVID_META, SUSETAGS_DESCRDIR); if (!descrdir) descrdir = "suse/setup/descr"; filename = susetags_find(repo, "packages.gz", &filechksum, &filechksumtype); if (!filename) filename = susetags_find(repo, "packages", &filechksum, &filechksumtype); if (!filename) { printf(" no packages file entry, skipped\n"); cinfo->incomplete = 1; return 0; } printf(" fetching\n"); if ((fp = curlfopen(cinfo, pool_tmpjoin(pool, descrdir, "/", filename), 1, filechksum, filechksumtype, 1)) == 0) { cinfo->incomplete = 1; return 0; /* hopeless */ } if (repo_add_susetags(repo, fp, defvendor, 0, REPO_NO_INTERNALIZE|SUSETAGS_RECORD_SHARES)) { printf("packages: %s\n", pool_errstr(pool)); fclose(fp); cinfo->incomplete = 1; return 0; /* hopeless */ } fclose(fp); /* add default language */ filename = susetags_find(repo, "packages.en.gz", &filechksum, &filechksumtype); if (!filename) filename = susetags_find(repo, "packages.en", &filechksum, &filechksumtype); if (filename) { if ((fp = curlfopen(cinfo, pool_tmpjoin(pool, descrdir, "/", filename), 1, filechksum, filechksumtype, 1)) != 0) { if (repo_add_susetags(repo, fp, defvendor, 0, REPO_NO_INTERNALIZE|REPO_REUSE_REPODATA|REPO_EXTEND_SOLVABLES)) { printf("packages.en: %s\n", pool_errstr(pool)); cinfo->incomplete = 1; } fclose(fp); } } filename = susetags_find(repo, "patterns", &filechksum, &filechksumtype); if (filename) { if ((fp = curlfopen(cinfo, pool_tmpjoin(pool, descrdir, "/", filename), 1, filechksum, filechksumtype, 1)) != 0) { char pbuf[256]; while (fgets(pbuf, sizeof(pbuf), fp)) { int l = strlen(pbuf); FILE *fp2; if (l && pbuf[l - 1] == '\n') pbuf[--l] = 0; if (!*pbuf || *pbuf == '.' || strchr(pbuf, '/') != 0) continue; filename = susetags_find(repo, pbuf, &filechksum, &filechksumtype); if (filename && (fp2 = curlfopen(cinfo, pool_tmpjoin(pool, descrdir, "/", filename), 1, filechksum, filechksumtype, 1)) != 0) { if (repo_add_susetags(repo, fp2, defvendor, 0, REPO_NO_INTERNALIZE)) { printf("%s: %s\n", pbuf, pool_errstr(pool)); cinfo->incomplete = 1; } fclose(fp2); } } fclose(fp); } } #ifdef ENABLE_APPDATA filename = susetags_find(repo, "appdata.xml.gz", &filechksum, &filechksumtype); if (!filename) filename = susetags_find(repo, "appdata.xml", &filechksum, &filechksumtype); if (filename && (fp = curlfopen(cinfo, pool_tmpjoin(pool, descrdir, "/", filename), 1, filechksum, filechksumtype, 1)) != 0) { if (repo_add_appdata(repo, fp, 0)) { printf("appdata: %s\n", pool_errstr(pool)); cinfo->incomplete = 1; } fclose(fp); } #endif repo_internalize(repo); #ifdef SUSE repo_add_autopattern(repo, 0); #endif data = repo_add_repodata(repo, 0); repodata_extend_block(data, repo->start, repo->end - repo->start); susetags_add_ext(repo, data); repodata_internalize(data); writecachedrepo(cinfo, 0, 0); repodata_create_stubs(repo_last_repodata(repo)); return 1; }