summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/ci.yaml137
-rw-r--r--.gitignore1
-rw-r--r--CHANGELOG.md114
-rw-r--r--README.md64
-rw-r--r--REFLECTION620
-rw-r--r--composer.json14
-rw-r--r--config.m421
-rw-r--r--package.xml135
-rw-r--r--php_rpminfo.h12
-rw-r--r--rpminfo.c495
-rw-r--r--rpminfo.stub.php9
-rw-r--r--rpminfo_arginfo.h30
-rw-r--r--tests/002-rpmvercmp.phpt44
-rw-r--r--tests/003-rpminfo.phpt2
-rw-r--r--tests/004-constants.phpt2
-rw-r--r--tests/005-rpminfo-full.phpt6
-rw-r--r--tests/008-rpmdbsearch.phpt11
-rw-r--r--tests/010-rpmvercmp_error7.phpt25
-rw-r--r--tests/011-rpmvercmp_error8.phpt12
-rw-r--r--tests/014-stream.phpt97
-rw-r--r--tests/015-rpmmacro.phpt25
-rw-r--r--tests/bidon.rpmbin6972 -> 7599 bytes
-rw-r--r--tests/bidon.spec42
23 files changed, 1486 insertions, 432 deletions
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000..792341d
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,137 @@
+name: CI
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+jobs:
+ Linux_EL8:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ distro: ['rockylinux']
+ el: [8]
+ php: ['8.0', '8.2', 'remi-8.0', 'remi-8.1', 'remi-8.2', 'remi-8.3', 'remi-8.4', 'remi-8.5']
+ container:
+ image: ${{ matrix.distro }}:${{ matrix.el }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup PHP module
+ if: ${{ matrix.php }}
+ run: |
+ dnf install -y "https://rpms.remirepo.net/enterprise/remi-release-${{ matrix.el }}.rpm"
+ dnf module enable -y "php:${{ matrix.php }}"
+ - name: Install PHP
+ run: |
+ dnf install -y "php" "php-devel" "rpm-devel"
+ - name: Show PHP version
+ run: php -v
+ - name: Make php-rpminfo
+ run: |
+ phpize
+ ./configure
+ make -j"$(nproc)"
+ - name: Test php-rpminfo
+ env:
+ TEST_PHP_ARGS: '-q --show-diff'
+ run: |
+ make test
+ Linux_EL9:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ distro: ['rockylinux']
+ el: [9]
+ php: [0, '8.2', '8.3', 'remi-8.0', 'remi-8.1', 'remi-8.2', 'remi-8.3', 'remi-8.4', 'remi-8.5']
+ container:
+ image: ${{ matrix.distro }}:${{ matrix.el }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup PHP module
+ if: ${{ matrix.php }}
+ run: |
+ dnf install -y "https://rpms.remirepo.net/enterprise/remi-release-${{ matrix.el }}.rpm"
+ dnf module enable -y "php:${{ matrix.php }}"
+ - name: Install PHP
+ run: |
+ dnf install -y "php" "php-devel" "rpm-devel"
+ - name: Show PHP version
+ run: php -v
+ - name: Make php-rpminfo
+ run: |
+ phpize
+ ./configure
+ make -j"$(nproc)"
+ - name: Test php-rpminfo
+ env:
+ TEST_PHP_ARGS: '-q --show-diff'
+ run: |
+ make test
+ Linux_EL10:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ distro: ['almalinux']
+ el: [10]
+ php: [0, 'remi-8.0', 'remi-8.1', 'remi-8.2', 'remi-8.3', 'remi-8.4', 'remi-8.5']
+ container:
+ image: ${{ matrix.distro }}:${{ matrix.el }}
+ steps:
+ - name: Install gzip
+ run: |
+ dnf install -y "gzip"
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup PHP module
+ if: ${{ matrix.php }}
+ run: |
+ dnf install -y "https://rpms.remirepo.net/enterprise/remi-release-${{ matrix.el }}.rpm"
+ dnf module enable -y "php:${{ matrix.php }}"
+ - name: Install PHP
+ run: |
+ dnf install -y "php" "php-devel" "rpm-devel"
+ - name: Show PHP version
+ run: php -v
+ - name: Make php-rpminfo
+ run: |
+ phpize
+ ./configure
+ make -j"$(nproc)"
+ - name: Test php-rpminfo
+ env:
+ TEST_PHP_ARGS: '-q --show-diff'
+ run: |
+ make test
+ Linux_Fedora:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ fedora: [42, 43]
+ php: [0, 'remi-8.0', 'remi-8.1', 'remi-8.2', 'remi-8.3', 'remi-8.4', 'remi-8.5']
+ container:
+ image: fedora:${{ matrix.fedora }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup PHP module
+ if: ${{ matrix.php }}
+ run: |
+ dnf install -y "https://rpms.remirepo.net/fedora/remi-release-${{ matrix.fedora }}.rpm"
+ dnf module enable -y "php:${{ matrix.php }}"
+ - name: Install PHP
+ run: |
+ dnf install -y "php" "php-devel" "rpm-devel"
+ - name: Show PHP version
+ run: php -v
+ - name: Make php-rpminfo
+ run: |
+ phpize
+ ./configure
+ make -j"$(nproc)"
+ - name: Test php-rpminfo
+ env:
+ TEST_PHP_ARGS: '-q --show-diff'
+ run: |
+ make test
diff --git a/.gitignore b/.gitignore
index 54b9e13..f9067ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,6 +55,7 @@ modules
run-tests.php
run-tests.log
tmp-php.ini
+sendpackagist
# Archives
rpminfo-*.tgz
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..676cb3d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,114 @@
+# Unreleased
+
+-
+
+# Version 1.2.1 - 2025-09-25
+
+- use `RPMTAG_SIGMD5` instead of `RPMTAG_PKGID` removed in RPM 6
+- use `RPMTAG_SHA1HEADER` instead of `RPMTAG_HDRID` removed in RPM 6
+
+# Version 1.2.0 - 2024-12-19
+
+- add `rpmexpand`, `rpmexpandnumeric` to retrieve rpm macro value
+- add `rpmdefine` to set rpm macro value
+
+# Version 1.1.1 - 2024-09-03
+
+- display author and license in phpinfo
+- drop support for librpm < 4.13
+
+# Version 1.1.0 - 2023-11-10
+
+- check open_basedir restriction
+- new function: `rpmgetsymlink(string $path, string $name): ?string`
+
+# Version 1.0.1 - 2023-10-13
+
+- fix stack smashing on 32-bit
+- allow retrieval of hardlink content
+
+# Version 1.0.0 - 2023-10-12
+
+- implement rpm stream wrapper with librpm >= 4.13
+
+# Version 0.7.0 - 2023-09-26
+
+- add optional operator to `rpmcmpver` for consistency with version_compare
+- drop support for PHP 7
+
+# Version 0.6.0 - 2021-06-18
+
+- generate arginfo from stub and add missing default values
+- raise dependency on PHP 7.2
+- raise exception on bad parameter value with PHP 8
+
+# Version 0.5.1 - 2020-09-23
+
+- split tests for PHP 7/8
+- improve librpm example
+
+# Version 0.5.0 - 2020-04-07
+
+- add `rpmaddtag()` function
+
+# Version 0.4.2 - 2020-03-25
+
+- improve reflection with better parameter names
+- speed optimization: open DB only once per request
+
+# Version 0.4.1 - 2020-03-18
+
+- fix build with RPM 4.12 (Fedora 21-22 only)
+- add type hinting in reflection
+- return `NULL` instead of `FALSE` on failure
+
+# Version 0.4.0 - 2020-03-13
+
+- improve search logic, use index when exists and no search mode
+- add 'full' parameter to `rpmdbsearch`
+- allow `rpmdbinfo` to search on NEVR (instead of name only)
+- first "stable" release
+
+# Version 0.3.1 - 2020-03-12
+
+- allow search by Pkgid, Hdrid, Installtid with specific input
+- fix search with various other tags (Version, ...)
+
+# Version 0.3.0 - 2020-03-12
+
+- add `rpmdbsearch` function to search packages using
+ name, installed files, requires, provides...
+
+# Version 0.2.3 - 2020-03-11
+
+- fix gh#2 free allocated iterators to avoid "DB2053 Freeing read locks..." messages
+
+# Version 0.2.2 - 2020-03-11
+
+- Fix gh#1 `rpmvercmp()` incorrect comparison result
+
+# Version 0.2.1 - 2018-02-12
+
+- add summary in minimal information set
+- retrieve array from metadata
+- add `RPMSENSE_*` macros
+
+# Version 0.2.0 - 2018-02-08
+
+- new function:
+ `array rpmdbinfo(string name [, bool full]);`
+
+# Version 0.1.3 - 2018-02-08
+
+- first pecl release
+- `rpminfo()`: add option to retrieve error message instead of raising a warning
+
+# Version 0.1.1 - 2018-01-26
+
+- fix segfault in ZTS mode
+- define `RPMVERSION` constant
+
+# Version 0.1.0 - 2018-01-26
+- first release with 2 functions:
+ `int rpmvercmp(string evr1, string evr2);`
+ `array rpminfo(string path [, bool full]);`
diff --git a/README.md b/README.md
index 421d5a1..9d19947 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,11 @@
+[![CI](https://github.com/remicollet/rpminfo/actions/workflows/ci.yaml/badge.svg)](https://github.com/remicollet/rpminfo/actions/workflows/ci.yaml)
+
# RPM information extension for PHP
Retrieve RPM information from PHP code using librpm.
This extension can be considered as stable, and be used on production environement.
-But be aware that if its API will probably stay stable,
-some changes may occur before version 1.0.0.
-
----
@@ -17,7 +16,7 @@ some changes may occur before version 1.0.0.
# Build
-You need the rpm development files (rpm-devel) version >= 4.11.3.
+You need the rpm development files (rpm-devel) version >= 4.13.
From the sources tree
@@ -26,6 +25,15 @@ From the sources tree
$ make
$ make test
+From https://pecl.php.net/ using pecl command
+
+ $ pecl install rpminfo
+
+From https://packagist.org/ using PHP Installer for Extensions
+
+ $ pie install remi/rpminfo
+
+
----
# Usage
@@ -45,7 +53,7 @@ Allow to compare 2 EVR (epoch:version-release) strings. The return value is < 0
## rpminfo
- array rpminfo(string path [, bool full [, string &error]]);
+ rpminfo(string path [, bool full [, string &error]]): array;
Retrieve information from a rpm file, reading its metadata.
If given `error` will be used to store error message instead of raising a warning.
@@ -89,7 +97,7 @@ The return value is a hash table, or false if it fails.
## rpmdbinfo
- array rpmdbinfo(string path [, bool full ]);
+ rpmdbinfo(string path [, bool full ]): array;
Retrieve information from rpm database about an installed package.
The return value is an array of hash tables, or false if it fails.
@@ -185,6 +193,50 @@ The return value is an array of hash tables, or false if it fails.
)
)
+## rpmexpand
+
+ rpmexpand($text): string
+
+Retrieve expanded value of a RPM macro
+
+ $ php -a
+ php > var_dump(rpmexpand("%{?fedora:Fedora %{fedora}}%{?rhel:Enterprise Linux %{rhel}}"));
+ string(9) "Fedora 41"
+
+## rpmexpandnumeric
+
+ rpmexpandnumeric($text): int
+
+Retrieve numerical value of a RPM macro
+
+ $ php -a
+ php > var_dump(rpmexpandnumeric("%__isa_bits"));
+ int(64)
+
+## rpmdefine
+
+ rpmdefine($text): bool
+
+Define or change a RPM macro value.
+
+For example, can be used to set the Database path and backend
+
+ $ mock -r almalinux-8-x86_64 init
+ ...
+ $ mock -r fedora-41-x86_64 init
+ ...
+ $ php -a
+ php > // use an old database (bdb) from an EL-8 chroot
+ php > rpmdefine("_dbpath /var/lib/mock/almalinux-8-x86_64/root/var/lib/rpm");
+ php > rpmdefine("_db_backend bdb_ro");
+ php > var_dump(rpmdbinfo("almalinux-release")[0]["Summary"]);
+ string(22) "AlmaLinux release file"
+ php > // use a new database (sqlite) from a Fedora-41 chroot
+ php > rpmdefine("_dbpath /var/lib/mock/fedora-41-x86_64/root/usr/lib/sysimage/rpm");
+ php > rpmdefine("_db_backend sqlite");
+ php > var_dump(rpmdbinfo("fedora-release")[0]["Summary"]);
+ string(20) "Fedora release files"
+
----
# LICENSE
diff --git a/REFLECTION b/REFLECTION
index 273ac29..3decc5a 100644
--- a/REFLECTION
+++ b/REFLECTION
@@ -1,277 +1,301 @@
-Extension [ <persistent> extension #15 rpminfo version 0.5.0 ] {
+Extension [ <persistent> extension #113 rpminfo version 1.2.1 ] {
- - Constants [271] {
- Constant [ string RPMVERSION ] { 4.15.1 }
- Constant [ int RPMSENSE_ANY ] { 0 }
- Constant [ int RPMSENSE_LESS ] { 2 }
- Constant [ int RPMSENSE_GREATER ] { 4 }
- Constant [ int RPMSENSE_EQUAL ] { 8 }
- Constant [ int RPMSENSE_POSTTRANS ] { 32 }
- Constant [ int RPMSENSE_PREREQ ] { 64 }
- Constant [ int RPMSENSE_PRETRANS ] { 128 }
- Constant [ int RPMSENSE_INTERP ] { 256 }
- Constant [ int RPMSENSE_SCRIPT_PRE ] { 512 }
- Constant [ int RPMSENSE_SCRIPT_POST ] { 1024 }
- Constant [ int RPMSENSE_SCRIPT_PREUN ] { 2048 }
- Constant [ int RPMSENSE_SCRIPT_POSTUN ] { 4096 }
- Constant [ int RPMSENSE_SCRIPT_VERIFY ] { 8192 }
- Constant [ int RPMSENSE_FIND_REQUIRES ] { 16384 }
- Constant [ int RPMSENSE_FIND_PROVIDES ] { 32768 }
- Constant [ int RPMSENSE_TRIGGERIN ] { 65536 }
- Constant [ int RPMSENSE_TRIGGERUN ] { 131072 }
- Constant [ int RPMSENSE_TRIGGERPOSTUN ] { 262144 }
- Constant [ int RPMSENSE_MISSINGOK ] { 524288 }
- Constant [ int RPMSENSE_RPMLIB ] { 16777216 }
- Constant [ int RPMSENSE_TRIGGERPREIN ] { 33554432 }
- Constant [ int RPMSENSE_KEYRING ] { 67108864 }
- Constant [ int RPMSENSE_CONFIG ] { 268435456 }
- Constant [ int RPMMIRE_DEFAULT ] { 0 }
- Constant [ int RPMMIRE_STRCMP ] { 1 }
- Constant [ int RPMMIRE_REGEX ] { 2 }
- Constant [ int RPMMIRE_GLOB ] { 3 }
- Constant [ int RPMTAG_ARCH ] { 1022 }
- Constant [ int RPMTAG_ARCHIVESIZE ] { 1046 }
- Constant [ int RPMTAG_BASENAMES ] { 1117 }
- Constant [ int RPMTAG_BUGURL ] { 5012 }
- Constant [ int RPMTAG_BUILDARCHS ] { 1089 }
- Constant [ int RPMTAG_BUILDHOST ] { 1007 }
- Constant [ int RPMTAG_BUILDTIME ] { 1006 }
- Constant [ int RPMTAG_C ] { 1054 }
- Constant [ int RPMTAG_CHANGELOGNAME ] { 1081 }
- Constant [ int RPMTAG_CHANGELOGTEXT ] { 1082 }
- Constant [ int RPMTAG_CHANGELOGTIME ] { 1080 }
- Constant [ int RPMTAG_CLASSDICT ] { 1142 }
- Constant [ int RPMTAG_CONFLICTFLAGS ] { 1053 }
- Constant [ int RPMTAG_CONFLICTNAME ] { 1054 }
- Constant [ int RPMTAG_CONFLICTNEVRS ] { 5044 }
- Constant [ int RPMTAG_CONFLICTS ] { 1054 }
- Constant [ int RPMTAG_CONFLICTVERSION ] { 1055 }
- Constant [ int RPMTAG_COOKIE ] { 1094 }
- Constant [ int RPMTAG_DBINSTANCE ] { 1195 }
- Constant [ int RPMTAG_DEPENDSDICT ] { 1145 }
- Constant [ int RPMTAG_DESCRIPTION ] { 1005 }
- Constant [ int RPMTAG_DIRINDEXES ] { 1116 }
- Constant [ int RPMTAG_DIRNAMES ] { 1118 }
- Constant [ int RPMTAG_DISTRIBUTION ] { 1010 }
- Constant [ int RPMTAG_DISTTAG ] { 1155 }
- Constant [ int RPMTAG_DISTURL ] { 1123 }
- Constant [ int RPMTAG_DSAHEADER ] { 267 }
- Constant [ int RPMTAG_E ] { 1003 }
- Constant [ int RPMTAG_ENCODING ] { 5062 }
- Constant [ int RPMTAG_ENHANCEFLAGS ] { 5057 }
- Constant [ int RPMTAG_ENHANCENAME ] { 5055 }
- Constant [ int RPMTAG_ENHANCENEVRS ] { 5061 }
- Constant [ int RPMTAG_ENHANCES ] { 5055 }
- Constant [ int RPMTAG_ENHANCEVERSION ] { 5056 }
- Constant [ int RPMTAG_EPOCH ] { 1003 }
- Constant [ int RPMTAG_EPOCHNUM ] { 5019 }
- Constant [ int RPMTAG_EVR ] { 5013 }
- Constant [ int RPMTAG_EXCLUDEARCH ] { 1059 }
- Constant [ int RPMTAG_EXCLUDEOS ] { 1060 }
- Constant [ int RPMTAG_EXCLUSIVEARCH ] { 1061 }
- Constant [ int RPMTAG_EXCLUSIVEOS ] { 1062 }
- Constant [ int RPMTAG_FILECAPS ] { 5010 }
- Constant [ int RPMTAG_FILECLASS ] { 1141 }
- Constant [ int RPMTAG_FILECOLORS ] { 1140 }
- Constant [ int RPMTAG_FILECONTEXTS ] { 1147 }
- Constant [ int RPMTAG_FILEDEPENDSN ] { 1144 }
- Constant [ int RPMTAG_FILEDEPENDSX ] { 1143 }
- Constant [ int RPMTAG_FILEDEVICES ] { 1095 }
- Constant [ int RPMTAG_FILEDIGESTALGO ] { 5011 }
- Constant [ int RPMTAG_FILEDIGESTS ] { 1035 }
- Constant [ int RPMTAG_FILEFLAGS ] { 1037 }
- Constant [ int RPMTAG_FILEGROUPNAME ] { 1040 }
- Constant [ int RPMTAG_FILEINODES ] { 1096 }
- Constant [ int RPMTAG_FILELANGS ] { 1097 }
- Constant [ int RPMTAG_FILELINKTOS ] { 1036 }
- Constant [ int RPMTAG_FILEMD5S ] { 1035 }
- Constant [ int RPMTAG_FILEMODES ] { 1030 }
- Constant [ int RPMTAG_FILEMTIMES ] { 1034 }
- Constant [ int RPMTAG_FILENAMES ] { 5000 }
- Constant [ int RPMTAG_FILENLINKS ] { 5045 }
- Constant [ int RPMTAG_FILEPROVIDE ] { 5001 }
- Constant [ int RPMTAG_FILERDEVS ] { 1033 }
- Constant [ int RPMTAG_FILEREQUIRE ] { 5002 }
- Constant [ int RPMTAG_FILESIGNATURELENGTH ] { 5091 }
- Constant [ int RPMTAG_FILESIGNATURES ] { 5090 }
- Constant [ int RPMTAG_FILESIZES ] { 1028 }
- Constant [ int RPMTAG_FILESTATES ] { 1029 }
- Constant [ int RPMTAG_FILETRIGGERCONDS ] { 5086 }
- Constant [ int RPMTAG_FILETRIGGERFLAGS ] { 5072 }
- Constant [ int RPMTAG_FILETRIGGERINDEX ] { 5070 }
- Constant [ int RPMTAG_FILETRIGGERNAME ] { 5069 }
- Constant [ int RPMTAG_FILETRIGGERPRIORITIES ] { 5084 }
- Constant [ int RPMTAG_FILETRIGGERSCRIPTFLAGS ] { 5068 }
- Constant [ int RPMTAG_FILETRIGGERSCRIPTPROG ] { 5067 }
- Constant [ int RPMTAG_FILETRIGGERSCRIPTS ] { 5066 }
- Constant [ int RPMTAG_FILETRIGGERTYPE ] { 5087 }
- Constant [ int RPMTAG_FILETRIGGERVERSION ] { 5071 }
- Constant [ int RPMTAG_FILEUSERNAME ] { 1039 }
- Constant [ int RPMTAG_FILEVERIFYFLAGS ] { 1045 }
- Constant [ int RPMTAG_FSCONTEXTS ] { 1148 }
- Constant [ int RPMTAG_GIF ] { 1012 }
- Constant [ int RPMTAG_GROUP ] { 1016 }
- Constant [ int RPMTAG_HDRID ] { 269 }
- Constant [ int RPMTAG_HEADERCOLOR ] { 5017 }
- Constant [ int RPMTAG_HEADERI18NTABLE ] { 100 }
- Constant [ int RPMTAG_HEADERIMAGE ] { 61 }
- Constant [ int RPMTAG_HEADERIMMUTABLE ] { 63 }
- Constant [ int RPMTAG_HEADERREGIONS ] { 64 }
- Constant [ int RPMTAG_HEADERSIGNATURES ] { 62 }
- Constant [ int RPMTAG_ICON ] { 1043 }
- Constant [ int RPMTAG_INSTALLCOLOR ] { 1127 }
- Constant [ int RPMTAG_INSTALLTID ] { 1128 }
- Constant [ int RPMTAG_INSTALLTIME ] { 1008 }
- Constant [ int RPMTAG_INSTFILENAMES ] { 5040 }
- Constant [ int RPMTAG_INSTPREFIXES ] { 1099 }
- Constant [ int RPMTAG_LICENSE ] { 1014 }
- Constant [ int RPMTAG_LONGARCHIVESIZE ] { 271 }
- Constant [ int RPMTAG_LONGFILESIZES ] { 5008 }
- Constant [ int RPMTAG_LONGSIGSIZE ] { 270 }
- Constant [ int RPMTAG_LONGSIZE ] { 5009 }
- Constant [ int RPMTAG_MODULARITYLABEL ] { 5096 }
- Constant [ int RPMTAG_N ] { 1000 }
- Constant [ int RPMTAG_NAME ] { 1000 }
- Constant [ int RPMTAG_NEVR ] { 5015 }
- Constant [ int RPMTAG_NEVRA ] { 5016 }
- Constant [ int RPMTAG_NOPATCH ] { 1052 }
- Constant [ int RPMTAG_NOSOURCE ] { 1051 }
- Constant [ int RPMTAG_NVR ] { 5014 }
- Constant [ int RPMTAG_NVRA ] { 1196 }
- Constant [ int RPMTAG_O ] { 1090 }
- Constant [ int RPMTAG_OBSOLETEFLAGS ] { 1114 }
- Constant [ int RPMTAG_OBSOLETENAME ] { 1090 }
- Constant [ int RPMTAG_OBSOLETENEVRS ] { 5043 }
- Constant [ int RPMTAG_OBSOLETES ] { 1090 }
- Constant [ int RPMTAG_OBSOLETEVERSION ] { 1115 }
- Constant [ int RPMTAG_OLDENHANCES ] { 1159 }
- Constant [ int RPMTAG_OLDENHANCESFLAGS ] { 1161 }
- Constant [ int RPMTAG_OLDENHANCESNAME ] { 1159 }
- Constant [ int RPMTAG_OLDENHANCESVERSION ] { 1160 }
- Constant [ int RPMTAG_OLDFILENAMES ] { 1027 }
- Constant [ int RPMTAG_OLDSUGGESTS ] { 1156 }
- Constant [ int RPMTAG_OLDSUGGESTSFLAGS ] { 1158 }
- Constant [ int RPMTAG_OLDSUGGESTSNAME ] { 1156 }
- Constant [ int RPMTAG_OLDSUGGESTSVERSION ] { 1157 }
- Constant [ int RPMTAG_OPTFLAGS ] { 1122 }
- Constant [ int RPMTAG_ORDERFLAGS ] { 5037 }
- Constant [ int RPMTAG_ORDERNAME ] { 5035 }
- Constant [ int RPMTAG_ORDERVERSION ] { 5036 }
- Constant [ int RPMTAG_ORIGBASENAMES ] { 1120 }
- Constant [ int RPMTAG_ORIGDIRINDEXES ] { 1119 }
- Constant [ int RPMTAG_ORIGDIRNAMES ] { 1121 }
- Constant [ int RPMTAG_ORIGFILENAMES ] { 5007 }
- Constant [ int RPMTAG_OS ] { 1021 }
- Constant [ int RPMTAG_P ] { 1047 }
- Constant [ int RPMTAG_PACKAGER ] { 1015 }
- Constant [ int RPMTAG_PATCH ] { 1019 }
- Constant [ int RPMTAG_PATCHESFLAGS ] { 1134 }
- Constant [ int RPMTAG_PATCHESNAME ] { 1133 }
- Constant [ int RPMTAG_PATCHESVERSION ] { 1135 }
- Constant [ int RPMTAG_PAYLOADCOMPRESSOR ] { 1125 }
- Constant [ int RPMTAG_PAYLOADDIGEST ] { 5092 }
- Constant [ int RPMTAG_PAYLOADDIGESTALGO ] { 5093 }
- Constant [ int RPMTAG_PAYLOADFLAGS ] { 1126 }
- Constant [ int RPMTAG_PAYLOADFORMAT ] { 1124 }
- Constant [ int RPMTAG_PKGID ] { 261 }
- Constant [ int RPMTAG_PLATFORM ] { 1132 }
- Constant [ int RPMTAG_POLICIES ] { 1150 }
- Constant [ int RPMTAG_POLICYFLAGS ] { 5033 }
- Constant [ int RPMTAG_POLICYNAMES ] { 5030 }
- Constant [ int RPMTAG_POLICYTYPES ] { 5031 }
- Constant [ int RPMTAG_POLICYTYPESINDEXES ] { 5032 }
- Constant [ int RPMTAG_POSTIN ] { 1024 }
- Constant [ int RPMTAG_POSTINFLAGS ] { 5021 }
- Constant [ int RPMTAG_POSTINPROG ] { 1086 }
- Constant [ int RPMTAG_POSTTRANS ] { 1152 }
- Constant [ int RPMTAG_POSTTRANSFLAGS ] { 5025 }
- Constant [ int RPMTAG_POSTTRANSPROG ] { 1154 }
- Constant [ int RPMTAG_POSTUN ] { 1026 }
- Constant [ int RPMTAG_POSTUNFLAGS ] { 5023 }
- Constant [ int RPMTAG_POSTUNPROG ] { 1088 }
- Constant [ int RPMTAG_PREFIXES ] { 1098 }
- Constant [ int RPMTAG_PREIN ] { 1023 }
- Constant [ int RPMTAG_PREINFLAGS ] { 5020 }
- Constant [ int RPMTAG_PREINPROG ] { 1085 }
- Constant [ int RPMTAG_PRETRANS ] { 1151 }
- Constant [ int RPMTAG_PRETRANSFLAGS ] { 5024 }
- Constant [ int RPMTAG_PRETRANSPROG ] { 1153 }
- Constant [ int RPMTAG_PREUN ] { 1025 }
- Constant [ int RPMTAG_PREUNFLAGS ] { 5022 }
- Constant [ int RPMTAG_PREUNPROG ] { 1087 }
- Constant [ int RPMTAG_PROVIDEFLAGS ] { 1112 }
- Constant [ int RPMTAG_PROVIDENAME ] { 1047 }
- Constant [ int RPMTAG_PROVIDENEVRS ] { 5042 }
- Constant [ int RPMTAG_PROVIDES ] { 1047 }
- Constant [ int RPMTAG_PROVIDEVERSION ] { 1113 }
- Constant [ int RPMTAG_PUBKEYS ] { 266 }
- Constant [ int RPMTAG_R ] { 1002 }
- Constant [ int RPMTAG_RECOMMENDFLAGS ] { 5048 }
- Constant [ int RPMTAG_RECOMMENDNAME ] { 5046 }
- Constant [ int RPMTAG_RECOMMENDNEVRS ] { 5058 }
- Constant [ int RPMTAG_RECOMMENDS ] { 5046 }
- Constant [ int RPMTAG_RECOMMENDVERSION ] { 5047 }
- Constant [ int RPMTAG_RECONTEXTS ] { 1149 }
- Constant [ int RPMTAG_RELEASE ] { 1002 }
- Constant [ int RPMTAG_REMOVETID ] { 1129 }
- Constant [ int RPMTAG_REQUIREFLAGS ] { 1048 }
- Constant [ int RPMTAG_REQUIRENAME ] { 1049 }
- Constant [ int RPMTAG_REQUIRENEVRS ] { 5041 }
- Constant [ int RPMTAG_REQUIRES ] { 1049 }
- Constant [ int RPMTAG_REQUIREVERSION ] { 1050 }
- Constant [ int RPMTAG_RPMVERSION ] { 1064 }
- Constant [ int RPMTAG_RSAHEADER ] { 268 }
- Constant [ int RPMTAG_SHA1HEADER ] { 269 }
- Constant [ int RPMTAG_SHA256HEADER ] { 273 }
- Constant [ int RPMTAG_SIGGPG ] { 262 }
- Constant [ int RPMTAG_SIGMD5 ] { 261 }
- Constant [ int RPMTAG_SIGPGP ] { 259 }
- Constant [ int RPMTAG_SIGSIZE ] { 257 }
- Constant [ int RPMTAG_SIZE ] { 1009 }
- Constant [ int RPMTAG_SOURCE ] { 1018 }
- Constant [ int RPMTAG_SOURCEPACKAGE ] { 1106 }
- Constant [ int RPMTAG_SOURCEPKGID ] { 1146 }
- Constant [ int RPMTAG_SOURCERPM ] { 1044 }
- Constant [ int RPMTAG_SUGGESTFLAGS ] { 5051 }
- Constant [ int RPMTAG_SUGGESTNAME ] { 5049 }
- Constant [ int RPMTAG_SUGGESTNEVRS ] { 5059 }
- Constant [ int RPMTAG_SUGGESTS ] { 5049 }
- Constant [ int RPMTAG_SUGGESTVERSION ] { 5050 }
- Constant [ int RPMTAG_SUMMARY ] { 1004 }
- Constant [ int RPMTAG_SUPPLEMENTFLAGS ] { 5054 }
- Constant [ int RPMTAG_SUPPLEMENTNAME ] { 5052 }
- Constant [ int RPMTAG_SUPPLEMENTNEVRS ] { 5060 }
- Constant [ int RPMTAG_SUPPLEMENTS ] { 5052 }
- Constant [ int RPMTAG_SUPPLEMENTVERSION ] { 5053 }
- Constant [ int RPMTAG_TRANSFILETRIGGERCONDS ] { 5088 }
- Constant [ int RPMTAG_TRANSFILETRIGGERFLAGS ] { 5082 }
- Constant [ int RPMTAG_TRANSFILETRIGGERINDEX ] { 5080 }
- Constant [ int RPMTAG_TRANSFILETRIGGERNAME ] { 5079 }
- Constant [ int RPMTAG_TRANSFILETRIGGERPRIORITIES ] { 5085 }
- Constant [ int RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS ] { 5078 }
- Constant [ int RPMTAG_TRANSFILETRIGGERSCRIPTPROG ] { 5077 }
- Constant [ int RPMTAG_TRANSFILETRIGGERSCRIPTS ] { 5076 }
- Constant [ int RPMTAG_TRANSFILETRIGGERTYPE ] { 5089 }
- Constant [ int RPMTAG_TRANSFILETRIGGERVERSION ] { 5081 }
- Constant [ int RPMTAG_TRIGGERCONDS ] { 5005 }
- Constant [ int RPMTAG_TRIGGERFLAGS ] { 1068 }
- Constant [ int RPMTAG_TRIGGERINDEX ] { 1069 }
- Constant [ int RPMTAG_TRIGGERNAME ] { 1066 }
- Constant [ int RPMTAG_TRIGGERSCRIPTFLAGS ] { 5027 }
- Constant [ int RPMTAG_TRIGGERSCRIPTPROG ] { 1092 }
- Constant [ int RPMTAG_TRIGGERSCRIPTS ] { 1065 }
- Constant [ int RPMTAG_TRIGGERTYPE ] { 5006 }
- Constant [ int RPMTAG_TRIGGERVERSION ] { 1067 }
- Constant [ int RPMTAG_URL ] { 1020 }
- Constant [ int RPMTAG_V ] { 1001 }
- Constant [ int RPMTAG_VCS ] { 5034 }
- Constant [ int RPMTAG_VENDOR ] { 1011 }
- Constant [ int RPMTAG_VERBOSE ] { 5018 }
- Constant [ int RPMTAG_VERIFYSCRIPT ] { 1079 }
- Constant [ int RPMTAG_VERIFYSCRIPTFLAGS ] { 5026 }
- Constant [ int RPMTAG_VERIFYSCRIPTPROG ] { 1091 }
- Constant [ int RPMTAG_VERSION ] { 1001 }
- Constant [ int RPMTAG_XPM ] { 1013 }
+ - Constants [295] {
+ Constant [ <persistent> string RPMVERSION ] { 6.0.1 }
+ Constant [ <persistent> int RPMSENSE_ANY ] { 0 }
+ Constant [ <persistent> int RPMSENSE_LESS ] { 2 }
+ Constant [ <persistent> int RPMSENSE_GREATER ] { 4 }
+ Constant [ <persistent> int RPMSENSE_EQUAL ] { 8 }
+ Constant [ <persistent> int RPMSENSE_POSTTRANS ] { 32 }
+ Constant [ <persistent> int RPMSENSE_PREREQ ] { 64 }
+ Constant [ <persistent> int RPMSENSE_PRETRANS ] { 128 }
+ Constant [ <persistent> int RPMSENSE_INTERP ] { 256 }
+ Constant [ <persistent> int RPMSENSE_SCRIPT_PRE ] { 512 }
+ Constant [ <persistent> int RPMSENSE_SCRIPT_POST ] { 1024 }
+ Constant [ <persistent> int RPMSENSE_SCRIPT_PREUN ] { 2048 }
+ Constant [ <persistent> int RPMSENSE_SCRIPT_POSTUN ] { 4096 }
+ Constant [ <persistent> int RPMSENSE_SCRIPT_VERIFY ] { 8192 }
+ Constant [ <persistent> int RPMSENSE_FIND_REQUIRES ] { 16384 }
+ Constant [ <persistent> int RPMSENSE_FIND_PROVIDES ] { 32768 }
+ Constant [ <persistent> int RPMSENSE_TRIGGERIN ] { 65536 }
+ Constant [ <persistent> int RPMSENSE_TRIGGERUN ] { 131072 }
+ Constant [ <persistent> int RPMSENSE_TRIGGERPOSTUN ] { 262144 }
+ Constant [ <persistent> int RPMSENSE_MISSINGOK ] { 524288 }
+ Constant [ <persistent> int RPMSENSE_RPMLIB ] { 16777216 }
+ Constant [ <persistent> int RPMSENSE_TRIGGERPREIN ] { 33554432 }
+ Constant [ <persistent> int RPMSENSE_KEYRING ] { 67108864 }
+ Constant [ <persistent> int RPMSENSE_CONFIG ] { 268435456 }
+ Constant [ <persistent> int RPMMIRE_DEFAULT ] { 0 }
+ Constant [ <persistent> int RPMMIRE_STRCMP ] { 1 }
+ Constant [ <persistent> int RPMMIRE_REGEX ] { 2 }
+ Constant [ <persistent> int RPMMIRE_GLOB ] { 3 }
+ Constant [ <persistent> int RPMTAG_ARCH ] { 1022 }
+ Constant [ <persistent> int RPMTAG_ARCHIVESIZE ] { 1046 }
+ Constant [ <persistent> int RPMTAG_ARCHSUFFIX ] { 5098 }
+ Constant [ <persistent> int RPMTAG_BASENAMES ] { 1117 }
+ Constant [ <persistent> int RPMTAG_BUGURL ] { 5012 }
+ Constant [ <persistent> int RPMTAG_BUILDARCHS ] { 1089 }
+ Constant [ <persistent> int RPMTAG_BUILDHOST ] { 1007 }
+ Constant [ <persistent> int RPMTAG_BUILDTIME ] { 1006 }
+ Constant [ <persistent> int RPMTAG_C ] { 1054 }
+ Constant [ <persistent> int RPMTAG_CHANGELOGNAME ] { 1081 }
+ Constant [ <persistent> int RPMTAG_CHANGELOGTEXT ] { 1082 }
+ Constant [ <persistent> int RPMTAG_CHANGELOGTIME ] { 1080 }
+ Constant [ <persistent> int RPMTAG_CLASSDICT ] { 1142 }
+ Constant [ <persistent> int RPMTAG_CONFLICTFLAGS ] { 1053 }
+ Constant [ <persistent> int RPMTAG_CONFLICTNAME ] { 1054 }
+ Constant [ <persistent> int RPMTAG_CONFLICTNEVRS ] { 5044 }
+ Constant [ <persistent> int RPMTAG_CONFLICTS ] { 1054 }
+ Constant [ <persistent> int RPMTAG_CONFLICTVERSION ] { 1055 }
+ Constant [ <persistent> int RPMTAG_COOKIE ] { 1094 }
+ Constant [ <persistent> int RPMTAG_DBINSTANCE ] { 1195 }
+ Constant [ <persistent> int RPMTAG_DEPENDSDICT ] { 1145 }
+ Constant [ <persistent> int RPMTAG_DESCRIPTION ] { 1005 }
+ Constant [ <persistent> int RPMTAG_DIRINDEXES ] { 1116 }
+ Constant [ <persistent> int RPMTAG_DIRNAMES ] { 1118 }
+ Constant [ <persistent> int RPMTAG_DISTRIBUTION ] { 1010 }
+ Constant [ <persistent> int RPMTAG_DISTTAG ] { 1155 }
+ Constant [ <persistent> int RPMTAG_DISTURL ] { 1123 }
+ Constant [ <persistent> int RPMTAG_DSAHEADER ] { 267 }
+ Constant [ <persistent> int RPMTAG_E ] { 1003 }
+ Constant [ <persistent> int RPMTAG_ENCODING ] { 5062 }
+ Constant [ <persistent> int RPMTAG_ENHANCEFLAGS ] { 5057 }
+ Constant [ <persistent> int RPMTAG_ENHANCENAME ] { 5055 }
+ Constant [ <persistent> int RPMTAG_ENHANCENEVRS ] { 5061 }
+ Constant [ <persistent> int RPMTAG_ENHANCES ] { 5055 }
+ Constant [ <persistent> int RPMTAG_ENHANCEVERSION ] { 5056 }
+ Constant [ <persistent> int RPMTAG_EPOCH ] { 1003 }
+ Constant [ <persistent> int RPMTAG_EPOCHNUM ] { 5019 }
+ Constant [ <persistent> int RPMTAG_EVR ] { 5013 }
+ Constant [ <persistent> int RPMTAG_EXCLUDEARCH ] { 1059 }
+ Constant [ <persistent> int RPMTAG_EXCLUDEOS ] { 1060 }
+ Constant [ <persistent> int RPMTAG_EXCLUSIVEARCH ] { 1061 }
+ Constant [ <persistent> int RPMTAG_EXCLUSIVEOS ] { 1062 }
+ Constant [ <persistent> int RPMTAG_FILECAPS ] { 5010 }
+ Constant [ <persistent> int RPMTAG_FILECLASS ] { 1141 }
+ Constant [ <persistent> int RPMTAG_FILECOLORS ] { 1140 }
+ Constant [ <persistent> int RPMTAG_FILECONTEXTS ] { 1147 }
+ Constant [ <persistent> int RPMTAG_FILEDEPENDSN ] { 1144 }
+ Constant [ <persistent> int RPMTAG_FILEDEPENDSX ] { 1143 }
+ Constant [ <persistent> int RPMTAG_FILEDEVICES ] { 1095 }
+ Constant [ <persistent> int RPMTAG_FILEDIGESTALGO ] { 5011 }
+ Constant [ <persistent> int RPMTAG_FILEDIGESTS ] { 1035 }
+ Constant [ <persistent> int RPMTAG_FILEFLAGS ] { 1037 }
+ Constant [ <persistent> int RPMTAG_FILEGROUPNAME ] { 1040 }
+ Constant [ <persistent> int RPMTAG_FILEINODES ] { 1096 }
+ Constant [ <persistent> int RPMTAG_FILELANGS ] { 1097 }
+ Constant [ <persistent> int RPMTAG_FILELINKTOS ] { 1036 }
+ Constant [ <persistent> int RPMTAG_FILEMD5S ] { 1035 }
+ Constant [ <persistent> int RPMTAG_FILEMIMEINDEX ] { 5115 }
+ Constant [ <persistent> int RPMTAG_FILEMIMES ] { 5117 }
+ Constant [ <persistent> int RPMTAG_FILEMODES ] { 1030 }
+ Constant [ <persistent> int RPMTAG_FILEMTIMES ] { 1034 }
+ Constant [ <persistent> int RPMTAG_FILENAMES ] { 5000 }
+ Constant [ <persistent> int RPMTAG_FILENLINKS ] { 5045 }
+ Constant [ <persistent> int RPMTAG_FILEPROVIDE ] { 5001 }
+ Constant [ <persistent> int RPMTAG_FILERDEVS ] { 1033 }
+ Constant [ <persistent> int RPMTAG_FILEREQUIRE ] { 5002 }
+ Constant [ <persistent> int RPMTAG_FILESIGNATURELENGTH ] { 5091 }
+ Constant [ <persistent> int RPMTAG_FILESIGNATURES ] { 5090 }
+ Constant [ <persistent> int RPMTAG_FILESIZES ] { 1028 }
+ Constant [ <persistent> int RPMTAG_FILESTATES ] { 1029 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERCONDS ] { 5086 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERFLAGS ] { 5072 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERINDEX ] { 5070 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERNAME ] { 5069 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERPRIORITIES ] { 5084 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERSCRIPTFLAGS ] { 5068 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERSCRIPTPROG ] { 5067 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERSCRIPTS ] { 5066 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERTYPE ] { 5087 }
+ Constant [ <persistent> int RPMTAG_FILETRIGGERVERSION ] { 5071 }
+ Constant [ <persistent> int RPMTAG_FILEUSERNAME ] { 1039 }
+ Constant [ <persistent> int RPMTAG_FILEVERIFYFLAGS ] { 1045 }
+ Constant [ <persistent> int RPMTAG_FSCONTEXTS ] { 1148 }
+ Constant [ <persistent> int RPMTAG_GIF ] { 1012 }
+ Constant [ <persistent> int RPMTAG_GROUP ] { 1016 }
+ Constant [ <persistent> int RPMTAG_HEADERCOLOR ] { 5017 }
+ Constant [ <persistent> int RPMTAG_HEADERI18NTABLE ] { 100 }
+ Constant [ <persistent> int RPMTAG_HEADERIMMUTABLE ] { 63 }
+ Constant [ <persistent> int RPMTAG_ICON ] { 1043 }
+ Constant [ <persistent> int RPMTAG_INSTALLCOLOR ] { 1127 }
+ Constant [ <persistent> int RPMTAG_INSTALLTID ] { 1128 }
+ Constant [ <persistent> int RPMTAG_INSTALLTIME ] { 1008 }
+ Constant [ <persistent> int RPMTAG_INSTFILENAMES ] { 5040 }
+ Constant [ <persistent> int RPMTAG_INSTPREFIXES ] { 1099 }
+ Constant [ <persistent> int RPMTAG_LICENSE ] { 1014 }
+ Constant [ <persistent> int RPMTAG_LONGARCHIVESIZE ] { 271 }
+ Constant [ <persistent> int RPMTAG_LONGFILESIZES ] { 5008 }
+ Constant [ <persistent> int RPMTAG_LONGSIGSIZE ] { 270 }
+ Constant [ <persistent> int RPMTAG_LONGSIZE ] { 5009 }
+ Constant [ <persistent> int RPMTAG_MIMEDICT ] { 5116 }
+ Constant [ <persistent> int RPMTAG_MODULARITYLABEL ] { 5096 }
+ Constant [ <persistent> int RPMTAG_N ] { 1000 }
+ Constant [ <persistent> int RPMTAG_NAME ] { 1000 }
+ Constant [ <persistent> int RPMTAG_NEVR ] { 5015 }
+ Constant [ <persistent> int RPMTAG_NEVRA ] { 5016 }
+ Constant [ <persistent> int RPMTAG_NOPATCH ] { 1052 }
+ Constant [ <persistent> int RPMTAG_NOSOURCE ] { 1051 }
+ Constant [ <persistent> int RPMTAG_NVR ] { 5014 }
+ Constant [ <persistent> int RPMTAG_NVRA ] { 1196 }
+ Constant [ <persistent> int RPMTAG_O ] { 1090 }
+ Constant [ <persistent> int RPMTAG_OBSOLETEFLAGS ] { 1114 }
+ Constant [ <persistent> int RPMTAG_OBSOLETENAME ] { 1090 }
+ Constant [ <persistent> int RPMTAG_OBSOLETENEVRS ] { 5043 }
+ Constant [ <persistent> int RPMTAG_OBSOLETES ] { 1090 }
+ Constant [ <persistent> int RPMTAG_OBSOLETEVERSION ] { 1115 }
+ Constant [ <persistent> int RPMTAG_OLDENHANCES ] { 1159 }
+ Constant [ <persistent> int RPMTAG_OLDENHANCESFLAGS ] { 1161 }
+ Constant [ <persistent> int RPMTAG_OLDENHANCESNAME ] { 1159 }
+ Constant [ <persistent> int RPMTAG_OLDENHANCESVERSION ] { 1160 }
+ Constant [ <persistent> int RPMTAG_OLDFILENAMES ] { 1027 }
+ Constant [ <persistent> int RPMTAG_OLDSUGGESTS ] { 1156 }
+ Constant [ <persistent> int RPMTAG_OLDSUGGESTSFLAGS ] { 1158 }
+ Constant [ <persistent> int RPMTAG_OLDSUGGESTSNAME ] { 1156 }
+ Constant [ <persistent> int RPMTAG_OLDSUGGESTSVERSION ] { 1157 }
+ Constant [ <persistent> int RPMTAG_OPENPGP ] { 278 }
+ Constant [ <persistent> int RPMTAG_OPTFLAGS ] { 1122 }
+ Constant [ <persistent> int RPMTAG_ORDERFLAGS ] { 5037 }
+ Constant [ <persistent> int RPMTAG_ORDERNAME ] { 5035 }
+ Constant [ <persistent> int RPMTAG_ORDERVERSION ] { 5036 }
+ Constant [ <persistent> int RPMTAG_ORIGBASENAMES ] { 1120 }
+ Constant [ <persistent> int RPMTAG_ORIGDIRINDEXES ] { 1119 }
+ Constant [ <persistent> int RPMTAG_ORIGDIRNAMES ] { 1121 }
+ Constant [ <persistent> int RPMTAG_ORIGFILENAMES ] { 5007 }
+ Constant [ <persistent> int RPMTAG_OS ] { 1021 }
+ Constant [ <persistent> int RPMTAG_P ] { 1047 }
+ Constant [ <persistent> int RPMTAG_PACKAGEDIGESTALGOS ] { 5119 }
+ Constant [ <persistent> int RPMTAG_PACKAGEDIGESTS ] { 5118 }
+ Constant [ <persistent> int RPMTAG_PACKAGER ] { 1015 }
+ Constant [ <persistent> int RPMTAG_PATCH ] { 1019 }
+ Constant [ <persistent> int RPMTAG_PATCHESFLAGS ] { 1134 }
+ Constant [ <persistent> int RPMTAG_PATCHESNAME ] { 1133 }
+ Constant [ <persistent> int RPMTAG_PATCHESVERSION ] { 1135 }
+ Constant [ <persistent> int RPMTAG_PAYLOADCOMPRESSOR ] { 1125 }
+ Constant [ <persistent> int RPMTAG_PAYLOADFLAGS ] { 1126 }
+ Constant [ <persistent> int RPMTAG_PAYLOADFORMAT ] { 1124 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA256 ] { 5092 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA256ALGO ] { 5093 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA256ALT ] { 5097 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA3_256 ] { 5123 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA3_256ALT ] { 5124 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA512 ] { 5121 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSHA512ALT ] { 5122 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSIZE ] { 5112 }
+ Constant [ <persistent> int RPMTAG_PAYLOADSIZEALT ] { 5113 }
+ Constant [ <persistent> int RPMTAG_PLATFORM ] { 1132 }
+ Constant [ <persistent> int RPMTAG_POLICIES ] { 1150 }
+ Constant [ <persistent> int RPMTAG_POLICYFLAGS ] { 5033 }
+ Constant [ <persistent> int RPMTAG_POLICYNAMES ] { 5030 }
+ Constant [ <persistent> int RPMTAG_POLICYTYPES ] { 5031 }
+ Constant [ <persistent> int RPMTAG_POLICYTYPESINDEXES ] { 5032 }
+ Constant [ <persistent> int RPMTAG_POSTIN ] { 1024 }
+ Constant [ <persistent> int RPMTAG_POSTINFLAGS ] { 5021 }
+ Constant [ <persistent> int RPMTAG_POSTINPROG ] { 1086 }
+ Constant [ <persistent> int RPMTAG_POSTTRANS ] { 1152 }
+ Constant [ <persistent> int RPMTAG_POSTTRANSFLAGS ] { 5025 }
+ Constant [ <persistent> int RPMTAG_POSTTRANSPROG ] { 1154 }
+ Constant [ <persistent> int RPMTAG_POSTUN ] { 1026 }
+ Constant [ <persistent> int RPMTAG_POSTUNFLAGS ] { 5023 }
+ Constant [ <persistent> int RPMTAG_POSTUNPROG ] { 1088 }
+ Constant [ <persistent> int RPMTAG_POSTUNTRANS ] { 5104 }
+ Constant [ <persistent> int RPMTAG_POSTUNTRANSFLAGS ] { 5108 }
+ Constant [ <persistent> int RPMTAG_POSTUNTRANSPROG ] { 5106 }
+ Constant [ <persistent> int RPMTAG_PREFIXES ] { 1098 }
+ Constant [ <persistent> int RPMTAG_PREIN ] { 1023 }
+ Constant [ <persistent> int RPMTAG_PREINFLAGS ] { 5020 }
+ Constant [ <persistent> int RPMTAG_PREINPROG ] { 1085 }
+ Constant [ <persistent> int RPMTAG_PRETRANS ] { 1151 }
+ Constant [ <persistent> int RPMTAG_PRETRANSFLAGS ] { 5024 }
+ Constant [ <persistent> int RPMTAG_PRETRANSPROG ] { 1153 }
+ Constant [ <persistent> int RPMTAG_PREUN ] { 1025 }
+ Constant [ <persistent> int RPMTAG_PREUNFLAGS ] { 5022 }
+ Constant [ <persistent> int RPMTAG_PREUNPROG ] { 1087 }
+ Constant [ <persistent> int RPMTAG_PREUNTRANS ] { 5103 }
+ Constant [ <persistent> int RPMTAG_PREUNTRANSFLAGS ] { 5107 }
+ Constant [ <persistent> int RPMTAG_PREUNTRANSPROG ] { 5105 }
+ Constant [ <persistent> int RPMTAG_PROVIDEFLAGS ] { 1112 }
+ Constant [ <persistent> int RPMTAG_PROVIDENAME ] { 1047 }
+ Constant [ <persistent> int RPMTAG_PROVIDENEVRS ] { 5042 }
+ Constant [ <persistent> int RPMTAG_PROVIDES ] { 1047 }
+ Constant [ <persistent> int RPMTAG_PROVIDEVERSION ] { 1113 }
+ Constant [ <persistent> int RPMTAG_PUBKEYS ] { 266 }
+ Constant [ <persistent> int RPMTAG_R ] { 1002 }
+ Constant [ <persistent> int RPMTAG_RECOMMENDFLAGS ] { 5048 }
+ Constant [ <persistent> int RPMTAG_RECOMMENDNAME ] { 5046 }
+ Constant [ <persistent> int RPMTAG_RECOMMENDNEVRS ] { 5058 }
+ Constant [ <persistent> int RPMTAG_RECOMMENDS ] { 5046 }
+ Constant [ <persistent> int RPMTAG_RECOMMENDVERSION ] { 5047 }
+ Constant [ <persistent> int RPMTAG_RECONTEXTS ] { 1149 }
+ Constant [ <persistent> int RPMTAG_RELEASE ] { 1002 }
+ Constant [ <persistent> int RPMTAG_REMOVETID ] { 1129 }
+ Constant [ <persistent> int RPMTAG_REQUIREFLAGS ] { 1048 }
+ Constant [ <persistent> int RPMTAG_REQUIRENAME ] { 1049 }
+ Constant [ <persistent> int RPMTAG_REQUIRENEVRS ] { 5041 }
+ Constant [ <persistent> int RPMTAG_REQUIRES ] { 1049 }
+ Constant [ <persistent> int RPMTAG_REQUIREVERSION ] { 1050 }
+ Constant [ <persistent> int RPMTAG_RPMFORMAT ] { 5114 }
+ Constant [ <persistent> int RPMTAG_RPMVERSION ] { 1064 }
+ Constant [ <persistent> int RPMTAG_RSAHEADER ] { 268 }
+ Constant [ <persistent> int RPMTAG_SHA1HEADER ] { 269 }
+ Constant [ <persistent> int RPMTAG_SHA256HEADER ] { 273 }
+ Constant [ <persistent> int RPMTAG_SHA3_256HEADER ] { 279 }
+ Constant [ <persistent> int RPMTAG_SIGGPG ] { 262 }
+ Constant [ <persistent> int RPMTAG_SIGMD5 ] { 261 }
+ Constant [ <persistent> int RPMTAG_SIGPGP ] { 259 }
+ Constant [ <persistent> int RPMTAG_SIGSIZE ] { 257 }
+ Constant [ <persistent> int RPMTAG_SIZE ] { 1009 }
+ Constant [ <persistent> int RPMTAG_SOURCE ] { 1018 }
+ Constant [ <persistent> int RPMTAG_SOURCENEVR ] { 5120 }
+ Constant [ <persistent> int RPMTAG_SOURCEPACKAGE ] { 1106 }
+ Constant [ <persistent> int RPMTAG_SOURCERPM ] { 1044 }
+ Constant [ <persistent> int RPMTAG_SOURCESIGMD5 ] { 1146 }
+ Constant [ <persistent> int RPMTAG_SPEC ] { 5099 }
+ Constant [ <persistent> int RPMTAG_SUGGESTFLAGS ] { 5051 }
+ Constant [ <persistent> int RPMTAG_SUGGESTNAME ] { 5049 }
+ Constant [ <persistent> int RPMTAG_SUGGESTNEVRS ] { 5059 }
+ Constant [ <persistent> int RPMTAG_SUGGESTS ] { 5049 }
+ Constant [ <persistent> int RPMTAG_SUGGESTVERSION ] { 5050 }
+ Constant [ <persistent> int RPMTAG_SUMMARY ] { 1004 }
+ Constant [ <persistent> int RPMTAG_SUPPLEMENTFLAGS ] { 5054 }
+ Constant [ <persistent> int RPMTAG_SUPPLEMENTNAME ] { 5052 }
+ Constant [ <persistent> int RPMTAG_SUPPLEMENTNEVRS ] { 5060 }
+ Constant [ <persistent> int RPMTAG_SUPPLEMENTS ] { 5052 }
+ Constant [ <persistent> int RPMTAG_SUPPLEMENTVERSION ] { 5053 }
+ Constant [ <persistent> int RPMTAG_SYSUSERS ] { 5109 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERCONDS ] { 5088 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERFLAGS ] { 5082 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERINDEX ] { 5080 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERNAME ] { 5079 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERPRIORITIES ] { 5085 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS ] { 5078 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERSCRIPTPROG ] { 5077 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERSCRIPTS ] { 5076 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERTYPE ] { 5089 }
+ Constant [ <persistent> int RPMTAG_TRANSFILETRIGGERVERSION ] { 5081 }
+ Constant [ <persistent> int RPMTAG_TRANSLATIONURL ] { 5100 }
+ Constant [ <persistent> int RPMTAG_TRIGGERCONDS ] { 5005 }
+ Constant [ <persistent> int RPMTAG_TRIGGERFLAGS ] { 1068 }
+ Constant [ <persistent> int RPMTAG_TRIGGERINDEX ] { 1069 }
+ Constant [ <persistent> int RPMTAG_TRIGGERNAME ] { 1066 }
+ Constant [ <persistent> int RPMTAG_TRIGGERSCRIPTFLAGS ] { 5027 }
+ Constant [ <persistent> int RPMTAG_TRIGGERSCRIPTPROG ] { 1092 }
+ Constant [ <persistent> int RPMTAG_TRIGGERSCRIPTS ] { 1065 }
+ Constant [ <persistent> int RPMTAG_TRIGGERTYPE ] { 5006 }
+ Constant [ <persistent> int RPMTAG_TRIGGERVERSION ] { 1067 }
+ Constant [ <persistent> int RPMTAG_UPSTREAMRELEASES ] { 5101 }
+ Constant [ <persistent> int RPMTAG_URL ] { 1020 }
+ Constant [ <persistent> int RPMTAG_V ] { 1001 }
+ Constant [ <persistent> int RPMTAG_VCS ] { 5034 }
+ Constant [ <persistent> int RPMTAG_VENDOR ] { 1011 }
+ Constant [ <persistent> int RPMTAG_VERBOSE ] { 5018 }
+ Constant [ <persistent> int RPMTAG_VERIFYSCRIPT ] { 1079 }
+ Constant [ <persistent> int RPMTAG_VERIFYSCRIPTFLAGS ] { 5026 }
+ Constant [ <persistent> int RPMTAG_VERIFYSCRIPTPROG ] { 1091 }
+ Constant [ <persistent> int RPMTAG_VERITYSIGNATUREALGO ] { 277 }
+ Constant [ <persistent> int RPMTAG_VERITYSIGNATURES ] { 276 }
+ Constant [ <persistent> int RPMTAG_VERSION ] { 1001 }
+ Constant [ <persistent> int RPMTAG_XPM ] { 1013 }
}
- Functions {
@@ -286,37 +310,67 @@ Extension [ <persistent> extension #15 rpminfo version 0.5.0 ] {
- Parameters [2] {
Parameter #0 [ <required> string $nevr ]
- Parameter #1 [ <optional> bool $full ]
+ Parameter #1 [ <optional> bool $full = false ]
}
- - Return [ array or NULL ]
+ - Return [ ?array ]
}
Function [ <internal:rpminfo> function rpmdbsearch ] {
- Parameters [4] {
Parameter #0 [ <required> string $pattern ]
- Parameter #1 [ <optional> int $rpmtag ]
- Parameter #2 [ <optional> int $rpmmire ]
- Parameter #3 [ <optional> bool $full ]
+ Parameter #1 [ <optional> int $rpmtag = RPMTAG_NAME ]
+ Parameter #2 [ <optional> int $rpmmire = -1 ]
+ Parameter #3 [ <optional> bool $full = false ]
}
- - Return [ array or NULL ]
+ - Return [ ?array ]
}
Function [ <internal:rpminfo> function rpminfo ] {
- Parameters [3] {
Parameter #0 [ <required> string $path ]
- Parameter #1 [ <optional> bool $full ]
- Parameter #2 [ <optional> string or NULL &$error ]
+ Parameter #1 [ <optional> bool $full = false ]
+ Parameter #2 [ <optional> ?string &$error = null ]
}
- - Return [ array or NULL ]
+ - Return [ ?array ]
}
Function [ <internal:rpminfo> function rpmvercmp ] {
- - Parameters [2] {
+ - Parameters [3] {
Parameter #0 [ <required> string $evr1 ]
Parameter #1 [ <required> string $evr2 ]
+ Parameter #2 [ <optional> ?string $operator = null ]
+ }
+ - Return [ int|bool ]
+ }
+ Function [ <internal:rpminfo> function rpmgetsymlink ] {
+
+ - Parameters [2] {
+ Parameter #0 [ <required> string $path ]
+ Parameter #1 [ <required> string $name ]
+ }
+ - Return [ ?string ]
+ }
+ Function [ <internal:rpminfo> function rpmexpand ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> string $text ]
+ }
+ - Return [ string ]
+ }
+ Function [ <internal:rpminfo> function rpmexpandnumeric ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> string $text ]
}
- Return [ int ]
}
+ Function [ <internal:rpminfo> function rpmdefine ] {
+
+ - Parameters [1] {
+ Parameter #0 [ <required> string $macro ]
+ }
+ - Return [ bool ]
+ }
}
}
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..6d62481
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,14 @@
+{
+ "name": "remi/rpminfo",
+ "type": "php-ext",
+ "license": "PHP-3.01",
+ "description": "RPM information",
+ "require": {
+ "php": ">= 8.0.0"
+ },
+ "php-ext": {
+ "extension-name": "rpminfo",
+ "os-families": ["linux"],
+ "configure-options": []
+ }
+}
diff --git a/config.m4 b/config.m4
index 49f6f1d..abff0a9 100644
--- a/config.m4
+++ b/config.m4
@@ -4,27 +4,10 @@ PHP_ARG_ENABLE(rpminfo, whether to enable rpminfo support,
[ --enable-rpminfo Enable rpminfo support])
if test "$PHP_RPMINFO" != "no"; then
- dnl Write more examples of tests here...
- AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ PKG_CHECK_MODULES([LIBRPM], [rpm >= 4.13])
- AC_MSG_CHECKING(for librpm)
- if test -x "$PKG_CONFIG" && $PKG_CONFIG --exists rpm; then
- if $PKG_CONFIG rpm --atleast-version 4.11.3; then
- LIBRPM_CFLAGS=`$PKG_CONFIG rpm --cflags`
- LIBRPM_LIBDIR=`$PKG_CONFIG rpm --libs`
- LIBRPM_VERSON=`$PKG_CONFIG rpm --modversion`
- AC_MSG_RESULT(from pkgconfig: version $LIBRPM_VERSON)
- if $PKG_CONFIG rpm --atleast-version 4.13; then
- AC_DEFINE(HAVE_WEAKDEP, 1, [ Indexes on weak dependency field since RPM 4.13 ])
- fi
- else
- AC_MSG_ERROR(system librpm is too old: version 4.11.3 required)
- fi
- else
- AC_MSG_ERROR(pkg-config not found)
- fi
- PHP_EVAL_LIBLINE($LIBRPM_LIBDIR, RPMINFO_SHARED_LIBADD)
+ PHP_EVAL_LIBLINE($LIBRPM_LIBS, RPMINFO_SHARED_LIBADD)
PHP_EVAL_INCLINE($LIBRPM_CFLAGS)
PHP_SUBST(RPMINFO_SHARED_LIBADD)
diff --git a/package.xml b/package.xml
index 38d8f04..58b197e 100644
--- a/package.xml
+++ b/package.xml
@@ -13,21 +13,20 @@ Documentation: https://www.php.net/rpminfo
<email>remi@php.net</email>
<active>yes</active>
</lead>
- <date>2020-09-23</date>
+ <date>2025-09-25</date>
<version>
- <release>0.6.0dev</release>
- <api>0.5.0</api>
+ <release>1.2.1</release>
+ <api>1.2.0</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
- <license>PHP 3.01</license>
- <notes>
-- generate arginfo from stub and add missing default values
-- raise dependency on PHP 7.2
-- raise exception on bad parameter value with PHP 8
- </notes>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes><![CDATA[
+- use RPMTAG_SIGMD5 instead of RPMTAG_PKGID removed in RPM 6
+- use RPMTAG_SHA1HEADER instead of RPMTAG_HDRID removed in RPM 6
+ ]]></notes>
<contents>
<dir name="/">
<!-- sources -->
@@ -40,6 +39,7 @@ Documentation: https://www.php.net/rpminfo
<file name="CREDITS" role="doc"/>
<file name="LICENSE" role="doc"/>
<file name="README.md" role="doc"/>
+ <file name="CHANGELOG.md" role="doc"/>
<dir name ="examples">
<file name="repomanage.php" role="doc"/>
<file name="rpmvercmp.php" role="doc"/>
@@ -55,10 +55,11 @@ Documentation: https://www.php.net/rpminfo
<file name="007-rpmdbinfo.phpt" role="test"/>
<file name="008-rpmdbsearch.phpt" role="test"/>
<file name="009-rpmdbinfo2.phpt" role="test"/>
- <file name="010-rpmvercmp_error7.phpt" role="test"/>
<file name="011-rpmvercmp_error8.phpt" role="test"/>
<file name="012-rpmaddtag.phpt" role="test"/>
<file name="013-rpmdbsearch-error.phpt" role="test"/>
+ <file name="014-stream.phpt" role="test"/>
+ <file name="015-rpmmacro.phpt" role="test"/>
<file name="bidon.rpm" role="test"/>
<file name="bidon-src.rpm" role="test"/>
</dir>
@@ -67,7 +68,7 @@ Documentation: https://www.php.net/rpminfo
<dependencies>
<required>
<php>
- <min>7.2.0</min>
+ <min>8.0.0</min>
</php>
<pearinstaller>
<min>1.10.0</min>
@@ -78,6 +79,118 @@ Documentation: https://www.php.net/rpminfo
<extsrcrelease/>
<changelog>
<release>
+ <date>2024-12-19</date>
+ <version>
+ <release>1.2.0</release>
+ <api>1.2.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes><![CDATA[
+- add rpmexpand, rpmexpandnumeric to retrieve rpm macro value
+- add rpmdefine to set rpm macro value
+ ]]></notes>
+ </release>
+ <release>
+ <date>2024-09-03</date>
+ <version>
+ <release>1.1.1</release>
+ <api>1.1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes><![CDATA[
+- display author and license in phpinfo
+- drop support for librpm < 4.13
+ ]]></notes>
+ </release>
+ <release>
+ <date>2023-11-10</date>
+ <version>
+ <release>1.1.0</release>
+ <api>1.1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes>
+- check open_basedir restriction
+- new function: rpmgetsymlink(string $path, string $name): ?string
+ </notes>
+ </release>
+ <release>
+ <date>2023-10-13</date>
+ <version>
+ <release>1.0.1</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes>
+- fix stack smashing on 32-bit
+- allow retrieval of hardlink content
+ </notes>
+ </release>
+ <release>
+ <date>2023-10-12</date>
+ <version>
+ <release>1.0.0</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes>
+- implement rpm stream wrapper with librpm >= 4.13
+ </notes>
+ </release>
+ <release>
+ <date>2023-09-26</date>
+ <version>
+ <release>0.7.0</release>
+ <api>0.7.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes>
+- add optional operator to rpmcmpver for consistency with version_compare
+- drop support for PHP 7
+ </notes>
+ </release>
+ <release>
+ <date>2021-06-18</date>
+ <version>
+ <release>0.6.0</release>
+ <api>0.5.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://www.php.net/license/3_01.txt" filesource="LICENSE">PHP-3.01</license>
+ <notes>
+- generate arginfo from stub and add missing default values
+- raise dependency on PHP 7.2
+- raise exception on bad parameter value with PHP 8
+ </notes>
+ </release>
+ <release>
<date>2020-09-23</date>
<version>
<release>0.5.1</release>
diff --git a/php_rpminfo.h b/php_rpminfo.h
index 69ff71e..68a8694 100644
--- a/php_rpminfo.h
+++ b/php_rpminfo.h
@@ -22,15 +22,9 @@
extern zend_module_entry rpminfo_module_entry;
#define phpext_rpminfo_ptr &rpminfo_module_entry
-#define PHP_RPMINFO_VERSION "0.6.0-dev"
-
-#ifdef PHP_WIN32
-# define PHP_RPMINFO_API __declspec(dllexport)
-#elif defined(__GNUC__) && __GNUC__ >= 4
-# define PHP_RPMINFO_API __attribute__ ((visibility("default")))
-#else
-# define PHP_RPMINFO_API
-#endif
+#define PHP_RPMINFO_VERSION "1.2.1"
+#define PHP_RPMINFO_AUTHOR "Remi Collet"
+#define PHP_RPMINFO_LICENSE "PHP-3.01"
#ifdef ZTS
#include "TSRM.h"
diff --git a/rpminfo.c b/rpminfo.c
index 53b9c6c..a32a45a 100644
--- a/rpminfo.c
+++ b/rpminfo.c
@@ -23,26 +23,29 @@
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
+#include "ext/standard/php_string.h"
#include <fcntl.h>
#include <rpm/rpmdb.h>
#include <rpm/rpmio.h>
#include <rpm/rpmlib.h>
#include <rpm/rpmts.h>
+#include <rpm/rpmmacro.h>
#include "php_rpminfo.h"
-/* For PHP < 8.0 */
-#ifndef ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE
-#define ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(pass_by_ref, name, type_hint, allow_null, default_value) \
- ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null)
-#endif
+#include "rpminfo_arginfo.h"
-#ifndef RETURN_THROWS
-#define RETURN_THROWS() return
-#endif
+struct php_rpm_stream_data_t {
+ FD_t gzdi;
+ Header h;
+ rpmfiles files;
+ rpmfi fi;
+ php_stream *stream;
+};
-#include "rpminfo_arginfo.h"
+#define STREAM_DATA_FROM_STREAM() \
+ struct php_rpm_stream_data_t *self = (struct php_rpm_stream_data_t *) stream->abstract;
ZEND_DECLARE_MODULE_GLOBALS(rpminfo)
@@ -67,6 +70,13 @@ static rpmdb rpminfo_getdb(void) {
return RPMINFO_G(db);
}
+static void rpminfo_closedb(void) {
+ if (RPMINFO_G(db)) {
+ rpmtsCloseDB(RPMINFO_G(ts));
+ RPMINFO_G(db) = NULL;
+ }
+}
+
static void rpm_header_to_zval(zval *return_value, Header h, zend_bool full)
{
HeaderIterator hi;
@@ -231,6 +241,9 @@ PHP_FUNCTION(rpminfo)
zval_dtor(error);
ZVAL_NULL(error);
}
+ if (php_check_open_basedir(path)) {
+ RETURN_NULL();
+ }
f = Fopen(path, "r");
if (f) {
@@ -287,7 +300,7 @@ PHP_FUNCTION(rpmdbinfo)
db = rpminfo_getdb();
di = rpmdbInitIterator(db, RPMDBI_LABEL, name, len);
if (!di) {
- // Not found
+ /* Not found */
RETURN_NULL();
}
@@ -312,7 +325,7 @@ static unsigned char nibble(char c) {
if (c >= 'A' && c <= 'F') {
return (c - 'A') + 10;
}
- return 0;
+ return 0;
}
static int hex2bin(const char *hex, char *bin, int len) {
@@ -342,14 +355,12 @@ static int haveIndex(zend_long tag) {
tag == RPMDBI_INSTALLTID ||
tag == RPMDBI_SIGMD5 ||
tag == RPMDBI_SHA1HEADER ||
-#ifdef HAVE_WEAKDEP
tag == RPMDBI_FILETRIGGERNAME ||
tag == RPMDBI_TRANSFILETRIGGERNAME ||
tag == RPMDBI_RECOMMENDNAME ||
tag == RPMDBI_SUGGESTNAME ||
tag == RPMDBI_SUPPLEMENTNAME ||
tag == RPMDBI_ENHANCENAME ||
-#endif
tag == RPMDBI_INSTFILENAMES) {
return 1;
}
@@ -376,54 +387,34 @@ PHP_FUNCTION(rpmdbsearch)
RETURN_THROWS();
}
if (rpmTagGetType(crit) == RPM_NULL_TYPE) {
-#if PHP_VERSION_ID < 80000
- php_error_docref(NULL, E_WARNING, "Unkown rpmtag");
- RETURN_NULL();
-#else
zend_argument_value_error(2, "Unkown rpmtag");
RETURN_THROWS();
-#endif
}
if (mode != RPMMIRE_DEFAULT &&
mode != RPMMIRE_STRCMP &&
mode != RPMMIRE_REGEX &&
mode != RPMMIRE_GLOB &&
mode != -1) {
-#if PHP_VERSION_ID < 80000
- php_error_docref(NULL, E_WARNING, "Unkown rpmmire");
- RETURN_NULL();
-#else
zend_argument_value_error(3, "Unkown rpmmire");
RETURN_THROWS();
-#endif
}
- if (crit == RPMTAG_PKGID) {
+ if (crit == RPMTAG_INSTALLTID) {
+ tid = atol(name);
+ name = (char *)&tid;
+ len = sizeof(tid);
+ } else if (crit == RPMTAG_SIGMD5) {
if (len != 32) {
-#if PHP_VERSION_ID < 80000
- php_error_docref(NULL, E_WARNING, "Bad length for PKGID, 32 expected");
- RETURN_NULL();
-#else
- zend_argument_value_error(1, "Bad length for PKGID, 32 expected");
+ zend_argument_value_error(1, "Bad length for PKGID/SIGMD5, 32 expected");
RETURN_THROWS();
-#endif
}
len = hex2bin(name, MD5, len);
name = MD5;
- } else if (crit == RPMTAG_HDRID) {
+ } else if (crit == RPMTAG_SHA1HEADER) {
if (len != 40) {
-#if PHP_VERSION_ID < 80000
- php_error_docref(NULL, E_WARNING, "Bad length for HDRID, 40 expected");
- RETURN_NULL();
-#else
- zend_argument_value_error(1, "Bad length for HDRID, 40 expected");
+ zend_argument_value_error(1, "Bad length for HDRID/SHA1HEADER, 40 expected");
RETURN_THROWS();
-#endif
}
- } else if (crit == RPMTAG_INSTALLTID) {
- tid = atol(name);
- name = (char *)&tid;
- len = sizeof(tid);
} else if (crit == RPMTAG_INSTFILENAMES) {
/* use input parameters */
} else {
@@ -447,7 +438,7 @@ PHP_FUNCTION(rpmdbsearch)
}
}
if (!di) {
- // Not found
+ /* Not found */
RETURN_NULL();
}
@@ -469,16 +460,17 @@ PHP_FUNCTION(rpmvercmp)
char *in_evr1, *evr1, *v1, *r1;
char *in_evr2, *evr2, *v2, *r2;
char *p, empty[] = "";
+ char *op = NULL;
long e1, e2, r;
- size_t len1, len2;
+ size_t len1, len2, oplen;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &in_evr1, &len1, &in_evr2, &len2) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|s", &in_evr1, &len1, &in_evr2, &len2, &op, &oplen) == FAILURE) {
RETURN_THROWS();
}
evr1 = estrdup(in_evr1);
evr2 = estrdup(in_evr2);
- // Epoch
+ /* Epoch */
p = strchr(evr1, ':');
if (p) {
v1 = p+1;
@@ -498,11 +490,11 @@ PHP_FUNCTION(rpmvercmp)
e2 = 0;
}
if (e1 < e2) {
- RETVAL_LONG(-1);
+ r = -1;
} else if (e1 > e2) {
- RETVAL_LONG(1);
+ r = 1;
} else {
- // Version
+ /* Version */
p = strchr(v1, '-');
if (p) {
r1 = p+1;
@@ -518,16 +510,39 @@ PHP_FUNCTION(rpmvercmp)
r2 = empty;
}
r = rpmvercmp(v1, v2);
- if (r) {
- RETVAL_LONG(r);
- } else {
- // Release
+ if (!r) {
+ /* Release*/
r = rpmvercmp(r1, r2);
- RETVAL_LONG(r);
}
}
efree(evr1);
efree(evr2);
+
+ if (!op) {
+ RETURN_LONG(r);
+ }
+
+ if (!strcmp(op, "<") || !strcmp(op, "lt")) {
+ RETURN_BOOL(r < 0);
+ }
+ if (!strcmp(op, "<=") || !strcmp(op, "le")) {
+ RETURN_BOOL(r <= 0);
+ }
+ if (!strcmp(op, ">") || !strcmp(op, "gt")) {
+ RETURN_BOOL(r > 0);
+ }
+ if (!strcmp(op, ">=") || !strcmp(op, "ge")) {
+ RETURN_BOOL(r >= 0);
+ }
+ if (!strcmp(op, "==") || !strcmp(op, "=") || !strcmp(op, "eq")) {
+ RETURN_BOOL(r == 0);
+ }
+ if (!strcmp(op, "!=") || !strcmp(op, "<>") || !strcmp(op, "ne")) {
+ RETURN_BOOL(r != 0);
+ }
+
+ zend_argument_value_error(3, "must be a valid comparison operator");
+ RETURN_THROWS();
}
/* }}} */
@@ -543,13 +558,8 @@ PHP_FUNCTION(rpmaddtag)
}
if (rpmTagGetType(tag) == RPM_NULL_TYPE) {
-#if PHP_VERSION_ID < 80000
- php_error_docref(NULL, E_WARNING, "Unkown rpmtag");
- RETURN_BOOL(0);
-#else
zend_argument_value_error(1, "Unkown rpmtag");
RETURN_THROWS();
-#endif
}
if (RPMINFO_G(tags)) {
@@ -572,12 +582,366 @@ PHP_FUNCTION(rpmaddtag)
}
/* }}} */
+static ssize_t php_rpm_ops_read(php_stream *stream, char *buf, size_t count)
+{
+ ssize_t n = -1;
+ STREAM_DATA_FROM_STREAM();
+
+ if (self) {
+ n = rpmfiArchiveRead(self->fi, buf, count);
+ if (n == 0 || n < (ssize_t)count) {
+ stream->eof = 1;
+ }
+ }
+ return n;
+}
+
+static void php_rpm_ops_free(struct php_rpm_stream_data_t *self, int close_handle)
+{
+ if (self) {
+ if (close_handle) {
+ Fclose(self->gzdi);
+ rpmfilesFree(self->files);
+ rpmfiFree(self->fi);
+ headerFree(self->h);
+ }
+ efree(self);
+ }
+}
+
+static int php_rpm_ops_close(php_stream *stream, int close_handle)
+{
+ STREAM_DATA_FROM_STREAM();
+
+ php_rpm_ops_free(self, close_handle);
+ stream->abstract = NULL;
+
+ return EOF;
+}
+
+static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb)
+{
+ STREAM_DATA_FROM_STREAM();
+
+ if (self) {
+ struct stat s[2]; /* librpm may use different size (32-bit) */
+ int rc;
+ rc = rpmfiStat(self->fi, 0, s);
+ memcpy(&ssb->sb, s, sizeof(ssb->sb));
+ return rc;
+ }
+ return -1;
+}
+
+const php_stream_ops php_stream_rpmio_ops = {
+ NULL, /* write */
+ php_rpm_ops_read,
+ php_rpm_ops_close,
+ NULL, /* flush */
+ "rpm",
+ NULL, /* seek */
+ NULL, /* cast */
+ php_zip_ops_stat,
+ NULL /* set_option */
+};
+
+static struct php_rpm_stream_data_t *php_stream_rpm_finder(const char *path, int want_content)
+{
+ size_t path_len;
+ zend_string *file_basename;
+ char file_dirname[MAXPATHLEN];
+ char *fragment;
+ size_t fragment_len;
+ struct php_rpm_stream_data_t *self = NULL;
+ FD_t fdi;
+ FD_t gzdi;
+ int rc;
+ Header h;
+ char rpmio_flags[80];
+ const char *compr;
+ rpmfiles files;
+ rpmfi fi;
+ rpmts ts = rpminfo_getts();
+
+ fragment = strchr(path, '#');
+ if (!fragment) {
+ return NULL;
+ }
+ if (strncasecmp("rpm://", path, 6) == 0) {
+ path += 6;
+ }
+ fragment_len = strlen(fragment);
+ if (fragment_len < 1) {
+ return NULL;
+ }
+ path_len = strlen(path);
+ if (path_len >= MAXPATHLEN) {
+ return NULL;
+ }
+ memcpy(file_dirname, path, path_len - fragment_len);
+ file_dirname[path_len - fragment_len] = '\0';
+ file_basename = php_basename(path, path_len - fragment_len, NULL, 0);
+ fragment++;
+ if (php_check_open_basedir(file_dirname)) {
+ zend_string_release_ex(file_basename, 0);
+ return NULL;
+ }
+ fdi = Fopen(file_dirname, "r.ufdio");
+ if (Ferror(fdi)) {
+ zend_string_release_ex(file_basename, 0);
+ return NULL;
+ }
+ rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
+ if (rc != RPMRC_OK && rc != RPMRC_NOKEY && rc != RPMRC_NOTTRUSTED) {
+ zend_string_release_ex(file_basename, 0);
+ Fclose(fdi);
+ return NULL;
+ }
+
+ compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
+ snprintf(rpmio_flags, sizeof(rpmio_flags), "r.%s", compr ? compr : "gzip");
+ gzdi = Fdopen(fdi, rpmio_flags);
+ if (gzdi == NULL) {
+ headerFree(h);
+ Fclose(fdi);
+ zend_string_release_ex(file_basename, 0);
+ return NULL;
+ }
+
+ files = rpmfilesNew(NULL, h, 0, RPMFI_KEEPHEADER);
+ fi = rpmfiNewArchiveReader(gzdi, files, RPMFI_ITER_READ_ARCHIVE);
+
+ while((rc = rpmfiNext(fi)) >=0) {
+ const char *fn = rpmfiFN(fi);
+ /*
+ printf("Name=%s, Size=%d, N=%d, mode=%d, reg=%d, content=%d, rdev=%d, inode=%d link=%s\n", fn,
+ (int)rpmfiFSize(fi), (int)rpmfiFNlink(fi), (int)rpmfiFMode(fi),
+ (int)S_ISREG(rpmfiFMode(fi)), (int)rpmfiArchiveHasContent(fi),
+ (int)rpmfiFRdev(fi), (int)rpmfiFInode(fi), rpmfiFLink(fi));
+ */
+ if (!strcmp(fn, fragment)) {
+ if (want_content && S_ISREG(rpmfiFMode(fi)) && !rpmfiArchiveHasContent(fi)) {
+ rpm_rdev_t rdev = rpmfiFRdev(fi);
+ rpm_ino_t inode = rpmfiFInode(fi);
+ while((rc = rpmfiNext(fi)) >=0) {
+ if (rdev == rpmfiFRdev(fi) && inode == rpmfiFInode(fi) && rpmfiArchiveHasContent(fi)) {
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ if (rc == RPMERR_ITER_END) {
+ Fclose(gzdi);
+ rpmfilesFree(files);
+ rpmfiFree(fi);
+ headerFree(h);
+ } else {
+ self = emalloc(sizeof(*self));
+ self->gzdi = gzdi;
+ self->files = files;
+ self->fi = fi;
+ self->h = h;
+ }
+ zend_string_release_ex(file_basename, 0);
+
+ return self;
+}
+
+php_stream *php_stream_rpm_opener(php_stream_wrapper *wrapper,
+ const char *path,
+ const char *mode,
+ int options,
+ zend_string **opened_path,
+ php_stream_context *context STREAMS_DC)
+{
+ struct php_rpm_stream_data_t *self;
+
+ if (mode[0] != 'r') {
+ return NULL;
+ }
+ self = php_stream_rpm_finder(path, 1);
+ if (self) {
+ if (opened_path) {
+ *opened_path = zend_string_init(path, strlen(path), 0);
+ }
+ if (!S_ISREG(rpmfiFMode(self->fi)) || !rpmfiArchiveHasContent(self->fi)) {
+ php_rpm_ops_free(self, 1);
+ } else {
+ return php_stream_alloc(&php_stream_rpmio_ops, self, NULL, mode);
+ }
+ }
+
+ return NULL;
+}
+
+static int php_stream_rpm_stat(php_stream_wrapper *wrapper, const char *url, int flags,
+ php_stream_statbuf *ssb, php_stream_context *context)
+{
+ struct php_rpm_stream_data_t *self;
+ int rc = -1;
+
+ self = php_stream_rpm_finder(url, 0);
+ if (self) {
+ struct stat s[2]; /* librpm may use different size (32-bit) */
+ rc = rpmfiStat(self->fi, 0, s);
+ memcpy(&ssb->sb, s, sizeof(ssb->sb));
+ php_rpm_ops_free(self, 1);
+ }
+
+ return rc;
+}
+
+static const php_stream_wrapper_ops rpm_stream_wops = {
+ php_stream_rpm_opener,
+ NULL, /* close */
+ NULL, /* fstat */
+ php_stream_rpm_stat,
+ NULL, /* opendir */
+ "RPM wrapper",
+ NULL, /* unlink */
+ NULL, /* rename */
+ NULL, /* mkdir */
+ NULL, /* rmdir */
+ NULL /* metadata */
+};
+
+const php_stream_wrapper php_stream_rpm_wrapper = {
+ &rpm_stream_wops,
+ NULL,
+ 0 /* is_url */
+};
+
+/* {{{ proto array rpmgetsymlink(string path , string name)
+ Retrieve soft link target of en entry */
+PHP_FUNCTION(rpmgetsymlink)
+{
+ char *path, *name;
+ const char *link;
+ size_t plen, nlen;
+ FD_t fdi;
+ FD_t gzdi;
+ int rc;
+ Header h;
+ char rpmio_flags[80];
+ const char *compr;
+ rpmfiles files;
+ rpmfi fi;
+ rpmts ts = rpminfo_getts();
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "pp", &path, &plen, &name, &nlen) == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ if (php_check_open_basedir(path)) {
+ RETURN_NULL();
+ }
+ fdi = Fopen(path, "r.ufdio");
+ if (Ferror(fdi)) {
+ RETURN_NULL();
+ }
+ rc = rpmReadPackageFile(ts, fdi, "rpm2cpio", &h);
+ if (rc != RPMRC_OK && rc != RPMRC_NOKEY && rc != RPMRC_NOTTRUSTED) {
+ Fclose(fdi);
+ RETURN_NULL();
+ }
+
+ compr = headerGetString(h, RPMTAG_PAYLOADCOMPRESSOR);
+ snprintf(rpmio_flags, sizeof(rpmio_flags), "r.%s", compr ? compr : "gzip");
+ gzdi = Fdopen(fdi, rpmio_flags);
+ if (gzdi == NULL) {
+ headerFree(h);
+ Fclose(fdi);
+ RETURN_NULL();
+ }
+
+ files = rpmfilesNew(NULL, h, 0, RPMFI_KEEPHEADER);
+ fi = rpmfiNewArchiveReader(gzdi, files, RPMFI_ITER_READ_ARCHIVE);
+
+ rc = rpmfiFindFN(fi, name);
+ rpmfiSetFX(fi, rc); /* return value have change in 4.18 (from previous to new) */
+ if (rc < 0
+ || rpmfiFX(fi) != rc
+ || (link = rpmfiFLink(fi)) == NULL) {
+ RETVAL_NULL();
+ } else {
+ RETVAL_STRING(link);
+ }
+ rpmfiFree(fi);
+ rpmfilesFree(files);
+ headerFree(h);
+ Fclose(gzdi);
+}
+/* }}} */
+
+/* {{{ proto array rpmexpand(string $text): string
+ Expand macro in text */
+PHP_FUNCTION(rpmexpand)
+{
+ char *text, *result;
+ size_t len;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &text, &len) == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ (void)rpminfo_getts(); /* read config files */
+
+ result = rpmExpand(text, NULL);
+ RETVAL_STRING(result);
+ free(result);
+}
+/* }}} */
+
+/* {{{ proto array rpmexpandnumeric(string $text): int
+ Expand macro in text */
+PHP_FUNCTION(rpmexpandnumeric)
+{
+ char *text;
+ size_t len;
+ int result;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &text, &len) == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ (void)rpminfo_getts(); /* read config files */
+
+ result = rpmExpandNumeric(text);
+
+ RETURN_LONG(result);
+}
+/* }}} */
+
+/* {{{ proto array rpmdefine(string $macro): bool
+ Define a new macro */
+PHP_FUNCTION(rpmdefine)
+{
+ char *macro;
+ size_t len;
+ int result;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &macro, &len) == FAILURE) {
+ RETURN_THROWS();
+ }
+
+ (void)rpminfo_getts(); /* read config files */
+
+ rpminfo_closedb(); /* Close the DB to allow path change */
+
+ result = rpmDefineMacro(NULL, macro, RMIL_GLOBAL);
+
+ RETURN_BOOL(result == 0);
+}
+/* }}} */
+
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(rpminfo)
{
- const char *tagname;
- rpmtd names;
+ const char *tagname;
+ rpmtd names;
REGISTER_STRING_CONSTANT("RPMVERSION", (char *)RPMVERSION, CONST_CS | CONST_PERSISTENT);
@@ -617,6 +981,8 @@ PHP_MINIT_FUNCTION(rpminfo)
}
rpmtdFree(names);
+ php_register_url_stream_wrapper("rpm", &php_stream_rpm_wrapper);
+
return SUCCESS;
}
/* }}} */
@@ -642,10 +1008,8 @@ PHP_RINIT_FUNCTION(rpminfo)
PHP_RSHUTDOWN_FUNCTION(rpminfo)
{
if (RPMINFO_G(ts)) {
- if (RPMINFO_G(db)) {
- rpmtsCloseDB(RPMINFO_G(ts));
- RPMINFO_G(db) = NULL;
- }
+ rpminfo_closedb();
+
rpmtsFree(RPMINFO_G(ts));
RPMINFO_G(ts) = NULL;
}
@@ -668,7 +1032,10 @@ PHP_MINFO_FUNCTION(rpminfo)
php_info_print_table_start();
php_info_print_table_header(2, "rpminfo support", "enabled");
php_info_print_table_row(2, "Extension version", PHP_RPMINFO_VERSION);
+ php_info_print_table_row(2, "Author", PHP_RPMINFO_AUTHOR);
+ php_info_print_table_row(2, "License", PHP_RPMINFO_LICENSE);
php_info_print_table_row(2, "RPM library version", RPMVERSION);
+ php_info_print_table_row(2, "RPM stream wrapper", "yes");
php_info_print_table_end();
/* Remove comments if you have entries in php.ini
diff --git a/rpminfo.stub.php b/rpminfo.stub.php
index 543cc5f..026df4b 100644
--- a/rpminfo.stub.php
+++ b/rpminfo.stub.php
@@ -10,6 +10,13 @@ function rpmdbsearch(string $pattern, int $rpmtag = RPMTAG_NAME, int $rpmmire =
function rpminfo(string $path, bool $full = false, ?string &$error = null): Array|null {}
-function rpmvercmp(string $evr1, string $evr2): int {}
+function rpmvercmp(string $evr1, string $evr2, ?string $operator = null): int|bool {}
+function rpmgetsymlink(string $path, string $name): string|null {}
+
+function rpmexpand(string $text): string {}
+
+function rpmexpandnumeric(string $text): int {}
+
+function rpmdefine(string $macro): bool {}
diff --git a/rpminfo_arginfo.h b/rpminfo_arginfo.h
index 20c501f..6db4fed 100644
--- a/rpminfo_arginfo.h
+++ b/rpminfo_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 6b4dfeada2b5de5c5453d2b38c1a861e01bf958e */
+ * Stub hash: dc980a56084190700162f5a8c70b54fcdbc30ced */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpmaddtag, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, rpmtag, IS_LONG, 0)
@@ -23,9 +23,27 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpminfo, 0, 1, IS_ARRAY, 1)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(1, error, IS_STRING, 1, "null")
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpmvercmp, 0, 2, IS_LONG, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_rpmvercmp, 0, 2, MAY_BE_LONG|MAY_BE_BOOL)
ZEND_ARG_TYPE_INFO(0, evr1, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, evr2, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, operator, IS_STRING, 1, "null")
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpmgetsymlink, 0, 2, IS_STRING, 1)
+ ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpmexpand, 0, 1, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO(0, text, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpmexpandnumeric, 0, 1, IS_LONG, 0)
+ ZEND_ARG_TYPE_INFO(0, text, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rpmdefine, 0, 1, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, macro, IS_STRING, 0)
ZEND_END_ARG_INFO()
@@ -34,6 +52,10 @@ ZEND_FUNCTION(rpmdbinfo);
ZEND_FUNCTION(rpmdbsearch);
ZEND_FUNCTION(rpminfo);
ZEND_FUNCTION(rpmvercmp);
+ZEND_FUNCTION(rpmgetsymlink);
+ZEND_FUNCTION(rpmexpand);
+ZEND_FUNCTION(rpmexpandnumeric);
+ZEND_FUNCTION(rpmdefine);
static const zend_function_entry ext_functions[] = {
@@ -42,5 +64,9 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(rpmdbsearch, arginfo_rpmdbsearch)
ZEND_FE(rpminfo, arginfo_rpminfo)
ZEND_FE(rpmvercmp, arginfo_rpmvercmp)
+ ZEND_FE(rpmgetsymlink, arginfo_rpmgetsymlink)
+ ZEND_FE(rpmexpand, arginfo_rpmexpand)
+ ZEND_FE(rpmexpandnumeric, arginfo_rpmexpandnumeric)
+ ZEND_FE(rpmdefine, arginfo_rpmdefine)
ZEND_FE_END
};
diff --git a/tests/002-rpmvercmp.phpt b/tests/002-rpmvercmp.phpt
index d83cf67..c53a183 100644
--- a/tests/002-rpmvercmp.phpt
+++ b/tests/002-rpmvercmp.phpt
@@ -29,11 +29,53 @@ $ok = true;
foreach ($cases as $case) {
list($a,$b,$expected) = $case;
$result = rpmvercmp($a,$b);
- if ($result != $expected) {
+ if ($result !== $expected) {
$ok = false;
printf("rpmvercmp(%s, %s) = %d when %d expected\n", $a, $b, $result, $expected);
}
}
+
+$cases = [
+ ['1', '2', '>', false],
+ ['1', '2', 'gt', false],
+ ['1', '2', '>=', false],
+ ['1', '2', 'ge', false],
+ ['1', '1', '>=', true],
+ ['1', '1', 'ge', true],
+
+ ['1', '2', '<', true],
+ ['1', '2', 'lt', true],
+ ['1', '2', '<=', true],
+ ['1', '2', 'le', true],
+ ['1', '1', '<=', true],
+ ['1', '1', 'le', true],
+
+ ['1', '1', '=', true],
+ ['1', '1', '==', true],
+ ['1', '1', 'eq', true],
+
+ ['1', '2', '=', false],
+ ['1', '2', '==', false],
+ ['1', '2', 'eq', false],
+
+ ['1', '1', '!=', false],
+ ['1', '1', '<>', false],
+ ['1', '1', 'ne', false],
+
+ ['1', '2', '!=', true],
+ ['1', '2', '<>', true],
+ ['1', '2', 'ne', true],
+];
+foreach ($cases as $case) {
+ list($a,$b,$op,$expected) = $case;
+ $result = rpmvercmp($a,$b,$op);
+ if ($result !== $expected) {
+ $ok = false;
+ printf("rpmvercmp(%s, %s, %s) = %s when %s expected\n",
+ $a, $b, $op, $result ? "true" : "false", $expected ? "true" : "false");
+ }
+}
+
if ($ok) echo "OK\n";
?>
Done
diff --git a/tests/003-rpminfo.phpt b/tests/003-rpminfo.phpt
index beb7b47..919bcc9 100644
--- a/tests/003-rpminfo.phpt
+++ b/tests/003-rpminfo.phpt
@@ -14,7 +14,7 @@ array(5) {
["Version"]=>
string(1) "1"
["Release"]=>
- string(11) "1.fc27.remi"
+ string(1) "3"
["Summary"]=>
string(5) "Bidon"
["Arch"]=>
diff --git a/tests/004-constants.phpt b/tests/004-constants.phpt
index 397c97f..18104cc 100644
--- a/tests/004-constants.phpt
+++ b/tests/004-constants.phpt
@@ -8,5 +8,5 @@ var_dump(RPMVERSION);
?>
Done
--EXPECTF--
-string(%d) "4.%s"
+string(%d) "%s"
Done
diff --git a/tests/005-rpminfo-full.phpt b/tests/005-rpminfo-full.phpt
index 38f5bab..15c158d 100644
--- a/tests/005-rpminfo-full.phpt
+++ b/tests/005-rpminfo-full.phpt
@@ -24,9 +24,11 @@ Done
--- bidon.rpm ---
string(5) "bidon"
string(15) "A dummy package"
-array(1) {
+array(2) {
[0]=>
- string(8) "- create"
+ string(14) "- add symlinks"
+ [1]=>
+ string(20) "- add some hardlinks"
}
bool(false)
array(1) {
diff --git a/tests/008-rpmdbsearch.phpt b/tests/008-rpmdbsearch.phpt
index f348b92..6e0e402 100644
--- a/tests/008-rpmdbsearch.phpt
+++ b/tests/008-rpmdbsearch.phpt
@@ -1,7 +1,10 @@
--TEST--
Check for rpmdbinfo function
--SKIPIF--
-<?php if (!extension_loaded("rpminfo")) print "skip"; ?>
+<?php
+if (!extension_loaded("rpminfo")) print "skip";
+?>
+
--FILE--
<?php
echo "Name / glob\n";
@@ -20,16 +23,16 @@ $phprpm = $a[0]['Name'];
$p = rpmdbinfo($phprpm, 1);
echo "Pkgid\n";
-$a = rpmdbsearch($p[0]['Sigmd5'], RPMTAG_PKGID);
+$a = rpmdbsearch($p[0]['Sigmd5'], RPMTAG_SIGMD5);
var_dump($a[0]['Name'] == $phprpm);
echo "Hdrid\n";
-$a = rpmdbsearch($p[0]['Sha1header'], RPMTAG_HDRID);
+$a = rpmdbsearch($p[0]['Sha1header'], RPMTAG_SHA1HEADER);
var_dump($a[0]['Name'] == $phprpm);
var_dump(count($a[0]) < 10);
echo "Hdrid (full)\n";
-$a = rpmdbsearch($p[0]['Sha1header'], RPMTAG_HDRID, -1, true);
+$a = rpmdbsearch($p[0]['Sha1header'], RPMTAG_SHA1HEADER, -1, true);
var_dump($a[0]['Name'] == $phprpm);
var_dump($a[0]['Sha1header'] == $p[0]['Sha1header']);
var_dump(count($a[0]) > 20);
diff --git a/tests/010-rpmvercmp_error7.phpt b/tests/010-rpmvercmp_error7.phpt
deleted file mode 100644
index c9b3875..0000000
--- a/tests/010-rpmvercmp_error7.phpt
+++ /dev/null
@@ -1,25 +0,0 @@
---TEST--
-Check for rpmvercmp function error
---SKIPIF--
-<?php
-if (!extension_loaded("rpminfo")) print "skip";
-if (PHP_VERSION_ID >= 80000) print "skip only for PHP 7";
-?>
---FILE--
-<?php
-var_dump(rpmvercmp());
-var_dump(rpmvercmp("a"));
-var_dump(rpmvercmp("a", "b", "c"));
-?>
-Done
---EXPECTF--
-
-Warning: rpmvercmp() expects exactly 2 parameters, 0 given in %s
-NULL
-
-Warning: rpmvercmp() expects exactly 2 parameters, 1 given in %s
-NULL
-
-Warning: rpmvercmp() expects exactly 2 parameters, 3 given in %s
-NULL
-Done
diff --git a/tests/011-rpmvercmp_error8.phpt b/tests/011-rpmvercmp_error8.phpt
index 4430975..2fe6aa1 100644
--- a/tests/011-rpmvercmp_error8.phpt
+++ b/tests/011-rpmvercmp_error8.phpt
@@ -19,13 +19,19 @@ try {
}
try {
var_dump(rpmvercmp("a", "b", "c"));
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+try {
+ var_dump(rpmvercmp("a", "b", "c", "d"));
} catch (ArgumentCountError $e) {
echo $e->getMessage(), "\n";
}
?>
Done
--EXPECTF--
-rpmvercmp() expects exactly 2 %s, 0 given
-rpmvercmp() expects exactly 2 %s, 1 given
-rpmvercmp() expects exactly 2 %s, 3 given
+rpmvercmp() expects at least 2 %s, 0 given
+rpmvercmp() expects at least 2 %s, 1 given
+rpmvercmp(): Argument #3 ($operator) must be a valid comparison operator
+rpmvercmp() expects at most 3 %s, 4 given
Done
diff --git a/tests/014-stream.phpt b/tests/014-stream.phpt
new file mode 100644
index 0000000..69b881e
--- /dev/null
+++ b/tests/014-stream.phpt
@@ -0,0 +1,97 @@
+--TEST--
+Check for stream
+--SKIPIF--
+<?php
+if (!extension_loaded("rpminfo")) print "skip";
+if (version_compare(RPMVERSION, '4.13', 'lt')) print("skip librpm is older than 4.13");
+?>
+--FILE--
+<?php
+$d = "rpm://" . __DIR__ . "/bidon.rpm#/usr/share/doc/bidon";
+$n = "rpm://" . __DIR__ . "/bidon.rpm#/usr/share/doc/bidon/README";
+$x = "rpm://" . __DIR__ . "/bidon.rpm#/usr/share/doc/bidon/MISSING";
+$foo = "rpm://" . __DIR__ . "/bidon.rpm#/etc/foo.conf";
+$bar = "rpm://" . __DIR__ . "/bidon.rpm#/etc/bar.conf";
+$toto = "rpm://" . __DIR__ . "/bidon.rpm#/etc/toto.conf";
+
+echo "+ wrapper\n";
+var_dump(in_array('rpm', stream_get_wrappers()));
+
+echo "+ stat\n";
+$s = stat($d); // S_ISDIR
+var_dump($s['size'], $s['mode'] , ($s['mode'] & 0170000) == 0040000 ? "OK" : "KO");
+var_dump(file_exists($d), is_dir($d), is_file($d), is_link($n));
+$s = stat($n); // S_ISREG
+var_dump($s['size'], $s['mode'] , ($s['mode'] & 0170000) == 0100000 ? "OK" : "KO");
+var_dump(file_exists($n), is_dir($n), is_file($n), is_link($n));
+$s = stat($toto); // S_ISLNK
+var_dump($s['size'], $s['mode'] , ($s['mode'] & 0170000) == 0120000 ? "OK" : "KO");
+var_dump(file_exists($toto), is_dir($toto), is_file($toto), is_link($toto));
+
+echo "+ file\n";
+var_dump($f = fopen($n, "r"));
+$s = fstat($f);
+var_dump($s['size'], $s['mode']);
+var_dump(trim(fread($f, 10)));
+var_dump(feof($f));
+var_dump(trim(fread($f, 100)));
+var_dump(feof($f));
+fclose($f);
+
+echo "+ stream\n";
+var_dump(trim(file_get_contents($n))); // Existing file
+var_dump(trim(file_get_contents($foo))); // Hardlink with content
+var_dump(trim(file_get_contents($bar))); // hardlink without content
+var_dump(file_get_contents($x)); // Missing file
+
+echo "+ symlink\n";
+var_dump(rpmgetsymlink(__DIR__ . "/bidon.rpm", "missing"));
+var_dump(rpmgetsymlink(__DIR__ . "/bidon.rpm", "/etc/foo.conf")); // not a symlink
+var_dump(rpmgetsymlink(__DIR__ . "/bidon.rpm", "/etc/toto.conf")); // symlink
+?>
+Done
+--EXPECTF--
++ wrapper
+bool(true)
++ stat
+int(0)
+int(16877)
+string(2) "OK"
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+int(30)
+int(33188)
+string(2) "OK"
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+int(8)
+int(41471)
+string(2) "OK"
+bool(true)
+bool(false)
+bool(false)
+bool(true)
++ file
+resource(%d) of type (stream)
+int(30)
+int(33188)
+string(10) "Thu Oct 19"
+bool(false)
+string(18) "12:01:02 CEST 2023"
+bool(true)
++ stream
+string(29) "Thu Oct 19 12:01:02 CEST 2023"
+string(7) "content"
+string(7) "content"
+
+Warning: file_get_contents(%s/bidon.rpm#/usr/share/doc/bidon/MISSING): Failed to open stream: operation failed in %s on line %d
+bool(false)
++ symlink
+NULL
+string(0) ""
+string(8) "foo.conf"
+Done
diff --git a/tests/015-rpmmacro.phpt b/tests/015-rpmmacro.phpt
new file mode 100644
index 0000000..794cabf
--- /dev/null
+++ b/tests/015-rpmmacro.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Check for rpmdefine, rpmexpand, rpmexpandnumeric
+--SKIPIF--
+<?php if (!extension_loaded("rpminfo")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(is_dir(rpmexpand("%{_dbpath}")));
+
+var_dump(rpmexpandnumeric("%__isa_bits") === PHP_INT_SIZE * 8);
+var_dump(is_int(rpmexpandnumeric("0%{?fedora}%{?rhel}")));
+
+$name = "_my_test_macro_for_rpminfo_";
+$val = __FILE__;
+var_dump(rpmexpand("%$name") === "%$name" );
+var_dump(rpmdefine("$name $val"));
+var_dump(rpmexpand("%$name") === __FILE__);
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+
diff --git a/tests/bidon.rpm b/tests/bidon.rpm
index 6cbfa04..d8efb06 100644
--- a/tests/bidon.rpm
+++ b/tests/bidon.rpm
Binary files differ
diff --git a/tests/bidon.spec b/tests/bidon.spec
new file mode 100644
index 0000000..b3ad790
--- /dev/null
+++ b/tests/bidon.spec
@@ -0,0 +1,42 @@
+%{!?ver: %global ver 1}
+
+Name: bidon
+Version: %{ver}
+Release: 3
+Summary: Bidon
+License: Public Domain
+URL: https://rpms.remirepo.net/
+
+Obsoletes: fooobs < 2
+
+
+%description
+A dummy package
+
+%prep
+date >README
+echo "content" >conf
+
+%build
+: nothing to build
+
+%install
+install -Dpm644 conf %{buildroot}%{_sysconfdir}/foo.conf
+cd %{buildroot}%{_sysconfdir}
+ln foo.conf bar.conf
+ln -s foo.conf toto.conf
+
+%files
+%doc README
+%config(noreplace) %{_sysconfdir}/*.conf
+
+
+%changelog
+* Thu Oct 19 2023 Remi Collet <remi@fedoraproject.org> - 1-3
+- add symlinks
+
+* Fri Oct 13 2023 Remi Collet <remi@fedoraproject.org> - 1-2
+- add some hardlinks
+
+* Wed Dec 24 2014 Remi Collet <remi@fedoraproject.org> - 1-1
+- create