|
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
|