Blame examples/solv/repoinfo_config_yum.c

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