|
Packit |
54873f |
#ifdef ENABLE_MDKREPO
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include <stdio.h>
|
|
Packit |
54873f |
#include <stdlib.h>
|
|
Packit |
54873f |
#include <unistd.h>
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include "pool.h"
|
|
Packit |
54873f |
#include "repo.h"
|
|
Packit |
54873f |
#include "chksum.h"
|
|
Packit |
54873f |
#include "repo_mdk.h"
|
|
Packit |
54873f |
#include "solv_xfopen.h"
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include "repoinfo.h"
|
|
Packit |
54873f |
#include "repoinfo_cache.h"
|
|
Packit |
54873f |
#include "repoinfo_download.h"
|
|
Packit |
54873f |
#include "repoinfo_type_mdk.h"
|
|
Packit |
54873f |
|
|
Packit |
54873f |
static int
|
|
Packit |
54873f |
mdk_find(const char *md5sums, const char *what, unsigned char *chksum)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
const char *sp, *ep;
|
|
Packit |
54873f |
int wl = strlen(what);
|
|
Packit |
54873f |
for (sp = md5sums; (ep = strchr(sp, '\n')) != 0; sp = ep + 1)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
int l = ep - sp;
|
|
Packit |
54873f |
if (l <= 34)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
if (sp[32] != ' ' || sp[33] != ' ')
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
if (wl != l - 34 || strncmp(what, sp + 34, wl) != 0)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
if (solv_hex2bin(&sp, chksum, 16) != 16)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
return 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
static char *
|
|
Packit |
54873f |
slurp(FILE *fp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
int l, ll;
|
|
Packit |
54873f |
char *buf = 0;
|
|
Packit |
54873f |
int bufl = 0;
|
|
Packit |
54873f |
|
|
Packit |
54873f |
for (l = 0; ; l += ll)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (bufl - l < 4096)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
bufl += 4096;
|
|
Packit |
54873f |
buf = solv_realloc(buf, bufl);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
ll = fread(buf + l, 1, bufl - l, fp);
|
|
Packit |
54873f |
if (ll < 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
buf = solv_free(buf);
|
|
Packit |
54873f |
l = 0;
|
|
Packit |
54873f |
break;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
if (ll == 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
buf[l] = 0;
|
|
Packit |
54873f |
break;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
return buf;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
int
|
|
Packit |
54873f |
mdk_load_ext(Repo *repo, Repodata *data)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
struct repoinfo *cinfo = repo->appdata;
|
|
Packit |
54873f |
const char *type, *ext, *filename;
|
|
Packit |
54873f |
const unsigned char *filechksum;
|
|
Packit |
54873f |
Id filechksumtype;
|
|
Packit |
54873f |
int r = 0;
|
|
Packit |
54873f |
FILE *fp;
|
|
Packit |
54873f |
|
|
Packit |
54873f |
type = repodata_lookup_str(data, SOLVID_META, REPOSITORY_REPOMD_TYPE);
|
|
Packit |
54873f |
if (strcmp(type, "filelists") != 0)
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
ext = "FL";
|
|
Packit |
54873f |
printf("[%s:%s", repo->name, ext);
|
|
Packit |
54873f |
if (usecachedrepo(cinfo, ext, 0))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
printf(" cached]\n"); fflush(stdout);
|
|
Packit |
54873f |
return 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
printf(" fetching]\n"); fflush(stdout);
|
|
Packit |
54873f |
filename = repodata_lookup_str(data, SOLVID_META, REPOSITORY_REPOMD_LOCATION);
|
|
Packit |
54873f |
filechksumtype = 0;
|
|
Packit |
54873f |
filechksum = repodata_lookup_bin_checksum(data, SOLVID_META, REPOSITORY_REPOMD_CHECKSUM, &filechksumtype);
|
|
Packit |
54873f |
if ((fp = curlfopen(cinfo, filename, 1, filechksum, filechksumtype, 0)) == 0)
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
r = repo_add_mdk_info(repo, fp, REPO_USE_LOADING|REPO_EXTEND_SOLVABLES|REPO_LOCALPOOL);
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
if (r)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
printf("%s\n", pool_errstr(repo->pool));
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
writecachedrepo(cinfo, ext, data);
|
|
Packit |
54873f |
return 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
static void
|
|
Packit |
54873f |
mdk_add_ext(Repo *repo, Repodata *data, const char *what, const char *ext, const char *filename, Id chksumtype, const unsigned char *chksum)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
Id handle = repodata_new_handle(data);
|
|
Packit |
54873f |
/* we mis-use the repomd ids here... need something generic in the future */
|
|
Packit |
54873f |
repodata_set_poolstr(data, handle, REPOSITORY_REPOMD_TYPE, what);
|
|
Packit |
54873f |
repodata_set_str(data, handle, REPOSITORY_REPOMD_LOCATION, filename);
|
|
Packit |
54873f |
repodata_set_bin_checksum(data, handle, REPOSITORY_REPOMD_CHECKSUM, chksumtype, chksum);
|
|
Packit |
54873f |
add_ext_keys(data, handle, ext);
|
|
Packit |
54873f |
repodata_add_flexarray(data, SOLVID_META, REPOSITORY_EXTERNAL, handle);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
int
|
|
Packit |
54873f |
mdk_load(struct repoinfo *cinfo, Pool **sigpoolp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
Repo *repo = cinfo->repo;
|
|
Packit |
54873f |
Pool *pool = repo->pool;
|
|
Packit |
54873f |
Repodata *data;
|
|
Packit |
54873f |
const char *compression;
|
|
Packit |
54873f |
FILE *fp, *cfp;
|
|
Packit |
54873f |
char *md5sums;
|
|
Packit |
54873f |
unsigned char probe[5];
|
|
Packit |
54873f |
unsigned char md5[16];
|
|
Packit |
54873f |
|
|
Packit |
54873f |
printf("mdk repo '%s':", cinfo->alias);
|
|
Packit |
54873f |
fflush(stdout);
|
|
Packit |
54873f |
if ((fp = curlfopen(cinfo, "media_info/MD5SUM", 0, 0, 0, 0)) == 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
printf(" no media_info/MD5SUM file\n");
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
calc_cookie_fp(fp, REPOKEY_TYPE_SHA256, cinfo->cookie);
|
|
Packit |
54873f |
cinfo->cookieset = 1;
|
|
Packit |
54873f |
if (usecachedrepo(cinfo, 0, 1))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
printf(" cached\n");
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
return 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
md5sums = slurp(fp);
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
printf(" fetching\n");
|
|
Packit |
54873f |
if (!mdk_find(md5sums, "synthesis.hdlist.cz", md5))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
solv_free(md5sums);
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
return 0; /* hopeless */
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
if ((fp = curlfopen(cinfo, "media_info/synthesis.hdlist.cz", 0, md5, REPOKEY_TYPE_MD5, 1)) == 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
solv_free(md5sums);
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
return 0; /* hopeless */
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
/* probe compression */
|
|
Packit |
54873f |
if (fread(probe, 5, 1, fp) != 1)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
solv_free(md5sums);
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
return 0; /* hopeless */
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
if (probe[0] == 0xfd && memcmp(probe + 1, "7zXZ", 4) == 0)
|
|
Packit |
54873f |
compression = "synthesis.hdlist.xz";
|
|
Packit |
54873f |
else
|
|
Packit |
54873f |
compression = "synthesis.hdlist.gz";
|
|
Packit |
54873f |
lseek(fileno(fp), 0, SEEK_SET);
|
|
Packit |
54873f |
cfp = solv_xfopen_fd(compression, dup(fileno(fp)), "r");
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
fp = cfp;
|
|
Packit |
54873f |
if (!fp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
solv_free(md5sums);
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
return 0; /* hopeless */
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
if (repo_add_mdk(repo, fp, REPO_NO_INTERNALIZE))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
printf("synthesis.hdlist.cz: %s\n", pool_errstr(pool));
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
solv_free(md5sums);
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
return 0; /* hopeless */
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
/* add info, could do this on demand, but always having the summary is nice */
|
|
Packit |
54873f |
if (mdk_find(md5sums, "info.xml.lzma", md5))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if ((fp = curlfopen(cinfo, "media_info/info.xml.lzma", 1, md5, REPOKEY_TYPE_MD5, 1)) != 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (repo_add_mdk_info(repo, fp, REPO_NO_INTERNALIZE|REPO_REUSE_REPODATA|REPO_EXTEND_SOLVABLES))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
printf("info.xml.lzma: %s\n", pool_errstr(pool));
|
|
Packit |
54873f |
cinfo->incomplete = 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
repo_internalize(repo);
|
|
Packit |
54873f |
data = repo_add_repodata(repo, 0);
|
|
Packit |
54873f |
/* setup on-demand loading of filelist data */
|
|
Packit |
54873f |
if (mdk_find(md5sums, "files.xml.lzma", md5))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
repodata_extend_block(data, repo->start, repo->end - repo->start);
|
|
Packit |
54873f |
mdk_add_ext(repo, data, "filelists", "FL", "media_info/files.xml.lzma", REPOKEY_TYPE_MD5, md5);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
solv_free(md5sums);
|
|
Packit |
54873f |
repodata_internalize(data);
|
|
Packit |
54873f |
writecachedrepo(cinfo, 0, 0);
|
|
Packit |
54873f |
repodata_create_stubs(repo_last_repodata(repo));
|
|
Packit |
54873f |
return 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#endif
|