URPM
view release on metacpan or search on metacpan
} while (header != NULL);
int ok = Fclose(fd) == 0;
if (!empty_archive)
ok = av_len(depslist) >= start_id;
SPAGAIN;
if (ok) {
mXPUSHs(newSViv(start_id));
mXPUSHs(newSViv(av_len(depslist)));
}
} else {
SV **nofatal = hv_fetch((HV*)SvRV(urpm), "nofatal", 7, 0);
if (!nofatal || !SvIV(*nofatal))
croak("cannot open hdlist file %s", filename);
}
} else croak("first argument should contain a depslist ARRAY reference");
} else croak("first argument should be a reference to a HASH");
#ifndef RPM4_14_0
#define RPMVSF_NOPAYLOAD RPMVSF_NOSHA1
#define RPMVSF_NOSHA256HEADER RPMVSF_NOMD5HEADER
#endif
void
Urpm_parse_rpm(urpm, filename, ...)
SV *urpm
char *filename
PPCODE:
if (SvROK(urpm) && SvTYPE(SvRV(urpm)) == SVt_PVHV) {
SV **fdepslist = hv_fetch((HV*)SvRV(urpm), "depslist", 8, 0);
AV *depslist = fdepslist && SvROK(*fdepslist) && SvTYPE(SvRV(*fdepslist)) == SVt_PVAV ? (AV*)SvRV(*fdepslist) : NULL;
SV **fprovides = hv_fetch((HV*)SvRV(urpm), "provides", 8, 0);
HV *provides = fprovides && SvROK(*fprovides) && SvTYPE(SvRV(*fprovides)) == SVt_PVHV ? (HV*)SvRV(*fprovides) : NULL;
SV **fobsoletes = hv_fetch((HV*)SvRV(urpm), "obsoletes", 8, 0);
HV *obsoletes = fobsoletes && SvROK(*fobsoletes) && SvTYPE(SvRV(*fobsoletes)) == SVt_PVHV ? (HV*)SvRV(*fobsoletes) : NULL;
if (depslist != NULL) {
struct s_Package *_pkg;
int packing = 0;
int keep_all_tags = 0;
SV *callback = NULL;
rpmVSFlags vsflags = RPMVSF_DEFAULT;
if (items > 3) {
int i;
for (i = 2; i < items-1; i+=2) {
STRLEN len;
char *s = SvPV(ST(i), len);
if (len == 7 && !memcmp(s, "packing", 7))
packing = SvTRUE(ST(i + 1));
else if (len == 13 && !memcmp(s, "keep_all_tags", 13))
keep_all_tags = SvTRUE(ST(i+1));
else if (len == 8 && !memcmp(s, "callback", 8) && SvROK(ST(i+1)))
callback = ST(i+1);
else if (SvIV(ST(i+1))) {
if (len == 5) {
if (!memcmp(s, "nopgp", 5))
vsflags |= (RPMVSF_NOPAYLOAD | RPMVSF_NOSHA1HEADER);
else if (!memcmp(s, "nogpg", 5))
vsflags |= (RPMVSF_NOPAYLOAD | RPMVSF_NOSHA1HEADER);
else if (!memcmp(s, "nomd5", 5))
vsflags |= (RPMVSF_NOMD5 | RPMVSF_NOSHA256HEADER);
else if (!memcmp(s, "norsa", 5))
vsflags |= (RPMVSF_NORSA | RPMVSF_NORSAHEADER);
else if (!memcmp(s, "nodsa", 5))
vsflags |= (RPMVSF_NODSA | RPMVSF_NODSAHEADER);
} else if (len == 9) {
if (!memcmp(s, "nodigests", 9))
vsflags |= _RPMVSF_NODIGESTS;
else if (!memcmp(s, "nopayload", 9))
vsflags |= _RPMVSF_NOPAYLOAD;
}
}
}
}
PUTBACK;
_pkg = calloc(1, sizeof(struct s_Package));
_pkg->flag = 1 + av_len(depslist);
if (update_header(filename, _pkg, keep_all_tags, vsflags)) {
push_in_depslist(_pkg, urpm, depslist, callback, provides, obsoletes, packing);
SPAGAIN;
/* only one element read */
mXPUSHs(newSViv(av_len(depslist)));
mXPUSHs(newSViv(av_len(depslist)));
} else free(_pkg);
} else croak("first argument should contain a depslist ARRAY reference");
} else croak("first argument should be a reference to a HASH");
int
Urpm_verify_rpm(filename, ...)
char *filename
PREINIT:
FD_t fd;
int i, oldlogmask;
rpmVSFlags vsflags;
CODE:
/* Don't display error messages */
oldlogmask = rpmlogSetMask(RPMLOG_UPTO(RPMLOG_PRI(4)));
vsflags = RPMVSF_DEFAULT;
for (i = 1 ; i < items - 1 ; i += 2) {
STRLEN len;
char *s = SvPV(ST(i), len);
if (SvIV(ST(i+1))) {
if (len == 9 && !strncmp(s, "nodigests", 9))
vsflags |= _RPMVSF_NODIGESTS;
else if (len == 12 && !strncmp(s, "nosignatures", 12))
vsflags |= _RPMVSF_NOSIGNATURES;
}
}
fd = Fopen(filename, "r");
if (fd == NULL)
RETVAL = 0;
else {
Header h;
read_config_files(0);
rpmts ts = rpmtsCreate();
rpmtsSetRootDir(ts, "/");
rpmtsOpenDB(ts, O_RDONLY);
rpmtsSetVSFlags(ts, vsflags);
RETVAL = (rpmReadPackageFile(ts, fd, filename, &h) == RPMRC_OK);
Fclose(fd);
if (h)
h = headerFree(h);
(void)rpmtsFree(ts);
}
rpmlogSetMask(oldlogmask);
OUTPUT:
RETVAL
char *
Urpm_get_gpg_fingerprint(filename)
char * filename
PREINIT:
uint8_t fingerprint[sizeof(pgpKeyID_t)];
char fingerprint_str[sizeof(pgpKeyID_t) * 2 + 1];
const uint8_t *pkt = NULL;
size_t pktlen = 0;
int rc;
CODE:
memset (fingerprint, 0, sizeof (fingerprint));
if ((rc = pgpReadPkts(filename, (uint8_t ** ) &pkt, &pktlen)) <= 0)
pktlen = 0;
else if (rc != PGPARMOR_PUBKEY)
pktlen = 0;
else {
unsigned int i;
#ifdef RPM4_14_0
pgpPubkeyKeyID (pkt, pktlen, fingerprint);
#else
pgpPubkeyFingerprint (pkt, pktlen, fingerprint);
#endif
for (i = 0; i < sizeof (pgpKeyID_t); i++)
sprintf(&fingerprint_str[i*2], "%02x", fingerprint[i]);
}
_free(pkt);
RETVAL = fingerprint_str;
OUTPUT:
RETVAL
char *
Urpm_verify_signature(filename, prefix=NULL)
char *filename
char *prefix
PREINIT:
rpmts ts = NULL;
char result[1024];
rpmRC rc;
FD_t fd;
Header h;
CODE:
fd = Fopen(filename, "r");
if (fd == NULL)
RETVAL = "NOT OK (could not read file)";
else {
read_config_files(0);
ts = rpmtsCreate();
rpmtsSetRootDir(ts, prefix);
rpmtsOpenDB(ts, O_RDONLY);
rpmtsSetVSFlags(ts, RPMVSF_DEFAULT);
rc = rpmReadPackageFile(ts, fd, filename, &h);
Fclose(fd);
*result = '\0';
switch(rc) {
case RPMRC_OK:
if (h) {
char *fmtsig = headerFormat(
h,
"%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:"
"{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|",
( run in 0.484 second using v1.01-cache-2.11-cpan-df04353d9ac )