Blame examples/solv/fileconflicts.c

Packit Service ff689b
#if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA))
Packit Service ff689b
Packit Service ff689b
#include <stdio.h>
Packit Service ff689b
#include <stdlib.h>
Packit Service ff689b
#include <unistd.h>
Packit Service ff689b
Packit Service ff689b
#include "pool.h"
Packit Service ff689b
#include "repo.h"
Packit Service ff689b
#include "repo_rpmdb.h"
Packit Service ff689b
#include "pool_fileconflicts.h"
Packit Service ff689b
Packit Service ff689b
#include "fileconflicts.h"
Packit Service ff689b
Packit Service ff689b
struct fcstate {
Packit Service ff689b
  FILE **newpkgsfps;
Packit Service ff689b
  Queue *checkq;
Packit Service ff689b
  int newpkgscnt;
Packit Service ff689b
  void *rpmstate;
Packit Service ff689b
};
Packit Service ff689b
Packit Service ff689b
static void *
Packit Service ff689b
fileconflict_cb(Pool *pool, Id p, void *cbdata)
Packit Service ff689b
{
Packit Service ff689b
  struct fcstate *fcstate = cbdata;
Packit Service ff689b
  Solvable *s;
Packit Service ff689b
  Id rpmdbid;
Packit Service ff689b
  int i;
Packit Service ff689b
  FILE *fp; 
Packit Service ff689b
Packit Service ff689b
  s = pool_id2solvable(pool, p);
Packit Service ff689b
  if (pool->installed && s->repo == pool->installed)
Packit Service ff689b
    {    
Packit Service ff689b
      if (!s->repo->rpmdbid)
Packit Service ff689b
        return 0;
Packit Service ff689b
      rpmdbid = s->repo->rpmdbid[p - s->repo->start];
Packit Service ff689b
      if (!rpmdbid)
Packit Service ff689b
        return 0;
Packit Service ff689b
      return rpm_byrpmdbid(fcstate->rpmstate, rpmdbid);
Packit Service ff689b
    }    
Packit Service ff689b
  for (i = 0; i < fcstate->newpkgscnt; i++) 
Packit Service ff689b
    if (fcstate->checkq->elements[i] == p)
Packit Service ff689b
      break;
Packit Service ff689b
  if (i == fcstate->newpkgscnt)
Packit Service ff689b
    return 0;
Packit Service ff689b
  fp = fcstate->newpkgsfps[i];
Packit Service ff689b
  if (!fp)
Packit Service ff689b
    return 0;
Packit Service ff689b
  rewind(fp);
Packit Service ff689b
  return rpm_byfp(fcstate->rpmstate, fp, pool_solvable2str(pool, s)); 
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
int
Packit Service ff689b
checkfileconflicts(Pool *pool, Queue *checkq, int newpkgs, FILE **newpkgsfps, Queue *conflicts)
Packit Service ff689b
{
Packit Service ff689b
  struct fcstate fcstate;
Packit Service ff689b
  int i;
Packit Service ff689b
Packit Service ff689b
  printf("Searching for file conflicts\n");
Packit Service ff689b
  queue_init(conflicts);
Packit Service ff689b
  fcstate.rpmstate = rpm_state_create(pool, pool_get_rootdir(pool));
Packit Service ff689b
  fcstate.newpkgscnt = newpkgs;
Packit Service ff689b
  fcstate.checkq = checkq;
Packit Service ff689b
  fcstate.newpkgsfps = newpkgsfps;
Packit Service ff689b
  pool_findfileconflicts(pool, checkq, newpkgs, conflicts, FINDFILECONFLICTS_USE_SOLVABLEFILELIST | FINDFILECONFLICTS_CHECK_DIRALIASING | FINDFILECONFLICTS_USE_ROOTDIR, &fileconflict_cb, &fcstate);
Packit Service ff689b
  fcstate.rpmstate = rpm_state_free(fcstate.rpmstate);
Packit Service ff689b
  if (conflicts->count)
Packit Service ff689b
    {
Packit Service ff689b
      printf("\n");
Packit Service ff689b
      for (i = 0; i < conflicts->count; i += 6)
Packit Service ff689b
	{
Packit Service ff689b
	  if (conflicts->elements[i] == conflicts->elements[i + 3])
Packit Service ff689b
	    printf("file %s of package %s conflicts with package %s\n", pool_id2str(pool, conflicts->elements[i]), pool_solvid2str(pool, conflicts->elements[i + 1]), pool_solvid2str(pool, conflicts->elements[i + 4]));
Packit Service ff689b
	  else
Packit Service ff689b
	    printf("file %s of package %s conflicts with file %s of package %s\n", pool_id2str(pool, conflicts->elements[i]), pool_solvid2str(pool, conflicts->elements[i + 1]), pool_id2str(pool, conflicts->elements[i + 3]), pool_solvid2str(pool, conflicts->elements[i + 4]));
Packit Service ff689b
	}
Packit Service ff689b
      printf("\n");
Packit Service ff689b
    }
Packit Service ff689b
  return conflicts->count;
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
#endif