rpm/Perl-RPM/RPM.h

201 lines
5.2 KiB
C

/*
* $Id: RPM.h,v 1.19 2002/05/10 05:50:19 rjray Exp $
*
* Various C-specific decls/includes/etc. for the RPM linkage
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifndef H_RPM_XS_HDR
#define H_RPM_XS_HDR
#ifdef Stat
# undef Stat
#endif
#ifdef Mkdir
# undef Mkdir
#endif
#ifdef Fstat
# undef Fstat
#endif
#ifdef Fflush
# undef Fflush
#endif
#ifdef Fopen
# undef Fopen
#endif
/* Borrowed from DB_File.xs */
#ifndef pTHX
# define pTHX
# define pTHX_
# define aTHX
# define aTHX_
# define dTHX dTHR
#endif
#ifndef newSVpvn
# define newSVpvn(a,b) newSVpv(a,b)
#endif
#include <rpmcli.h>
#include <rpmlib.h>
/* Various flags. For now, one nybble for header and one for package. */
#define RPM_HEADER_MASK 0x0f
#define RPM_HEADER_READONLY 0x01
#define RPM_HEADER_FROM_REF 0x02
#define RPM_PACKAGE_MASK 0x0f00
#define RPM_PACKAGE_READONLY 0x0100
#define RPM_PACKAGE_NOREAD 0x0200
/*
Use this define for deriving the saved underlying struct, rather than coding
it a dozen places.
*/
#define struct_from_object_ret(type, header, object, err_ret) \
{ \
MAGIC* mg = mg_find((SV *)(object), '~'); \
if (mg) \
(header) = (type *)SvIV(mg->mg_obj); \
else \
return (err_ret); \
}
/* And a no-return version: */
#define struct_from_object(type, header, object) \
{ \
MAGIC* mg = mg_find((SV *)(object), '~'); \
if (mg) \
(header) = (type *)SvIV(mg->mg_obj); \
else \
(header) = Null(type *); \
}
/*
* Perl complement: RPM::Database
*/
/*
This is the underlying struct that implements the interface to the RPM
database.
*/
typedef struct {
rpmdb dbp;
int current_rec;
int noffs;
int offx;
int* offsets;
/* This HV will be used to cache key/value pairs to avoid re-computing */
HV* storage;
} RPM_Database;
typedef HV* RPM__Database;
/*
* Perl complement: RPM::Header
*/
/*
This is the underlying struct that implements the interface to the RPM
headers.
*/
typedef struct {
Header hdr;
/* These three tags will probably cover at least 80% of data requests */
const char* name;
const char* version;
const char* release;
/* These are set by rpmReadPackageHeader when applicable */
int isSource; /* If this header is for a source RPM (SRPM) */
int major; /* Major and minor rev numbers of package's format */
int minor;
/* This HV will be used to cache key/value pairs to avoid re-computing */
HV* storage;
/* Keep a per-header iterator for things like FIRSTKEY and NEXTKEY */
HeaderIterator iterator;
int read_only;
/* Since we close the files after reading, store the filename here in case
we have to re-open it later */
char* source_name;
} RPM_Header;
typedef HV* RPM__Header;
/*
* Perl complement: RPM::Package
*/
/*
This is the underlying struct that implements the interface to the RPM
packages. As above, we need the actual object to be a hash, so the struct
will be stored as an SV on the same sort of special key as RPM__Database and
RPM__Header use.
*/
typedef struct {
/* The filepath, ftp path or URI that refers to the package */
char* path;
/* A weak ref to the header structure for the package, if it exists */
RPM__Header header;
/* The RPM signature (if present) is stored in the same struct as hdrs */
Header signature;
/* Should this be treated as a read-only source? */
int readonly;
/* The current notify/callback function associated with this package */
CV* callback;
/* Any data they want to have passed to the callback */
SV* cb_data;
} RPM_Package;
typedef RPM_Package* RPM__Package;
/*
These represent the various interfaces that are allowed for use outside
their native modules.
*/
/* RPM.xs: */
extern int tag2num(pTHX_ const char *);
extern const char* num2tag(pTHX_ int);
/* RPM/Error.xs: */
extern SV* rpm_errSV;
extern void clear_errors(pTHX);
extern SV* set_error_callback(pTHX_ SV *);
extern void rpm_error(pTHX_ int, const char *);
/* RPM/Header.xs: */
extern const char* sv2key(pTHX_ SV *);
extern RPM__Header rpmhdr_TIEHASH(pTHX_ char *, SV *, int);
extern SV* rpmhdr_FETCH(pTHX_ RPM__Header, SV *, const char *, int, int);
extern int rpmhdr_STORE(pTHX_ RPM__Header, SV *, SV *);
extern int rpmhdr_DELETE(pTHX_ RPM__Header, SV *);
extern bool rpmhdr_EXISTS(pTHX_ RPM__Header, SV *);
extern unsigned int rpmhdr_size(pTHX_ RPM__Header);
extern int rpmhdr_tagtype(pTHX_ RPM__Header, SV *);
extern int rpmhdr_write(pTHX_ RPM__Header, SV *, int);
extern int rpmhdr_is_source(pTHX_ RPM__Header);
extern int rpmhdr_cmpver(pTHX_ RPM__Header, RPM__Header);
extern int rpmhdr_scalar_tag(pTHX_ SV*, int);
/* RPM/Database.xs: */
extern RPM__Database rpmdb_TIEHASH(pTHX_ char *, SV *);
extern SV* rpmdb_FETCH(pTHX_ RPM__Database, SV *);
extern bool rpmdb_EXISTS(pTHX_ RPM__Database, SV *);
/* RPM/Package.xs: */
extern RPM__Package rpmpkg_new(pTHX_ char *, SV *, int);
extern SV* rpmpkg_set_callback(pTHX_ RPM__Package, SV *);
extern int rpmpkg_is_source(pTHX_ RPM__Package);
extern int rpmpkg_cmpver_pkg(pTHX_ RPM__Package, RPM__Package);
extern int rpmpkg_cmpver_hdr(pTHX_ RPM__Package, RPM__Header);
#endif /* H_RPM_XS_HDR */