|
Packit |
54873f |
#if defined(SUSE) || defined(FEDORA) || defined(MAGEIA)
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include <stdio.h>
|
|
Packit |
54873f |
#include <stdlib.h>
|
|
Packit |
54873f |
#include <unistd.h>
|
|
Packit |
54873f |
#include <dirent.h>
|
|
Packit |
54873f |
#include <sys/utsname.h>
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include "pool.h"
|
|
Packit |
54873f |
#include "repo.h"
|
|
Packit |
54873f |
#include "repo_rpmdb.h"
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include "repoinfo.h"
|
|
Packit |
54873f |
#include "repoinfo_config_yum.h"
|
|
Packit |
54873f |
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#if defined(FEDORA) || defined(MAGEIA)
|
|
Packit |
54873f |
# define REPOINFO_PATH "/etc/yum.repos.d"
|
|
Packit |
54873f |
#endif
|
|
Packit |
54873f |
#ifdef SUSE
|
|
Packit |
54873f |
# define REPOINFO_PATH "/etc/zypp/repos.d"
|
|
Packit |
54873f |
#endif
|
|
Packit |
54873f |
|
|
Packit |
54873f |
char *
|
|
Packit |
54873f |
yum_substitute(Pool *pool, char *line)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
char *p, *p2;
|
|
Packit |
54873f |
static char *releaseevr;
|
|
Packit |
54873f |
static char *basearch;
|
|
Packit |
54873f |
|
|
Packit |
54873f |
if (!line)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
solv_free(releaseevr);
|
|
Packit |
54873f |
releaseevr = 0;
|
|
Packit |
54873f |
solv_free(basearch);
|
|
Packit |
54873f |
basearch = 0;
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
p = line;
|
|
Packit |
54873f |
while ((p2 = strchr(p, '$')) != 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (!strncmp(p2, "$releasever", 11))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (!releaseevr)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
void *rpmstate;
|
|
Packit |
54873f |
Queue q;
|
|
Packit |
54873f |
|
|
Packit |
54873f |
queue_init(&q);
|
|
Packit |
54873f |
rpmstate = rpm_state_create(pool, pool_get_rootdir(pool));
|
|
Packit |
54873f |
rpm_installedrpmdbids(rpmstate, "Providename", "system-release", &q);
|
|
Packit |
54873f |
if (q.count)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
void *handle;
|
|
Packit |
54873f |
char *p;
|
|
Packit |
54873f |
handle = rpm_byrpmdbid(rpmstate, q.elements[0]);
|
|
Packit |
54873f |
releaseevr = handle ? rpm_query(handle, SOLVABLE_EVR) : 0;
|
|
Packit |
54873f |
if (releaseevr && (p = strchr(releaseevr, '-')) != 0)
|
|
Packit |
54873f |
*p = 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
rpm_state_free(rpmstate);
|
|
Packit |
54873f |
queue_free(&q);
|
|
Packit |
54873f |
if (!releaseevr)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
fprintf(stderr, "no installed package provides 'system-release', cannot determine $releasever\n");
|
|
Packit |
54873f |
exit(1);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
*p2 = 0;
|
|
Packit |
54873f |
p = pool_tmpjoin(pool, line, releaseevr, p2 + 11);
|
|
Packit |
54873f |
p2 = p + (p2 - line);
|
|
Packit |
54873f |
line = p;
|
|
Packit |
54873f |
p = p2 + strlen(releaseevr);
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
if (!strncmp(p2, "$basearch", 9))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (!basearch)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
struct utsname un;
|
|
Packit |
54873f |
if (uname(&un))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
perror("uname");
|
|
Packit |
54873f |
exit(1);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
basearch = strdup(un.machine);
|
|
Packit |
54873f |
if (basearch[0] == 'i' && basearch[1] && !strcmp(basearch + 2, "86"))
|
|
Packit |
54873f |
basearch[1] = '3';
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
*p2 = 0;
|
|
Packit |
54873f |
p = pool_tmpjoin(pool, line, basearch, p2 + 9);
|
|
Packit |
54873f |
p2 = p + (p2 - line);
|
|
Packit |
54873f |
line = p;
|
|
Packit |
54873f |
p = p2 + strlen(basearch);
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
p = p2 + 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
return line;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
struct repoinfo *
|
|
Packit |
54873f |
read_repoinfos_yum(Pool *pool, int *nrepoinfosp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
const char *reposdir = REPOINFO_PATH;
|
|
Packit |
54873f |
char buf[4096];
|
|
Packit |
54873f |
char buf2[4096], *kp, *vp, *kpe;
|
|
Packit |
54873f |
DIR *dir;
|
|
Packit |
54873f |
FILE *fp;
|
|
Packit |
54873f |
struct dirent *ent;
|
|
Packit |
54873f |
int l, rdlen;
|
|
Packit |
54873f |
struct repoinfo *repoinfos = 0, *cinfo;
|
|
Packit |
54873f |
int nrepoinfos = 0;
|
|
Packit |
54873f |
|
|
Packit |
54873f |
rdlen = strlen(reposdir);
|
|
Packit |
54873f |
dir = opendir(reposdir);
|
|
Packit |
54873f |
if (!dir)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
*nrepoinfosp = 0;
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
while ((ent = readdir(dir)) != 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (ent->d_name[0] == '.')
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
l = strlen(ent->d_name);
|
|
Packit |
54873f |
if (l < 6 || rdlen + 2 + l >= sizeof(buf) || strcmp(ent->d_name + l - 5, ".repo") != 0)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
snprintf(buf, sizeof(buf), "%s/%s", reposdir, ent->d_name);
|
|
Packit |
54873f |
if ((fp = fopen(buf, "r")) == 0)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
perror(buf);
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
cinfo = 0;
|
|
Packit |
54873f |
while(fgets(buf2, sizeof(buf2), fp))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
l = strlen(buf2);
|
|
Packit |
54873f |
if (l == 0)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
while (l && (buf2[l - 1] == '\n' || buf2[l - 1] == ' ' || buf2[l - 1] == '\t'))
|
|
Packit |
54873f |
buf2[--l] = 0;
|
|
Packit |
54873f |
kp = buf2;
|
|
Packit |
54873f |
while (*kp == ' ' || *kp == '\t')
|
|
Packit |
54873f |
kp++;
|
|
Packit |
54873f |
if (!*kp || *kp == '#')
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
if (strchr(kp, '$'))
|
|
Packit |
54873f |
kp = yum_substitute(pool, kp);
|
|
Packit |
54873f |
if (*kp == '[')
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
vp = strrchr(kp, ']');
|
|
Packit |
54873f |
if (!vp)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
*vp = 0;
|
|
Packit |
54873f |
repoinfos = solv_extend(repoinfos, nrepoinfos, 1, sizeof(*repoinfos), 15);
|
|
Packit |
54873f |
cinfo = repoinfos + nrepoinfos++;
|
|
Packit |
54873f |
memset(cinfo, 0, sizeof(*cinfo));
|
|
Packit |
54873f |
cinfo->alias = strdup(kp + 1);
|
|
Packit |
54873f |
cinfo->type = TYPE_RPMMD;
|
|
Packit |
54873f |
cinfo->autorefresh = 1;
|
|
Packit |
54873f |
cinfo->priority = 99;
|
|
Packit |
54873f |
#if !defined(FEDORA) && !defined(MAGEIA)
|
|
Packit |
54873f |
cinfo->repo_gpgcheck = 1;
|
|
Packit |
54873f |
#endif
|
|
Packit |
54873f |
cinfo->metadata_expire = METADATA_EXPIRE;
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
if (!cinfo)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
vp = strchr(kp, '=');
|
|
Packit |
54873f |
if (!vp)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
for (kpe = vp - 1; kpe >= kp; kpe--)
|
|
Packit |
54873f |
if (*kpe != ' ' && *kpe != '\t')
|
|
Packit |
54873f |
break;
|
|
Packit |
54873f |
if (kpe == kp)
|
|
Packit |
54873f |
continue;
|
|
Packit |
54873f |
vp++;
|
|
Packit |
54873f |
while (*vp == ' ' || *vp == '\t')
|
|
Packit |
54873f |
vp++;
|
|
Packit |
54873f |
kpe[1] = 0;
|
|
Packit |
54873f |
if (!strcmp(kp, "name"))
|
|
Packit |
54873f |
cinfo->name = strdup(vp);
|
|
Packit |
54873f |
else if (!strcmp(kp, "enabled"))
|
|
Packit |
54873f |
cinfo->enabled = *vp == '0' ? 0 : 1;
|
|
Packit |
54873f |
else if (!strcmp(kp, "autorefresh"))
|
|
Packit |
54873f |
cinfo->autorefresh = *vp == '0' ? 0 : 1;
|
|
Packit |
54873f |
else if (!strcmp(kp, "gpgcheck"))
|
|
Packit |
54873f |
cinfo->pkgs_gpgcheck = *vp == '0' ? 0 : 1;
|
|
Packit |
54873f |
else if (!strcmp(kp, "repo_gpgcheck"))
|
|
Packit |
54873f |
cinfo->repo_gpgcheck = *vp == '0' ? 0 : 1;
|
|
Packit |
54873f |
else if (!strcmp(kp, "baseurl"))
|
|
Packit |
54873f |
cinfo->baseurl = strdup(vp);
|
|
Packit |
54873f |
else if (!strcmp(kp, "mirrorlist"))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (strstr(vp, "metalink"))
|
|
Packit |
54873f |
cinfo->metalink = strdup(vp);
|
|
Packit |
54873f |
else
|
|
Packit |
54873f |
cinfo->mirrorlist = strdup(vp);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
else if (!strcmp(kp, "path"))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (vp && strcmp(vp, "/") != 0)
|
|
Packit |
54873f |
cinfo->path = strdup(vp);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
else if (!strcmp(kp, "type"))
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (!strcmp(vp, "yast2"))
|
|
Packit |
54873f |
cinfo->type = TYPE_SUSETAGS;
|
|
Packit |
54873f |
else if (!strcmp(vp, "rpm-md"))
|
|
Packit |
54873f |
cinfo->type = TYPE_RPMMD;
|
|
Packit |
54873f |
else if (!strcmp(vp, "plaindir"))
|
|
Packit |
54873f |
cinfo->type = TYPE_PLAINDIR;
|
|
Packit |
54873f |
else if (!strcmp(vp, "mdk"))
|
|
Packit |
54873f |
cinfo->type = TYPE_MDK;
|
|
Packit |
54873f |
else
|
|
Packit |
54873f |
cinfo->type = TYPE_UNKNOWN;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
else if (!strcmp(kp, "priority"))
|
|
Packit |
54873f |
cinfo->priority = atoi(vp);
|
|
Packit |
54873f |
else if (!strcmp(kp, "keeppackages"))
|
|
Packit |
54873f |
cinfo->keeppackages = *vp == '0' ? 0 : 1;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
fclose(fp);
|
|
Packit |
54873f |
cinfo = 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
closedir(dir);
|
|
Packit |
54873f |
*nrepoinfosp = nrepoinfos;
|
|
Packit |
54873f |
return repoinfos;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#endif
|