URPM
view release on metacpan or search on metacpan
} else {
len = strlen(dirNames[dirIndexes[i]]);
if (len >= sizeof(buff)) continue;
memcpy(p = buff, dirNames[dirIndexes[i]], len + 1); p += len;
len = strlen(baseNames[i]);
if (p - buff + len >= sizeof(buff)) continue;
memcpy(p, baseNames[i], len + 1); p += len;
s = buff;
len = p-buff;
}
if (filter_mode) {
if ((filter_mode & FILTER_MODE_CONF_FILES) && flags && (flags[i] & RPMFILE_CONFIG) == 0) continue;
if ((filter_mode & FILTER_MODE_DOC_FILES) && flags && (flags[i] & RPMFILE_DOC) == 0) continue;
}
mXPUSHs(newSVpv(s, len));
}
rpmtdFreeData(&td_baseNames);
rpmtdFreeData(&td_dirNames);
if (is_oldfilenames)
rpmtdFreeData(&td_list);
}
PUTBACK;
}
static void
return_problems(rpmps ps, int translate_message, int raw_message) {
dSP;
if (ps && rpmpsNumProblems(ps) > 0) {
rpmpsi iterator = rpmpsInitIterator(ps);
while (rpmpsNextIterator(iterator) >= 0) {
rpmProblem p = rpmpsGetProblem(iterator);
if (translate_message) {
/* translate error using rpm localization */
const char *buf = rpmProblemString(p);
SV *sv = newSVpv(buf, 0);
if (rpm_codeset_is_utf8) SvUTF8_on(sv);
mXPUSHs(sv);
_free(buf);
}
if (raw_message) {
const char *pkgNEVR = rpmProblemGetPkgNEVR(p) ? rpmProblemGetPkgNEVR(p) : "";
const char *altNEVR = rpmProblemGetAltNEVR(p) ? rpmProblemGetAltNEVR(p) : "";
const char *s = rpmProblemGetStr(p) ? rpmProblemGetStr(p) : "";
SV *sv;
switch (rpmProblemGetType(p)) {
case RPMPROB_BADARCH:
sv = newSVpvf("badarch@%s", pkgNEVR); break;
case RPMPROB_BADOS:
sv = newSVpvf("bados@%s", pkgNEVR); break;
case RPMPROB_PKG_INSTALLED:
sv = newSVpvf("installed@%s", pkgNEVR); break;
case RPMPROB_BADRELOCATE:
sv = newSVpvf("badrelocate@%s@%s", pkgNEVR, s); break;
case RPMPROB_NEW_FILE_CONFLICT:
case RPMPROB_FILE_CONFLICT:
sv = newSVpvf("conflicts@%s@%s@%s", pkgNEVR, altNEVR, s); break;
case RPMPROB_OLDPACKAGE:
sv = newSVpvf("installed@%s@%s", pkgNEVR, altNEVR); break;
case RPMPROB_DISKSPACE:
sv = newSVpvf("diskspace@%s@%s@%lld", pkgNEVR, s, (long long)rpmProblemGetDiskNeed(p)); break;
case RPMPROB_DISKNODES:
sv = newSVpvf("disknodes@%s@%s@%lld", pkgNEVR, s, (long long)rpmProblemGetDiskNeed(p)); break;
case RPMPROB_REQUIRES:
sv = newSVpvf("requires@%s@%s", pkgNEVR, altNEVR+2); break;
case RPMPROB_CONFLICT:
sv = newSVpvf("conflicts@%s@%s", pkgNEVR, altNEVR+2); break;
case RPMPROB_OBSOLETES:
sv = newSVpvf("obsoletes@%s@%s", pkgNEVR, altNEVR+2); break;
default:
sv = newSVpvf("unknown@%s", pkgNEVR); break;
}
mXPUSHs(sv);
}
}
rpmpsFreeIterator(iterator);
}
PUTBACK;
}
static char *
pack_list(const Header header, rpmTag tag_name, rpmTag tag_flags, rpmTag tag_version) {
char buff[BUF_SIZE];
char *p = buff;
struct rpmtd_s td;
if (headerGet(header, tag_name, &td, HEADERGET_EXT)) {
char **list = td.data;
char **list_evr = NULL;
rpmTag *flags = NULL;
unsigned int i;
struct rpmtd_s td_flags, td_list_evr;
if (tag_flags && headerGet(header, tag_flags, &td_flags, HEADERGET_DEFAULT)) flags = td_flags.data;
if (tag_version && headerGet(header, tag_version, &td_list_evr, HEADERGET_DEFAULT)) list_evr = td_list_evr.data;
for(i = 0; i < rpmtdCount(&td); i++) {
int len = print_list_entry(p, sizeof(buff)-(p-buff)-1, list[i], flags ? flags[i] : 0, list_evr ? list_evr[i] : NULL);
if (len < 0) continue;
p += len;
*p++ = '@';
}
if (p > buff) p[-1] = 0;
free(list);
free(list_evr);
}
return p > buff ? memcpy(malloc(p-buff), buff, p-buff) : NULL;
mi = rpmtsInitIterator(db->ts, rpmtag, name, 0);
while ((header = rpmdbNextIterator(mi))) {
dSP;
int count = _run_cb_while_traversing(callback, header, 0);
SPAGAIN;
if (count == 1) {
SV* ret = POPs;
found = SvTRUE(ret);
PUTBACK;
}
if (found) {
break;
}
}
rpmtsSetVSFlags(db->ts, ovsflags);
(void)rpmdbFreeIterator(mi);
(void)rpmtsFree(db->ts);
RETVAL = found;
OUTPUT:
RETVAL
URPM::Transaction
Db_create_transaction(db)
URPM::DB db
CODE:
/* this is *REALLY* dangerous to create a new transaction while another is open,
so use the db transaction instead. */
db->ts = rpmtsLink(db->ts);
++db->count;
RETVAL = db;
OUTPUT:
RETVAL
MODULE = URPM PACKAGE = URPM::Transaction PREFIX = Trans_
void
Trans_DESTROY(trans)
URPM::Transaction trans
CODE:
FD_t fd = rpmtsScriptFd(trans->ts);
if (fd) Fclose(fd);
(void)rpmtsFree(trans->ts);
if (!--trans->count) free(trans);
void
Trans_set_script_fd(trans, fdno)
URPM::Transaction trans
int fdno
CODE:
rpmtsSetScriptFd(trans->ts, fdDup(fdno));
int
Trans_add(trans, pkg, ...)
URPM::Transaction trans
URPM::Package pkg
CODE:
if ((pkg->flag & FLAG_ID_MASK) <= FLAG_ID_MAX && pkg->h != NULL) {
int update = 0;
rpmRelocation *relocations = NULL;
if (items > 3) {
int i;
for (i = 2; i < items-1; i+=2) {
STRLEN len;
char *s = SvPV(ST(i), len);
if (len == 6 && !memcmp(s, "update", 6))
update = SvIV(ST(i+1));
else if (len == 11 && !memcmp(s, "excludepath", 11)) {
if (SvROK(ST(i+1)) && SvTYPE(SvRV(ST(i+1))) == SVt_PVAV) {
AV *excludepath = (AV*)SvRV(ST(i+1));
I32 j = 1 + av_len(excludepath);
if (relocations) free(relocations);
relocations = calloc(j + 1, sizeof(rpmRelocation));
while (--j >= 0) {
SV **e = av_fetch(excludepath, j, 0);
if (e != NULL && *e != NULL)
relocations[j].oldPath = SvPV_nolen(*e);
}
}
}
}
}
RETVAL = rpmtsAddInstallElement(trans->ts, pkg->h, (fnpyKey)(1+(long)(pkg->flag & FLAG_ID_MASK)), update, relocations) == 0;
/* free allocated memory, check rpm is copying it just above, at least in 4.0.4 */
free(relocations);
} else RETVAL = 0;
OUTPUT:
RETVAL
#ifdef RPM4_12_0
int
Trans_addReinstall(trans, pkg)
URPM::Transaction trans
URPM::Package pkg
CODE:
if ((pkg->flag & FLAG_ID_MASK) <= FLAG_ID_MAX && pkg->h != NULL)
RETVAL = rpmtsAddReinstallElement(trans->ts, pkg->h, (fnpyKey)(1+(long)(pkg->flag & FLAG_ID_MASK))) == 0;
else RETVAL = 0;
OUTPUT:
RETVAL
#endif
int
Trans_remove(trans, name)
URPM::Transaction trans
char *name
PREINIT:
Header h;
rpmdbMatchIterator mi;
int count = 0;
CODE:
mi = rpmtsInitIterator(trans->ts, RPMDBI_LABEL, name, 0);
while ((h = rpmdbNextIterator(mi))) {
unsigned int recOffset = rpmdbGetIteratorOffset(mi);
if (recOffset != 0) {
rpmtsAddEraseElement(trans->ts, h, recOffset);
++count;
}
}
rpmdbFreeIterator(mi);
RETVAL=count;
OUTPUT:
RETVAL
int
Trans_traverse(trans, callback)
URPM::Transaction trans
SV *callback
PREINIT:
rpmdbMatchIterator mi;
Header h;
int c = 0;
CODE:
mi = rpmtsInitIterator(trans->ts, RPMDBI_PACKAGES, NULL, 0);
while ((h = rpmdbNextIterator(mi))) {
if (SvROK(callback))
_run_cb_while_traversing(callback, h, G_DISCARD);
++c;
}
rpmdbFreeIterator(mi);
RETVAL = c;
OUTPUT:
RETVAL
( run in 0.709 second using v1.01-cache-2.11-cpan-84de2e75c66 )