#ifndef H_RPMLIB #define H_RPMLIB /** \ingroup rpmcli rpmrc rpmdep rpmtrans rpmdb lead signature header payload dbi * \file lib/rpmlib.h * * In Memoriam: Steve Taylor was here, now he's not. * */ #include #include #include #include #include /* XXX move rpmlib provides to rpmds instead */ #ifdef __cplusplus extern "C" { #endif extern struct rpmMacroContext_s * rpmGlobalMacroContext; extern struct rpmMacroContext_s * rpmCLIMacroContext; extern const char * const RPMVERSION; extern const char * const rpmNAME; extern const char * const rpmEVR; extern const int rpmFLAGS; /** \ingroup header * Translate and merge legacy signature tags into header. * @todo Remove headerSort() through headerInitIterator() modifies sig. * @param h header * @param sigh signature header */ void headerMergeLegacySigs(Header h, const Header sigh); /** \ingroup header * Regenerate signature header. * @todo Remove headerSort() through headerInitIterator() modifies h. * @param h header * @param noArchiveSize don't copy archive size tag (pre rpm-4.1) * @return regenerated signature header */ Header headerRegenSigHeader(const Header h, int noArchiveSize); /* ==================================================================== */ /** \name RPMRC */ /** \ingroup rpmrc * Build and install arch/os table identifiers. * @todo Eliminate from API. */ enum rpm_machtable_e { RPM_MACHTABLE_INSTARCH = 0, /*!< Install platform architecture. */ RPM_MACHTABLE_INSTOS = 1, /*!< Install platform operating system. */ RPM_MACHTABLE_BUILDARCH = 2, /*!< Build platform architecture. */ RPM_MACHTABLE_BUILDOS = 3 /*!< Build platform operating system. */ }; #define RPM_MACHTABLE_COUNT 4 /*!< No. of arch/os tables. */ /** \ingroup rpmrc * Read macro configuration file(s) for a target. * @param file colon separated files to read (NULL uses default) * @param target target platform (NULL uses default) * @return 0 on success, -1 on error */ int rpmReadConfigFiles(const char * file, const char * target); /** \ingroup rpmrc * Return current arch name and/or number. * @todo Generalize to extract arch component from target_platform macro. * @retval name address of arch name (or NULL) * @retval num address of arch number (or NULL) */ void rpmGetArchInfo( const char ** name, int * num); /** \ingroup rpmrc * Return current os name and/or number. * @todo Generalize to extract os component from target_platform macro. * @retval name address of os name (or NULL) * @retval num address of os number (or NULL) */ void rpmGetOsInfo( const char ** name, int * num); /** \ingroup rpmrc * Return arch/os score of a name. * An arch/os score measures the "nearness" of a name to the currently * running (or defined) platform arch/os. For example, the score of arch * "i586" on an i686 platform is (usually) 2. The arch/os score is used * to select one of several otherwise identical packages using the arch/os * tags from the header as hints of the intended platform for the package. * @todo Rewrite to use RE's against config.guess target platform output. * * @param type any of the RPM_MACHTABLE_* constants * @param name name * @return arch score (0 is no match, lower is preferred) */ int rpmMachineScore(int type, const char * name); /** \ingroup rpmrc * Display current rpmrc (and macro) configuration. * @param fp output file handle * @return 0 always */ int rpmShowRC(FILE * fp); /** \ingroup rpmrc * @deprecated Use addMacro to set _target_* macros. * @todo Eliminate from API. # @note Only used by build code. * @param archTable * @param osTable */ void rpmSetTables(int archTable, int osTable); /** \ingroup rpmrc * Destroy rpmrc arch/os compatibility tables. * @todo Eliminate from API. */ void rpmFreeRpmrc(void); /** * Compare headers to determine which header is "newer". * @param first 1st header * @param second 2nd header * @return result of comparison */ int rpmVersionCompare(Header first, Header second); /** \ingroup header * Perform simple sanity and range checks on header tag(s). * @param il no. of tags in header * @param dl no. of bytes in header data. * @param pev 1st element in tag array, big-endian * @param iv failing (or last) tag element, host-endian * @param negate negative offset expected? * @return -1 on success, otherwise failing tag element index */ int headerVerifyInfo(int il, int dl, const void * pev, void * iv, int negate); /** \ingroup header * Check for supported payload format in header. * @param h header to check * @return RPMRC_OK if supported, RPMRC_FAIL otherwise */ rpmRC headerCheckPayloadFormat(Header h); /** \ingroup header * Check header consistency, performing headerGetEntry() the hard way. * * Sanity checks on the header are performed while looking for a * header-only digest or signature to verify the blob. If found, * the digest or signature is verified. * * @param ts transaction set * @param uh unloaded header blob * @param uc no. of bytes in blob (or 0 to disable) * @retval *msg verification error message (or NULL) * @return RPMRC_OK on success */ rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, char ** msg); /** \ingroup header * Return checked and loaded header. * @param ts transaction set * @param fd file handle * @retval hdrp address of header (or NULL) * @retval *msg verification error message (or NULL) * @return RPMRC_OK on success */ rpmRC rpmReadHeader(rpmts ts, FD_t fd, Header *hdrp, char ** msg); /** \ingroup header * Return package header from file handle, verifying digests/signatures. * @param ts transaction set * @param fd file handle * @param fn file name * @retval hdrp address of header (or NULL) * @return RPMRC_OK on success */ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp); /** \ingroup rpmtrans * Install source package. * @param ts transaction set * @param fd file handle * @retval specFilePtr address of spec file name (or NULL) * @retval cookie address of cookie pointer (or NULL) * @return rpmRC return code */ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, char ** specFilePtr, char ** cookie); /** \ingroup rpmtrans * Segmented string compare for version and/or release. * * @param a 1st string * @param b 2nd string * @return +1 if a is "newer", 0 if equal, -1 if b is "newer" */ int rpmvercmp(const char * a, const char * b); /** * Release storage used by file system usage cache. */ void rpmFreeFilesystems(void); /** * Return (cached) file system mount points. * @retval listptr addess of file system names (or NULL) * @retval num address of number of file systems (or NULL) * @return 0 on success, 1 on error */ int rpmGetFilesystemList( const char *** listptr, unsigned int * num); /** * Determine per-file system usage for a list of files. * @param fileList array of absolute file names * @param fssizes array of file sizes * @param numFiles number of files in list * @retval usagesPtr address of per-file system usage array (or NULL) * @param flags (unused) * @return 0 on success, 1 on error */ int rpmGetFilesystemUsage(const char ** fileList, rpm_off_t * fssizes, unsigned int numFiles, uint32_t ** usagesPtr, int flags); /* ==================================================================== */ /** \name RPMK */ /** \ingroup signature * Verify a signature from a package. * * This needs the following variables from the transaction set: * - ts->sigtag type of signature * - ts->sig signature itself (from signature header) * - ts->siglen no. of bytes in signature * - ts->dig signature/pubkey parameters (malloc'd workspace) * * @param ts transaction set * @retval result detailed text result of signature verification * (malloc'd) * @return result of signature verification */ rpmRC rpmVerifySignature(const rpmts ts, char ** result); /** \ingroup signature * Destroy signature header from package. * @param h signature header * @return NULL always */ Header rpmFreeSignature(Header h); #ifdef __cplusplus } #endif #endif /* H_RPMLIB */