diff options
Diffstat (limited to 'lib/rpmprob.c')
-rw-r--r-- | lib/rpmprob.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/lib/rpmprob.c b/lib/rpmprob.c new file mode 100644 index 0000000..df9c578 --- /dev/null +++ b/lib/rpmprob.c @@ -0,0 +1,213 @@ +/** + * \file lib/rpmps.c + */ + +#include "system.h" + +#include <inttypes.h> +#include <stdlib.h> + +#include <rpm/rpmstring.h> +#include <rpm/rpmprob.h> + +#include "debug.h" + +struct rpmProblem_s { + char * pkgNEVR; + char * altNEVR; + fnpyKey key; + rpmProblemType type; + char * str1; + uint64_t num1; + int nrefs; +}; + +static rpmProblem rpmProblemUnlink(rpmProblem prob); + +rpmProblem rpmProblemCreate(rpmProblemType type, + const char * pkgNEVR, fnpyKey key, + const char * altNEVR, + const char * str, uint64_t number) +{ + rpmProblem p = xcalloc(1, sizeof(*p)); + + p->type = type; + p->key = key; + p->num1 = number; + + p->pkgNEVR = (pkgNEVR ? xstrdup(pkgNEVR) : NULL); + p->altNEVR = (altNEVR ? xstrdup(altNEVR) : NULL); + p->str1 = (str ? xstrdup(str) : NULL); + + return rpmProblemLink(p); +} + +rpmProblem rpmProblemFree(rpmProblem prob) +{ + if (prob == NULL) return NULL; + + if (prob->nrefs > 1) { + return rpmProblemUnlink(prob); + } + prob->pkgNEVR = _free(prob->pkgNEVR); + prob->altNEVR = _free(prob->altNEVR); + prob->str1 = _free(prob->str1); + free(prob); + return NULL; +} + +rpmProblem rpmProblemLink(rpmProblem prob) +{ + if (prob) { + prob->nrefs++; + } + return prob; +} + +static rpmProblem rpmProblemUnlink(rpmProblem prob) +{ + if (prob) { + prob->nrefs--; + } + return NULL; +} + +const char * rpmProblemGetPkgNEVR(rpmProblem p) +{ + return (p->pkgNEVR); +} + +const char * rpmProblemGetAltNEVR(rpmProblem p) +{ + return (p->altNEVR); +} + +fnpyKey rpmProblemGetKey(rpmProblem p) +{ + return (p->key); +} + +rpmProblemType rpmProblemGetType(rpmProblem p) +{ + return (p->type); +} + +const char * rpmProblemGetStr(rpmProblem p) +{ + return (p->str1); +} + +rpm_loff_t rpmProblemGetDiskNeed(rpmProblem p) +{ + return (p->num1); +} + +char * rpmProblemString(rpmProblem prob) +{ + const char * pkgNEVR = (prob->pkgNEVR ? prob->pkgNEVR : "?pkgNEVR?"); + const char * altNEVR = (prob->altNEVR ? prob->altNEVR : "? ?altNEVR?"); + const char * str1 = (prob->str1 ? prob->str1 : N_("different")); + char * buf = NULL; + int rc; + + switch (prob->type) { + case RPMPROB_BADARCH: + rc = rasprintf(&buf, _("package %s is intended for a %s architecture"), + pkgNEVR, str1); + break; + case RPMPROB_BADOS: + rc = rasprintf(&buf, + _("package %s is intended for a %s operating system"), + pkgNEVR, str1); + break; + case RPMPROB_PKG_INSTALLED: + rc = rasprintf(&buf, _("package %s is already installed"), + pkgNEVR); + break; + case RPMPROB_BADRELOCATE: + rc = rasprintf(&buf, _("path %s in package %s is not relocatable"), + str1, pkgNEVR); + break; + case RPMPROB_NEW_FILE_CONFLICT: + rc = rasprintf(&buf, + _("file %s conflicts between attempted installs of %s and %s"), + str1, pkgNEVR, altNEVR); + break; + case RPMPROB_FILE_CONFLICT: + rc = rasprintf(&buf, + _("file %s from install of %s conflicts with file from package %s"), + str1, pkgNEVR, altNEVR); + break; + case RPMPROB_OLDPACKAGE: + rc = rasprintf(&buf, + _("package %s (which is newer than %s) is already installed"), + altNEVR, pkgNEVR); + break; + case RPMPROB_DISKSPACE: + rc = rasprintf(&buf, + _("installing package %s needs %" PRIu64 "%cB on the %s filesystem"), + pkgNEVR, + prob->num1 > (1024*1024) + ? (prob->num1 + 1024 * 1024 - 1) / (1024 * 1024) + : (prob->num1 + 1023) / 1024, + prob->num1 > (1024*1024) ? 'M' : 'K', + str1); + break; + case RPMPROB_DISKNODES: + rc = rasprintf(&buf, + _("installing package %s needs %" PRIu64 " inodes on the %s filesystem"), + pkgNEVR, prob->num1, str1); + break; + case RPMPROB_REQUIRES: + rc = rasprintf(&buf, _("%s is needed by %s%s"), + prob->str1, + (prob->num1 ? _("(installed) ") : ""), altNEVR); + break; + case RPMPROB_CONFLICT: + rc = rasprintf(&buf, _("%s conflicts with %s%s"), + prob->str1, + (prob->num1 ? _("(installed) ") : ""), altNEVR); + break; + case RPMPROB_OBSOLETES: + rc = rasprintf(&buf, _("%s is obsoleted by %s%s"), + prob->str1, + (prob->num1 ? _("(installed) ") : ""), altNEVR); + break; + default: + rc = rasprintf(&buf, + _("unknown error %d encountered while manipulating package %s"), + prob->type, pkgNEVR); + break; + } + + return buf; +} + +static int cmpStr(const char *s1, const char *s2) +{ + if (s1 == s2) return 0; + if (s1 && s2) return strcmp(s1, s2); + return 1; +} + +int rpmProblemCompare(rpmProblem ap, rpmProblem bp) +{ + if (ap == bp) + return 0; + if (ap == NULL || bp == NULL) + return 1; + if (ap->type != bp->type) + return 1; + if (ap->key != bp->key) + return 1; + if (ap->num1 != bp->num1) + return 1; + if (cmpStr(ap->pkgNEVR, bp->pkgNEVR)) + return 1; + if (cmpStr(ap->altNEVR, bp->altNEVR)) + return 1; + if (cmpStr(ap->str1, bp->str1)) + return 1; + + return 0; +} |