From c7c416edfab0d5c992a74371f4d824a7e3bcb76f Mon Sep 17 00:00:00 2001 From: jbj Date: Fri, 19 Nov 2004 15:47:20 +0000 Subject: [PATCH] Not on rpm-4_4 branch. CVS patchset: 7585 CVS date: 2004/11/19 15:47:20 --- Perl-RPM/ChangeLog | 274 -------- Perl-RPM/IMPORTANT.perl | 40 -- Perl-RPM/MANIFEST | 23 - Perl-RPM/Makefile.PL | 263 -------- Perl-RPM/README | 63 -- Perl-RPM/RPM.h | 200 ------ Perl-RPM/RPM.pm | 145 ----- Perl-RPM/RPM.xs | 120 ---- Perl-RPM/RPM/Constants.pm | 1509 ------------------------------------------- Perl-RPM/RPM/Constants.xs | 647 ------------------- Perl-RPM/RPM/Database.pm | 265 -------- Perl-RPM/RPM/Database.xs | 507 --------------- Perl-RPM/RPM/Error.pm | 126 ---- Perl-RPM/RPM/Error.xs | 145 ----- Perl-RPM/RPM/Header.pm | 309 --------- Perl-RPM/RPM/Header.xs | 1422 ---------------------------------------- Perl-RPM/RPM/Package.pm | 60 -- Perl-RPM/RPM/Package.xs | 433 ------------- Perl-RPM/RPM/Transaction.pm | 42 -- Perl-RPM/RPM/Transaction.xs | 25 - Perl-RPM/t/00_load.t | 17 - Perl-RPM/t/01_database.t | 184 ------ Perl-RPM/t/02_headers.t | 136 ---- Perl-RPM/t/03_errors.t | 75 --- Perl-RPM/t/04_utils.t | 27 - Perl-RPM/t/05_package.t | 10 - Perl-RPM/typemap | 57 -- Perl-RPM/utils/rpmprune | 159 ----- 28 files changed, 7283 deletions(-) delete mode 100644 Perl-RPM/ChangeLog delete mode 100644 Perl-RPM/IMPORTANT.perl delete mode 100644 Perl-RPM/MANIFEST delete mode 100644 Perl-RPM/Makefile.PL delete mode 100644 Perl-RPM/README delete mode 100644 Perl-RPM/RPM.h delete mode 100644 Perl-RPM/RPM.pm delete mode 100644 Perl-RPM/RPM.xs delete mode 100644 Perl-RPM/RPM/Constants.pm delete mode 100644 Perl-RPM/RPM/Constants.xs delete mode 100644 Perl-RPM/RPM/Database.pm delete mode 100644 Perl-RPM/RPM/Database.xs delete mode 100644 Perl-RPM/RPM/Error.pm delete mode 100644 Perl-RPM/RPM/Error.xs delete mode 100644 Perl-RPM/RPM/Header.pm delete mode 100644 Perl-RPM/RPM/Header.xs delete mode 100644 Perl-RPM/RPM/Package.pm delete mode 100644 Perl-RPM/RPM/Package.xs delete mode 100644 Perl-RPM/RPM/Transaction.pm delete mode 100644 Perl-RPM/RPM/Transaction.xs delete mode 100755 Perl-RPM/t/00_load.t delete mode 100755 Perl-RPM/t/01_database.t delete mode 100755 Perl-RPM/t/02_headers.t delete mode 100755 Perl-RPM/t/03_errors.t delete mode 100755 Perl-RPM/t/04_utils.t delete mode 100755 Perl-RPM/t/05_package.t delete mode 100644 Perl-RPM/typemap delete mode 100755 Perl-RPM/utils/rpmprune diff --git a/Perl-RPM/ChangeLog b/Perl-RPM/ChangeLog deleted file mode 100644 index f006dcf..0000000 --- a/Perl-RPM/ChangeLog +++ /dev/null @@ -1,274 +0,0 @@ -Revision history for Perl extension RPM. - -0.40 Fri May 10 01:09:13 PDT 2002 - -alpha thirteen - - RPM 3.0 line is no longer going to be supported. It's been long - enough since the 4.0 line came out, I feel. All #ifdef'd code relating - to 3.0 (and 4.0 line before about 4.0.2) has been removed. The code - once again will compile standing on its own within the rpm CVS - repository. - - Applied a patch to RPM/Database.xs from Gerald Teschl - so that when a header for a package that exists multiple times in - the db (such as kernel) is requested, the newest of the lot is - returned. - - In a related area, the list of potential control-case packages in - t/02_headers.t started with kernel, but if there were two such - packages installed when the tests ran, several of them would fail. - Now, rpm is the first choice. - - Applied a modified version of a patch from Anton Berezin - to RPM/Header.xs that catches cases where at - the start of key-iteration, the first run of headerNextIterator() - might yield a null (unknown) header key (in rpmhdr_FIRSTKEY). - - Applied a patch to RPM/Database.pm to allow options to be passed to - the new() method. Also added documentation for the new() method (!). - Patch was from viktor@vs.nexus.hu. - - Applied a patch from Radu Greab that eliminated - a couple of compiler warnings and freed a pointer at destructor-time - that was previously overlooked (RPM/Header.xs and RPM/Error.xs). - - Removed all the calls to safemalloc and safefree, replaced them with - the API-correct New (or Newz) and Safefree. - -0.32 Tue May 15 00:54:20 PDT 2001 - - alpha twelve - - Found and fixed a bug in RPM/Database.xs that was causing more of - the "Attempt to free unreferenced scalar" messages. In the process, - noticed that caching of values during iteration wasn't actually - working as designed. The resulting fix should improve database look-ups - fairly noticably. - - Two more places found (one in RPM/Header.xs, one in RPM/Database.xs) - that were contributing to memory leakage. - - A lot of changes to RPM/Constants.xs in terms of reducing the number - and length of string-compares made in constant look-ups. This is most - noticable in the RPM* set of constants, where the breakdown is the - most granular. On the main dev box (a P-1/233MHz) this sped up the - full test suite by over 25%. - -0.31 Fri Apr 27 01:45:37 PDT 2001 - - alpha eleven - - Re-worked most of RPM/Constants.xs to accomodate the change from - #define to enum values in 4.0.2. This will be released as an - interim version, since Red Hat is shipping 7.1 with this version of - rpm. - -0.30 Wed Mar 7 22:13:40 PST 2001 - - tenth alpha - - Much of the leakage of RPM::Header objects is now gone, due mostly to - changing the prototype of rpmdb_FETCH to returning a SV* instead of - a RPM::Header reference. The various class DESTROY methods seem to be - getting called in the correct order, now. - - Caught a case in the RPM::Header class where attempting to reference - an element of a non-existent tag would trigger auto-vivification on - that key, which in turn was leading to some bad calls being made to - the rpmlib routines. - - Re-did the av-assignment in rpmhdr_create. This should save on SV* - creation, though it might not have been a leak. Still, this method - is more efficient overall. - - Newer versions of rpm 4.0 tickled a bug in which a database offset - value might get sent in without being initialized first. This was - caught and fixed. Also related to the 3.0/4.0 rift, some variables - only used for 3.0.X are now declared within #ifdef's to defeat 'unused' - warnings. - - The current state of the module will be released to allow for use by - other parties, without the wait for any ongoing development milestones - on my part. - -0.292 Mon Nov 13 22:40:15 PST 2000 - - ninth alpha - - Some unused variables were found in several places. - - Moved away from the self-tie mechanism and instead handle the data - opacity in a completely different fashion. This simplified some code, - muddled some, but ultimately led to the removal of several #define - macros, more unused variable removal, and (hopefully) more stable - code. - - Addressed a problem in both RPM::Database and RPM::Header XS code - wherein destructors were not getting called when objects were - implicitly or explicitly freed. - - Added more tests to the test suite. - - Changed the names of some of the find_* routines in RPM::Database. - See the manual page. The old names were confusing me, despite my - direct familiarity with the code! - - The find_* functions in RPM::Database may now take a RPM::Header - object as their argument, and will use the package's name for the - searches. - - It's still leaking RPM::Header objects in the RPM::Database routines. - The alternative is a nasty mix of "attempt to free unreferenced - scalar" errors and core dumps. - -0.291 Fri Oct 13 01:45:18 PDT 2000 - - eighth alpha - - The flags that are created from the rpm version are now passed for - 3.0.X, as well. - - A thread-safing bug was found and fixed in Header.xs. An unused - variable was removed. - - Makefile.PL has some large-scale work, including the addition of a - template spec file following the __DATA__ token, code to expand this - file using the values that MakeMaker has derived for the package, - generation of make rules to construct *.rpm and *.srpm files, and - generation of "rpmrc" and "rpmmacro" files to use in invoking rpm - (to force all operation into the local dir area). - -0.29 Wed Oct 4 22:29:56 PDT 2000 - - seventh alpha - - The only change of note in this release is compatibility with version - 4.0 of RPM. Additionally, some flags to the C compiler to work with - the gcc that is distributed with Red Hat Linux 7. This version has - been tested on both 6.2 and 7 systems. - -0.28 Fri Aug 18 01:29:35 PDT 2000 - - sixth alpha - - Considerable additions made to the documentation in RPM::Constants, as - well as a few corrections. The prototype of the constant() function - was changed, as well. - - Several bugs were addressed in RPM::Header, most notably: Error returns - now correctly return a value of "undef"; A blocking issue surrounding - multiple RPM::Header objects from ftp:// sources is fixed; the mode - with which files are opened was also changed to allow for reading off - of STDIN. The error-return issue was also applied to RPM::Database. - - RPM::Header now has a source_name() accessor method that returns the - file name (or URI) that the header was read from. This is null if the - header came from the database. - -0.27 Tue Aug 8 00:02:22 PDT 2000 - - fifth alpha - - Added filenames() method to RPM::Header. This re-assembles the list of - filenames from the components in the tags, BASENAMES, DIRNAMES and - DIRINDEXES. - - Added scalar_tag() method to RPM::Header. This returns a 0/1 value - based on whether the return value for a given flag is an array ref or - scalar (respectively). Can be called with either a string or a number - argument. Can be called as a static (class) method. - - Added RPM/Error.xs and integrated into the build. All the XS code for - RPM::Error that was previously in RPM.xs has been moved here. - - Added export of %RPM to RPM::Database. If requested, this is a hash - pre-tied to the RPM::Database package (and thus the rpm database). One - may also request $RPM and get an object referencing a tied hash. - - The return values from fetches on header objects has been completely - revised. Tags are now explicitly defined as scalar or list in nature. - The scalar_tag() method above is a part of this. The return value from - a scalar tag is now a plain scalar. There is no more need for $_->[0] - on scalar returns. Lists are still returned as list references, and - undef is still used to signify problems. Tests have been added to - t/02_headers.t for this, and tests in t/01_database.t were updated to - use the new syntax. This does not obsolete the RPM::Header::NVR method, - as that is a much faster means of fetching those three items than a - stock fetch of the three individual tags would be. - - More tags/values documented in RPM::Constants. - -0.26 Fri Jul 14 01:03:02 PDT 2000 - - fourth alpha - - Added NVR() method to RPM::Header for obvious reasons of convenience. - Also added cmpver method, which calls into the rpmCompareVersion() API - hook to compare two headers' version/release data with an internal - algorithm that handles numerical and alpha content in the tags. - - Took out all remaining warn()'s and croak()'s, replacing them with - rpm_error() calls. Most notable in the error-return cases of - RPM::Database::init and ::rebuild. - - More thread-safing, in particular the heretofore-ignored RPM::Constants - XS module. - - Added a sample script in utils, called rpmprune. It has a --help - summary and a man page, see those for details. - -0.25 Mon Jun 5 00:54:59 PDT 2000 - - third alpha - - Fixes to the thread-safing code. When built against a 5.6.0 configured - for threading, several problems were found. All (current) tests now - pass on that configuration. - - Added a file, IMPORTANT.perl, to the distribution that explains the - nature of a condition that can prevent the extension from working on - any version of Perl not installed from an rpm. - - Still more trimming of tokens out of Constants.pm that are not of use - by the interface being provided. Filled in a few more in terms of - documentation. - - Found a case in RPM::Header that would cause core-dumps: Any tags found - by the iterator that were not exported for the API by the rpm lib - could cause a null pointer to be passed through to an entry point that - was several lines past where I had normally checked for the null. This - meant that source RPMs would almost certainly break, since the - offending tags only showed up when I started testing against SRPMS. - Now, the iterators skip over these internal tags. The normal FETCH - method already tested for this, but the interators were sneaking past - those tests. - - Added a method to the RPM::Header class, is_source(), that returns a - true value (1) if the header is associated with a source RPM. - -0.2 Mon May 29 17:59:20 PDT 2000 - - second alpha - - Class for RPM::Error added. The code is in the RPM.xs file, but - the docs and accessors are done in RPM/Error.pm. - - All sub-classes moved to RPM/. - - More documentation added, especially to RPM::Constants. - - RPM::Constants had about a dozen or so trimmed out. - - Found error in Database.xs where the FIRSTKEY/NEXTKEY pair would - have returned string-ified references instead of package names, - because of not taking the first array element. I really plan to - change the RPM::Header::FETCH interface. - - Added two utility functions under the RPM::* space for getting O/S - and architecture names. - - Put in the start of thread-safing the module. But this part of the - API is still pretty black in the Lockheed Skunkworks sense of the - word, so it isn't at all complete. - -0.1 Mon May 22 00:59:54 PDT 2000 - - first alpha release - - Classes for RPM::Header and RPM::Database are (more or less) done. - RPM::Constants appears to have everything that is expected to be - needed (i.e., any changes should result in shortening the list of - exported symbols, rather than lengthening it). A basic top-level - RPM namespace is present, but doesn't yet do anything useful. Some - basic test scripts are in place, but more are (always) needed. - -0.01 Thu May 4 12:04:34 2000 - - original version; created by h2xs 1.19 diff --git a/Perl-RPM/IMPORTANT.perl b/Perl-RPM/IMPORTANT.perl deleted file mode 100644 index bcad8d1..0000000 --- a/Perl-RPM/IMPORTANT.perl +++ /dev/null @@ -1,40 +0,0 @@ -I have found, through fairly extensive testing and bug reports, that if the -Perl you try to use when building and using the Perl-RPM package was built to -immediately link any database library, then the RPM code will be unable to -open the rpm databases. - -This is due to the fact that Perl creates backwards-compatibility to the Perl 4 -dbmopen()/dbmclose() facility through linking of a DBM implementation into the -base executable. Though I couldn't exactly determine why, even if the only -such linkage is Berkeley DB (libdb.so, the same library used by rpm) this -earlier linkage will cause calls to dbopen() made by rpm into db to fail. - -At this time, I don't have a solution for this problem, except to build Perl -without any of those libraries linked in Perl itself. Note that this will NOT -prevent you from building any of DB_File, GDBM_File, or NDBM_File (as installed -software permits) as dynamic extensions. This is the way Perl is distributed -on Red Hat Linux systems. No database libraries are natively linked, but both -DB_File and GDBM_File are still available as normal. - -Building Perl in this fashion is not difficult, but not particularly easy, -either. It is necessary to remove any of "-ldb", "-lgdbm" and/or "-lndbm" -from the libraries that Perl selects for linking (these are usually listed -immediately before the dyna-linking library, -ldl on my Linux machines). Once -these are removed, they cause Configure to choose not to include DB_File or -GDBM_File in the list of dynamic or static extensions. This is easier to -remedy, since one can use variable substitution to add them back to the end of -the list: - - $* DB_File GDBM_File - -Most likely, this disables the dbmopen/close functionality, though I haven't -tested to see if it is still accessible. Most likely, you won't be using it, -at least not with this particular extension. - -I apologize for this inconvenience, and hope to find a way around it in future -versions of Perl. If you use Perl installations in RPM form (from rpm.org or -from Red Hat), this shouldn't be a problem. - -Randy J. Ray -Fri Jun 2 18:21:24 PDT 2000 - diff --git a/Perl-RPM/MANIFEST b/Perl-RPM/MANIFEST deleted file mode 100644 index c12a984..0000000 --- a/Perl-RPM/MANIFEST +++ /dev/null @@ -1,23 +0,0 @@ -ChangeLog Change history -IMPORTANT.perl Notes regarding datbase-linkage issues in Perl -MANIFEST This file -Makefile.PL MakeMaker file -README Overview -RPM.h C header, declarations, etc. -RPM.pm Perl code for top-level functionality -RPM.xs C/XS code for top-level stuff -RPM/Constants.pm Perl code for constants (export lists, etc.) -RPM/Constants.xs C/XS code for constants -RPM/Database.pm Perl code for database access -RPM/Database.xs C/XS code for database -RPM/Error.pm Perl code for the error package -RPM/Error.xs C/XS code for the error package -RPM/Header.pm Perl code for headers -RPM/Header.xs C/XS code for headers -typemap Type-mappings for xsubpp to manage headers and database -t/00_load.t Test suite -t/01_database.t -t/02_headers.t -t/03_errors.t -t/04_utils.t -utils/rpmprune Sample script diff --git a/Perl-RPM/Makefile.PL b/Perl-RPM/Makefile.PL deleted file mode 100644 index bb612d1..0000000 --- a/Perl-RPM/Makefile.PL +++ /dev/null @@ -1,263 +0,0 @@ -#!/bin/perl - -# $Id: Makefile.PL,v 1.29 2002/05/10 08:04:55 rjray Exp $ - -use Config; -use ExtUtils::MakeMaker; -use Cwd 'cwd'; - -$cwd = cwd; - -# Check for any "local" arguments to the command that creates the Makefile -@ARGV = map { /^RPM_(\w+)=(.*)/ ? do { $opts{lc $1} = $2; (); } : $_ } @ARGV - if @ARGV; - -%XS = qw( - RPM.xs RPM.c - RPM/Constants.xs RPM/Constants.c - RPM/Database.xs RPM/Database.c - RPM/Error.xs RPM/Error.c - RPM/Header.xs RPM/Header.c - ); -# RPM/Package.xs RPM/Package.c - -@OBJECT = values %XS; -for (@OBJECT) -{ - s/\.c\b/\$(OBJ_EXT)/g; -} -$OBJECT = join(' ', @OBJECT); - -%PM = map { ($from = $_) =~ s/xs$/pm/; - ($from, "\$(INST_LIBDIR)/$from"); } (keys %XS); - -@SAMPLES = qw(utils/rpmprune); - -# This shouldn't be necessary, I don't think, but for now it is -unlink 'RPM/typemap'; -symlink '../typemap', 'RPM/typemap'; - -# Cruft that MakeMaker wouldn't inherently know about -$CLEAN = join(' ', values %XS) . " $OBJECT"; -$CLEAN .= ' Perl-RPM.spec pod2html-* */pod2html-* *.html */*.html RPM/typemap'; -$CLEAN .= ' rpmrc rpmmacro Perl-RPM-*'; - -$rpm_libs = '-lrpm -lrpmdb -lrpmio -lpopt'; -# Check for needed header files -$rpm_libdir = ''; -unless ($opts{build}) -{ - # If RPM_BUILD was set, then this module is being built as a part of the - # whole rpm kit. In that case, when the make is run the CFLAGS environment - # variable will have all the paths we need. - for (qw(/usr/include /usr/local/include /opt/include /opt/rpm/include)) - { - next unless -d $_ and -d "$_/rpm"; - $rpm_libdir = "$_/rpm", last if (-d "$_/rpm" && -e "$_/rpm/rpmlib.h"); - } - die "Header file 'rpmlib.h' not found. This is needed for compiling the XS -code. If this is present, edit $0 and add the correct directory to the search -list near this line. Stopped" - unless $rpm_libdir; -} - -WriteMakefile( - NAME => 'RPM', - DISTNAME => 'Perl-RPM', - VERSION => '0.40', - LIBS => $rpm_libs, - DEFINE => $rpm_defines, - PM => \%PM, - XS => \%XS, - EXE_FILES => [ @SAMPLES ], - OBJECT => $OBJECT, - INC => $rpm_libdir ? "-I. -I$rpm_libdir" : '-I.', - DIR => [], -# XSOPT => '-noversioncheck -nolinenumbers', - XSOPT => '-noversioncheck', - dist => { COMPRESS => 'gzip -9f' }, - clean => { FILES => $CLEAN } - ); - -exit; - -sub MY::c_o -{ - package MY; # so that "SUPER" works right - - my $text = shift->SUPER::c_o(@_); - - $text =~ s/CCCMD.*$/$& -o \$*\$(OBJ_EXT)/gm; - - $text; -} - -sub MY::tools_other -{ - package MY; - - my $text = shift->SUPER::tools_other(@_); - - "$text\nECHO=\@echo\nRPM=rpm\n"; -} - -sub MY::post_constants -{ - my $self = shift; - - "SPECFILE=$self->{DISTNAME}.spec"; -} - -sub MY::postamble -{ - my $self = shift; - - my @text; - - # - # Only create the support files and extra make targets when packaging - # locally. - # - unless ($opts{build}) - { - # - # Generate the spec file from with substitutions - # - print "Local build detected. Generating $self->{DISTNAME}.spec...\n"; - $self->{INSTALLDIR} = $Config{installsitearch} - unless $self->{INSTALLDIR}; - $self->{RELEASE} = $opts{release} || 1 unless $self->{RELEASE}; - # Copy all the RPM_* args from the command-line (parsed earlier), but - # don't overwrite any of MM's internal values - $self->{uc $_} ||= $opts{$_} for (keys %opts); - open(SPEC, "> $self->{DISTNAME}.spec"); - if ($?) - { - die "Error creating spec file: $!, stopped"; - } - else - { - for () - { - s/(SPEC_(\w+))/$self->{$2}/eg; - print SPEC $_; - } - close(SPEC); - } - print "Generating rpmrc...\n"; - open(RPMRC, "> rpmrc"); - if ($?) - { - die "Error creating rpmrc file: $!, stopped"; - } - else - { - print RPMRC < rpmmacro"); - if ($?) - { - die "Error creating macro file: $!, stopped"; - } - else - { - chomp(my $rpm_ver = (reverse split(/ /, qx{rpm --version}))[0]); - print MACRO <= 0:5.00503 -Requires: perl >= 0:5.00503 -Requires: rpm = %{rpm_version} -Provides: SPEC_DISTNAME = SPEC_VERSION -Provides: perl(RPM::Database) = %{rpm_version} -Provides: perl(RPM::Header) = %{rpm_version} -Obsoletes: rpm-perl -BuildRoot: %{_tmppath}/%{name}-root - -%description -Native Bindings to the RPM API for Perl 5.005 and later. Uses a combination -of Perl and C/XS (compiled) code to provide access to the RPM database, -headers of installed packages, and more. - -%prep -%setup -q -n SPEC_DISTNAME-%{version} - -%build -CFLAGS="$RPM_OPT_FLAGS" perl Makefile.PL - -%clean -rm -rf $RPM_BUILD_ROOT - -%install -rm -rf $RPM_BUILD_ROOT -install_dir=SPEC_INSTALLDIR -mkdir -p $RPM_BUILD_ROOT/$installdir -make PREFIX=$RPM_BUILD_ROOT/usr install - -[ -x /usr/lib/rpm/brp-compress ] && /usr/lib/rpm/brp-compress - -find $RPM_BUILD_ROOT/usr -type f -print | - sed "s@^$RPM_BUILD_ROOT@@g" | - grep -v perllocal.pod | - grep -v "\.packlist" > SPEC_DISTNAME-SPEC_VERSION-filelist -if [ "$(cat SPEC_DISTNAME-SPEC_VERSION-filelist)X" = "X" ] ; then - echo "ERROR: EMPTY FILE LIST" - exit -1 -fi - -%files -f SPEC_DISTNAME-SPEC_VERSION-filelist -%defattr(-,root,root) - -%changelog -* Tue Oct 10 2000 Randy J. Ray -- Turned into a meta-file that gets filled in by MakeMaker - -* Tue Oct 3 2000 Jeff Johnson -- update to 0.28. - -* Mon Oct 2 2000 root -- Spec file was autogenerated. diff --git a/Perl-RPM/README b/Perl-RPM/README deleted file mode 100644 index 2ba1bed..0000000 --- a/Perl-RPM/README +++ /dev/null @@ -1,63 +0,0 @@ -Perl-RPM - Native bindings to the RPM Package Manager API for Perl - -Version 0.32 (alpha twelve) - - -WHAT IS IT - -The Perl-RPM package is an attempt to provide Perl-level access to the complete -application programming interface that is a part of the RPM Package Manager -(RPM). Rather than have scripts rely on executing RPM commands and parse the -resultant output, this modules aims to provide Perl programmers the ability -to do anything that would otherwise have been done in C or C++. - -The interface is being designed and laid out as a collection of classes, at -least some of which are also available as tied-hash implementations. - -At this time, the interface only provides access to the database of installed -packages, and header data retrieval for RPM and SRPM files not yet installed. -Error management and the export of most defined constants, through RPM::Error -and RPM::Constants respectively, is also available. - - -BUILDING/INSTALLING - -This package is set up to configure and build like a typical Perl extension. -To build: - - perl Makefile.PL - make && make test - -If the RPM package passes all tests, then: - - make install - -You may need super-user access to install. - - -PROBLEMS/BUG REPORTS - -Please send any reports of problems or bugs to rjray@blackperl.com. - - -MAILING LIST - -There is now a mailing list for Perl-RPM. For details, see: - - https://listman.redhat.com/mailman/listinfo/perl-rpm-list - - -CHANGES - -This is the twelfth release. For detailed changes, see the file ChangeLog. -The main focus of this release is to address some lingering unreferenced-scalar -warning messages. This is in preparation for moving the CVS repository to -the one used for the rpm project itself. - - -LICENSE - -This package is Copyright (C) 2000 by Randy J. Ray (rjray@blackperl.com). You -may distribute this under the terms of Artistic License, as specified in the -README file of Perl itself. Please see the file ARTISTIC in your distribution -of Perl. diff --git a/Perl-RPM/RPM.h b/Perl-RPM/RPM.h deleted file mode 100644 index 444c7c3..0000000 --- a/Perl-RPM/RPM.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * $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 -#include - -/* 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 */ diff --git a/Perl-RPM/RPM.pm b/Perl-RPM/RPM.pm deleted file mode 100644 index 48cc2fc..0000000 --- a/Perl-RPM/RPM.pm +++ /dev/null @@ -1,145 +0,0 @@ -package RPM; - -use 5.005; -use strict; -use subs qw(bootstrap_Constants bootstrap_Header bootstrap_Database); -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); - -require DynaLoader; -require Exporter; - -@ISA = qw(Exporter DynaLoader); -$VERSION = do { my @r=(q$Revision: 1.17 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -@EXPORT = qw(rpm_osname rpm_archname); -@EXPORT_OK = (@EXPORT, 'vercmp'); - -bootstrap RPM; - -# These are stubs into the sub-module bootstraps, hacked into RPM.xs -bootstrap_Constants(); -bootstrap_Header(); -bootstrap_Database(); -bootstrap_Error(); -#bootstrap_Package($VERSION); - -1; - -############################################################################### -# -# Sub Name: vercmp -# -# Description: Compare two sets of version/release values as though they -# were from headers. -# -# Arguments: NAME IN/OUT TYPE DESCRIPTION -# $verA in scalar First version component -# $relA in scalar First release component -# $verB in scalar Second version component -# $relB in scalar Second release component -# -# Globals: None. -# -# Environment: None. -# -# Returns: -1, 0 or 1, as a comparison operator -# -############################################################################### -sub vercmp -{ - my ($verA, $relA, $verB, $relB) = @_; - - require RPM::Header unless $INC{'RPM/Header.pm'}; - - my $headA = new RPM::Header; - my $headB = new RPM::Header; - - $headA->{version} = $verA; - $headA->{release} = $relA; - $headB->{version} = $verB; - $headB->{release} = $relB; - - $headA->cmpver($headB); -} - -__END__ - -=head1 NAME - -RPM - Perl interface to the API for the RPM Package Manager - -=head1 DESCRIPTION - -The B package is an extension for natively linking the -functionality of the B with the extension facility of -Perl. The aim is to offer all the functionality made available via the C -API in the form of Perl object classes. - -At present, the package-manipulation functionality is not yet implemented. -The B and B packages do provide access to the -information contained within the database of installed packages, and -individual package headers, respectively. The B package is -available, which provides support routines for signaling and catching -errors. Additionally, there is the B package which provides -a number of values from the B library, referred to by the same name used -at the C level. - -=head1 UTILITY FUNCTIONS - -The following utility functions are exported by default from B: - -=over - -=item rpm_osname - -Returns the text name of the O/S, as derived from the B configuration -files. This is the O/S token that B will use to refer to the running -system. - -=item rpm_archname - -As above, but returns the architecture string instead. Again, this may not -directly match the running system, but rather is the value that B is -using. B will use the lowest-matching architecture whenever possible, -for maximum cross-platform compatibility. - -=back - -The following utility function may be explicitly requested via B or -B: - -=over vercmp($verA, $relA, $verB, $relB) - -Allows RPM-style comparison of version/release pairs without having the full -B objects in memory. This enables programs to compare versions -without having to worry about how RPM handles the mixture of alphanumeric -cases that are supported internally. The return value is -1, 0 or 1, as with -any comparison operator. This is purposefully named differently from the -B method in B so as to avoid confusion. - -=back - -=head1 DIAGNOSTICS - -When an error occurs in either the C-level B library or internally -within these libraries, it is made available via a special dual-nature -variable B<$RPM::err>. When evaluated in a numeric context, it returns the -integer code value of the error. When taken in a string context, it returns -the text message associated with the error. This is intended to closely -mimic the behavior of the special Perl variable "C<$!>". - -=head1 CAVEATS - -This is currently regarded as alpha-quality software. The interface is -subject to change in future releases. - -=head1 SEE ALSO - -L, L, L, L, -L, L - -=head1 AUTHOR - -Randy J. Ray - -=cut diff --git a/Perl-RPM/RPM.xs b/Perl-RPM/RPM.xs deleted file mode 100644 index 092ce11..0000000 --- a/Perl-RPM/RPM.xs +++ /dev/null @@ -1,120 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include "RPM.h" - -static char * const rcsid = "$Id: RPM.xs,v 1.9 2000/11/10 08:49:57 rjray Exp $"; - -extern XS(boot_RPM__Constants); -extern XS(boot_RPM__Header); -extern XS(boot_RPM__Database); -extern XS(boot_RPM__Error); -/*extern XS(boot_RPM__Package);*/ - -static HV* tag2num_priv; -static HV* num2tag_priv; - -static void setup_tag_mappings(pTHX) -{ - const char* tag; - int num; - int idx; - char str_num[8]; - - tag2num_priv = perl_get_hv("RPM::tag2num", TRUE); - num2tag_priv = perl_get_hv("RPM::num2tag", TRUE); - for (idx = 0; idx < rpmTagTableSize; idx++) - { - /* - For future reference: The offset of 7 used in referring to the - (const char *) tag and its length is to discard the "RPMTAG_" - prefix inherent in the tag names. - */ - tag = rpmTagTable[idx].name; - num = rpmTagTable[idx].val; - hv_store(tag2num_priv, (char *)tag + 7, strlen(tag) - 7, - newSViv(num), FALSE); - Zero(str_num, 1, 8); - snprintf(str_num, 8, "%d", num); - hv_store(num2tag_priv, str_num, strlen(str_num), - newSVpv((char *)tag + 7, strlen(tag) - 7), FALSE); - } -} - -int tag2num(pTHX_ const char* tag) -{ - SV** svp; - - /* Get the #define value for the tag from the hash made at boot-up */ - svp = hv_fetch(tag2num_priv, (char *)tag, strlen(tag), FALSE); - if (! (svp && SvOK(*svp) && SvIOK(*svp))) - /* Later we may need to set some sort of error message */ - return 0; - - return (SvIV(*svp)); -} - -const char* num2tag(pTHX_ int num) -{ - SV** svp; - char str_num[8]; - - Zero(str_num, 1, 8); - snprintf(str_num, 8, "%d", num); - svp = hv_fetch(num2tag_priv, str_num, strlen(str_num), FALSE); - if (! (svp && SvPOK(*svp))) - return Nullch; - - return (SvPV(*svp, PL_na)); -} - -char* rpm_rpm_osname(void) -{ - char* os_name; - int os_val; - - rpmGetOsInfo((const char **)&os_name, &os_val); - return os_name; -} - -char* rpm_rpm_archname(void) -{ - char* arch_name; - int arch_val; - - rpmGetArchInfo((const char **)&arch_name, &arch_val); - return arch_name; -} - -MODULE = RPM PACKAGE = RPM PREFIX = rpm_ - - -char* -rpm_rpm_osname() - PROTOTYPE: - -char* -rpm_rpm_archname() - PROTOTYPE: - - -BOOT: -{ - SV * config_loaded; - - config_loaded = perl_get_sv("RPM::__config_loaded", GV_ADD|GV_ADDMULTI); - if (! (SvOK(config_loaded) && SvTRUE(config_loaded))) - { - rpmReadConfigFiles(NULL, NULL); - sv_setiv(config_loaded, TRUE); - } - - setup_tag_mappings(aTHX); - - newXS("RPM::bootstrap_Constants", boot_RPM__Constants, file); - newXS("RPM::bootstrap_Header", boot_RPM__Header, file); - newXS("RPM::bootstrap_Database", boot_RPM__Database, file); - newXS("RPM::bootstrap_Error", boot_RPM__Error, file); - /*newXS("RPM::bootstrap_Package", boot_RPM__Package, file);*/ -} diff --git a/Perl-RPM/RPM/Constants.pm b/Perl-RPM/RPM/Constants.pm deleted file mode 100644 index 6b08954..0000000 --- a/Perl-RPM/RPM/Constants.pm +++ /dev/null @@ -1,1509 +0,0 @@ -############################################################################### -# -# (c) Copyright @ 2000, Randy J. Ray -# All Rights Reserved -# -############################################################################### -# -# $Id: Constants.pm,v 1.18 2001/04/27 09:05:21 rjray Exp $ -# -# Description: Constants for the RPM package -# -# Functions: None-- constants are implemented as pseudo-functions -# -# Libraries: RPM (to force bootstrapping) -# -############################################################################### - -package RPM::Constants; - -use strict; -use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS $VERSION $AUTOLOAD); - -require Exporter; - -use RPM; - -@ISA = qw(Exporter); - -$VERSION = do { my @r=(q$Revision: 1.18 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -@EXPORT_OK = qw( - CHECKSIG_GPG - CHECKSIG_MD5 - CHECKSIG_PGP - INSTALL_HASH - INSTALL_LABEL - INSTALL_NODEPS - INSTALL_NOORDER - INSTALL_PERCENT - INSTALL_UPGRADE - QUERY_FOR_CONFIG - QUERY_FOR_DOCS - QUERY_FOR_DUMPFILES - QUERY_FOR_LIST - QUERY_FOR_STATE - RPM_NULL_TYPE - RPM_CHAR_TYPE - RPM_INT8_TYPE - RPM_INT16_TYPE - RPM_INT32_TYPE - RPM_STRING_TYPE - RPM_BIN_TYPE - RPM_STRING_ARRAY_TYPE - RPM_I18NSTRING_TYPE - RPMERR_BADARG - RPMERR_BADDEV - RPMERR_BADFILENAME - RPMERR_BADMAGIC - RPMERR_BADRELOCATE - RPMERR_BADSIGTYPE - RPMERR_BADSPEC - RPMERR_CHOWN - RPMERR_CPIO - RPMERR_CREATE - RPMERR_DBCORRUPT - RPMERR_DBGETINDEX - RPMERR_DBOPEN - RPMERR_DBPUTINDEX - RPMERR_EXEC - RPMERR_FILECONFLICT - RPMERR_FLOCK - RPMERR_FORK - RPMERR_GDBMOPEN - RPMERR_GDBMREAD - RPMERR_GDBMWRITE - RPMERR_GZIP - RPMERR_INTERNAL - RPMERR_LDD - RPMERR_MKDIR - RPMERR_MTAB - RPMERR_NEWPACKAGE - RPMERR_NOCREATEDB - RPMERR_NOGROUP - RPMERR_NORELOCATE - RPMERR_NOSPACE - RPMERR_NOSPEC - RPMERR_NOTSRPM - RPMERR_NOUSER - RPMERR_OLDDB - RPMERR_OLDDBCORRUPT - RPMERR_OLDDBMISSING - RPMERR_OLDPACKAGE - RPMERR_PKGINSTALLED - RPMERR_READERROR - RPMERR_RENAME - RPMERR_RMDIR - RPMERR_RPMRC - RPMERR_SCRIPT - RPMERR_SIGGEN - RPMERR_STAT - RPMERR_UNKNOWNARCH - RPMERR_UNKNOWNOS - RPMERR_UNLINK - RPMERR_UNMATCHEDIF - RPMFILE_CONFIG - RPMFILE_DOC - RPMFILE_DONOTUSE - RPMFILE_GHOST - RPMFILE_LICENSE - RPMFILE_MISSINGOK - RPMFILE_NOREPLACE - RPMFILE_README - RPMFILE_SPECFILE - RPMFILE_STATE_NETSHARED - RPMFILE_STATE_NORMAL - RPMFILE_STATE_NOTINSTALLED - RPMFILE_STATE_REPLACED - RPMPROB_FILTER_DISKSPACE - RPMPROB_FILTER_FORCERELOCATE - RPMPROB_FILTER_IGNOREARCH - RPMPROB_FILTER_IGNOREOS - RPMPROB_FILTER_OLDPACKAGE - RPMPROB_FILTER_REPLACENEWFILES - RPMPROB_FILTER_REPLACEOLDFILES - RPMPROB_FILTER_REPLACEPKG - RPMSENSE_EQUAL - RPMSENSE_GREATER - RPMSENSE_LESS - RPMSENSE_OBSOLETES - RPMSENSE_PREREQ - RPMSENSE_SENSEMASK - RPMSENSE_TRIGGER - RPMSENSE_TRIGGERIN - RPMSENSE_TRIGGERPOSTUN - RPMSENSE_TRIGGERUN - RPMSIGTAG_GPG - RPMSIGTAG_LEMD5_1 - RPMSIGTAG_LEMD5_2 - RPMSIGTAG_MD5 - RPMSIGTAG_PGP - RPMSIGTAG_PGP5 - RPMSIGTAG_SIZE - RPMSIG_BAD - RPMSIG_NOKEY - RPMSIG_NOTTRUSTED - RPMSIG_OK - RPMSIG_UNKNOWN - RPMTAG_ARCH - RPMTAG_ARCHIVESIZE - RPMTAG_BASENAMES - RPMTAG_BUILDARCHS - RPMTAG_BUILDHOST - RPMTAG_BUILDMACROS - RPMTAG_BUILDROOT - RPMTAG_BUILDTIME - RPMTAG_CAPABILITY - RPMTAG_CHANGELOGNAME - RPMTAG_CHANGELOGTEXT - RPMTAG_CHANGELOGTIME - RPMTAG_CONFLICTFLAGS - RPMTAG_CONFLICTNAME - RPMTAG_CONFLICTVERSION - RPMTAG_COPYRIGHT - RPMTAG_COOKIE - RPMTAG_DESCRIPTION - RPMTAG_DIRINDEXES - RPMTAG_DIRNAMES - RPMTAG_DISTRIBUTION - RPMTAG_EXCLUDEARCH - RPMTAG_EXCLUDEOS - RPMTAG_EXCLUSIVEARCH - RPMTAG_EXCLUSIVEOS - RPMTAG_FILEDEVICES - RPMTAG_FILEFLAGS - RPMTAG_FILEGROUPNAME - RPMTAG_FILEINODES - RPMTAG_FILELANGS - RPMTAG_FILELINKTOS - RPMTAG_FILEMD5S - RPMTAG_FILEMODES - RPMTAG_FILEMTIMES - RPMTAG_FILERDEVS - RPMTAG_FILESIZES - RPMTAG_FILESTATES - RPMTAG_FILEUSERNAME - RPMTAG_FILEVERIFYFLAGS - RPMTAG_GIF - RPMTAG_GROUP - RPMTAG_ICON - RPMTAG_INSTALLTIME - RPMTAG_INSTPREFIXES - RPMTAG_LICENSE - RPMTAG_NOPATCH - RPMTAG_NOSOURCE - RPMTAG_NAME - RPMTAG_OBSOLETEFLAGS - RPMTAG_OBSOLETENAME - RPMTAG_OBSOLETEVERSION - RPMTAG_OS - RPMTAG_PACKAGER - RPMTAG_PATCH - RPMTAG_POSTIN - RPMTAG_POSTINPROG - RPMTAG_POSTUN - RPMTAG_POSTUNPROG - RPMTAG_PREFIXES - RPMTAG_PREIN - RPMTAG_PREINPROG - RPMTAG_PREUN - RPMTAG_PREUNPROG - RPMTAG_PROVIDEFLAGS - RPMTAG_PROVIDENAME - RPMTAG_PROVIDEVERSION - RPMTAG_RELEASE - RPMTAG_REQUIREFLAGS - RPMTAG_REQUIRENAME - RPMTAG_REQUIREVERSION - RPMTAG_RPMVERSION - RPMTAG_SIZE - RPMTAG_SOURCE - RPMTAG_SOURCERPM - RPMTAG_SUMMARY - RPMTAG_TRIGGERCONDS - RPMTAG_TRIGGERFLAGS - RPMTAG_TRIGGERINDEX - RPMTAG_TRIGGERNAME - RPMTAG_TRIGGERSCRIPTPROG - RPMTAG_TRIGGERSCRIPTS - RPMTAG_TRIGGERVERSION - RPMTAG_URL - RPMTAG_VENDOR - RPMTAG_VERIFYSCRIPT - RPMTAG_VERIFYSCRIPTPROG - RPMTAG_VERSION - RPMTAG_XPM - RPMTRANS_FLAG_ALLFILES - RPMTRANS_FLAG_BUILD_PROBS - RPMTRANS_FLAG_JUSTDB - RPMTRANS_FLAG_KEEPOBSOLETE - RPMTRANS_FLAG_NODOCS - RPMTRANS_FLAG_NOSCRIPTS - RPMTRANS_FLAG_NOTRIGGERS - RPMTRANS_FLAG_TEST - RPMVERIFY_ALL - RPMVERIFY_FILESIZE - RPMVERIFY_GROUP - RPMVERIFY_LINKTO - RPMVERIFY_LSTATFAIL - RPMVERIFY_MD5 - RPMVERIFY_MODE - RPMVERIFY_MTIME - RPMVERIFY_NONE - RPMVERIFY_RDEV - RPMVERIFY_READFAIL - RPMVERIFY_READLINKFAIL - RPMVERIFY_USER - UNINSTALL_ALLMATCHES - UNINSTALL_NODEPS - VERIFY_DEPS - VERIFY_FILES - VERIFY_MD5 - VERIFY_SCRIPT - ); - -# -# To create the %EXPORT_TAGS table, we're going to create a temp hash with -# the tags broken down into groupings. Then when the "known" groupings are -# done, whatever is left can go in "misc" -# -my %groups = (); -my %consts = map { $_, 1 } @EXPORT_OK; -for my $group (qw(install query rpmerr rpmfile rpmlead rpmmess rpmprob_filter - rpmsense rpmsigtag rpmsig rpmtag rpmtrans_flag - rpmverify uninstall verify)) -{ - my $pat = qr/^$group/i; - my $list = []; - - for (grep($_ =~ $pat, sort keys %consts)) - { - push(@$list, $_); - delete $consts{$_}; - } - - $groups{$group} = $list; -} - -# Types didn't fit neatly into the above logic-loop -$groups{rpmtype} = []; -for (grep($_ =~ /^RPM_.*_TYPE/, sort keys %consts)) -{ - push(@{$groups{rpmtype}}, $_); - delete $consts{$_}; -} - -# Pick up any stragglers -$groups{misc} = [ sort keys %consts ]; - -# Merge the install and uninstall groups -push(@{$groups{install}}, @{$groups{uninstall}}); -delete $groups{uninstall}; - -%EXPORT_TAGS = ( - all => [ @EXPORT_OK ], - %groups - ); - -sub AUTOLOAD -{ - my $constname; - ($constname = $AUTOLOAD) =~ s/.*:://; - die "& not defined" if $constname eq 'constant'; - my $val = constant($constname); - if ($! != 0) - { - die "Your vendor has not defined RPM macro $constname"; - } - no strict 'refs'; - *$AUTOLOAD = sub { $val }; - goto &$AUTOLOAD; -} - -1; - -__END__ - -=head1 NAME - -RPM::Constants - Groups of RPM-defined symbols - -=head1 SYNOPSIS - - use RPM::Constants qw(:rpmerr :rpmtype); - -=head1 DESCRIPTION - -This package is a collection of the constants defined by B itself that -may be of use to those developing with the B Perl bindings. - -=head1 GROUPS - -For ease of use and uderstanding (at last count, the total number of -constants was 232), the constants are broken up into several smaller groups: - -=head2 Header Tag Identifiers - -The following symbols may be imported via the tag B<:rpmtag>, and represent -the various elements that may be present in a package header. When used to -retrieve data from a header as a hash key, the C portion should be -omitted from the name. Use the full name only when referring to the constant. -Note that each name is followed by either a C<$> or a C<@>. This signifies -the return type of the data; a scalar or an array reference. In all cases, a -failed operation is noted by a return value of C. - -The majority of the tags that return list references in fact refer to the -ordered list of files present in the C tag. In these cases (such -as C), the value of the array at a given point may be null if it -is not relevant. That is because the C array (and thus all other -file-related lists) must accomodate the indices at which a directory name is -specified for the sake of defining the directory. In such cases, values such -as size or MD5 checksum have no direct relevance. - -=over - -=item RPMTAG_ARCH ($) - -Name of the architecture that the package was built for. If the package -is architecture-independant, the value should read "noarch". - -=item RPMTAG_ARCHIVESIZE ($) - -Size of the archive portion of the file. B stores the archive portion -of a (non-source) package as a B archive, which may also be compressed -internally. Thus, this value is generally larger than the file size of the -C file itself. - -=item RPMTAG_BASENAMES (@) - -A list of the base (leaf) names of the files contained within the package. -These are combined with the values from B using a mapping -provided by B. - -This is actually a very key tag within a header. Many of the list-returning -tags documented further down maintain a one-to-one correlation with the -elements in this array. - -=item RPMTAG_BUILDARCHS (@) - -Not entirely sure. Appears from source code examples to be a list of those -architectures for which a package should be built. All examples from the set -of SRPMs in Red Hat Linux 6.2 only use this tag when the only value is -C. - -=item RPMTAG_BUILDHOST ($) - -Name of the host the package was built on. - -=item RPMTAG_BUILDMACROS (@) - -This does not seem to be used in the library. It may be present for future -expansion use. - -=item RPMTAG_BUILDROOT ($) - -Specifies the root at which the package is built. - -=item RPMTAG_BUILDTIME ($) - -The time/date when the package was created, expressed as a C value -(seconds since the epoch). - -=item RPMTAG_CHANGELOGNAME (@) - -=item RPMTAG_CHANGELOGTEXT (@) - -=item RPMTAG_CHANGELOGTIME (@) - -These three items should be taken together. Each should have the same number -of items, and the items at corresponding indices should be taken together. -Taken this way, they provide a small-scale changelog for the package, detailing -the name of the person making the entry, the text of the entry and the time -of the entry, in the respective order given above. - -=item RPMTAG_CONFLICTFLAGS (@) - -=item RPMTAG_CONFLICTNAME (@) - -=item RPMTAG_CONFLICTVERSION (@) - -These three items are used in conjunction to specify packages and/or -individual files which the package itself would conflict with. Of the three, -only B is required to have data in all elements of -the array. The other two will have the same number of elements, though some -(or most) may be null. This is the same approach as is used to specify the -elements that the package obsoletes, those the package provides and those -the package requires (see L<"Three-Part Linkage"> below). - -=item RPMTAG_COPYRIGHT - -Maintained by RPM for backwards-compatibility with some older packages. It -is the same as C. - -=item RPMTAG_COOKIE ($) - -A simple tag, a single text string, added at the time the RPM is created. -Generally, it is created from the hostname on which the package is built -and the UNIX C value at the time of packaging. - -=item RPMTAG_DESCRIPTION ($) - -A textual description of the package. - -=item RPMTAG_DIRINDEXES (@) - -This data should have a one-to-one correspondance with B, -above. Each item here is a numerical index into the list of directories named -in B below. It indicates which of the directories is to be -prepended to the corresponding base file name in order to create the full -pathname. - -=item RPMTAG_DIRNAMES (@) - -This is a list of all directories into which the package would install files. -This list is used with B to create full paths, indexed by -way of B above. - -=item RPMTAG_DISTRIBUTION ($) - -A text label identifying the name given to the overall larger distribution -the package itself is a part of. - -=item RPMTAG_EXCLUDEARCH (@) - -A list of architectures for which the package should not be built. - -=item RPMTAG_EXCLUDEOS (@) - -A list of operating systems for which the package should not be built. - -=item RPMTAG_EXCLUSIVEARCH (@) - -A list of architectures only for which the package should be built. - -=item RPMTAG_EXCLUSIVEOS (@) - -A list of operating systems only for which the package should be built. - -=item RPMTAG_FILEDEVICES (@) - -The integer device values (from the B system call) for each file in -the package. - -=item RPMTAG_FILEFLAGS (@) - -A bit-field with zero or more of the flags defined below under the heading -of I. See the flags themselves for more detail. - -=item RPMTAG_FILEGROUPNAME (@) - -A string-array data field that contains the group ID (by name) that should -be used for setting group ownership of the files contained in the package. -There should be a one-to-one correspondance between this list and the list of -files in C. See also C. - -=item RPMTAG_FILEINODES (@) - -The C (from the B system call) that each file in -the package had on the system on which the package was built. - -=item RPMTAG_FILELANGS (@) - -Used to specify language-specific files, which may then be marked for skipping -based on the list of accepted languages at install-time. - -=item RPMTAG_FILELINKTOS (@) - -A list of names with exactly as many elements as there are filenames; each -slot in this list is either empty, or (if not) gives the name of a file that -the current filename should be made as a symbolic link to. - -=item RPMTAG_FILEMD5S (@) - -MD5 checksums for each file in the package. - -=item RPMTAG_FILEMODES (@) - -The file-modes as integer values, for each file in the package. - -=item RPMTAG_FILEMTIMES (@) - -The integer modification-time (from the B system call) for each file in -the package. - -=item RPMTAG_FILERDEVS (@) - -The integer C values (from the B system call) for each file in -the package. - -=item RPMTAG_FILESIZES (@) - -The size (in bytes) of each file in the package. - -=item RPMTAG_FILESTATES (@) - -A list of file-state information for each file in the package. References -the constants defined below under the heading of C. - -=item RPMTAG_FILEUSERNAME (@) - -A string-array data field that contains the user ID (by name) that should -be used for setting ownership of the files contained in the package. There -should be a one-to-one correspondance between this list and the list of -files in C. See also C. - -=item RPMTAG_FILEVERIFYFLAGS (@) - -A list of flags (implemented as a bit-field within an integer) for each file -in the archive, specifying what should be checked during the verification -stage. See the B constants below. - -=item RPMTAG_GIF ($) - -Similar to B defined below, with the restriction that the file -specified should in fact be a GIF image. - -=item RPMTAG_GROUP ($) - -A one-line text string that places the package within the overall hierarchy -of packages, using a UNIX-style format of denoting level with forward-slash -characters (C). Most packages will have at least two elements separated by -one such slash, though more are possible (as is a top-level name). - -=item RPMTAG_ICON ($) - -Specifies a file within a source-RPM (SRPM) that should be treated as an icon -(of either GIF or XPM format), for potential use by GUI-based RPM tools. -See C below and C above. - -=item RPMTAG_INSTALLTIME ($) - -The time at which the package was installed on your system. Should only be -present in header objects from the database, not from uninstalled packages. - -=item RPMTAG_INSTPREFIXES (@) - -Specifies one or more prefixes that are set to the environment variables, -C, where C<{n}> is a number starting from zero. These -are set before executing any of the scripts (pre- or post-install, or verify). - -=item RPMTAG_LICENSE ($) - -The license and/or restrictions under which the package is distributed. - -=item RPMTAG_NAME ($) - -The name of the package. This is the first part of a triple used to uniquely -identify a given package. It is used in conjunction with B -and B, in that order. - -=item RPMTAG_NOPATCH (@) - -=item RPMTAG_NOSOURCE (@) - -These are used to list elements that should not be included in the resulting -SRPM when it is built from a spec-file. The lists provided by the B -and B tags provide all elements as itemized in the spec-file. However, -if either of these tags are also present, then some elements may not actually -exist in the package. Both of these refer to entries in the corresponding -list of names by numberical index (starting at 0). - -=item RPMTAG_OBSOLETEFLAGS (@) - -=item RPMTAG_OBSOLETENAME (@) - -=item RPMTAG_OBSOLETEVERSION (@) - -These three items are used in conjunction to specify packages and/or -individual files which the package itself obsoletes. Of the three, only -B is required to have data in all elements of the array. -The other two will have the same number of elements, though some (or most) -may be null. This is the same approach as is used to specify the elements -that the package conflicts with, those the package provides and those the -package requires (see L<"Three-Part Linkage"> below). - -=item RPMTAG_OS ($) - -The name of the O/S for which the package is intended. - -=item RPMTAG_PACKAGER ($) - -Name of the group/company/individual who built the package. - -=item RPMTAG_PATCH (@) - -A list of patch files (see L) that will be applied to the source tree -when building the package from a source-RPM (SRPM). These files are part of -the bundle in the SRPM. All patch files listed in the original spec are listed -here, even if some were excluded by the B tag defined earlier. - -=item RPMTAG_POSTIN (@) - -Post-installation scripts, each entry in the list holds the text for a full -script. - -=item RPMTAG_POSTINPROG (@) - -The program (and additional arguments) for executing post-installation scripts. -The default is B with no arguments. This is much like the C argv/argc -pair, in that list subscript 0 represents the program itself while the -remaining list items (if any) are arguments to the program. - -=item RPMTAG_POSTUN (@) - -Post-uninstallation scripts, again with one full script per array item. - -=item RPMTAG_POSTUNPROG (@) - -Specification of the program to run post-uninstallation scripts. See -B. - -=item RPMTAG_PREFIXES (@) - -The list of directory prefixes under which files are (or will be) installed. -This differs from the B tag in that it is used to specify the parts -of the filesystem affected. Thus, it is generally a shorter list and the -elements are more basic (three directories under C in B will -only warrant a mention of C in this tag). - -=item RPMTAG_PREIN (@) - -=item RPMTAG_PREINPROG (@) - -=item RPMTAG_PREUN (@) - -=item RPMTAG_PREUNPROG (@) - -Specification of the scripts and commands to use in executing them, for -pre-installation and pre-uninstallation. See the B set above. - -=item RPMTAG_PROVIDEFLAGS (@) - -=item RPMTAG_PROVIDENAME (@) - -=item RPMTAG_PROVIDEVERSION (@) - -These three items are used in conjunction to specify the specific files that -the package itself provides to other packages as possible dependancies. Of the -three, only B is required to have data in all elements -of the array. The other two will have the same number of elements, though -some (or most) may be null. This three-part specification is also used to -itemize dependancies and obsoletions (see L<"Three-Part Linkage">). - -=item RPMTAG_RELEASE ($) - -The release part of the identifying triple for a package. This is combined -with the B and B tags to create a unique -identification for each package. - -=item RPMTAG_REQUIREFLAGS (@) - -=item RPMTAG_REQUIRENAME (@) - -=item RPMTAG_REQUIREVERSION (@) - -These three items are used in conjunction to specify packages and/or -individual files on which the package itself depends. Of the three, only -B is required to have data in all elements of the array. -The other two will have the same number of elements, though some (or most) -may be null. This is the same approach as is used to specify the elements -that the package provides and those the package obsoletes (see -L<"Three-Part Linkage">). - -=item RPMTAG_RPMVERSION ($) - -The version of B used when bundling the package. - -=item RPMTAG_SIZE ($) - -Total size of the package contents, the sum of individual file sizes. - -=item RPMTAG_SOURCE (@) - -A list of the source files that are present in the SRPM package. All files -listed here will be placed in the relevant C directory when building -from this SRPM. All source files listed in the original spec are listed here, -even if some were excluded by the B tag defined earlier. - -=item RPMTAG_SOURCERPM ($) - -The source-RPM (SRPM) file used to build this package. If the file being -queried is itself a source-RPM, this tag will be non-existent or null in -value. - -=item RPMTAG_SUMMARY ($) - -A one line summary description of the package. - -=item RPMTAG_TRIGGERCONDS (@) - -=item RPMTAG_TRIGGERFLAGS (@) - -=item RPMTAG_TRIGGERINDEX (@) - -=item RPMTAG_TRIGGERNAME (@) - -=item RPMTAG_TRIGGERSCRIPTPROG (@) - -=item RPMTAG_TRIGGERSCRIPTS (@) - -=item RPMTAG_TRIGGERVERSION (@) - -These items are all taken together to manage the trigger functionality and -mechanism of the RPM package. This is covered in greater depth in a later -section (see L<"The Trigger Specifications">). - -=item RPMTAG_URL ($) - -A Uniform Resource Locator (generally a WWW page) for the vendor/individual -or for the software project itself. - -=item RPMTAG_VENDOR ($) - -An alternate identifier for the company that created and provided the package. - -=item RPMTAG_VERIFYSCRIPT (@) - -Scripts to be run during the verification stage. As with other script-providing -tags, each array element contains one full script. - -=item RPMTAG_VERIFYSCRIPTPROG (@) - -The program (and arguments) that is to be used in executing the verification -scripts. If absent or empty, C with no arguments is used. - -=item RPMTAG_VERSION ($) - -The package version, the second part (with B and -B) of the triple used to uniquely identify packages. - -=item RPMTAG_XPM ($) - -The name of a file in the SRPM that may be used as an icon by a GUI-based -tool. This differs from B above in that it implies that the file -is specifically a XPM format image. - -=back - -=head2 Three-Part Linkage - -There are several groupings of tags that are used to specify a linkage of -some sort, often external in nature. These triple-tags consist of a list of -textual names, a list of corresponding versions and a list of flag fields. -Of the three, only the list of names is required to have data in every -element. The other two lists will have the same number of elements, however. -The version values are only applied when the corresponding name refers to -another RPM package. - -When a version is specified, the corresponding package may need to be -logically equal to, less than (older than) or greater (newer) than the -version as specified. This is signified in the corresponding flags field -for the triple. The flags documented later (see L<"Dependancy Sense Flags">) -can be used to determine the specific relationship. - -=head2 The Trigger Specifications - -The concept of trigger scripts was added into RPM from version 3.0 onwards. -It provides a powerful and flexible (if delicate and tricky) mechanism by -which packages may be sensitive to the installation, un-installation or -upgrade of other packages. In C terms, triggers are managed -through a combination of seven different header tags. - -Firstly, the tags C and C -behave in the same fashion as similar tags for other script specifications. -All the triggers are stored on the B tag, with each script -stored as one contiguous string. The B array will specify -the program (and optional additional arguments) if the program is anything -other than C (with no arguments). - -The C and C lists are used to -specify the packages that a given trigger is sensitive to. The name refers -to the package name (as RPM knows it to be), while the version (if specified) -further narrows the dependancy. The C tag appears to be -present for future use, but the C is used as similarly- -named tags are for other script specifiers. In addition to the usual relative -comparison flags, these will also have some trigger-specific flags that -identify the trigger as being attached to an install, un-install or upgrade. -See L<"Dependancy Sense Flags">. - -Lastly, the C list is used to associate a given trigger -entry (in the B list) with a particular script from the -B list. This is to optimize storage, as the likelihood exists -that a given script may be re-used for more than one trigger. - -The tags C, C, -C and C must all have the same -number of elements. - -=head2 Dependancy Sense Flags - -The following values may be imported via the tag B<:rpmsense>, and are -used with the flags values from various triple-tag combinations, to establish -the nature of the requirement relationship. In the paragraphs below, The C<*> -refers to any of B, B, B or B. The -trigger-related flags have different uses than the rest of the B<:rpmsense> -set, though they may also make use of the flags for version comparison. - -=over - -=item RPMSENSE_SENSEMASK - -This is a mask that, when applied to a value from B, -masks out all bits except for the following three values: - -=item RPMSENSE_EQUAL - -=item RPMSENSE_GREATER - -=item RPMSENSE_LESS - -These values are used to check the corresponding entries from -B and B, and specify whether -the existing file should be of a version equal to, greater than or less than -the version specified. More than one flag may be present. - -=item RPMSENSE_PREREQ - -The corresponding item from B is a simple pre-requisite, -generally without specific version checking. - -=item RPMSENSE_TRIGGER - -A mask value that will isolate the trigger flags below from any other data -in the flag field. - -=item RPMSENSE_TRIGGERIN - -The corresponding trigger is an installation trigger. - -=item RPMSENSE_TRIGGERUN - -The corresponding trigger is an uninstallation trigger. - -=item RPMSENSE_TRIGGERPOSTUN - -The corresponding trigger is a post-uninstallation trigger. - -=back - -=head2 Header Data Types - -The following symbols may be imported via the tag B<:rpmtype>, and represent -the different types of which the various header tags (described above) may -return data: - -=over - -=item RPM_NULL_TYPE - -This is used internally by the C-level B library. - -=item RPM_CHAR_TYPE - -This type represents single-character data. - -=item RPM_INT8_TYPE - -All items of this type are 8-bit integers. - -=item RPM_INT16_TYPE - -This type represents 16-bit integers. - -=item RPM_INT32_TYPE - -This type represents 32-bit integers. - -=item RPM_BIN_TYPE - -Data of this type represents a chunk of binary data without any further -decoding or translation. It is stored as a string in Perl terms, and the -C keyword should return the size of the chunk. - -=item RPM_STRING_TYPE - -=item RPM_STRING_ARRAY_TYPE - -=item RPM_I18NSTRING_TYPE - -These data types represent strings of text. Each are stored and treated the -same internally by Perl. - -=back - -=head2 Error Codes - -The following symbols may be imported via the tag B<:rpmerr>. They represent -the set of pre-defined error conditions that the B system anticipates -as possibly occuring: - -=over - -=item RPMERR_BADARG - -This is the most common error type used within the Perl RPM bindings. It is -used here to indicate bad or missing data in method calls. - -=item RPMERR_BADDEV - -Signaled when a file in the contents list is a bad or unknown device type. - -=item RPMERR_BADFILENAME - -This error signifies that RPM was unable to generate a filename, or that a -filename that RPM tried to use led to an error. - -=item RPMERR_BADMAGIC - -Signaled whenever an attempt to read the lead-in of the header (the "file magic" -information) fails. May be due either to bad data in that part, or an I/O -failure in reading the data itself. - -=item RPMERR_BADRELOCATE - -An error with the relocation specifications in the spec file. - -=item RPMERR_BADSIGTYPE - -Signals that an older, obsoleted style of signature was detected. - -=item RPMERR_BADSPEC - -General errors in the parsing or processing of the spec file. - -=item RPMERR_CHOWN - -An error occured in using the B system call. - -=item RPMERR_CPIO - -Errors that may occur when using B to either package or unpack the source. - -=item RPMERR_CREATE - -This is signaled when RPM cannot create a directory or file. - -=item RPMERR_DBCORRUPT - -Signaled for consistency errors found in the database. - -=item RPMERR_DBGETINDEX - -This error represents a failure to read a requested header record from the -database. - -=item RPMERR_DBOPEN - -An error when opening some component of the database. - -=item RPMERR_DBPUTINDEX - -This error signals a failure to either store or remove a specified entry into -(or from) the database. - -=item RPMERR_EXEC - -An error occured when executing a sub-command (such as B). - -=item RPMERR_FILECONFLICT - -A file conflict (not otherwise caught or handled by B itself) was detected. - -=item RPMERR_FLOCK - -A failure to obtain a lock on the database. When the RPM library opens the -database it places an exclusive lock on it. As such, there cannot be two -processes (or two B instances) accessing the database at one -time. - -=item RPMERR_FORK - -An error occured when RPM tried to fork a child process. - -=item RPMERR_GDBMOPEN - -An error occured when trying to open a GDBM (GNU DBM) database. - -=item RPMERR_GDBMREAD - -An error occured when trying to read from a GDBM database. - -=item RPMERR_GDBMWRITE - -An error occured when trying to write to a GDBM database. - -=item RPMERR_GZIP - -An error occured with the B program. - -=item RPMERR_INTERNAL - -This is used to signal internal errors from within the RPM library. Odds are, -if your program sees this error, you should exit as cleanly and quickly as -possible. - -=item RPMERR_LDD - -An error occurred with the B program. - -=item RPMERR_MKDIR - -An error code was returned from the C system call. - -=item RPMERR_MTAB - -An error occured when trying to determine file system information from the -system C file. - -=item RPMERR_NEWPACKAGE - -An attempt was made to create a new package with a specification of an RPM -version older (less) than 3. - -=item RPMERR_NOCREATEDB - -An attempt was made to create the database when one already exists. - -=item RPMERR_NOGROUP - -A group specified for file group-ownership was not found in the list of groups -on the system. The group C will be used instead. - -=item RPMERR_NORELOCATE - -An attempt was made to relocate a package that is not relocatable. - -=item RPMERR_NOSPACE - -An attempt to write a package file failed for lack of available disk space. - -=item RPMERR_NOSPEC - -Am unpack operation on a source RPM failed to produce a spec file. - -=item RPMERR_NOTSRPM - -An operation was requested that can only be performed on a source RPM, but the -specified package was a binary (or C) RPM. - -=item RPMERR_NOUSER - -A specified user (for file ownership) does not exist, and C will be used -in its place. See B. - -=item RPMERR_OLDDB - -An old-format database is present. - -=item RPMERR_OLDDBCORRUPT - -An old-format database being read (for conversion) was found to be corrupt. - -=item RPMERR_OLDDBMISSING - -A request to convert an old-format database found that there was no such -database present. - -=item RPMERR_OLDPACKAGE - -An old-format package was detected. - -=item RPMERR_PKGINSTALLED - -A package requested for install is already installed on the system. - -=item RPMERR_READERROR - -An error occurred while reading data. - -=item RPMERR_RENAME - -An error occured while renaming a file. - -=item RPMERR_RMDIR - -An attempted removal of a directory failed. - -=item RPMERR_RPMRC - -A parsing or format error in an RC (options) file occurred. - -=item RPMERR_SCRIPT - -An error occurred while executing a script. - -=item RPMERR_SIGGEN - -Some type of error occurred when generating a signature on the package. - -=item RPMERR_STAT - -There was a failure of some sort on a C system call. - -=item RPMERR_UNKNOWNARCH - -A requested architecture is unknown to RPM. - -=item RPMERR_UNKNOWNOS - -A requested operating system is unknown to RPM. - -=item RPMERR_UNLINK - -An error occurred with the C system call. - -=item RPMERR_UNMATCHEDIF - -An C<%else> or C<%endif> directive was seen in the spec file, for which there -is no corresponding C<%if>. - -=back - -=head2 File-Verification Flags - -The values in the B list defined in the header-tags -section earlier represent various combinations of the following values. These -tags may be imported via B<:rpmverify>. - -=over - -=item RPMVERIFY_ALL - -A full mask that will isolate the valid flag-bits from the flag field. - -=item RPMVERIFY_NONE - -An empty mask that will not match any tested verification flags. - -=item RPMVERIFY_FILESIZE - -Test the file size against the value in the header. - -=item RPMVERIFY_GROUP - -Test the file group ID against the value it should have been set to. - -=item RPMVERIFY_LINKTO - -If the file was to be a symbolic link, check that it is set correctly. - -=item RPMVERIFY_MD5 - -Check the MD5 checksum for the file. - -=item RPMVERIFY_MODE - -Verify the file mode against the value it was to be set to. - -=item RPMVERIFY_MTIME - -Check the file modification-time against that which it should have been set. - -=item RPMVERIFY_RDEV - -Check the device field of the inode, if relevant. - -=item RPMVERIFY_USER - -Check the user ID to which ownership was set. - -=back - -When the verification of a given file fails, the return value contains the -relevant bits from the values above, corresponding to what test(s) failed. -In addition, any of the following may be set to indicate a larger problem: - -=over - -=item RPMVERIFY_LSTATFAIL - -The attempt to read the inode information via C was not successful. -This will guarantee that other bits in the return value are set, as well. - -=item RPMVERIFY_READFAIL - -The attempt to read the file or its data (for the sake of MD5, etc.) failed. - -=item RPMVERIFY_READLINKFAIL - -An attempt to do a C on the file, expected to be a symbolic link, -failed. - -=back - -=head2 File Specification Flags - -The following tags may be imported via the B<:rpmfile> specifier. They are -used to express various characteristics of files in the archive, based on the -value from B that corresponds to a given file. - -=over - -=item RPMFILE_CONFIG - -Not documented yet. - -=item RPMFILE_DOC - -Not documented yet. - -=item RPMFILE_DONOTUSE - -Not documented yet. - -=item RPMFILE_GHOST - -Not documented yet. - -=item RPMFILE_LICENSE - -Not documented yet. - -=item RPMFILE_MISSINGOK - -Not documented yet. - -=item RPMFILE_NOREPLACE - -Not documented yet. - -=item RPMFILE_README - -Not documented yet. - -=item RPMFILE_SPECFILE - -Not documented yet. - -=item RPMFILE_STATE_NETSHARED - -Not documented yet. - -=item RPMFILE_STATE_NORMAL - -Not documented yet. - -=item RPMFILE_STATE_NOTINSTALLED - -Not documented yet. - -=item RPMFILE_STATE_REPLACED - -Not documented yet. - -=back - -=head2 Not Yet Defined - -The following have not yet been categorized. They may, after further research -and development, be found to be un-needed by this package. - -=over - -=item ADD_SIGNATURE - -Not documented yet. - -=item CHECKSIG_GPG - -Not documented yet. - -=item CHECKSIG_MD5 - -Not documented yet. - -=item CHECKSIG_PGP - -Not documented yet. - -=item INSTALL_HASH - -Not documented yet. - -=item INSTALL_LABEL - -Not documented yet. - -=item INSTALL_NODEPS - -Not documented yet. - -=item INSTALL_NOORDER - -Not documented yet. - -=item INSTALL_PERCENT - -Not documented yet. - -=item INSTALL_UPGRADE - -Not documented yet. - -=item QUERY_FOR_CONFIG - -Not documented yet. - -=item QUERY_FOR_DOCS - -Not documented yet. - -=item QUERY_FOR_DUMPFILES - -Not documented yet. - -=item QUERY_FOR_LIST - -Not documented yet. - -=item QUERY_FOR_STATE - -Not documented yet. - -=item RPMPROB_FILTER_DISKSPACE - -Not documented yet. - -=item RPMPROB_FILTER_FORCERELOCATE - -Not documented yet. - -=item RPMPROB_FILTER_IGNOREARCH - -Not documented yet. - -=item RPMPROB_FILTER_IGNOREOS - -Not documented yet. - -=item RPMPROB_FILTER_OLDPACKAGE - -Not documented yet. - -=item RPMPROB_FILTER_REPLACENEWFILES - -Not documented yet. - -=item RPMPROB_FILTER_REPLACEOLDFILES - -Not documented yet. - -=item RPMPROB_FILTER_REPLACEPKG - -Not documented yet. - -=item RPMSIGTAG_GPG - -Not documented yet. - -=item RPMSIGTAG_LEMD5_1 - -Not documented yet. - -=item RPMSIGTAG_LEMD5_2 - -Not documented yet. - -=item RPMSIGTAG_MD5 - -Not documented yet. - -=item RPMSIGTAG_PGP - -Not documented yet. - -=item RPMSIGTAG_PGP5 - -Not documented yet. - -=item RPMSIGTAG_SIZE - -Not documented yet. - -=item RPMSIG_BAD - -Not documented yet. - -=item RPMSIG_NOKEY - -Not documented yet. - -=item RPMSIG_NOTTRUSTED - -Not documented yet. - -=item RPMSIG_OK - -Not documented yet. - -=item RPMSIG_UNKNOWN - -Not documented yet. - -=item RPMTRANS_FLAG_ALLFILES - -Not documented yet. - -=item RPMTRANS_FLAG_BUILD_PROBS - -Not documented yet. - -=item RPMTRANS_FLAG_JUSTDB - -Not documented yet. - -=item RPMTRANS_FLAG_KEEPOBSOLETE - -Not documented yet. - -=item RPMTRANS_FLAG_NODOCS - -Not documented yet. - -=item RPMTRANS_FLAG_NOSCRIPTS - -Not documented yet. - -=item RPMTRANS_FLAG_NOTRIGGERS - -Not documented yet. - -=item RPMTRANS_FLAG_TEST - -Not documented yet. - -=item UNINSTALL_ALLMATCHES - -Not documented yet. - -=item UNINSTALL_NODEPS - -Not documented yet. - -=item VERIFY_DEPS - -Not documented yet. - -=item VERIFY_FILES - -Not documented yet. - -=item VERIFY_MD5 - -Not documented yet. - -=item VERIFY_SCRIPT - -Not documented yet. - -=back - -=head1 SEE ALSO - -L, L, L - -=head1 AUTHOR - -Randy J. Ray - -=cut diff --git a/Perl-RPM/RPM/Constants.xs b/Perl-RPM/RPM/Constants.xs deleted file mode 100644 index 2faedc1..0000000 --- a/Perl-RPM/RPM/Constants.xs +++ /dev/null @@ -1,647 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include "RPM.h" - -static char * const rcsid = "$Id: Constants.xs,v 1.12 2002/04/11 22:40:20 rjray Exp $"; - -static int constant(pTHX_ char *name) -{ - errno = 0; - - switch (*name) - { - case 'C': - if (strnEQ(name, "CHECKSIG_", 9)) - { - if (strEQ(name + 9, "GPG")) - return CHECKSIG_GPG; - if (strEQ(name + 9, "MD5")) - return CHECKSIG_MD5; - if (strEQ(name + 9, "PGP")) - return CHECKSIG_PGP; - } - break; - case 'I': - if (strnEQ(name, "INSTALL_", 8)) - { - if (strEQ(name + 8, "HASH")) - return INSTALL_HASH; - if (strEQ(name + 8, "LABEL")) - return INSTALL_LABEL; - if (strEQ(name + 8, "NODEPS")) - return INSTALL_NODEPS; - if (strEQ(name + 8, "NOORDER")) - return INSTALL_NOORDER; - if (strEQ(name + 8, "PERCENT")) - return INSTALL_PERCENT; - if (strEQ(name + 8, "UPGRADE")) - return INSTALL_UPGRADE; - } - break; - case 'Q': - if (strnEQ(name, "QUERY_FOR_", 10)) - { - if (strEQ(name + 10, "CONFIG")) - return QUERY_FOR_CONFIG; - if (strEQ(name + 10, "DOCS")) - return QUERY_FOR_DOCS; - if (strEQ(name + 10, "DUMPFILES")) - return QUERY_FOR_DUMPFILES; - if (strEQ(name + 10, "LIST")) - return QUERY_FOR_LIST; - if (strEQ(name + 10, "STATE")) - return QUERY_FOR_STATE; - } - break; - case 'R': - /* THIS is the area that really needs progressive breaking down by - minimal leading-string matching. */ - if (strnEQ(name, "RPM_MACHTABLE_", 14)) - { - if (strEQ(name + 14, "BUILDARCH")) - return RPM_MACHTABLE_BUILDARCH; - if (strEQ(name + 14, "BUILDOS")) - return RPM_MACHTABLE_BUILDOS; - if (strEQ(name + 14, "COUNT")) - return RPM_MACHTABLE_COUNT; - if (strEQ(name + 14, "INSTARCH")) - return RPM_MACHTABLE_INSTARCH; - if (strEQ(name + 14, "INSTOS")) - return RPM_MACHTABLE_INSTOS; - } - if (strnEQ(name, "RPM_", 4)) - { - if (strEQ(name + 4, "NULL_TYPE")) - return RPM_NULL_TYPE; - if (strEQ(name + 4, "CHAR_TYPE")) - return RPM_CHAR_TYPE; - if (strEQ(name + 4, "INT8_TYPE")) - return RPM_INT8_TYPE; - if (strEQ(name + 4, "INT16_TYPE")) - return RPM_INT16_TYPE; - if (strEQ(name + 4, "INT32_TYPE")) - return RPM_INT32_TYPE; - if (strEQ(name + 4, "STRING_TYPE")) - return RPM_STRING_TYPE; - if (strEQ(name + 4, "BIN_TYPE")) - return RPM_BIN_TYPE; - if (strEQ(name + 4, "STRING_ARRAY_TYPE")) - return RPM_STRING_ARRAY_TYPE; - if (strEQ(name + 4, "I18NSTRING_TYPE")) - return RPM_I18NSTRING_TYPE; - } - if (strnEQ(name, "RPMERR_", 7)) - { - switch (*(name + 7)) - { - case 'B': - if (strEQ(name + 7, "BADARG")) - return RPMERR_BADARG; - if (strEQ(name + 7, "BADDEV")) - return RPMERR_BADDEV; - if (strEQ(name + 7, "BADFILENAME")) - return RPMERR_BADFILENAME; - if (strEQ(name + 7, "BADMAGIC")) - return RPMERR_BADMAGIC; - if (strEQ(name + 7, "BADRELOCATE")) - return RPMERR_BADRELOCATE; - if (strEQ(name + 7, "BADSIGTYPE")) - return RPMERR_BADSIGTYPE; - if (strEQ(name + 7, "BADSPEC")) - return RPMERR_BADSPEC; - break; - case 'C': - if (strEQ(name + 7, "CHOWN")) - return RPMERR_CHOWN; - if (strEQ(name + 7, "CPIO")) - return RPMERR_CPIO; - if (strEQ(name + 7, "CREATE")) - return RPMERR_CREATE; - break; - case 'D': - if (strEQ(name + 7, "DBCORRUPT")) - return RPMERR_DBCORRUPT; - if (strEQ(name + 7, "DBGETINDEX")) - return RPMERR_DBGETINDEX; - if (strEQ(name + 7, "DBOPEN")) - return RPMERR_DBOPEN; - if (strEQ(name + 7, "DBPUTINDEX")) - return RPMERR_DBPUTINDEX; - break; - case 'E': - if (strEQ(name + 7, "EXEC")) - return RPMERR_EXEC; - break; - case 'F': - if (strEQ(name + 7, "FILECONFLICT")) - return RPMERR_FILECONFLICT; - if (strEQ(name + 7, "FLOCK")) - return RPMERR_FLOCK; - if (strEQ(name + 7, "FORK")) - return RPMERR_FORK; - break; - case 'G': - if (strEQ(name + 7, "GDBMOPEN")) - return RPMERR_GDBMOPEN; - if (strEQ(name + 7, "GDBMREAD")) - return RPMERR_GDBMREAD; - if (strEQ(name + 7, "GDBMWRITE")) - return RPMERR_GDBMWRITE; - if (strEQ(name + 7, "GZIP")) - return RPMERR_GZIP; - break; - case 'I': - if (strEQ(name + 7, "INTERNAL")) - return RPMERR_INTERNAL; - break; - case 'L': - if (strEQ(name + 7, "LDD")) - return RPMERR_LDD; - break; - case 'M': - if (strEQ(name + 7, "MKDIR")) - return RPMERR_MKDIR; - if (strEQ(name + 7, "MTAB")) - return RPMERR_MTAB; - break; - case 'N': - if (strEQ(name + 7, "NEWPACKAGE")) - return RPMERR_NEWPACKAGE; - if (strEQ(name + 7, "NOCREATEDB")) - return RPMERR_NOCREATEDB; - if (strEQ(name + 7, "NOGROUP")) - return RPMERR_NOGROUP; - if (strEQ(name + 7, "NORELOCATE")) - return RPMERR_NORELOCATE; - if (strEQ(name + 7, "NOSPACE")) - return RPMERR_NOSPACE; - if (strEQ(name + 7, "NOSPEC")) - return RPMERR_NOSPEC; - if (strEQ(name + 7, "NOTSRPM")) - return RPMERR_NOTSRPM; - if (strEQ(name + 7, "NOUSER")) - return RPMERR_NOUSER; - break; - case 'O': - if (strEQ(name + 7, "OLDDB")) - return RPMERR_OLDDB; - if (strEQ(name + 7, "OLDDBCORRUPT")) - return RPMERR_OLDDBCORRUPT; - if (strEQ(name + 7, "OLDDBMISSING")) - return RPMERR_OLDDBMISSING; - if (strEQ(name + 7, "OLDPACKAGE")) - return RPMERR_OLDPACKAGE; - break; - case 'P': - if (strEQ(name + 7, "PKGINSTALLED")) - return RPMERR_PKGINSTALLED; - break; - case 'R': - if (strEQ(name + 7, "READ") || strEQ(name + 7, "READERROR")) - return RPMERR_READ; - if (strEQ(name + 7, "RENAME")) - return RPMERR_RENAME; - if (strEQ(name + 7, "RMDIR")) - return RPMERR_RMDIR; - if (strEQ(name + 7, "RPMRC")) - return RPMERR_RPMRC; - break; - case 'S': - if (strEQ(name + 7, "SCRIPT")) - return RPMERR_SCRIPT; - if (strEQ(name + 7, "SIGGEN")) - return RPMERR_SIGGEN; - if (strEQ(name + 7, "STAT")) - return RPMERR_STAT; - break; - case 'U': - if (strEQ(name + 7, "UNKNOWNARCH")) - return RPMERR_UNKNOWNARCH; - if (strEQ(name + 7, "UNKNOWNOS")) - return RPMERR_UNKNOWNOS; - if (strEQ(name + 7, "UNLINK")) - return RPMERR_UNLINK; - if (strEQ(name + 7, "UNMATCHEDIF")) - return RPMERR_UNMATCHEDIF; - break; - default: - break; - } - } - if (strnEQ(name, "RPMFILE_", 8)) - { - if (strEQ(name + 8, "CONFIG")) - return RPMFILE_CONFIG; - if (strEQ(name + 8, "DOC")) - return RPMFILE_DOC; - if (strEQ(name + 8, "DONOTUSE")) - return RPMFILE_DONOTUSE; - if (strEQ(name + 8, "GHOST")) - return RPMFILE_GHOST; - if (strEQ(name + 8, "LICENSE")) - return RPMFILE_LICENSE; - if (strEQ(name + 8, "MISSINGOK")) - return RPMFILE_MISSINGOK; - if (strEQ(name + 8, "NOREPLACE")) - return RPMFILE_NOREPLACE; - if (strEQ(name + 8, "README")) - return RPMFILE_README; - if (strEQ(name + 8, "SPECFILE")) - return RPMFILE_SPECFILE; - if (strEQ(name + 8, "STATE_NETSHARED")) - return RPMFILE_STATE_NETSHARED; - if (strEQ(name + 8, "STATE_NORMAL")) - return RPMFILE_STATE_NORMAL; - if (strEQ(name + 8, "STATE_NOTINSTALLED")) - return RPMFILE_STATE_NOTINSTALLED; - if (strEQ(name + 8, "STATE_REPLACED")) - return RPMFILE_STATE_REPLACED; - } - if (strnEQ(name, "RPMPROB_FILTER_", 15)) - { - if (strEQ(name + 15, "DISKSPACE")) - return RPMPROB_FILTER_DISKSPACE; - if (strEQ(name + 15, "FORCERELOCATE")) - return RPMPROB_FILTER_FORCERELOCATE; - if (strEQ(name + 15, "IGNOREARCH")) - return RPMPROB_FILTER_IGNOREARCH; - if (strEQ(name + 15, "IGNOREOS")) - return RPMPROB_FILTER_IGNOREOS; - if (strEQ(name + 15, "OLDPACKAGE")) - return RPMPROB_FILTER_OLDPACKAGE; - if (strEQ(name + 15, "REPLACENEWFILES")) - return RPMPROB_FILTER_REPLACENEWFILES; - if (strEQ(name + 15, "REPLACEOLDFILES")) - return RPMPROB_FILTER_REPLACEOLDFILES; - if (strEQ(name + 15, "REPLACEPKG")) - return RPMPROB_FILTER_REPLACEPKG; - } - if (strnEQ(name, "RPMSENSE_", 9)) - { - if (strEQ(name + 9, "EQUAL")) - return RPMSENSE_EQUAL; - if (strEQ(name + 9, "GREATER")) - return RPMSENSE_GREATER; - if (strEQ(name + 9, "LESS")) - return RPMSENSE_LESS; - if (strEQ(name + 9, "PREREQ")) - return RPMSENSE_PREREQ; - if (strEQ(name + 9, "SENSEMASK")) - return RPMSENSE_SENSEMASK; - if (strEQ(name + 9, "TRIGGER")) - return RPMSENSE_TRIGGER; - if (strEQ(name + 9, "TRIGGERIN")) - return RPMSENSE_TRIGGERIN; - if (strEQ(name + 9, "TRIGGERPOSTUN")) - return RPMSENSE_TRIGGERPOSTUN; - if (strEQ(name + 9, "TRIGGERUN")) - return RPMSENSE_TRIGGERUN; - } - if (strnEQ(name, "RPMSIGTAG_", 10)) - { - if (strEQ(name + 10, "GPG")) - return RPMSIGTAG_GPG; - if (strEQ(name + 10, "LEMD5_1")) - return RPMSIGTAG_LEMD5_1; - if (strEQ(name + 10, "LEMD5_2")) - return RPMSIGTAG_LEMD5_2; - if (strEQ(name + 10, "MD5")) - return RPMSIGTAG_MD5; - if (strEQ(name + 10, "PGP")) - return RPMSIGTAG_PGP; - if (strEQ(name + 10, "PGP5")) - return RPMSIGTAG_PGP5; - if (strEQ(name + 10, "SIZE")) - return RPMSIGTAG_SIZE; - } - if (strnEQ(name, "RPMSIG_", 7)) - { - if (strEQ(name + 7, "BAD")) - return RPMSIG_BAD; - if (strEQ(name + 7, "NOKEY")) - return RPMSIG_NOKEY; - if (strEQ(name + 7, "NOTTRUSTED")) - return RPMSIG_NOTTRUSTED; - if (strEQ(name + 7, "OK")) - return RPMSIG_OK; - if (strEQ(name + 7, "UNKNOWN")) - return RPMSIG_UNKNOWN; - } - if (strnEQ(name, "RPMTAG_", 7)) - { - switch (*(name + 7)) - { - case 'A': - if (strEQ(name + 7, "ARCH")) - return RPMTAG_ARCH; - if (strEQ(name + 7, "ARCHIVESIZE")) - return RPMTAG_ARCHIVESIZE; - break; - case 'B': - if (strEQ(name + 7, "BASENAMES")) - return RPMTAG_BASENAMES; - if (strEQ(name + 7, "BUILDARCHS")) - return RPMTAG_BUILDARCHS; - if (strEQ(name + 7, "BUILDHOST")) - return RPMTAG_BUILDHOST; - if (strEQ(name + 7, "BUILDMACROS")) - return RPMTAG_BUILDMACROS; - if (strEQ(name + 7, "BUILDROOT")) - return RPMTAG_BUILDROOT; - if (strEQ(name + 7, "BUILDTIME")) - return RPMTAG_BUILDTIME; - break; - case 'C': - if (strEQ(name + 7, "CHANGELOGNAME")) - return RPMTAG_CHANGELOGNAME; - if (strEQ(name + 7, "CHANGELOGTEXT")) - return RPMTAG_CHANGELOGTEXT; - if (strEQ(name + 7, "CHANGELOGTIME")) - return RPMTAG_CHANGELOGTIME; - if (strEQ(name + 7, "CONFLICTFLAGS")) - return RPMTAG_CONFLICTFLAGS; - if (strEQ(name + 7, "CONFLICTNAME")) - return RPMTAG_CONFLICTNAME; - if (strEQ(name + 7, "CONFLICTVERSION")) - return RPMTAG_CONFLICTVERSION; - if (strEQ(name + 7, "COPYRIGHT")) - return RPMTAG_COPYRIGHT; - if (strEQ(name + 7, "COOKIE")) - return RPMTAG_COOKIE; - break; - case 'D': - if (strEQ(name + 7, "DESCRIPTION")) - return RPMTAG_DESCRIPTION; - if (strEQ(name + 7, "DIRINDEXES")) - return RPMTAG_DIRINDEXES; - if (strEQ(name + 7, "DIRNAMES")) - return RPMTAG_DIRNAMES; - if (strEQ(name + 7, "DISTRIBUTION")) - return RPMTAG_DISTRIBUTION; - break; - case 'E': - if (strEQ(name + 7, "EXCLUDEARCH")) - return RPMTAG_EXCLUDEARCH; - if (strEQ(name + 7, "EXCLUDEOS")) - return RPMTAG_EXCLUDEOS; - if (strEQ(name + 7, "EXCLUSIVEARCH")) - return RPMTAG_EXCLUSIVEARCH; - if (strEQ(name + 7, "EXCLUSIVEOS")) - return RPMTAG_EXCLUSIVEOS; - break; - case 'F': - if (strEQ(name + 7, "FILEDEVICES")) - return RPMTAG_FILEDEVICES; - if (strEQ(name + 7, "FILEFLAGS")) - return RPMTAG_FILEFLAGS; - if (strEQ(name + 7, "FILEGROUPNAME")) - return RPMTAG_FILEGROUPNAME; - if (strEQ(name + 7, "FILEINODES")) - return RPMTAG_FILEINODES; - if (strEQ(name + 7, "FILELANGS")) - return RPMTAG_FILELANGS; - if (strEQ(name + 7, "FILELINKTOS")) - return RPMTAG_FILELINKTOS; - if (strEQ(name + 7, "FILEMD5S")) - return RPMTAG_FILEMD5S; - if (strEQ(name + 7, "FILEMODES")) - return RPMTAG_FILEMODES; - if (strEQ(name + 7, "FILEMTIMES")) - return RPMTAG_FILEMTIMES; - if (strEQ(name + 7, "FILERDEVS")) - return RPMTAG_FILERDEVS; - if (strEQ(name + 7, "FILESIZES")) - return RPMTAG_FILESIZES; - if (strEQ(name + 7, "FILESTATES")) - return RPMTAG_FILESTATES; - if (strEQ(name + 7, "FILEUSERNAME")) - return RPMTAG_FILEUSERNAME; - if (strEQ(name + 7, "FILEVERIFYFLAGS")) - return RPMTAG_FILEVERIFYFLAGS; - break; - case 'G': - if (strEQ(name + 7, "GIF")) - return RPMTAG_GIF; - if (strEQ(name + 7, "GROUP")) - return RPMTAG_GROUP; - break; - case 'I': - if (strEQ(name + 7, "ICON")) - return RPMTAG_ICON; - if (strEQ(name + 7, "INSTALLTIME")) - return RPMTAG_INSTALLTIME; - if (strEQ(name + 7, "INSTPREFIXES")) - return RPMTAG_INSTPREFIXES; - break; - case 'L': - if (strEQ(name + 7, "LICENSE")) - return RPMTAG_LICENSE; - break; - case 'N': - if (strEQ(name + 7, "NAME")) - return RPMTAG_NAME; - if (strEQ(name + 7, "NOPATCH")) - return RPMTAG_NOPATCH; - if (strEQ(name + 7, "NOSOURCE")) - return RPMTAG_NOSOURCE; - break; - case 'O': - if (strEQ(name + 7, "OBSOLETEFLAGS")) - return RPMTAG_OBSOLETEFLAGS; - if (strEQ(name + 7, "OBSOLETENAME")) - return RPMTAG_OBSOLETENAME; - if (strEQ(name + 7, "OBSOLETEVERSION")) - return RPMTAG_OBSOLETEVERSION; - if (strEQ(name + 7, "OS")) - return RPMTAG_OS; - break; - case 'P': - if (strEQ(name + 7, "PACKAGER")) - return RPMTAG_PACKAGER; - if (strEQ(name + 7, "PATCH")) - return RPMTAG_PATCH; - if (strEQ(name + 7, "POSTIN")) - return RPMTAG_POSTIN; - if (strEQ(name + 7, "POSTINPROG")) - return RPMTAG_POSTINPROG; - if (strEQ(name + 7, "POSTUN")) - return RPMTAG_POSTUN; - if (strEQ(name + 7, "POSTUNPROG")) - return RPMTAG_POSTUNPROG; - if (strEQ(name + 7, "PREFIXES")) - return RPMTAG_PREFIXES; - if (strEQ(name + 7, "PREIN")) - return RPMTAG_PREIN; - if (strEQ(name + 7, "PREINPROG")) - return RPMTAG_PREINPROG; - if (strEQ(name + 7, "PREUN")) - return RPMTAG_PREUN; - if (strEQ(name + 7, "PREUNPROG")) - return RPMTAG_PREUNPROG; - if (strEQ(name + 7, "PROVIDEFLAGS")) - return RPMTAG_PROVIDEFLAGS; - if (strEQ(name + 7, "PROVIDENAME")) - return RPMTAG_PROVIDENAME; - if (strEQ(name + 7, "PROVIDEVERSION")) - return RPMTAG_PROVIDEVERSION; - break; - case 'R': - if (strEQ(name + 7, "RELEASE")) - return RPMTAG_RELEASE; - if (strEQ(name + 7, "REQUIREFLAGS")) - return RPMTAG_REQUIREFLAGS; - if (strEQ(name + 7, "REQUIRENAME")) - return RPMTAG_REQUIRENAME; - if (strEQ(name + 7, "REQUIREVERSION")) - return RPMTAG_REQUIREVERSION; - if (strEQ(name + 7, "RPMVERSION")) - return RPMTAG_RPMVERSION; - break; - case 'S': - if (strEQ(name + 7, "SIZE")) - return RPMTAG_SIZE; - if (strEQ(name + 7, "SOURCE")) - return RPMTAG_SOURCE; - if (strEQ(name + 7, "SOURCERPM")) - return RPMTAG_SOURCERPM; - if (strEQ(name + 7, "SUMMARY")) - return RPMTAG_SUMMARY; - break; - case 'T': - if (strEQ(name + 7, "TRIGGERFLAGS")) - return RPMTAG_TRIGGERFLAGS; - if (strEQ(name + 7, "TRIGGERINDEX")) - return RPMTAG_TRIGGERINDEX; - if (strEQ(name + 7, "TRIGGERNAME")) - return RPMTAG_TRIGGERNAME; - if (strEQ(name + 7, "TRIGGERSCRIPTPROG")) - return RPMTAG_TRIGGERSCRIPTPROG; - if (strEQ(name + 7, "TRIGGERSCRIPTS")) - return RPMTAG_TRIGGERSCRIPTS; - if (strEQ(name + 7, "TRIGGERVERSION")) - return RPMTAG_TRIGGERVERSION; - break; - case 'U': - if (strEQ(name + 7, "URL")) - return RPMTAG_URL; - break; - case 'V': - if (strEQ(name + 7, "VENDOR")) - return RPMTAG_VENDOR; - if (strEQ(name + 7, "VERIFYSCRIPT")) - return RPMTAG_VERIFYSCRIPT; - if (strEQ(name + 7, "VERIFYSCRIPTPROG")) - return RPMTAG_VERIFYSCRIPTPROG; - if (strEQ(name + 7, "VERSION")) - return RPMTAG_VERSION; - break; - case 'X': - if (strEQ(name + 7, "XPM")) - return RPMTAG_XPM; - break; - default: - break; - } - } - if (strnEQ(name, "RPMTRANS_FLAG_", 14)) - { - if (strEQ(name + 14, "ALLFILES")) - return RPMTRANS_FLAG_ALLFILES; - if (strEQ(name + 14, "BUILD_PROBS")) - return RPMTRANS_FLAG_BUILD_PROBS; - if (strEQ(name + 14, "JUSTDB")) - return RPMTRANS_FLAG_JUSTDB; - if (strEQ(name + 14, "KEEPOBSOLETE")) - return RPMTRANS_FLAG_KEEPOBSOLETE; - if (strEQ(name + 14, "NODOCS")) - return RPMTRANS_FLAG_NODOCS; - if (strEQ(name + 14, "NOSCRIPTS")) - return RPMTRANS_FLAG_NOSCRIPTS; - if (strEQ(name + 14, "NOTRIGGERS")) - return RPMTRANS_FLAG_NOTRIGGERS; - if (strEQ(name + 14, "TEST")) - return RPMTRANS_FLAG_TEST; - } - if (strnEQ(name, "RPMVAR_", 7)) - { - if (strEQ(name + 7, "INCLUDE")) - return RPMVAR_INCLUDE; - if (strEQ(name + 7, "MACROFILES")) - return RPMVAR_MACROFILES; - if (strEQ(name + 7, "NUM")) - return RPMVAR_NUM; - if (strEQ(name + 7, "OPTFLAGS")) - return RPMVAR_OPTFLAGS; - if (strEQ(name + 7, "PROVIDES")) - return RPMVAR_PROVIDES; - } - if (strnEQ(name, "RPMVERIFY_", 10)) - { - if (strEQ(name + 10, "ALL")) - return RPMVERIFY_ALL; - if (strEQ(name + 10, "FILESIZE")) - return RPMVERIFY_FILESIZE; - if (strEQ(name + 10, "GROUP")) - return RPMVERIFY_GROUP; - if (strEQ(name + 10, "LINKTO")) - return RPMVERIFY_LINKTO; - if (strEQ(name + 10, "LSTATFAIL")) - return RPMVERIFY_LSTATFAIL; - if (strEQ(name + 10, "MD5")) - return RPMVERIFY_MD5; - if (strEQ(name + 10, "MODE")) - return RPMVERIFY_MODE; - if (strEQ(name + 10, "MTIME")) - return RPMVERIFY_MTIME; - if (strEQ(name + 10, "NONE")) - return RPMVERIFY_NONE; - if (strEQ(name + 10, "RDEV")) - return RPMVERIFY_RDEV; - if (strEQ(name + 10, "READFAIL")) - return RPMVERIFY_READFAIL; - if (strEQ(name + 10, "READLINKFAIL")) - return RPMVERIFY_READLINKFAIL; - if (strEQ(name + 10, "USER")) - return RPMVERIFY_USER; - } - break; - case 'U': - if (strEQ(name, "UNINSTALL_ALLMATCHES")) - return UNINSTALL_ALLMATCHES; - if (strEQ(name, "UNINSTALL_NODEPS")) - return UNINSTALL_NODEPS; - break; - case 'V': - if (strnEQ(name, "VERIFY_", 7)) - { - if (strEQ(name + 7, "DEPS")) - return VERIFY_DEPS; - if (strEQ(name + 7, "FILES")) - return VERIFY_FILES; - if (strEQ(name + 7, "MD5")) - return VERIFY_MD5; - if (strEQ(name + 7, "SCRIPT")) - return VERIFY_SCRIPT; - } - break; - default: - break; - } - errno = EINVAL; - return 0; -} - - -MODULE = RPM::Constants PACKAGE = RPM::Constants - - -int -constant(name) - char* name; - PROTOTYPE: $ - CODE: - RETVAL = constant(aTHX_ name); - OUTPUT: - RETVAL diff --git a/Perl-RPM/RPM/Database.pm b/Perl-RPM/RPM/Database.pm deleted file mode 100644 index b003f8c..0000000 --- a/Perl-RPM/RPM/Database.pm +++ /dev/null @@ -1,265 +0,0 @@ -############################################################################### -# -# (c) Copyright @ 2000, Randy J. Ray -# All Rights Reserved -# -############################################################################### -# -# $Id: Database.pm,v 1.18 2002/05/10 07:38:58 rjray Exp $ -# -# Description: The RPM::Database class provides access to the RPM database -# as a tied hash, whose keys are taken as the names of -# packages installed and whose values are RPM::Header -# objects. -# -# Functions: new -# import -# -# Libraries: RPM -# RPM::Header -# -# Global Consts: None. -# -# Environment: Just stuff from the RPM config. -# -############################################################################### - -package RPM::Database; - -require 5.005; - -use strict; -use vars qw($VERSION %RPM $RPM); -use subs qw(new import); - -require RPM; -require RPM::Header; - -$VERSION = do { my @r=(q$Revision: 1.18 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -1; - -sub new -{ - my $class = shift; - my $opts = shift; - my %hash = (); - - # The presence of $opts when empty is hard on the XS TIEHASH method - $opts ? tie(%hash, $class, $opts) : tie(%hash, $class); -} - -############################################################################### -# -# Sub Name: import -# -# Description: This lies in wait to see if someone actually tries to -# import from this package. If they do, check that it is -# allowed and do it if it is. -# -# At present, only "%RPM" or "$RPM" is allowed. If that is -# the requested export, then the hash is tied to the RPM -# database (with no extra arguments) then exported to the -# caller's namespace. -# -# Arguments: NAME IN/OUT TYPE DESCRIPTION -# $class in scalar Name of this package -# @args in list Requested exports -# -# Globals: None. -# -# Environment: None. -# -# Returns: void context -# -############################################################################### -sub import -{ - my ($class, @args) = @_; - - my $callpkg = caller(0); - - no strict 'refs'; - - for my $arg (@args) - { - if ($arg eq '%RPM' and ! (tied %RPM)) - { - tie %RPM, "RPM::Database"; - *{"${callpkg}::RPM"} = \%{"${class}::RPM"}; - } - elsif ($arg eq '$RPM' and ! $RPM) - { - tie %RPM, "RPM::Database" unless (tied %RPM); - $RPM = (tied %RPM); - *{"${callpkg}::RPM"} = \${"${class}::RPM"}; - } - else - { - warn "$class: Unknown export requested: $arg, "; - return; - } - } -} - -__END__ - -=head1 NAME - -RPM::Database - Access to the RPM database of installed packages - -=head1 SYNOPSIS - - use RPM::Database; - - tie %RPM, "RPM::Database" or die "$RPM::err"; - - for (sort keys %RPM) - { - ... - } - -=head1 DESCRIPTION - -The B package provides access to the database of installed -packages on a system. The database may be accessed as either a tied hash -or as a blessed reference to a hash. The keys of the hash represent -packages on the system. The order in which they are returned by any of -C, C or C, is determined by the internal database -ordering. Unlike the keys in B (see L), the -keys here are in fact case-sensitive. - -The return value corresponding to each key is a reference to a -B object. The header object is marked read-only, as the -RPM database is not directly modifiable via this interface. - -There are also a number of class methods implemented, which are described in -the next section. - -=head1 USAGE - -=head2 Creating an Object - -An object may be created one of two ways: - - tie %D, "RPM::Database"; - - $dataref = new RPM::Database; - -The latter approach offers more direct access to the class methods, while -also permitting the usual tied-hash operations such as fetching: - - $dataref->{package} # Such as "rpm" or "perl" - -=head2 Class Methods - -The following methods are available to objects of this class, in addition to -the tied-hash suite of operations. If the object is a hash instead of a -hash reference, it can be used to call these methods via: - - (tied %hash)->method_name(...) - -=over - -=item new - -Creates a tied hash using a lexically-scoped hash table, then returns a -reference to it (the return value of the C operation). This reference -prevents the hash table from going out of scope. If a hash-reference of -options is passed to this constructor, they are passed along to the tie of the -hash. If a single scalar argument is passed, it is assumed to be an alternate -database root to be used in opening the RPM database. The hash-reference -currently only supports a single key, C, which serves the same -purpose. The hash-reference approach leaves open the possibilty of future -options being added. - -=item init - -This causes a complete initialization of the RPM database. It must be run -with sufficient permissions to create/update the relevant files. It must -also be called as a static method, to avoid having any file descriptors -open on the database at the time. - -=item rebuild - -This rebuilds the database (same as "rpm --rebuilddb"). As with B -above, this requires adequate permissions and must be invoked as a static -method. - -=item find_by_file(file) - -Returns a list of B objects that correspond to the package(s) -claiming ownership of the file "file". - -=item find_by_group(group) - -Returns of a list of headers for all packages flagged as being in the -group specified. - -=item find_what_provides(provides) - -Search as above, but based on which package(s) provide the functionality -specified as "provides". - -=item find_what_requires(requires) - -Return a list of headers for the packages that directly depend on the -specified package for installation and operation. The specified package should -be just the name, no version or release information. - -=item find_what_conflicts(conflicts) - -List those packages that have conflicts based on the value of "conflicts". - -=item find_by_package(package) - -This performs the search by a specific package name. This is the API call -used by the FETCH tied-hash method, but this differs in that if there is -in fact more than one matching record, all are returned. - -=back - -Any of the C routines can take an B object as an argument, -in which case the package name will be retrieved and used for the argument. In -some cases (such as C), this is probably not what you want. But -in other cases such as C, it may be exactly what you want. - -=head2 Importable Defaults - -Given that there may be only one concurrent process with the rpm database -open, and given that such would lead to a lot of program code starting with -the same sequence of use/tie or use/new, the following identifiers may be -imported from the package: - -=over - -=item %RPM - -A hash pre-tied to the RPM::Database package (and thus the rpm database). - -=item $RPM - -A RPM::Database object, referencing a hash tied to the rpm database. - -=back - -=head1 DIAGNOSTICS - -Direct binding to the internal error-management of B is still under -development. At present, most operations generate their diagnostics to -STDERR. - -=head1 CAVEATS - -This is currently regarded as alpha-quality software. The interface is -subject to change in future releases. - -=head1 SEE ALSO - -L, L, L, L - -=head1 AUTHOR - -Randy J. Ray - -=cut diff --git a/Perl-RPM/RPM/Database.xs b/Perl-RPM/RPM/Database.xs deleted file mode 100644 index fb4f82c..0000000 --- a/Perl-RPM/RPM/Database.xs +++ /dev/null @@ -1,507 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include -#include "RPM.h" - -static char * const rcsid = "$Id: Database.xs,v 1.18 2002/05/10 05:53:48 rjray Exp $"; - -/* - rpmdb_TIEHASH - - This is the implementation of the tied-hash class constructor. The XS - wrapper will verify that the value of class is correct, then massage the - arguments as needed. The return value is expected to be either NULL or a - valid RPM__Database value (which the XS wrapper will fix up). -*/ -RPM__Database rpmdb_TIEHASH(pTHX_ char* class, SV* opts) -{ - char* root = (char *)NULL; - int mode = O_RDONLY; - mode_t perms = 0; - HV* opt_hash; - SV* t_magic; - SV** svp; - RPM_Database* retvalp; /* For "private" */ - RPM__Database RETVAL; - - if (opts) - { - if (SvROK(opts) && (SvTYPE(opts) == SVt_PVHV)) - { - /* This is a hash reference. We are concerned only with - the key "root". "mode" and "perms" don't apply, as we are - going to open the database as read-only. */ - opt_hash = (HV*)SvRV(opts); - - svp = hv_fetch(opt_hash, "root", 4, FALSE); - if (svp && SvPOK(*svp)) - root = SvPV(*svp, PL_na); - } - else if (SvPOK(opts)) - { - /* They passed a scalar, assumed to be the "root" */ - root = SvPV(opts, PL_na); - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - "Wrong type for argument 2 to TIEHASH"); - return (Null(RPM__Database)); - } - } - - /* With that all processed, attempt to open the actual RPM DB */ - /* The retvalp is used for the C-level rpmlib information on databases */ - Newz(0, retvalp, 1, RPM_Database); - if (rpmdbOpen(root, &retvalp->dbp, mode, perms) != 0) - /* rpm lib will have set the error already */ - return (Null(RPM__Database)); - else - { - retvalp->current_rec = 0; - retvalp->noffs = retvalp->offx = 0; - retvalp->offsets = (int *)NULL; - } - - RETVAL = newHV(); - retvalp->storage = newHV(); - t_magic = newSViv((unsigned)retvalp); - - sv_magic((SV *)RETVAL, Nullsv, 'P', Nullch, 0); - sv_magic((SV *)RETVAL, t_magic, '~', Nullch, 0); - SvREFCNT_dec(t_magic); - - return RETVAL; -} - -SV* rpmdb_FETCH(pTHX_ RPM__Database self, SV* key) -{ - const char* name = NULL; /* For the actual name out of (SV *)key */ - int namelen; /* Arg for SvPV(..., len) */ - int offset; /* In case they pass an integer offset */ - Header hdr; /* For rpmdbGetRecord() calls */ - Header lasthdr; /* For searching latest rpm */ - rpmdbMatchIterator mi; - SV** svp; - SV* FETCH; - RPM__Header FETCHp; - RPM_Database* dbstruct; /* This is the struct used to hold C-level data */ - - struct_from_object_ret(RPM_Database, dbstruct, self, FETCH); - /* De-reference key, if it is a reference */ - if (SvROK(key)) - key = SvRV(key); - - /* For sake of flexibility (and because it's almost zero overhead), - allow the request to be by name -or- by an offset number */ - if (SvPOK(key)) - { - name = SvPV(key, namelen); - - /* Step 1: Check to see if this has already been requested and is - thus cached on the hash itself */ - svp = hv_fetch(dbstruct->storage, (char *)name, namelen, FALSE); - if (svp && SvROK(*svp)) - return newSVsv(*svp); - - offset = -1; - lasthdr = NULL; - mi = rpmdbInitIterator(dbstruct->dbp, RPMTAG_NAME, name, 0); - while ((hdr = rpmdbNextIterator(mi)) != NULL) - { - /* There might be more than one match. Find the newest one. */ - if (lasthdr == NULL) - { - lasthdr = headerLink(hdr); - offset = rpmdbGetIteratorOffset(mi); - } - else - { - if (rpmVersionCompare(hdr, lasthdr) == 1) - { - lasthdr = headerLink(hdr); - offset = rpmdbGetIteratorOffset(mi); - } - } - } - rpmdbFreeIterator(mi); - if (offset == -1) - /* Some sort of error occured when reading the DB or the - name was not found. */ - return &PL_sv_undef; - } - else if (SvIOK(key)) - { - /* This is actually a lot easier than fetch-by-name, which is - why I've thrown it in */ - offset = SvIV(key); - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Database::FETCH: Second arg should be name or offset"); - return &PL_sv_undef; - } - - mi = rpmdbInitIterator(dbstruct->dbp, RPMDBI_PACKAGES, - &offset, sizeof(offset)); - hdr = rpmdbNextIterator(mi); - - if (hdr) - { - hdr = headerLink(hdr); - FETCHp = rpmhdr_TIEHASH(aTHX_ "RPM::Header", - sv_2mortal(newSViv((unsigned)hdr)), - RPM_HEADER_FROM_REF | RPM_HEADER_READONLY); - if (name == Null(const char *)) - name = SvPV(rpmhdr_FETCH(aTHX_ FETCHp, - sv_2mortal(newSVpv("NAME", 4)), - Null(const char *), 0, 0), namelen); - FETCH = sv_bless(newRV_noinc((SV*)FETCHp), - gv_stashpv("RPM::Header", TRUE)); - hv_store(dbstruct->storage, (char *)name, namelen, newSVsv(FETCH), - FALSE); - } - rpmdbFreeIterator(mi); - - return FETCH; -} - -bool rpmdb_EXISTS(pTHX_ RPM__Database self, SV* key) -{ - SV* tmp; - - tmp = rpmdb_FETCH(aTHX_ self, key); - return (tmp != &PL_sv_undef); -} - -/* - This is quite a bit easier than the FIRSTKEY/NEXTKEY combo for headers. - In these cases, the transition is based on the last offset fetched, which - we store on the struct part of self. We don't have to worry about an - iterator struct. -*/ -int rpmdb_FIRSTKEY(pTHX_ RPM__Database self, SV** key, SV** value) -{ - RPM_Database* dbstruct; - - struct_from_object_ret(RPM_Database, dbstruct, self, 0); - if (dbstruct->offsets == NULL || dbstruct->noffs <= 0) - { - rpmdbMatchIterator mi; - Header h; - - if (dbstruct->offsets) - free(dbstruct->offsets); - dbstruct->offsets = NULL; - dbstruct->noffs = 0; - mi = rpmdbInitIterator(dbstruct->dbp, RPMDBI_PACKAGES, NULL, 0); - while ((h = rpmdbNextIterator(mi)) != NULL) - { - dbstruct->noffs++; - dbstruct->offsets = - realloc(dbstruct->offsets, - dbstruct->noffs * sizeof(dbstruct->offsets[0])); - dbstruct->offsets[dbstruct->noffs-1] = rpmdbGetIteratorOffset(mi); - } - rpmdbFreeIterator(mi); - } - - if (dbstruct->offsets == NULL || dbstruct->noffs <= 0) - return 0; - - dbstruct->offx = 0; - dbstruct->current_rec = dbstruct->offsets[dbstruct->offx++]; - - *value = rpmdb_FETCH(aTHX_ self, newSViv(dbstruct->current_rec)); - *key = rpmhdr_FETCH(aTHX_ (RPM__Header)SvRV(*value), newSVpv("name", 4), - Nullch, 0, 0); - - return 1; -} - -int rpmdb_NEXTKEY(pTHX_ RPM__Database self, SV* key, - SV** nextkey, SV** nextvalue) -{ - RPM_Database* dbstruct; - - struct_from_object_ret(RPM_Database, dbstruct, self, 0); - - if (dbstruct->offsets == NULL || dbstruct->noffs <= 0) - return 0; - if (dbstruct->offx >= dbstruct->noffs) - return 0; - - dbstruct->current_rec = dbstruct->offsets[dbstruct->offx++]; - - *nextvalue = rpmdb_FETCH(aTHX_ self, newSViv(dbstruct->current_rec)); - *nextkey = rpmhdr_FETCH(aTHX_ (RPM__Header)SvRV(*nextvalue), - newSVpv("name", 4), Nullch, 0, 0); - - return 1; -} - -void rpmdb_DESTROY(pTHX_ RPM__Database self) -{ - RPM_Database* dbstruct; /* This is the struct used to hold C-level data */ - - struct_from_object(RPM_Database, dbstruct, self); - - rpmdbClose(dbstruct->dbp); - if (dbstruct->offsets) - Safefree(dbstruct->offsets); - - hv_undef(dbstruct->storage); - Safefree(dbstruct); - hv_undef(self); -} - -int rpmdb_init(SV* class, const char* root, int perms) -{ - return (1 - rpmdbInit(root, perms)); -} - -int rpmdb_rebuild(SV* class, const char* root) -{ - return (1 - rpmdbRebuild(root)); -} - -/* - This is a front-end to all the rpmdbFindBy*() set, including FindByPackage - which differs from FETCH above in that if there is actually more than one - match, all will be returned. -*/ -AV* rpmdb_find_by_whatever(pTHX_ RPM__Database self, SV* string, int idx) -{ - const char* str = NULL; /* For the actual string out of (SV *)string */ - RPM_Database* dbstruct; /* This is the struct used to hold C-level data */ - AV* return_val; - int loop; - SV* tmp_hdr; - rpmdbMatchIterator mi; - - /* Any successful operation will store items on this */ - return_val = newAV(); - - struct_from_object_ret(RPM_Database, dbstruct, self, return_val); - if (sv_derived_from(string, "RPM::Header")) - { - SV* fetch_string = rpmhdr_FETCH(aTHX_ (RPM__Header)SvRV(string), - sv_2mortal(newSVpvn("NAME", 4)), - Nullch, 0, 0); - - str = SvPV(fetch_string, PL_na); - } - else - { - /* De-reference key, if it is a reference */ - if (SvROK(string)) - string = SvRV(string); - /* Get the string */ - str = SvPV(string, PL_na); - } - - mi = rpmdbInitIterator(dbstruct->dbp, idx, str, 0); - if (mi) - { - av_extend(return_val, rpmdbGetIteratorCount(mi)); - loop = 0; - while ((rpmdbNextIterator(mi)) != NULL) - { - idx = rpmdbGetIteratorOffset(mi); - tmp_hdr = rpmdb_FETCH(aTHX_ self, sv_2mortal(newSViv(idx))); - av_store(return_val, loop++, sv_2mortal(newSVsv(tmp_hdr))); - } - } - rpmdbFreeIterator(mi); - - return return_val; -} - - -MODULE = RPM::Database PACKAGE = RPM::Database PREFIX = rpmdb_ - - -RPM::Database -rpmdb_TIEHASH(class, opts=NULL) - char* class; - SV* opts; - PROTOTYPE: $;$ - CODE: - RETVAL = rpmdb_TIEHASH(aTHX_ class, opts); - OUTPUT: - RETVAL - -SV* -rpmdb_FETCH(self, key) - RPM::Database self; - SV* key; - PROTOTYPE: $$ - CODE: - RETVAL = rpmdb_FETCH(aTHX_ self, key); - OUTPUT: - RETVAL - -int -rpmdb_STORE(self=NULL, key=NULL, value=NULL) - SV* self; - SV* key; - SV* value; - PROTOTYPE: $$$ - CODE: - { - rpm_error(aTHX_ RPMERR_NOCREATEDB, "STORE: operation not permitted"); - RETVAL = 0; - } - OUTPUT: - RETVAL - -SV* -rpmdb_DELETE(self=NULL, key=NULL) - SV* self; - SV* key; - PROTOTYPE: $$ - CODE: - { - rpm_error(aTHX_ RPMERR_NOCREATEDB, "DELETE: operation not permitted"); - RETVAL = Nullsv; - } - OUTPUT: - RETVAL - -int -rpmdb_CLEAR(self=NULL) - SV* self; - PROTOTYPE: $ - CODE: - { - rpm_error(aTHX_ RPMERR_NOCREATEDB, "CLEAR: operation not permitted"); - RETVAL = 0; - } - OUTPUT: - RETVAL - -bool -rpmdb_EXISTS(self, key) - RPM::Database self; - SV* key; - PROTOTYPE: $$ - CODE: - RETVAL = rpmdb_EXISTS(aTHX_ self, key); - OUTPUT: - RETVAL - -void -rpmdb_FIRSTKEY(self) - RPM::Database self; - PROTOTYPE: $ - PPCODE: - { - SV* key; - SV* value; - - if (! rpmdb_FIRSTKEY(aTHX_ self, &key, &value)) - { - key = newSVsv(&PL_sv_undef); - value = newSVsv(&PL_sv_undef); - } - - EXTEND(SP, 2); - PUSHs(sv_2mortal(value)); - PUSHs(sv_2mortal(newSVsv(key))); - } - -void -rpmdb_NEXTKEY(self, key=NULL) - RPM::Database self; - SV* key; - PROTOTYPE: $;$ - PPCODE: - { - SV* nextkey; - SV* nextvalue; - - if (! rpmdb_NEXTKEY(aTHX_ self, key, &nextkey, &nextvalue)) - { - nextkey = newSVsv(&PL_sv_undef); - nextvalue = newSVsv(&PL_sv_undef); - } - - EXTEND(SP, 2); - PUSHs(sv_2mortal(nextvalue)); - PUSHs(sv_2mortal(newSVsv(nextkey))); - } - -void -rpmdb_DESTROY(self) - RPM::Database self; - PROTOTYPE: $ - CODE: - rpmdb_DESTROY(aTHX_ self); - -int -rpmdb_init(class, root=NULL, perms=O_RDWR) - SV* class; - const char* root; - int perms; - PROTOTYPE: $;$$ - INIT: - if (! (SvPOK(class) && strcmp(SvPV(class, PL_na), "RPM::Database"))) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Database::init must be called as a static method"); - ST(0) = sv_2mortal(newSViv(0)); - XSRETURN(1); - } - -int -rpmdb_rebuild(class, root=NULL) - SV* class; - const char* root; - PROTOTYPE: $;$ - INIT: - if (! (SvPOK(class) && strcmp(SvPV(class, PL_na), "RPM::Database"))) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Database::rebuild must be called as a static method"); - ST(0) = sv_2mortal(newSViv(0)); - XSRETURN(1); - } - -void -rpmdb_find_by_file(self, string) - RPM::Database self; - SV* string; - PROTOTYPE: $$ - ALIAS: - find_by_group = RPMTAG_GROUP - find_what_provides = RPMTAG_PROVIDENAME - find_what_requires = RPMTAG_REQUIRENAME - find_what_conflicts = RPMTAG_CONFLICTNAME - find_by_package = RPMTAG_NAME - PPCODE: - { - AV* matches; - int len, size; - - if (ix == 0) ix = RPMTAG_BASENAMES; - matches = rpmdb_find_by_whatever(aTHX_ self, string, ix); - if ((len = av_len(matches)) != -1) - { - /* We have (len+1) elements in the array to put onto the stack */ - size = len + 1; - EXTEND(SP, size); - while (len >= 0) - { - /* This being a stack and all, we put them in backwards */ - PUSHs(sv_2mortal(newSVsv(*av_fetch(matches, len, FALSE)))); - len--; - } - } - else - size = 0; - - XSRETURN(size); - } diff --git a/Perl-RPM/RPM/Error.pm b/Perl-RPM/RPM/Error.pm deleted file mode 100644 index eb12b1d..0000000 --- a/Perl-RPM/RPM/Error.pm +++ /dev/null @@ -1,126 +0,0 @@ -############################################################################### -# -# This file copyright (c) 2000 by Randy J. Ray, all rights reserved -# -# Copying and distribution are permitted under the terms of the Artistic -# License as distributed with Perl versions 5.002 and later. -# -############################################################################### -# -# $Id: Error.pm,v 1.10 2001/04/27 09:05:21 rjray Exp $ -# -# Description: Error-management support that cooperates with the primary -# Perl/C error glue. -# -# Functions: None (all XS) -# -# Libraries: RPM -# -# Global Consts: None. -# -# Environment: None. -# -############################################################################### - -package RPM::Error; - -use 5.005; -use strict; -use vars qw(@ISA $VERSION @EXPORT @EXPORT_OK); - -require Exporter; -require RPM; - -@ISA = qw(Exporter); - -$VERSION = do { my @r=(q$Revision: 1.10 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -@EXPORT = qw(clear_errors set_error_callback rpm_error); -@EXPORT_OK = @EXPORT; - -1; - -__END__ - -=head1 NAME - -RPM::Error - Functions to supplement the internal error management of RPM - -=head1 SYNOPSIS - - use RPM::Error; - use RPM::Constants ':rpmerr'; - - set_error_callback(sub { ... }); - - rpm_error(RPMERR_DBOPEN, "Error opening RPM DB: $!"); - -=head1 DESCRIPTION - -The B package provides access to some functions that work with -(but do not replace) the special C<$RPM::err> variable. These routines allow -for reporting errors through the B facility, clearing the error variable, -and registering a callback function to be invoked whenever a new error is -raised. - -None of these routines are required for normal use of the special variable -C<$RPM::err> (see L). - -=head1 USAGE - -The following routines are exported by B: - -=over - -=item rpm_error($code, $message) - -Report an error through the internal facility used by B. By using this -function, the special error variable is set up to have a dual-nature: When -evaluated in a numeric context, it returns the numerical code C<$code>. When -evaluated as a string, it will return C<$message>. The value of C<$code> -should be (but is not required to be) one of the values exported from the -B package via the B<:rpmerr> tag. C<$message> may be any -string value. - -=item clear_errors() - -Clears both the numeric and string values of C<$RPM::err>. - -=item $old_cb = set_error_callback($subr) - -Set a (new) callback to be invoked whenever a new error is flagged. Returns -the old (existing) callback value if there was one, C otherwise. - -The parameter to this call should be either a subroutine reference or a -closure. A subroutine name may be passed; if so, it should either be given -a package qualification or exist in the C namespace. The routine, -when invoked, will be passed the numeric code and the message string being -raised as the error. Note that the callback may be invoked by internal error -flagging in the core B library, as well as by calls to B -above. - -Before any user-provided callback is invoked, the C<$RPM::err> variable is -set. While accessing it in a callback would be redundant, users should not -be concerned about interrupting other internal processes (in theory, that is). - -=back - -=head1 DIAGNOSTICS - -If the value passed to B is not valid, the current -callback is set to a null value. - -=head1 CAVEATS - -The code value passed to B is not checked against the list of -valid constants before assignment. - -=head1 SEE ALSO - -L, L, L - -=head1 AUTHOR - -Randy J. Ray - -=cut diff --git a/Perl-RPM/RPM/Error.xs b/Perl-RPM/RPM/Error.xs deleted file mode 100644 index 9ff29b3..0000000 --- a/Perl-RPM/RPM/Error.xs +++ /dev/null @@ -1,145 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include "RPM.h" - -static char * const rcsid = "$Id: Error.xs,v 1.5 2002/05/10 07:38:21 rjray Exp $"; - -static CV* err_callback; - -/* - This was static, but it needs to be accessible from other modules, as well. -*/ -SV* rpm_errSV; - -/* - This is a callback routine that the bootstrapper will register with the RPM - lib so as to catch any errors. (I hope) -*/ -static void rpm_catch_errors(void) -{ - /* Because rpmErrorSetCallback expects (void)fn(void), we have to declare - our thread context here */ - dTHX; - int error_code; - const char* error_string; - - error_code = rpmErrorCode(); - error_string = rpmErrorString(); - - /* Set the string part, first */ - sv_setsv(rpm_errSV, newSVpv((char*)error_string, strlen(error_string))); - /* Set the IV part */ - sv_setiv(rpm_errSV, error_code); - /* Doing that didn't erase the PV part, but it cleared the flag: */ - SvPOK_on(rpm_errSV); - - /* If there is a current callback, invoke it: */ - if (err_callback != Nullcv) - { - /* This is just standard boilerplate for calling perl from C */ - dSP; - ENTER; - SAVETMPS; - PUSHMARK(sp); - XPUSHs(sv_2mortal(newSViv(error_code))); - XPUSHs(sv_2mortal(newSVpv((char*)error_string, strlen(error_string)))); - PUTBACK; - - /* The actual call */ - perl_call_sv((SV *)err_callback, G_DISCARD); - - /* More boilerplate */ - SPAGAIN; - PUTBACK; - FREETMPS; - LEAVE; - } - - return; -} - -/* This is just to offer an easy way to clear both sides of $RPM::err */ -void clear_errors(pTHX) -{ - sv_setsv(rpm_errSV, newSVpv("", 0)); - sv_setiv(rpm_errSV, 0); - SvPOK_on(rpm_errSV); - - return; -} - -SV* set_error_callback(pTHX_ SV* newcb) -{ - SV* oldcb; - - oldcb = (err_callback) ? newRV((SV *)err_callback) : newSVsv(&PL_sv_undef); - - if (SvROK(newcb)) newcb = SvRV(newcb); - if (SvTYPE(newcb) == SVt_PVCV) - err_callback = (CV *)newcb; - else if (SvPOK(newcb)) - { - char* fn_name; - char* sv_name; - - sv_name = SvPV(newcb, PL_na); - if (! strstr(sv_name, "::")) - { - Newz(TRUE, fn_name, strlen(sv_name) + 7, char); - strncat(fn_name, "main::", 6); - strcat(fn_name + 6, sv_name); - } - else - fn_name = sv_name; - - err_callback = perl_get_cv(fn_name, FALSE); - } - else - { - err_callback = Nullcv; - } - - return oldcb; -} - -void rpm_error(pTHX_ int code, const char* message) -{ - rpmError(code, (char *)message); -} - - -MODULE = RPM::Error PACKAGE = RPM::Error - - -SV* -set_error_callback(newcb) - SV* newcb; - PROTOTYPE: $ - CODE: - RETVAL = set_error_callback(aTHX_ newcb); - OUTPUT: - RETVAL - -void -clear_errors() - PROTOTYPE: - CODE: - clear_errors(aTHX); - -void -rpm_error(code, message) - int code; - char* message; - PROTOTYPE: $$ - CODE: - rpm_error(aTHX_ code, message); - - -BOOT: -{ - rpm_errSV = perl_get_sv("RPM::err", GV_ADD|GV_ADDMULTI); - rpmErrorSetCallback(rpm_catch_errors); - err_callback = Nullcv; -} diff --git a/Perl-RPM/RPM/Header.pm b/Perl-RPM/RPM/Header.pm deleted file mode 100644 index d6c4860..0000000 --- a/Perl-RPM/RPM/Header.pm +++ /dev/null @@ -1,309 +0,0 @@ -############################################################################### -# -# (c) Copyright @ 2000, Randy J. Ray -# All Rights Reserved -# -############################################################################### -# -# $Id: Header.pm,v 1.20 2001/04/27 09:05:21 rjray Exp $ -# -# Description: The RPM::Header class provides access to the RPM Header -# structure as a tied hash, allowing direct access to the -# tags in a header as keys, and the content of said tags -# as the values. -# -# Functions: new -# AUTOLOAD -# filenames -# -# Libraries: None. -# -# Global Consts: None. -# -# Environment: Just stuff from the RPM config. -# -############################################################################### - -package RPM::Header; - -require 5.005; - -use strict; -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); -use subs qw(new AUTOLOAD filenames); - -require Exporter; - -use RPM; -use RPM::Error; -use RPM::Constants ':rpmerr'; - -$VERSION = do { my @r=(q$Revision: 1.20 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -@ISA = qw(Exporter); -@EXPORT = (); -@EXPORT_OK = qw(RPM_HEADER_MASK RPM_HEADER_READONLY); -%EXPORT_TAGS = (all => \@EXPORT_OK); - -1; - -sub AUTOLOAD -{ - my $constname; - ($constname = $AUTOLOAD) =~ s/.*:://; - die "& not defined" if $constname eq 'constant'; - my $val = constant($constname); - if ($! != 0) - { - die "Your vendor has not defined RPM macro $constname"; - } - no strict 'refs'; - *$AUTOLOAD = sub { $val }; - goto &$AUTOLOAD; -} - -sub new -{ - my $class = shift; - my %hash = (); - - tie %hash, $class, @_; -} - -############################################################################### -# -# Sub Name: filenames -# -# Description: Glue together the contents of BASENAMES, DIRNAMES and -# DIRINDEXES to create a single list of fully-qualified -# filenames -# -# Arguments: NAME IN/OUT TYPE DESCRIPTION -# $self in ref Object of this class -# -# Globals: None. -# -# Environment: None. -# -# Returns: Success: listref -# Failure: undef -# -############################################################################### -sub filenames -{ - my $self = shift; - - # Each of these three fetches will have already triggered rpm_error, were - # there any problems. - my $base = $self->{BASENAMES} || return undef; - my $dirs = $self->{DIRNAMES} || return undef; - my $idxs = $self->{DIRINDEXES} || return undef; - - unless (@$base == @$idxs) - { - rpm_error(RPMERR_INTERNAL, - "Mis-matched elements lists for BASENAMES and DIRINDEXES"); - return undef; - } - - # The value from DIRNAMES already has the trailing separator - [ map { "$dirs->[$idxs->[$_]]$base->[$_]" } (0 .. $#$base) ]; -} - - -__END__ - -=head1 NAME - -RPM::Header - Access to RPM package headers - -=head1 SYNOPSIS - - use RPM::Header; - - tie %hdr, "RPM::Header", "rpm-3.0.4-0.48.i386.rpm" or die "$RPM::err"; - - for (sort keys %hdr) - { - ... - } - -=head1 DESCRIPTION - -The B package permits access to the header of a package (external -file or currently installed) as either a tied hash or a blessed hash reference. -The tags that are present in the header are expressed as keys. Retrieving -them via C or C returns the tags in the order in which they -appear in the header. Keys may be requested without regard for letter case, -but they are always returned as all upper-case. - -The return value corresponding to each key is a list reference or scalar -(or C if the key is not valid), depending on the data-type of the -key. Each of the header tags are noted with one of C<$> or C<@> in the -B documentation. The C keyword should be used -for testing success versus failure, as empty tags are possible. See the -C test, below. - -This is a significant change from versions prior to 0.27, in which the -return value was always a list reference. This new approach brings -B more in line with other interfaces to B header information. - -B objects are also the native return value from keys retrieved -in the B class (see L). In these cases, the -header data is marked read-only, and attempts to alter any of the keys will -generate an error. - -There are also a number of class methods implemented, which are described in -the next section. - -=head1 USAGE - -=head2 Creating an Object - -An object may be created one of two ways: - - tie %h, "RPM::Header", "filename"; - - $href = new RPM::Header "filename"; - -The latter approach offers more direct access to the class methods, while -also permitting the usual tied-hash operations such as fetching: - - $href->{tag} # Such as "name" or "version" - -=head2 Class Methods - -The following methods are available to objects of this class, in addition to -the tied-hash suite of operations. If the object is a hash instead of a -hash reference, it can be used to call these methods via: - - (tied %hash)->method_name(...) - -=over - -=item filenames - -The B system attempts to save space by splitting up the file paths into -the leafs (stored by the tag C), the directories (stored under -C) and indexes into the list of directories (stored under -C). As a convenience, this method re-assembles the list of -filenames and returns it as a list reference. If an error occurs, C -will be returned after C has been called. - -=item is_source - -Returns true (1) or false (0), depending on whether the package the header -object is derived from is a source RPM. - -=item size - -Return the size of the header, in bytes, within the disk file containing the -associated package. The value is also returned for those headers within the -database. - -=item scalar_tag(TAG) - -Returns a true/false value (1 or 0) based on whether the value returned by -the specified tag is a scalar or an array reference. Useful in place of -using C to test the fetched values. B may be either a string (name) -or a number (imported from the B tag C<:rpmtag>). This -method may be called as a class (static) method. - -=item tagtype(TAG) - -Given a tag I, return the type as a numerical value. The valid types -can be imported from the B package via the import-tag -":rpmtype", and are: - -=over - -=item RPM_NULL_TYPE - -Used internally by B. - -=item RPM_BIN_TYPE - -The data returned is a single chunk of binary data. It has been converted to -a single "string" in Perl terms, but may contain nulls within it. The -B keyword should return the correct size for the chunk. - -=item RPM_CHAR_TYPE - -All items are single-character in nature. Note that since Perl does not -distinguish single characters versus strings in the way that C does, these -are stored as single-character strings. It is a tradeoff of efficiency over -memory. - -=item RPM_INT8_TYPE - -All items are integers no larger than 8 bits wide. - -=item RPM_INT16_TYPE - -All items are integers no larger than 16 bits wide. - -=item RPM_INT32_TYPE - -All items are integers no larger than 32 bits wide. - -=item RPM_STRING_TYPE - -=item RPM_I18NSTRING_TYPE - -=item RPM_STRING_ARRAY_TYPE - -These three are functionally similar from the Perl perspective. Currently, -B does not export data in an I18N format, it will have been converted to -an ordinary string before being handed to the caller (in this case, before -the internal Perl/XS code receives it). The distinction between STRING and -STRING_ARRAY types is only relevant internally. All of these are sequences of -one or more text strings, returned in the same internal order as they are -stored within the header. - -=back - -=item NVR - -The commonly-needed data triple of (B, B, B) may be -accessed more directly by means of this method. It returns the three values -on the stack, saving the need for three separate fetches. - -=item cmpver(OTHER) - -Compare the version of the current header against that in the header -referenced by C<$other>. The argument should be an object reference, not -a tied-hash representation of a header. Returns -1, 0 or 1, based on the -established behavior of other comparison operators (C and C=E>); --1 indicates that the calling object is considered less, or older, than the -passed argument. A value of 1 indicates that the calling object is greater, -or newer, than the argument. A value of 0 indicates that they are equal. - -=item source_name - -If the B object is created directly from a file, FTP source -or HTTP source, then that source is kept for future reference and may be -retrieved using this accessor. This will be an empty string if the header -was retrieved from the RPM database, or was built in-memory from data. - -=back - -=head1 DIAGNOSTICS - -Direct binding to the internal error-management of B is still under -development. At present, most operations generate their diagnostics to -STDERR. - -=head1 CAVEATS - -This is currently regarded as alpha-quality software. The interface is -subject to change in future releases. - -=head1 SEE ALSO - -L, L, L, L, L - -=head1 AUTHOR - -Randy J. Ray - -=cut diff --git a/Perl-RPM/RPM/Header.xs b/Perl-RPM/RPM/Header.xs deleted file mode 100644 index cefef06..0000000 --- a/Perl-RPM/RPM/Header.xs +++ /dev/null @@ -1,1422 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include "RPM.h" - -#ifndef RPMERR_READERROR -# define RPMERR_READERROR RPMERR_READ -#endif - -static char * const rcsid = "$Id: Header.xs,v 1.26 2002/05/10 07:37:08 rjray Exp $"; -static int scalar_tag(pTHX_ SV *, int); - -/* - Use this define for deriving the saved Header struct, rather than coding - it a dozen places. -*/ -#define header_from_object_ret(header, object, err_ret) \ - { \ - MAGIC* mg = mg_find((SV *)(object), '~'); \ - if (mg) \ - (header) = (RPM_Header *)SvIV(mg->mg_obj); \ - else \ - return (err_ret); \ - } -/* And a no-return version: */ -#define header_from_object(header, object) \ - { \ - MAGIC* mg = mg_find((SV *)(object), '~'); \ - if (mg) \ - (header) = (RPM_Header *)SvIV(mg->mg_obj); \ - else \ - (header) = Null(RPM_Header *); \ - } - -/* Any constants that are specific to the RPM::Header class will be exported - from here, via this C-level constant() routine */ -static int constant(pTHX_ char *name) -{ - errno = 0; - - if (strncmp((const char *)name, "RPM_HEADER_", 11)) - { - errno = ENOENT; - return 0; - } - else - { - name += 11; - switch (*name) - { - case 'M': - if (strEQ(name, "MASK")) -#ifdef RPM_HEADER_MASK - return RPM_HEADER_MASK; -#endif - case 'R': - if (strEQ(name, "READONLY")) -#ifdef RPM_HEADER_READONLY - return RPM_HEADER_READONLY; -#endif - default: - errno = EINVAL; - return 0; - } - } -} - -/* Some simple functions to manage key-to-SV* transactions, since these - gets used frequently. */ -const char* sv2key(pTHX_ SV* key) -{ - const char* new_key; - - /* De-reference key, if it is a reference */ - if (SvROK(key)) - key = SvRV(key); - new_key = SvPV(key, PL_na); - - return new_key; -} - -SV* key2sv(pTHX_ const char* key) -{ - return (sv_2mortal(newSVpv((char *)key, PL_na))); -} - -/* This creates a header data-field from the passed-in data */ -static SV* rpmhdr_create(pTHX_ const char* data, int type, int size, - int scalar) -{ - char urk[2]; - AV* new_list; - SV* new_item; - int idx; - - new_list = newAV(); - - /* - Bad enough to have to duplicate the loop for all the case branches, I - can at least bitch out on two of them: - */ - if (type == RPM_NULL_TYPE) - { - return newSVsv(&PL_sv_undef); - } - else if (type == RPM_BIN_TYPE) - { - /* This differs from other types in that here size is the length of - the binary chunk itself */ - av_store(new_list, 0, newSVpv((char *)data, size)); - } - else - { - /* There will be at least this many items: */ - av_extend(new_list, size); - - switch (type) - { - case RPM_CHAR_TYPE: - { - char* loop; - - for (loop = (char *)data, idx = 0; idx < size; idx++, loop++) - { - urk[0] = *data; - urk[1] = '\0'; - sv_setpvn(*av_fetch(new_list, idx, TRUE), (char *)urk, 1); - } - - break; - } - case RPM_INT8_TYPE: - { - I8* loop; - - for (loop = (I8 *)data, idx = 0; idx < size; idx++, loop++) - { - /* Note that the rpm lib also uses masks for INT8 */ - sv_setiv(*av_fetch(new_list, idx, TRUE), - (I32)(*((I8 *)loop) & 0xff)); - } - - break; - } - case RPM_INT16_TYPE: - { - I16* loop; - - for (loop = (I16 *)data, idx = 0; idx < size; idx++, loop++) - { - /* Note that the rpm lib also uses masks for INT16 */ - sv_setiv(*av_fetch(new_list, idx, TRUE), - (I32)(*((I16 *)loop) & 0xffff)); - } - - break; - } - case RPM_INT32_TYPE: - { - I32* loop; - - for (loop = (I32 *)data, idx = 0; idx < size; idx++, loop++) - { - sv_setiv(*av_fetch(new_list, idx, TRUE), - (I32)*((I32 *)loop)); - } - - break; - } - case RPM_STRING_TYPE: - case RPM_I18NSTRING_TYPE: - case RPM_STRING_ARRAY_TYPE: - { - char** loop; - - /* Special case for exactly one RPM_STRING_TYPE */ - if (type == RPM_STRING_TYPE && size == 1) - sv_setpv(*av_fetch(new_list, 0, TRUE), data); - else - { - for (loop = (char **)data, idx = 0; - idx < size; - idx++, loop++) - { - sv_setpvn(*av_fetch(new_list, idx, TRUE), - *loop, strlen(*loop)); - } - - /* Only for STRING_ARRAY_TYPE do we have to call free() */ - if (type == RPM_STRING_ARRAY_TYPE) Safefree(data); - } - - break; - } - default: - rpm_error(aTHX_ RPMERR_BADARG, "Unimplemented tag type"); - break; - } - } - - if (scalar) - { - new_item = newSVsv(*av_fetch(new_list, 0, FALSE)); - av_undef(new_list); - } - else - new_item = newRV_noinc((SV *)new_list); - - return new_item; -} - -/* These three are for reading the header data from external sources */ -static int new_from_fd_t(FD_t fd, RPM_Header* new_hdr) -{ - if (rpmReadPackageHeader(fd, &new_hdr->hdr, &new_hdr->isSource, - &new_hdr->major, &new_hdr->minor)) - { - /* Some cases of this failing, rpmError was already called. But not - all cases, unfortunately. So check the IV part of rpm_errSV */ - if (! SvIV(rpm_errSV)) - rpm_error(aTHX_ RPMERR_READERROR, "Error reading package header"); - return 0; - } - - return 1; -} - -static int new_from_fd(int fd, RPM_Header* new_hdr) -{ - FD_t FD = fdDup(fd); - - return(new_from_fd_t(FD, new_hdr)); -} - -static int new_from_fname(pTHX_ const char* source, RPM_Header* new_hdr) -{ - FD_t fd; - int retval; - - if (! (fd = Fopen(source, "r"))) - { - char errmsg[256]; - - snprintf(errmsg, 256, "Unable to open file %s", source); - rpm_error(aTHX_ RPMERR_BADFILENAME, errmsg); - return 0; - } - - if ((retval = new_from_fd_t(fd, new_hdr))) - { - Fclose(fd); - New(0, new_hdr->source_name, strlen(source) + 1, char); - strcpy(new_hdr->source_name, source); - } - - return retval; -} - -RPM__Header rpmhdr_TIEHASH(pTHX_ char* class, SV* source, int flags) -{ - char* fname; - int fname_len; - RPM__Header RETVAL; - RPM_Header* retvalp; /* Use this to store the actual C-level data */ - SV* t_magic; - - Newz(0, retvalp, 1, RPM_Header); - RETVAL = Nullhv; - - if (! source) - retvalp->hdr = headerNew(); - else if (! (flags & RPM_HEADER_FROM_REF)) - { - /* If we aren't starting out with a pointer to a Header - struct, figure out how to get there from here */ - - /* If it is a string value, assume it to be a file name */ - if (SvPOK(source)) - { - fname = SvPV(source, fname_len); - if (! new_from_fname(aTHX_ fname, retvalp)) - { - return RETVAL; - } - } - else if (IoIFP(sv_2io(source))) - { - if (! new_from_fd(PerlIO_fileno(IoIFP(sv_2io(source))), - retvalp)) - { - return RETVAL; - } - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - "Argument 2 must be filename or GLOB"); - return RETVAL; - } - } - else - { - retvalp->hdr = (Header)SvIV(source); - /* We simply don't know these three settings at this point */ - retvalp->isSource = 0; - retvalp->major = 0; - retvalp->minor = 0; - } - - /* These three are likely to be most of the data requests, anyway */ - headerNVR(retvalp->hdr, - &retvalp->name, &retvalp->version, &retvalp->release); - /* This defaults to false, but RPM::Database will set it true */ - retvalp->read_only = flags & RPM_HEADER_READONLY; - - retvalp->iterator = (HeaderIterator)NULL; - - retvalp->storage = newHV(); - RETVAL = newHV(); - t_magic = newSViv((unsigned)retvalp); - /* With the actual HV*, store the type-keys for the three cached values: */ - hv_store(retvalp->storage, - "NAME_t", 7, newSViv(RPM_STRING_TYPE), FALSE); - hv_store(retvalp->storage, - "VERSION_t", 10, newSViv(RPM_STRING_TYPE), FALSE); - hv_store(retvalp->storage, - "RELEASE_t", 10, newSViv(RPM_STRING_TYPE), FALSE); - - sv_magic((SV *)RETVAL, Nullsv, 'P', Nullch, 0); - sv_magic((SV *)RETVAL, t_magic, '~', Nullch, 0); - SvREFCNT_dec(t_magic); - - return RETVAL; -} - -SV* rpmhdr_FETCH(pTHX_ RPM__Header self, SV* key, - const char* data_in, int type_in, int size_in) -{ - const char* name; /* For the actual name out of (SV *)key */ - int namelen; /* Arg for SvPV(..., len) */ - char* uc_name; /* UC'd version of name */ - RPM_Header* hdr; /* Pointer to C-level struct */ - SV** svp; - SV* FETCH; - int i, tag_by_num; - char errmsg[256]; - - FETCH = newSVsv(&PL_sv_undef); - - struct_from_object_ret(RPM_Header, hdr, self, FETCH); - - name = sv2key(aTHX_ key); - if (! (name && (namelen = strlen(name)))) - return FETCH; - - New(0, uc_name, namelen+3, char); - for (i = 0; i < namelen; i++) - uc_name[i] = toUPPER(name[i]); - uc_name[i] = '\0'; - - /* Get the #define value for the tag from the hash made at boot */ - if (! (tag_by_num = tag2num(aTHX_ uc_name))) - { - snprintf(errmsg, 256, "RPM::Header::FETCH: unknown tag '%s'", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - Safefree(uc_name); - return FETCH; - } - - /* Check the three keys that are cached directly on the struct itself: */ - if (! strcmp(uc_name, "NAME")) - FETCH = newSVpv((char *)hdr->name, 0); - else if (! strcmp(uc_name, "VERSION")) - FETCH = newSVpv((char *)hdr->version, 0); - else if (! strcmp(uc_name, "RELEASE")) - FETCH = newSVpv((char *)hdr->release, 0); - else - { - /* If it wasn't one of those three, then we have to explicitly fetch - it, either from the store in cache or via the headerGetEntry call */ - svp = hv_fetch(hdr->storage, uc_name, namelen, FALSE); - if (svp && SvOK(*svp)) - { - FETCH = newSVsv(*svp); - } - else if (data_in) - { - /* In some cases (particarly the iterators) we could be called - with the data already available, but not hashed just yet. */ - FETCH = rpmhdr_create(aTHX_ data_in, type_in, size_in, - scalar_tag(aTHX_ Nullsv, tag_by_num)); - - hv_store(hdr->storage, uc_name, namelen, FETCH, FALSE); - hv_store(hdr->storage, strcat(uc_name, "_t"), (namelen + 2), - newSViv(type_in), FALSE); - } - else - { - char* new_item_p; - int new_item_type; - int size; - - /* Pull the tag by the int value we now have */ - if (! headerGetEntry(hdr->hdr, tag_by_num, - &new_item_type, (void **)&new_item_p, &size)) - { - snprintf(errmsg, 256, - "RPM::Header::FETCH: no tag '%s' in header", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - Safefree(uc_name); - return FETCH; - } - FETCH = rpmhdr_create(aTHX_ new_item_p, new_item_type, size, - scalar_tag(aTHX_ Nullsv, tag_by_num)); - - hv_store(hdr->storage, uc_name, namelen, FETCH, FALSE); - hv_store(hdr->storage, strcat(uc_name, "_t"), (namelen + 2), - newSViv(new_item_type), FALSE); - /* For some reason, I don't seem to need this next line in the - block above (the data_in branch) */ - FETCH = newSVsv(FETCH); - } - } - - Safefree(uc_name); - return FETCH; -} - -/* - Store the data in "value" both in the header and in the hash associated - with "self". -*/ -int rpmhdr_STORE(pTHX_ RPM__Header self, SV* key, SV* value) -{ - SV** svp; - const char* name; - char* uc_name; - char errmsg[256]; - STRLEN namelen; - int size, i, is_scalar; - I32 num_ent, data_type; - void* data; - AV* a_value = Nullav; - RPM_Header* hdr; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - if (hdr->read_only) - return 0; - - name = sv2key(aTHX_ key); - if (! (name && (namelen = strlen(name)))) - return 0; - - New(0, uc_name, namelen+3, char); - for (i = 0; i < namelen; i++) - uc_name[i] = toUPPER(name[i]); - uc_name[i] = '\0'; - - /* Get the numerical tag value for this name. If none exists, this means - that there is no such tag, which is an error in this case */ - if (! (num_ent = tag2num(aTHX_ uc_name))) - { - snprintf(errmsg, 256, "RPM::Header::STORE: No such tag '%s'", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - return 0; - } - is_scalar = scalar_tag(aTHX_ Nullsv, num_ent); - if (SvROK(value)) - { - /* - This is complicated. We have to allow for straight-in AV*, or a - single-pair HV* that provides the type indexing the data. Then - we get to decide if the data part needs to be promoted to an AV*. - */ - if (SvTYPE(SvRV(value)) == SVt_PVHV) - { - HE* iter; - SV* key; - SV* new_value; - HV* hv_value = (HV *)SvRV(value); - - /* There should be exactly one key */ - if (hv_iterinit(hv_value) != 1) - { - snprintf(errmsg, 256, - "RPM::Header::STORE: Hash reference passed in for " - "tag '%s' has invalid content", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - return 0; - } - iter = hv_iternext(hv_value); - key = HeSVKEY(iter); - new_value = HeVAL(iter); - if (! (SvIOK(key) && (data_type = SvIV(key)))) - { - snprintf(errmsg, 256, - "RPM::Header::STORE: Hash reference key passed in " - "for tag '%s' is invalid", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - return 0; - } - /* Clear this for later sanity-check */ - value = Nullsv; - /* Now let's look at new_value */ - if (SvROK(new_value)) - { - if (SvTYPE(SvRV(new_value)) == SVt_PVAV) - a_value = (AV *)SvRV(new_value); - else - /* Hope for the best... */ - value = SvRV(new_value); - } - else - value = new_value; - } - else if (SvTYPE(SvRV(value)) == SVt_PVAV) - { - /* - If they passed a straight-through AV*, de-ref it and mark type - to be filled in later - */ - a_value = (AV *)SvRV(value); - /* A size of 0 means this is an attempt at autovivification... */ - if (av_len(a_value) == -1) - /* ...which isn't allowed here. Nip it before it starts. */ - return 0; - data_type = -1; - value = Nullsv; - } - else - { - /* De-reference it and hope it passes muster as a scalar */ - value = SvRV(value); - } - } - - /* The only way value will still be set is if nothing else matched */ - if (value != Nullsv) - { - /* - The case-block below is already set up to handle data in a manner - transparent to the quantity or type. We can fake this with a_value - and not worry again until actually storing on the hash table for - self. - */ - a_value = newAV(); - av_store(a_value, 0, value); - /* Mark type for later setting */ - data_type = -1; - } - size = av_len(a_value) + 1; - - /* - Setting/STORE-ing means do the following: - - 1. Confirm that data adheres to type (mostly check against int types) - 2. Create the blob in **data (based on is_scalar) - 3. Store to the header struct - 4. Store the SV* on the hash - */ - - if (data_type == -1) - { - /* This will permanently concat "_t" to uc_name. But we'll craftily - manipulate that later on with namelen. */ - svp = hv_fetch(hdr->storage, strcat(uc_name, "_t"), (namelen + 2), - FALSE); - if (! (svp && SvOK(*svp))) - { - /* - If NAME_t does not exist, then this has not been fetched - previously, and worse, we don't really know what the type is - supposed to be. So we state in the docs that the default is - RPM_STRING_TYPE. - */ - data_type = RPM_STRING_TYPE; - } - else - { - data_type = SvIV(*svp); - SvREFCNT_dec(*svp); - } - } - - if (data_type == RPM_INT8_TYPE || - data_type == RPM_INT16_TYPE || - data_type == RPM_INT32_TYPE) - { - /* Cycle over the array and verify that all elements are valid IVs */ - for (i = 0; i < size; i++) - { - svp = av_fetch(a_value, i, FALSE); - if (! (SvOK(*svp) && SvIOK(*svp))) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Header::STORE: Non-integer value passed for " - "integer-type tag"); - return 0; - } - } - } - - /* - This is more like the rpmhdr_create case block, where we have to - discern based on data-type, so that the pointers are properly - allocated and assigned. - */ - switch (data_type) - { - case RPM_NULL_TYPE: - size = 1; - data = NULL; - break; - case RPM_BIN_TYPE: - { - char* data_p; - - svp = av_fetch(a_value, 0, FALSE); - if (svp && SvPOK(*svp)) - data_p = SvPV(*svp, size); - else - { - size = 0; - data_p = Nullch; - } - - data = (void *)data_p; - break; - } - case RPM_CHAR_TYPE: - { - char* data_p; - char* str_sv; - STRLEN len; - - Newz(TRUE, data_p, size, char); - for (i = 0; i < size; i++) - { - /* Having stored the chars in separate SVs wasn't the most - efficient way, but it made the rest of things a lot - cleaner. To be safe, only take the initial character from - each SV. */ - svp = av_fetch(a_value, i, FALSE); - if (svp && SvPOK(*svp)) - { - str_sv = SvPV(*svp, len); - data_p[i] = str_sv[0]; - } - else - data_p[i] = '\0'; - } - - data = (void *)data_p; - break; - } - case RPM_INT8_TYPE: - { - I8** data_p; - - Newz(TRUE, data_p, size, I8*); - - for (i = 0; i < size; i++) - { - svp = av_fetch(a_value, i, FALSE); - if (svp && SvIOK(*svp)) - *(data_p[i]) = (I8)SvIV(*svp); - else - *(data_p[i]) = (I8)0; - } - - data = (void *)data_p; - break; - } - case RPM_INT16_TYPE: - { - I16** data_p; - - Newz(TRUE, data_p, size, I16*); - - for (i = 0; i < size; i++) - { - svp = av_fetch(a_value, i, FALSE); - if (svp && SvIOK(*svp)) - *(data_p[i]) = (I16)SvIV(*svp); - else - *(data_p[i]) = (I16)0; - } - - data = (void *)data_p; - break; - } - case RPM_INT32_TYPE: - { - I32** data_p; - - Newz(TRUE, data_p, size, I32*); - - for (i = 0; i < size; i++) - { - svp = av_fetch(a_value, i, FALSE); - if (svp && SvIOK(*svp)) - *(data_p[i]) = SvIV(*svp); - else - *(data_p[i]) = 0; - } - - data = (void *)data_p; - break; - } - case RPM_STRING_TYPE: - case RPM_I18NSTRING_TYPE: - case RPM_STRING_ARRAY_TYPE: - { - char** data_p; - char* str_sv; - char* str_new; - SV* cloned; - STRLEN len; - - if (data_type == RPM_STRING_TYPE && size == 1) - { - /* Special case for exactly one RPM_STRING_TYPE */ - svp = av_fetch(a_value, 0, FALSE); - if (svp) - { - if (SvPOK(*svp)) - cloned = *svp; - else - cloned = sv_mortalcopy(*svp); - str_sv = SvPV(cloned, len); - New(0, str_new, len+1, char); - strncpy(str_new, str_sv, len + 1); - } - else - str_new = Nullch; - - data = (void **)str_new; - } - else - { - Newz(TRUE, data_p, size, char*); - - for (i = 0; i < size; i++) - { - svp = av_fetch(a_value, i, FALSE); - if (svp) - { - if (SvPOK(*svp)) - cloned = *svp; - else - cloned = sv_mortalcopy(*svp); - str_sv = SvPV(*svp, len); - New(0, str_new, len+1, char); - strncpy(str_new, str_sv, len + 1); - data_p[i] = str_new; - } - else - data_p[i] = Nullch; - } - - data = (void *)data_p; - } - break; - } - default: - rpm_error(aTHX_ RPMERR_BADARG, "Unimplemented tag type"); - break; - } - /* That was fun. I always enjoy delving into the black magic of void *. */ - - /* Remove any pre-existing tag */ - headerRemoveEntry(hdr->hdr, num_ent); /* Don't care if it fails? */ - /* Store the new data */ - headerAddEntry(hdr->hdr, num_ent, data_type, data, size); - /* Store on the hash */ - hv_store(hdr->storage, uc_name, namelen, - (is_scalar) ? newSVsv(value) : newRV_noinc((SV *)a_value), - FALSE); - - return 1; -} - -int rpmhdr_DELETE(pTHX_ RPM__Header self, SV* key) -{ - const char* name; /* For the actual name out of (SV *)key */ - int namelen; /* Arg for SvPV(..., len) */ - char* uc_name; /* UC'd version of name */ - RPM_Header* hdr; /* Pointer to C-level struct */ - int retval, num, i; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - if (hdr->read_only) - return 0; - - name = sv2key(aTHX_ key); - if (! (name && (namelen = strlen(name)))) - return 0; - - New(0, uc_name, namelen+3, char); - for (i = 0; i < namelen; i++) - uc_name[i] = toUPPER(name[i]); - uc_name[i] = '\0'; - - /* Get the numerical tag value for this name. If none exists, this means - that there is no such tag, which isn't really an error (so return 1). */ - if (! (num = tag2num(aTHX_ uc_name))) - { - retval = 1; - } - /* - Deletion means three steps: - - 1. rpmlib-level deletion - 2. Delete the key from self - 3. Delete the KEY_t from self - */ - - /* First off, if there were no entries of this tag, no need to do 2 or 3 */ - else if (headerRemoveEntry(hdr->hdr, num)) - { - retval = 1; - } - else - { - hv_delete(hdr->storage, uc_name, namelen, G_DISCARD); - hv_delete(hdr->storage, strcat(uc_name, "_t"), namelen + 2, G_DISCARD); - retval = 1; - } - - Safefree(uc_name); - return retval; -} - -bool rpmhdr_EXISTS(pTHX_ RPM__Header self, SV* key) -{ - const char* name; - char* uc_name; - int namelen, tag_by_num, i; - RPM_Header* hdr; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - name = sv2key(aTHX_ key); - if (! (name && (namelen = strlen(name)))) - return 0; - - /* Unlike FETCH, there will be no need for the KEY_t string */ - New(0, uc_name, namelen+1, char); - for (i = 0; i < namelen; i++) - uc_name[i] = toUPPER(name[i]); - uc_name[i] = '\0'; - - /* Get the #define value for the tag from the hash made at boot-up */ - tag_by_num = tag2num(aTHX_ uc_name); - Safefree(uc_name); - if (! tag_by_num) - { - char errmsg[256]; - - snprintf(errmsg, 256, - "RPM::Header::EXISTS: unknown (to rpm) tag %s", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - Safefree(uc_name); - return 0; - } - - return (headerIsEntry(hdr->hdr, tag_by_num)); -} - -int rpmhdr_FIRSTKEY(pTHX_ RPM__Header self, SV** key, SV** value) -{ - RPM_Header* hdr; - int tag, type, size; - char* ptr; - const char* tagname; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - /* If there is an existing iterator attached to the struct, free it */ - if (hdr->iterator) - headerFreeIterator(hdr->iterator); - - /* The init function returns the iterator that is used in later calls */ - if (! (hdr->iterator = headerInitIterator(hdr->hdr))) - /* need some error message? */ - return 0; - - /* Run once to get started */ - headerNextIterator(hdr->iterator, Null(int *), Null(int *), - Null(const void **), Null(int *)); - while (1) - { - /* Run it to get the header entry */ - if (! headerNextIterator(hdr->iterator, &tag, &type, - (const void **)&ptr, &size)) - return 0; - - tagname = num2tag(aTHX_ tag); - /* If the one we've just gotten is null, loop */ - if (tagname != Nullch) - break; - } - - *key = newSVpv((char *)tagname, strlen(tagname)); - *value = rpmhdr_FETCH(aTHX_ self, *key, ptr, type, size); - - return 1; -} - -int rpmhdr_NEXTKEY(pTHX_ RPM__Header self, SV* key, - SV** nextkey, SV** nextvalue) -{ - RPM_Header* hdr; - int tag, type, size; - char* ptr; - const char* tagname; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - /* If there is not an existing iterator, we can't continue */ - if (! hdr->iterator) - return 0; - - /* Iterate here, since there are internal tags that may be present for - which we don't want to expose to the user. */ - while (1) - { - /* Run it once, to get the next header entry */ - if (! headerNextIterator(hdr->iterator, &tag, &type, - (const void **)&ptr, &size)) - /* Last tag. Inform perl that iteration is over. */ - return 0; - - tagname = num2tag(aTHX_ tag); - /* This means that any time num2tag couldn't map it, we iterate */ - if (tagname != Nullch) - break; - } - - *nextkey = newSVpv((char *)tagname, strlen(tagname)); - *nextvalue = rpmhdr_FETCH(aTHX_ self, *nextkey, ptr, type, size); - - return 1; -} - -void rpmhdr_DESTROY(pTHX_ RPM__Header self) -{ - RPM_Header* hdr; - - struct_from_object(RPM_Header, hdr, self); - if (! hdr) return; - - if (hdr->iterator) - headerFreeIterator(hdr->iterator); - if (hdr->hdr) - headerFree(hdr->hdr); - - hv_undef(hdr->storage); - if (hdr->source_name) - Safefree(hdr->source_name); - Safefree(hdr); - hv_undef(self); -} - -unsigned int rpmhdr_size(pTHX_ RPM__Header self) -{ - RPM_Header* hdr; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - - if (! hdr->hdr) - return 0; - else - return(headerSizeof(hdr->hdr, HEADER_MAGIC_YES)); -} - -int rpmhdr_tagtype(pTHX_ RPM__Header self, SV* key) -{ - STRLEN namelen; - const char* name; - char* uc_name; - SV** svp; - int i, retval; - RPM_Header* hdr; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - - name = sv2key(aTHX_ key); - if (! (name && (namelen = strlen(name)))) - return RPM_NULL_TYPE; - - New(0, uc_name, namelen+3, char); - for (i = 0; i < namelen; i++) - uc_name[i] = toUPPER(name[i]); - uc_name[i] = '\0'; - strcat(uc_name, "_t"); - - retval = RPM_NULL_TYPE; - - svp = hv_fetch(hdr->storage, uc_name, strlen(uc_name), FALSE); - if (svp && SvOK(*svp)) - { - /* The base tag has already been fetched and thus we have a type */ - retval = SvIV(*svp); - } - else - { - /* We haven't had to fetch the tag itself yet. Until then, the special - key that holds the type isn't available, either. */ - - /* Do a plain fetch (that is, leave magic on) to populate the other */ - SV* sub_fetch = rpmhdr_FETCH(aTHX_ self, key, Nullch, 0, 0); - - if (sub_fetch) - { - svp = hv_fetch(hdr->storage, uc_name, strlen(uc_name), FALSE); - if (svp && SvOK(*svp)) - { - /* The base tag has now been fetched */ - retval = SvIV(*svp); - } - SvREFCNT_dec(*svp); - SvREFCNT_dec(sub_fetch); - } - } - - Safefree(uc_name); - return retval; -} - -int rpmhdr_write(pTHX_ RPM__Header self, SV* gv_in, int magicp) -{ - IO* io; - PerlIO* fp; - FD_t fd; - RPM_Header* hdr; - GV* gv; - int written = 0; - - gv = (SvPOK(gv_in) && (SvTYPE(gv_in) == SVt_PVGV)) ? - (GV *)SvRV(gv_in) : (GV *)gv_in; - struct_from_object_ret(RPM_Header, hdr, self, 0); - - if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) - return written; - - fd = fdDup(PerlIO_fileno(fp)); - headerWrite(fd, hdr->hdr, magicp); - Fclose(fd); - written = headerSizeof(hdr->hdr, magicp); - - return written; -} - -/* T/F test whether the header references a SRPM */ -int rpmhdr_is_source(pTHX_ RPM__Header self) -{ - RPM_Header* hdr; - - struct_from_object_ret(RPM_Header, hdr, self, 0); - - if (! hdr->hdr) - return 0; - else - return (hdr->isSource); -} - -/* - A classic-style comparison function for two headers, returns -1 if a < b, - 1 if a > b, and 0 if a == b. In terms of version/release, that is. -*/ -int rpmhdr_cmpver(pTHX_ RPM__Header self, RPM__Header other) -{ - RPM_Header* one; - RPM_Header* two; - - struct_from_object(RPM_Header, one, self); - if (! one) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Header::rpmhdr_cmpver: Arg 1 has no header data"); - return 0; - } - struct_from_object(RPM_Header, two, other); - if (! two) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Header::rpmhdr_cmpver: Arg 2 has no header data"); - return 0; - } - - return rpmVersionCompare(one->hdr, two->hdr); -} - -/* - If the header object was read from a specific source (file, ftp, http), then - a copy of that location was kept for future reference. Now reference it. -*/ -char* rpmhdr_source_name(RPM__Header self) -{ - RPM_Header* hdr; - - struct_from_object(RPM_Header, hdr, self); - - return hdr->source_name; -} - -/* - A matter-of-convenience function that tells whether the passed-in tag is - one that returns a scalar (yields a true return value) or one that returns - an array reference (yields a false value). -*/ -static int scalar_tag(pTHX_ SV* self, int tag_value) -{ - /* self is passed in as SV*, and unused, because this is a class method */ - switch (tag_value) - { - case RPMTAG_ARCH: - case RPMTAG_ARCHIVESIZE: - case RPMTAG_BUILDHOST: - case RPMTAG_BUILDROOT: - case RPMTAG_BUILDTIME: - case RPMTAG_COOKIE: - case RPMTAG_DESCRIPTION: - case RPMTAG_DISTRIBUTION: - case RPMTAG_EPOCH: - case RPMTAG_EXCLUDEARCH: - case RPMTAG_EXCLUDEOS: - case RPMTAG_EXCLUSIVEARCH: - case RPMTAG_EXCLUSIVEOS: - case RPMTAG_GIF: - case RPMTAG_GROUP: - case RPMTAG_ICON: - case RPMTAG_INSTALLTIME: - case RPMTAG_LICENSE: - case RPMTAG_NAME: - case RPMTAG_OS: - case RPMTAG_PACKAGER: - case RPMTAG_RELEASE: - case RPMTAG_RPMVERSION: - case RPMTAG_SIZE: - case RPMTAG_SOURCERPM: - case RPMTAG_SUMMARY: - case RPMTAG_URL: - case RPMTAG_VENDOR: - case RPMTAG_VERSION: - case RPMTAG_XPM: - return 1; - /* not reached */ - break; - default: - return 0; - /* not reached */ - break; - } - /* not reached */ -} - - -MODULE = RPM::Header PACKAGE = RPM::Header PREFIX = rpmhdr_ - - -RPM::Header -rpmhdr_TIEHASH(class, source=NULL, flags=0) - char* class; - SV* source; - int flags; - PROTOTYPE: $;$$ - CODE: - RETVAL = rpmhdr_TIEHASH(aTHX_ class, source, flags); - OUTPUT: - RETVAL - -SV* -rpmhdr_FETCH(self, key) - RPM::Header self; - SV* key; - PROTOTYPE: $$ - CODE: - RETVAL = rpmhdr_FETCH(aTHX_ self, key, Nullch, 0, 0); - OUTPUT: - RETVAL - -int -rpmhdr_STORE(self, key, value) - RPM::Header self; - SV* key; - SV* value; - PROTOTYPE: $$$ - CODE: - RETVAL = rpmhdr_STORE(aTHX_ self, key, value); - OUTPUT: - RETVAL - -int -rpmhdr_DELETE(self, key) - RPM::Header self; - SV* key; - PROTOTYPE: $$ - CODE: - RETVAL = rpmhdr_DELETE(aTHX_ self, key); - OUTPUT: - RETVAL - -int -rpmhdr_CLEAR(self=NULL) - SV* self; - PROTOTYPE: $ - CODE: - { - rpm_error(aTHX_ RPMERR_NOCREATEDB, "CLEAR: operation not permitted"); - RETVAL = 0; - } - OUTPUT: - RETVAL - -bool -rpmhdr_EXISTS(self, key) - RPM::Header self; - SV* key; - PROTOTYPE: $$ - CODE: - RETVAL = rpmhdr_EXISTS(aTHX_ self, key); - OUTPUT: - RETVAL - -void -rpmhdr_FIRSTKEY(self) - RPM::Header self; - PROTOTYPE: $ - PPCODE: - { - SV* key; - SV* value; - - if (! rpmhdr_FIRSTKEY(aTHX_ self, &key, &value)) - { - key = newSVsv(&PL_sv_undef); - value = newSVsv(&PL_sv_undef); - } - - XPUSHs(sv_2mortal(newSVsv(value))); - XPUSHs(sv_2mortal(newSVsv(key))); - } - -void -rpmhdr_NEXTKEY(self, key=NULL) - RPM::Header self; - SV* key; - PROTOTYPE: $;$ - PPCODE: - { - SV* nextkey; - SV* nextvalue; - - if (! rpmhdr_NEXTKEY(aTHX_ self, key, &nextkey, &nextvalue)) - { - nextkey = newSVsv(&PL_sv_undef); - nextvalue = newSVsv(&PL_sv_undef); - } - - XPUSHs(sv_2mortal(newSVsv(nextvalue))); - XPUSHs(sv_2mortal(newSVsv(nextkey))); - } - -void -rpmhdr_DESTROY(self) - RPM::Header self; - PROTOTYPE: $ - CODE: - rpmhdr_DESTROY(aTHX_ self); - -unsigned int -rpmhdr_size(self) - RPM::Header self; - PROTOTYPE: $ - CODE: - RETVAL = rpmhdr_size(aTHX_ self); - OUTPUT: - RETVAL - -int -rpmhdr_tagtype(self, key) - RPM::Header self; - SV* key; - PROTOTYPE: $$ - CODE: - RETVAL = rpmhdr_tagtype(aTHX_ self, key); - OUTPUT: - RETVAL - -int -rpmhdr_write(self, gv, magicp=0) - RPM::Header self; - SV* gv; - SV* magicp; - PROTOTYPE: $$;$ - CODE: - { - int flag; - - if (magicp && SvIOK(magicp)) - flag = SvIV(magicp); - else - flag = HEADER_MAGIC_YES; - - RETVAL = rpmhdr_write(aTHX_ self, gv, flag); - } - OUTPUT: - RETVAL - -int -rpmhdr_is_source(self) - RPM::Header self; - PROTOTYPE: $ - CODE: - RETVAL = rpmhdr_is_source(aTHX_ self); - OUTPUT: - RETVAL - -int -rpmhdr_cmpver(self, other) - RPM::Header self; - RPM::Header other; - PROTOTYPE: $$ - CODE: - RETVAL = rpmhdr_cmpver(aTHX_ self, other); - OUTPUT: - RETVAL - -void -rpmhdr_NVR(self) - RPM::Header self; - PROTOTYPE: $ - PPCODE: - { - RPM_Header* hdr; - - struct_from_object(RPM_Header, hdr, self); - - if (hdr->name) - { - XPUSHs(sv_2mortal(newSVpv((char *)hdr->name, 0))); - XPUSHs(sv_2mortal(newSVpv((char *)hdr->version, 0))); - XPUSHs(sv_2mortal(newSVpv((char *)hdr->release, 0))); - } - } - -int -rpmhdr_scalar_tag(self, tag) - SV* self; - SV* tag; - PROTOTYPE: $$ - CODE: - int tag_value; - - if (SvPOK(tag)) - { - const char* name; - int i, namelen; - char* uc_name; - - /* - A matter of explanation: - - By doing this bit here, I can let the real scalar_tag take an - integer argument directly. That means I can call it all over the - place in here, without the overhead of the SV-to-int conversion - below. Only use from outside of the XS code pays that penalty. - */ - name = sv2key(aTHX_ tag); - if (! (name && (namelen = strlen(name)))) - RETVAL = 0; - else - { - New(0, uc_name, namelen+1, char); - for (i = 0; i < namelen; i++) - uc_name[i] = toUPPER(name[i]); - uc_name[i] = '\0'; - if (! (tag_value = tag2num(aTHX_ uc_name))) - { - char errmsg[256]; - - snprintf(errmsg, 256, - "RPM::Header::scalar_tag: unknown tag %s", uc_name); - rpm_error(aTHX_ RPMERR_BADARG, errmsg); - Safefree(uc_name); - RETVAL = 0; - } - - RETVAL = scalar_tag(aTHX_ self, tag_value); - } - } - else if (SvIOK(tag)) - { - tag_value = SvIV(tag); - RETVAL = scalar_tag(aTHX_ self, tag_value); - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Header::scalar_tag: argument must be string or int"); - RETVAL = 0; - } - OUTPUT: - RETVAL - -char* -rpmhdr_source_name(self) - RPM::Header self; - PROTOTYPE: $ - CODE: - RETVAL = rpmhdr_source_name(self); - OUTPUT: - RETVAL - -int -constant(name) - char* name; - PROTOTYPE: $ - CODE: - RETVAL = constant(aTHX_ name); - OUTPUT: - RETVAL diff --git a/Perl-RPM/RPM/Package.pm b/Perl-RPM/RPM/Package.pm deleted file mode 100644 index 6db2205..0000000 --- a/Perl-RPM/RPM/Package.pm +++ /dev/null @@ -1,60 +0,0 @@ -############################################################################### -# -# This file copyright (c) 2000 by Randy J. Ray, all rights reserved -# -# Copying and distribution are permitted under the terms of the Artistic -# License as distributed with Perl versions 5.002 and later. -# -############################################################################### -# -# $Id: Package.pm,v 1.10 2001/04/27 09:05:21 rjray Exp $ -# -# Description: Perl-level glue and such for the RPM::Package class, the -# methods and accessors to package operations. -# -# Functions: AUTOLOAD -# -# Libraries: RPM -# -# Global Consts: $VERSION -# -# Environment: None. -# -############################################################################### - -package RPM::Package; - -use 5.005; -use strict; -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); -use subs qw(AUTOLOAD); - -require Exporter; - -use RPM; - -$VERSION = do { my @r=(q$Revision: 1.10 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -@ISA = qw(Exporter); -@EXPORT = (); -@EXPORT_OK = qw(RPM_PACKAGE_MASK RPM_PACKAGE_NOREAD RPM_PACKAGE_READONLY); -%EXPORT_TAGS = (all => \@EXPORT_OK); - -sub AUTOLOAD -{ - my $constname; - ($constname = $AUTOLOAD) =~ s/.*:://; - die "& not defined" if $constname eq 'constant'; - my $val = constant($constname); - if ($! != 0) - { - die "Your vendor has not defined RPM macro $constname"; - } - no strict 'refs'; - *$AUTOLOAD = sub { $val }; - goto &$AUTOLOAD; -} - -1; - -__END__ diff --git a/Perl-RPM/RPM/Package.xs b/Perl-RPM/RPM/Package.xs deleted file mode 100644 index 882bf61..0000000 --- a/Perl-RPM/RPM/Package.xs +++ /dev/null @@ -1,433 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include "RPM.h" - -static char * const rcsid = "$Id: Package.xs,v 1.6 2001/03/08 06:12:32 rjray Exp $"; - -/* Any constants that are specific to the RPM::Package class will be exported - from here, via this C-level constant() routine */ -static int constant(pTHX_ char *name) -{ - errno = 0; - - if (strncmp((const char *)name, "RPM_PACKAGE_", 12)) - { - errno = ENOENT; - return 0; - } - else - { - name += 12; - switch (*name) - { - case 'M': - if (strEQ(name, "MASK")) -#ifdef RPM_PACKAGE_MASK - return RPM_PACKAGE_MASK; -#else - goto not_found; -#endif - break; - case 'N': - if (strEQ(name, "NOREAD")) -#ifdef RPM_PACKAGE_NOREAD - return RPM_PACKAGE_NOREAD; -#else - goto not_found; -#endif - break; - case 'R': - if (strEQ(name, "READONLY")) -#ifdef RPM_PACKAGE_READONLY - return RPM_PACKAGE_READONLY; -#else - goto not_found; -#endif - break; - default: - errno = EINVAL; - return 0; - } - } - - not_found: - errno = EINVAL; - return 0; -} - -/* This is the class constructor for RPM::Package */ -RPM__Package rpmpkg_new(pTHX_ char* class, SV* source, int flags) -{ - char* fname; - int fname_len; - RPM__Package retval; - RPM__Header pkghdr; - - new_RPM__Package(retval); - if (! retval) { return retval; } - - if (source && SvROK(source) && (SvTYPE(SvRV(source)) == SVt_PVHV)) - { - /* This means a hashref of options was passed in for shortcuts' sake */ - SV** svp; - HV* options = (HV *)SvRV(source); - - svp = hv_fetch(options, "source", 7, FALSE); - if (SvOK(*svp)) - /* They specified a source in the hashref */ - source = sv_2mortal(*svp); - else - /* They, um, didn't */ - source = Nullsv; - - svp = hv_fetch(options, "callback", 9, FALSE); - if (SvOK(*svp)) - rpmpkg_set_callback(retval, sv_2mortal(*svp)); - - svp = hv_fetch(options, "flags", 6, FALSE); - if (SvOK(*svp) && SvIOK(*svp)) - flags = SvIV(sv_2mortal(*svp)); - } - - if (source && SvOK(source)) - { - /* Technically, at least one of these tests is a dupe, but necessary - * since source may have been re-assigned above. */ - if (SvROK(source)) - source = SvRV(source); - /* If it is a string value, assume it to be a file name */ - if (SvPOK(source)) - { - fname = SvPV(source, fname_len); - retval->path = safemalloc(fname_len + 1); - strncpy(retval->path, fname, fname_len); - retval->path[fname_len] = '\0'; - retval->header = rpmhdr_TIEHASH(aTHX_ Nullsv, source, - (flags & RPM_HEADER_MASK)); - if (! retval->header) - { - if (retval->callback) - SvREFCNT_dec((SV *)retval->callback); - safefree(retval); - return 0; - } - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - "Argument 2 must be a filename"); - if (retval->callback) - SvREFCNT_dec((SV *)retval->callback); - safefree(retval); - return 0; - } - } - else - { - /* Nothing valid in source means an empty object. Process flags. */ - if (flags & RPM_PACKAGE_READONLY) - retval->readonly = 1; - } - - return retval; -} - -void rpmpkg_DESTROY(pTHX_ RPM__Package self) -{ - /* Free/release the dynamic parts of the package structure */ - if (self->path) - safefree(self->path); - /* The Perl structures have their own clean-up methods that will kick in */ - - return; -} - -SV* rpmpkg_set_callback(pTHX_ RPM__Package self, SV* newcb) -{ - SV* oldcb; - - oldcb = (self->callback) ? - newRV((SV *)self->callback) : newSVsv(&PL_sv_undef); - - if (SvROK(newcb)) newcb = SvRV(newcb); - if (SvTYPE(newcb) == SVt_PVCV) - self->callback = (CV *)newcb; - else if (SvPOK(newcb)) - { - char* fn_name; - char* sv_name; - - sv_name = SvPV(newcb, PL_na); - if (! strstr(sv_name, "::")) - { - Newz(TRUE, fn_name, strlen(sv_name) + 7, char); - strncat(fn_name, "main::", 6); - strcat(fn_name + 6, sv_name); - } - else - fn_name = sv_name; - - self->callback = perl_get_cv(fn_name, FALSE); - } - else - { - self->callback = Nullcv; - } - - return oldcb; -} - -int rpmpkg_install(pTHX_ RPM__Package self) -{ -} - -int rpmpkg_uninstall(pTHX_ RPM__Package self) -{ -} - -int rpmpkg_verify(pTHX_ RPM__Package self) -{ -} - -SV* rpmpkg_size(pTHX_ RPM__Package self) -{ - SV* size; - - if (self->header) - size = rpmhdr_FETCH(self->header, newSVpv("SIZE", 5), - /* These are internal params */ Nullch, 0, 0); - else - size = newSVsv(&PL_sv_undef); - - return size; -} - -/* T/F test whether the package references a SRPM */ -int rpmpkg_is_source(pTHX_ RPM__Package self) -{ - return (self->header) ? (rpmhdr_is_source(aTHX_ self->header)) : 0; -} - -/* - A classic-style comparison function for two packages, returns -1 if a < b, - 1 if a > b, and 0 if a == b. In terms of version/release, that is. -*/ -int rpmpkg_cmpver_pkg(pTHX_ RPM__Package self, RPM__Package other) -{ - if (! ((self) && (self->header))) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Package::rpmpkg_cmpver: Arg 1 has no header data"); - return 0; - } - if (! ((other) && (other->header))) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Package::rpmpkg_cmpver: Arg 2 has no header data"); - return 0; - } - - return rpmhdr_cmpver(aTHX_ self->header, other->header); -} - -/* - This is essentially a duplicate of the above, to provide an interface- - polymorphic cmpver method to the user. This version takes a RPM::Header - object as arg 2. -*/ -int rpmpkg_cmpver_hdr(pTHX_ RPM__Package self, RPM__Header two) -{ - if (! ((self) && (self->header))) - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Package::rpmpkg_cmpver: Arg 1 has no header data"); - return 0; - } - - return rpmhdr_cmpver(aTHX_ self->header, two); -} - -/* - * This is where we catch all callback-ish events for packages, and translate - * them into a Perl-ized callback mechanism with (mostly) the same arguments - * and argument structure. - */ -static void* rpmpkg_callback_handler(const Header h, - const rpmCallbackType what, - const unsigned long amount, - const unsigned long total, - const void* pkg_key, - void* data) -{ - /* We couldn't declare the thread context in the prototype because we - don't control the calling context of this function. */ - dTHX; - RPM__Package self; /* This gets derived from "data" */ - SV* callback; /* So that we can more easily sanity-check it */ - - /* This is simple, but I'm planning ahead in case it gets more complex */ - self = (RPM__Package)data; - if (! (callback = (SV *)self->callback)) - return (void *)NULL; - - /* Set up the stack and the context */ - if (SvOK(callback) && (SvTYPE(callback) == SVt_PVCV)) - { - dSP; - ENTER; - SAVETMPS; - PUSHMARK(sp); - - /* Set up the args list */ - XPUSHs(sv_2mortal(sv_setref_pv(newSVsv(&PL_sv_undef), "RPM::Package", - (void *)self))); - XPUSHs(sv_2mortal(newSViv((I32)what))); - XPUSHs(sv_2mortal(newSViv(amount))); - XPUSHs(sv_2mortal(newSViv(total))); - XPUSHs(sv_2mortal(newSVpv((char *)pkg_key, 0))); - if (self->cb_data != Nullsv) - XPUSHs(sv_2mortal(newSVsv(self->cb_data))); - - /* Make the call */ - perl_call_sv((SV *)self->callback, G_DISCARD); - - /* More boilerplate */ - SPAGAIN; - PUTBACK; - FREETMPS; - LEAVE; - } - - return (void *)NULL; -} - - -MODULE = RPM::Package PACKAGE = RPM::Package PREFIX = rpmpkg_ - - -RPM::Package -rpmpkg_new(class, source=Nullsv, flags=0) - char* class; - SV* source; - int flags; - PROTOTYPE: $;$ - CODE: - RETVAL = rpmpkg_new(aTHX_ class, source, flags); - OUTPUT: - RETVAL - -void -rpmpkg_DESTROY(self) - RPM::Package self; - PROTOTYPE: $ - CODE: - rpmpkg_DESTROY(aTHX_ self); - -SV* -rpmpkg_set_callback(self, newcb) - RPM::Package self; - SV* newcb; - PROTOTYPE: $$ - CODE: - RETVAL = rpmpkg_set_callback(aTHX_ self, newcb); - OUTPUT: - RETVAL - -RPM::Header -rpmpkg_header(self) - RPM::Package self; - PROTOTYPE: $ - CODE: - RETVAL = self->header; - OUTPUT: - RETVAL - -int -rpmpkg_install(self, ...) - RPM::Package self; - PROTOTYPE: $@ - CODE: - RETVAL = rpmpkg_install(aTHX_ self); - OUTPUT: - RETVAL - -int -rpmpkg_uninstall(self, ...) - RPM::Package self; - PROTOTYPE: $@ - CODE: - RETVAL = rpmpkg_uninstall(aTHX_ self); - OUTPUT: - RETVAL - -int -rpmpkg_verify(self, ...) - RPM::Package self; - PROTOTYPE: $@ - CODE: - RETVAL = rpmpkg_verify(aTHX_ self); - OUTPUT: - RETVAL - -SV* -rpmpkg_size(self) - RPM::Package self; - PROTOTYPE: $ - CODE: - RETVAL = rpmpkg_size(aTHX_ self); - OUTPUT: - RETVAL - -int -rpmpkg_is_source(self) - RPM::Package self; - PROTOTYPE: $ - CODE: - RETVAL = rpmpkg_is_source(aTHX_ self); - OUTPUT: - RETVAL - -int -rpmpkg_cmpver(self, other) - RPM::Package self; - SV* other; - PROTOTYPE: $$ - PREINIT: - RPM__Package pkg2; - RPM__Header hdr2; - CODE: - { - if (sv_derived_from(other, "RPM::Package")) - { - IV tmp = SvIV((SV*)SvRV(other)); - pkg2 = (RPM__Package)tmp; - - RETVAL = rpmpkg_cmpver_pkg(aTHX_ self, pkg2); - } - else if (sv_derived_from(other, "RPM::Header")) - { - hdr2 = (RPM__Header)SvRV(other); - - RETVAL = rpmpkg_cmpver_hdr(aTHX_ self, hdr2); - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - "RPM::Package::cmpver: Arg 2 is not of a compatible " - "type (should be either RPM::Header or RPM::Package"); - RETVAL = 0; - } - } - OUTPUT: - RETVAL - -int -constant(name) - char* name; - PROTOTYPE: $ - CODE: - RETVAL = constant(aTHX_ name); - OUTPUT: - RETVAL diff --git a/Perl-RPM/RPM/Transaction.pm b/Perl-RPM/RPM/Transaction.pm deleted file mode 100644 index 8984bc0..0000000 --- a/Perl-RPM/RPM/Transaction.pm +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################### -# -# This file copyright (c) 2000 by Randy J. Ray, all rights reserved -# -# Copying and distribution are permitted under the terms of the Artistic -# License as distributed with Perl versions 5.002 and later. -# -############################################################################### -# -# $Id: Transaction.pm,v 1.8 2001/04/27 09:05:21 rjray Exp $ -# -# Description: Perl-level glue and such for the RPM::Transaction class, -# the methods and accessors to transaction operations. -# -# Functions: -# -# Libraries: RPM -# RPM::Header -# RPM::Package -# -# Global Consts: -# -# Environment: -# -############################################################################### - -package RPM::Package; - -use 5.005; -use strict; -use vars qw($VERSION); -use subs qw(); - -use RPM; -use RPM::Header; -use RPM::Package; - -$VERSION = do { my @r=(q$Revision: 1.8 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r }; - -1; - -__END__ diff --git a/Perl-RPM/RPM/Transaction.xs b/Perl-RPM/RPM/Transaction.xs deleted file mode 100644 index 0781405..0000000 --- a/Perl-RPM/RPM/Transaction.xs +++ /dev/null @@ -1,25 +0,0 @@ -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -#include "RPM.h" - -static char * const rcsid = "$Id: Transaction.xs,v 1.1 2000/08/06 08:57:09 rjray Exp $"; - -/* - Use this define for deriving the saved Transaction struct, rather - than coding it a dozen places. Note that the hv_fetch call is the - no-magic one defined in RPM.h -*/ -#define trans_from_object_ret(s_ptr, trans, object, err_ret) \ - hv_fetch_nomg((s_ptr), (object), STRUCT_KEY, STRUCT_KEY_LEN, FALSE); \ - (trans) = ((s_ptr) && SvOK(*(s_ptr))) ? (RPM_Transaction *)SvIV(*(s_ptr)) : NULL; \ - if (! (trans)) \ - return (err_ret); -/* And a no-return-value version: */ -#define trans_from_object(s_ptr, trans, object) \ - hv_fetch_nomg((s_ptr), (object), STRUCT_KEY, STRUCT_KEY_LEN, FALSE); \ - (trans) = ((s_ptr) && SvOK(*(s_ptr))) ? (RPM_Transaction *)SvIV(*(s_ptr)) : NULL; - - -MODULE = RPM::Transaction PACKAGE = RPM::Transaction PREFIX = rpmtrans_ diff --git a/Perl-RPM/t/00_load.t b/Perl-RPM/t/00_load.t deleted file mode 100755 index 3d1743a..0000000 --- a/Perl-RPM/t/00_load.t +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/perl - -# Verify that the individual modules will load - -@MODULES = qw(RPM RPM::Constants RPM::Database RPM::Header RPM::Error); - -printf "1..%d\n", scalar(@MODULES); - -$count = 0; -for (@MODULES) -{ - eval "use $_"; - - printf "%sok %d\n", ($@) ? 'not ' : '', ++$count; -} - -exit 0; diff --git a/Perl-RPM/t/01_database.t b/Perl-RPM/t/01_database.t deleted file mode 100755 index 1b54b72..0000000 --- a/Perl-RPM/t/01_database.t +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/perl - -use RPM::Database; - -print "1..18\n"; -$count = 1; - -# -# Prior to starting up, we need to do some less-direct queries of the RPM -# database, so that we have baseline data to test against. -# -@all_packs = `rpm -q -a --queryformat "\%{NAME}\\n"`; -chomp(@all_packs); -$all_packs{$_}++ for (@all_packs); - -# -# With a full list of packages now known, find one to use for package existence -# testing. -# -for (qw(kernel rpm inetd bash)) -{ - $test_pack = $_, last if (exists $all_packs{$_}); -} -if ($test_pack) -{ - @test_requires = `rpm -q --requires $test_pack`; - chomp(@test_requires); - @test_requires = map { (split(/ /, $_))[0] } grep(! m|^/|, @test_requires); - @test_requires = grep(! /^rpmlib\(/, @test_requires); - @test_required_by = `rpm -q --whatrequires $test_pack`; - chomp(@test_required_by); - @test_required_by = map { @p = split('-', $_); - pop(@p); pop(@p); - join('-', @p); } (@test_required_by); -} -else -{ - die "Not enough testable data in your RPM database, stopped"; -} - -$skip_kernel = 1; -if ($test_pack eq 'kernel') -{ - $skip_kernel = 0; - @kernel_matches = - `rpm -qf /sbin/installkernel --queryformat "\%{NAME}\\n"`; - chomp(@kernel_matches); -} - -tie %DB, "RPM::Database" or print "not "; -print "ok $count\n"; $count++; - -unless (tied %DB) -{ - die "$RPM::err"; - exit -1; -} - -# Start with the test package -$rpm = $DB{$test_pack}; -print "not " unless (defined $rpm and ref $rpm); -print "ok $count\n"; $count++; - -# Obviously, EXISTS should clear just fine -print "not " unless (exists $DB{$test_pack}); -print "ok $count\n"; $count++; - -# Run over FIRSTKEY and NEXTKEY by iterating against a copy of %all_packs -%tmp_packs = %all_packs; -for (keys %DB) { delete $tmp_packs{$_} } -print "not " if (keys %tmp_packs); -print "ok $count\n"; $count++; - -# Verify that STORE, DELETE and CLEAR operations are blocked -# STORE -eval { - $DB{foo_package} = 'baz'; - print "not " if (exists $DB{foo_package} and ($DB{foo_package} eq 'baz')); -}; -print "ok $count\n"; $count++; - -# DELETE -eval { delete $DB{foo_package} and print "not " }; -print "ok $count\n"; $count++; - -# CLEAR -eval { %DB = () and print "not " }; -print "ok $count\n"; $count++; - -# Test the untying -eval { untie %DB }; -print "not " if ($@); -print "ok $count\n"; $count++; - -# That should cover the basic TIEHASH operands sufficiently. - -# No way to test init() or rebuilddb() !!! - -# All of the FindBy* suite behave basically the same way. For now, I only -# have these few tests... - -# Test the non-tie approach -$rpm = new RPM::Database; -print "not " unless (defined $rpm and ref $rpm); -print "ok $count\n"; $count++; - -# Ensure that the same test package is visible -print "not " unless (exists $rpm->{$test_pack} and ref($rpm->{$test_pack})); -print "ok $count\n"; $count++; - -# Run over FIRSTKEY and NEXTKEY for the direct ref interface -%tmp_packs = %all_packs; -for (keys %$rpm) { delete $tmp_packs{$_} } -print "not " if (keys %tmp_packs); -print "ok $count\n"; $count++; - -# -# These two tests must be skipped if kernel is not an rpm package entry -# -if ($skip_kernel) -{ - print "ok $count # Skipped: test data missing\n"; $count++; - print "ok $count # Skipped: test data missing\n"; $count++; -} -else -{ - @matches = $rpm->find_by_file('/sbin/installkernel'); - # There should be exactly one match: - print "not " unless (@matches == @kernel_matches); - print "ok $count\n"; $count++; - - $_ = $_->{name} for (@matches); - print "not " unless (join(':', sort @matches) eq - join(':', sort @kernel_matches)); - print "ok $count\n"; $count++; -} - -# There may be more than one package that depends on $test_pack -@matches = $rpm->find_what_requires($test_pack); -%test = (); -for (@matches) { $test{$_->{name}} = 1 } -for (@test_required_by) { delete $test{$_} } -print "not " if (keys %test); -print "ok $count\n"; $count++; - -# Check now for finding those packages that $test_pack itself requires -for $testp (@test_requires) -{ - @matches = $rpm->find_what_requires($rpm->{$testp}); - print "not ", last unless (grep($_->{name} eq $test_pack, @matches)); -} -print "ok $count\n"; $count++; - -# Test the find-by-group -# First, check that the test pack is in the return list -@matches = $rpm->find_by_group($rpm->{$test_pack}->{group}); -print "not " unless (grep($_->{name} eq $test_pack, @matches)); -print "ok $count\n"; $count++; - -# Check the list of matches against what RPM thinks -@by_group = `rpm -q --group '$rpm->{$test_pack}->{group}'`; -%test = (); -for (@by_group) -{ - @p = split '-'; - pop(@p); pop(@p); - $_ = join('-', @p); - $test{$_}++; -} -for (@matches) -{ - delete $test{$_->{name}}; -} -print "not " if ((! scalar(@by_group)) || (keys %test)); -print "ok $count\n"; $count++; - -# Try to fetch a bogus package -$hdr = $rpm->{i_hope_no_one_makes_a_package_by_this_name}; -print "not " if $hdr; -print "ok $count\n"; $count++; - -undef $rpm; - -exit 0; diff --git a/Perl-RPM/t/02_headers.t b/Perl-RPM/t/02_headers.t deleted file mode 100755 index f925edc..0000000 --- a/Perl-RPM/t/02_headers.t +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/perl - -use RPM::Header; -use RPM::Database; - -print "1..18\n"; -$count = 1; - -tie %DB, "RPM::Database" or die "$RPM::err"; - -# -# Find a package to use for package existence and data integrity testing. -# -for (qw(rpm kernel inetd bash)) -{ - $test_pack = $_, last if (exists $DB{$_}); -} -if ($test_pack) -{ - @test_files = `rpm -ql $test_pack`; - chomp(@test_files); - chomp($rpmstr = qx{rpm -q $test_pack}); -} -else -{ - die "Not enough testable data in your RPM database, stopped"; -} - -# Are we getting RPM::Header objects from the database? -$hdr = $DB{$test_pack}; -print "not " unless (ref($hdr) and $hdr->isa('RPM::Header')); -print "ok $count\n"; $count++; - -# Does this one match what rpm thinks? -print "not " - unless ($rpmstr eq join('-', - map { $hdr->{$_} } qw(name version release))); -print "ok $count\n"; $count++; - -# Headers store files as a list of basenames, dirnames, and pointers to a dir -# for each file. -$files = $hdr->{basenames}; -$dirs = $hdr->{dirnames}; -$indices = $hdr->{dirindexes}; - -print "not " unless (@$files == @$indices); -print "ok $count\n"; $count++; - -print "not " unless (@$files == @test_files); -print "ok $count\n"; $count++; - -for $idx (0 .. $#test_files) -{ - if ($test_files[$idx] ne - sprintf("%s%s", $dirs->[$indices->[$idx]], $files->[$idx])) - { - print "not "; - last; - } -} -print "ok $count\n"; $count++; - -# Starting with 0.27, we have a method to do that for you -$rpmlines = $hdr->filenames; -print "not " unless ($rpmlines and (@$rpmlines == @test_files)); -print "ok $count\n"; $count++; - -for $idx (0 .. $#rpmlines) -{ - if ($test_files[$idx] ne $rpmlines->[$idx]) - { - print "not "; - last; - } -} -print "ok $count\n"; $count++; - -# Can't really test RPM::Header->size(), except to see that it works. -print "not " if ($hdr->size <= 0); -print "ok $count\n"; $count++; - -# Check tagtype() -use RPM::Constants ':rpmtype'; - -print "not " unless ($hdr->tagtype(q{size}) == RPM_INT32_TYPE); -print "ok $count\n"; $count++; - -print "not " unless ($hdr->tagtype(q{dirnames}) == RPM_STRING_ARRAY_TYPE); -print "ok $count\n"; $count++; - -# Test the NVR method -print "not " unless ($rpmstr eq join('-', $hdr->NVR)); -print "ok $count\n"; $count++; - -# Some tests on empty RPM::Header objects -$hdr = new RPM::Header; - -print "not " unless (defined $hdr and (ref($hdr) eq 'RPM::Header')); -print "ok $count\n"; $count++; - -print "not " if (scalar($hdr->NVR)); -print "ok $count\n"; $count++; - -# And now the scalar_tag predicate: -print "not " unless (RPM::Header->scalar_tag(q{size})); -print "ok $count\n"; $count++; - -use RPM::Constants ':rpmtag'; -print "not " if (RPM::Header->scalar_tag(RPMTAG_DIRNAMES)); -print "ok $count\n"; $count++; - -use RPM::Constants ':rpmerr'; -print "not " unless ((! RPM::Header->scalar_tag(q{not_a_tag})) and - ($RPM::err == RPMERR_BADARG)); -print "ok $count\n"; $count++; - -# Check all the keys to see that the scalar_tag flag matches the return value -$hdr = $DB{$test_pack}; -while (($k, $v) = each %$hdr) -{ - unless ((ref($v) and (! $hdr->scalar_tag($k))) or - ((! ref($v)) and $hdr->scalar_tag($k))) - { - print "not "; - last; - } -} -print "ok $count\n"; $count++; -untie %DB; - -# Test an attempt to open a non-existant RPM file -$hdr = new RPM::Header "this_file_not_here.rpm"; -print "not " if $hdr; -print "ok $count\n"; $count++; - -exit 0; diff --git a/Perl-RPM/t/03_errors.t b/Perl-RPM/t/03_errors.t deleted file mode 100755 index 6e2ccad..0000000 --- a/Perl-RPM/t/03_errors.t +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/perl - -# Test the error-reporting and management functions - -use RPM::Error; -use RPM::Constants ':rpmerr'; - -use vars qw($called $string $oldcb); - -select(STDOUT); $| = 1; - -print "1..11\n"; - -# tests 1-2: basic set -rpm_error(RPMERR_BADARG, "Bad argument passed"); - -print 'not ' unless ($RPM::err == RPMERR_BADARG); -print "ok 1\n"; - -print 'not ' unless ($RPM::err eq 'Bad argument passed'); -print "ok 2\n"; - -# tests 3-4: clearing the values -clear_errors; - -print 'not ' if ($RPM::err); -print "ok 3\n"; - -print 'not ' if (length($RPM::err)); -print "ok 4\n"; - -# tests 5-8: callbacks -$called = 0; -set_error_callback(sub { $called = 1 }); -rpm_error(RPMERR_BADSPEC, "Bad spec"); - -print 'not ' unless ($called); -print "ok 5\n"; - -sub cb1 { $called = shift; $string = shift; } -$called = 0; $string = ''; -set_error_callback('cb1'); -rpm_error(RPMERR_BADDEV, "baddev"); - -print 'not ' unless ($called == $RPM::err); -print "ok 6\n"; - -print 'not ' unless (length($string) == 6); -print "ok 7\n"; - -sub cb2 { $called = 1 } -set_error_callback(\&cb2); -rpm_error(RPMERR_BADMAGIC, "badmagic"); - -print 'not ' unless ($called == 1 and $RPM::err == RPMERR_BADMAGIC); -print "ok 8\n"; - -my $oldcb = set_error_callback(undef); -$called = 0; -rpm_error(RPMERR_BADDEV, "baddev"); - -print 'not ' if ($called); -print "ok 9\n"; - -print 'not ' unless (ref $oldcb eq 'CODE'); -print "ok 10\n"; - -set_error_callback($oldcb); -$called = 0; -rpm_error(RPMERR_BADMAGIC, "badmagic"); - -print 'not ' unless ($called == 1 and $RPM::err == RPMERR_BADMAGIC); -print "ok 11\n"; - -exit 0; diff --git a/Perl-RPM/t/04_utils.t b/Perl-RPM/t/04_utils.t deleted file mode 100755 index 88c8be6..0000000 --- a/Perl-RPM/t/04_utils.t +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/perl - -# Test the basic util functions - -use RPM; - -print "1..2\n"; - -$arch = $os = ''; - -open(PIPE, "rpm --showrc |"); -while (defined($line = )) -{ - chomp $line; - - $line =~ /^build arch\s*:\s*(\S+)\s*$/ and $arch = $1; - $line =~ /^build os\s*:\s*(\S+)\s*$/ and $os = $1; -} -close(PIPE); - -print 'not ' unless ($arch eq rpm_archname); -print "ok 1\n"; - -print 'not ' unless ($os eq rpm_osname); -print "ok 2\n"; - -exit; diff --git a/Perl-RPM/t/05_package.t b/Perl-RPM/t/05_package.t deleted file mode 100755 index 51d0268..0000000 --- a/Perl-RPM/t/05_package.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/perl - -use RPM::Database; - -$SIG{__WARN__} = sub { $@ = shift; }; -$SIG{__DIE__} = sub { $@ = shift; }; - -print "1..0\n"; - -exit; diff --git a/Perl-RPM/typemap b/Perl-RPM/typemap deleted file mode 100644 index a602801..0000000 --- a/Perl-RPM/typemap +++ /dev/null @@ -1,57 +0,0 @@ -# Treat this as -*- text -*- - -TYPEMAP - -const char * T_PTROBJ -RPM::Database O_RPM_Tied -RPM::Header O_RPM_Tied -RPM::Package O_RPM_Blessed -RPM::Transaction O_RPM_Blessed - -OUTPUT -O_RPM_Tied - if ($var) - { - $arg = sv_bless(sv_2mortal(newRV_noinc((SV*)$var)), - gv_stashpv(\"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\", - TRUE)); - } - else - { - $arg = newSVsv(&PL_sv_undef); - } - -O_RPM_Blessed - if ($var) - { - sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\", - (void*)$var); - } - else - { - $arg = newSVsv(&PL_sv_undef); - } - -INPUT -O_RPM_Tied - if (sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV)) - $var = (HV*)SvRV($arg); - else - { - rpm_error(aTHX_ RPMERR_BADARG, - \"${Package}::$func_name: not a blessed HV reference\"); - XSRETURN_UNDEF; - } - -O_RPM_Blessed - if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")) - { - IV tmp = SvIV((SV*)SvRV($arg)); - $var = ($type) tmp; - } - else - { - rpm_error(aTHX_ RPMERR_BADARG, - \"$var is not of type ${ntype}\"); - XSRETURN_UNDEF; - } \ No newline at end of file diff --git a/Perl-RPM/utils/rpmprune b/Perl-RPM/utils/rpmprune deleted file mode 100755 index 630e901..0000000 --- a/Perl-RPM/utils/rpmprune +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/perl - -use strict; -use vars qw($USAGE $VERSION $revision $cmd %opts $file $hdr $installed $ret); - -use Getopt::Long; -use File::Basename qw(basename); - -use RPM::Database qw(%RPM); -use RPM::Header; - -$cmd = basename $0; -$revision = q$Revision: 1.1 $; -$VERSION = sprintf("%d.%02d", $revision =~ /(\d+)\.(\d+)/); -$USAGE = "USAGE: - $cmd [ --newer ] [ --older ] [ --equal ] [ --uninst ] - [ --invert ] file [ file ... ] - -Where: - ---newer (--nonewer) Show (do not show) those files which are newer ---older (--noolder) Show (do not show) those that are older ---equal (--noequal) Show (do not show) those that match the database ---uninst (--nouninst) Show (do not show) those that are not in the database - ---invert Invert the given selection logic - -The default is: - - --newer --noolder --noequal --uninst -"; - -$opts{newer} = 1; -$opts{older} = 0; -$opts{equal} = 0; -$opts{uninst} = 1; -GetOptions(\%opts, qw(help newer! older! equal! uninst! invert)) or - die "$USAGE\nStopped"; - -if ($opts{help}) -{ - print $USAGE; - exit 0; -} -if ($opts{invert}) -{ - $opts{$_} = 1 - $opts{$_} for (qw(newer older equal uninst)); -} - -for $file (@ARGV) -{ - $hdr = new RPM::Header $file; - unless ($hdr) - { - warn "$file: $RPM::err\n"; - next; - } - - $installed = $RPM{$hdr->{name}}; - unless ($installed) - { - # It isn't currently installed, so there is no conflict - print "$file\n" if $opts{uninst}; - undef $hdr; - next; - } - - $ret = $hdr->cmpver($installed); - print "$file\n" if ($ret < 0 and $opts{older}); - print "$file\n" if ($ret == 0 and $opts{equal}); - print "$file\n" if ($ret > 0 and $opts{newer}); - undef $hdr; -} - -exit; - -__END__ - -=head1 NAME - -rpmprune - Remove unneeded files from a list of RPM package files - -=head1 SYNOPSIS - -rpmprune [ --newer ] [ --older ] [ --equal ] [ --uninst ] - [ --invert ] filelist ... - -=head1 DESCRIPTION - -The B tool is a simple example of using some of the B Perl -bindings. - -With B version 3 and newer, multiple files given on the command-line -for an install, uninstall or update command are treated as a single -I. If any of the files in the set cannot be acted upon, the -whole transaction must be rejected. This is inconvenient for casual package -upgrades where a directory may have many B files, some of which are -already installed. A command of: - - rpm -Uhv *.rpm - -would fail, as one (or more) files in the set is already installed. This -can lead to careless use of options such as C<--force>. - -In the simplest usage, this tool eases that situation by allowing: - - rpm -Uhv `rpmprune *.rpm` - -When the back-ticks are evaluated, B has only echoed the names of -those files that are either newer than their installed counterparts, or are -not installed at all. - -=head1 OPTIONS - -For maximum flexibility, B supports more options than anyone will -realistically put to use: - -=over - -=item --help - -Print a summary of the options and general usage. - -=item --newer (--nonewer) - -If selected, all files that are newer than their installed counterparts -will be echoed. Prefix with "no" to suppress the printing of these. - -=item --older (--noolder) - -If selected, all files that are older than their installed counterparts -will be echoed. Prefix with "no" to suppress them, instead. - -=item --equal (--noequal) - -If selected, all files that are the same version as their installed -counterparts will be echoed. Prefix with "no" to suppress them, instead. - -=item --uninst (--nouninst) - -If selected, all files that are for packages not currently installed on -the system will be echoed. Prefix with "no" to suppress them, instead. - -=item --invert - -Invert the logic of all four of the previous selectors. - -=back - -Without any arguments, B acts as if the following were the command -line: - - rpmprune --newer --noolder --noequal --uninst ... - -The C<--invert> option is applied last, after all others have been processed. - -=head1 AUTHOR - -Randy J. Ray -- 2.7.4