summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--php-pecl-rar.spec15
-rw-r--r--rar-php81.patch152
2 files changed, 165 insertions, 2 deletions
diff --git a/php-pecl-rar.spec b/php-pecl-rar.spec
index e879586..669d5c7 100644
--- a/php-pecl-rar.spec
+++ b/php-pecl-rar.spec
@@ -1,6 +1,6 @@
# spec file for php-pecl-rar
#
-# Copyright (c) 2013-2020 Remi Collet
+# Copyright (c) 2013-2021 Remi Collet
# License: CC-BY-SA
# http://creativecommons.org/licenses/by-sa/4.0/
#
@@ -19,12 +19,15 @@
Summary: PHP extension for reading RAR archives
Name: %{?scl_prefix}php-pecl-%{pecl_name}
Version: 4.2.0
-Release: 1%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
+Release: 2%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
License: PHP and Freeware with further limitations
Group: Development/Languages
URL: https://pecl.php.net/package/%{pecl_name}
Source0: https://pecl.php.net/get/%{pecl_name}-%{version}.tgz
+Patch0: %{pecl_name}-php81.patch
+
+BuildRequires: make
BuildRequires: %{?dtsprefix}gcc
BuildRequires: %{?scl_prefix}php-devel
BuildRequires: %{?scl_prefix}php-pear
@@ -53,6 +56,9 @@ Obsoletes: php74-pecl-%{pecl_name} <= %{version}
%if "%{php_version}" > "8.0"
Obsoletes: php80-pecl-%{pecl_name} <= %{version}
%endif
+%if "%{php_version}" > "8.1"
+Obsoletes: php81-pecl-%{pecl_name} <= %{version}
+%endif
%endif
@@ -74,6 +80,8 @@ sed -e 's/role="test"/role="src"/' \
-i package.xml
cd NTS
+%patch0 -p1
+
# Sanity check, really often broken
extver=$(sed -n '/#define PHP_RAR_VERSION/{s/.* "//;s/".*$//;p}' php_rar.h)
if test "x${extver}" != "x%{version}%{?prever:-%{prever}}"; then
@@ -206,6 +214,9 @@ REPORT_EXIT_STATUS=1 \
%changelog
+* Fri Sep 10 2021 Remi Collet <remi@remirepo.net> - 4.2.0-2
+- add upstream patch for PHP 8.1
+
* Mon Dec 7 2020 Remi Collet <remi@remirepo.net> - 4.2.0-1
- update to 4.2.0
diff --git a/rar-php81.patch b/rar-php81.patch
new file mode 100644
index 0000000..4f4407b
--- /dev/null
+++ b/rar-php81.patch
@@ -0,0 +1,152 @@
+From ab26d285759e4c917879967b09976a44829ed570 Mon Sep 17 00:00:00 2001
+From: Gustavo Lopes <mail@geleia.net>
+Date: Mon, 16 Aug 2021 01:28:05 +0100
+Subject: [PATCH] Fixes for PHP 8.1
+
+---
+ rar_stream.c | 6 ++++++
+ rararch.c | 8 +++++++-
+ rarentry.c | 26 +++++++++++++++-----------
+ tests/047.phpt | 6 +++---
+ 4 files changed, 31 insertions(+), 15 deletions(-)
+
+diff --git a/rar_stream.c b/rar_stream.c
+index 6fe207a..c6546a6 100644
+--- a/rar_stream.c
++++ b/rar_stream.c
+@@ -784,7 +784,13 @@ static int _rar_get_archive_and_fragment(php_stream_wrapper *wrapper,
+ #if PHP_MAJOR_VERSION < 7
+ *archive = zend_resolve_path(tmp_archive, tmp_arch_len TSRMLS_CC);
+ #else
++# if PHP_VERSION_ID < 80100
+ zend_string *arc_str = zend_resolve_path(tmp_archive, tmp_arch_len);
++# else
++ zend_string *tmp_archive_str = zend_string_init_fast(tmp_archive, tmp_arch_len);
++ zend_string *arc_str = zend_resolve_path(tmp_archive_str);
++ zend_string_free(tmp_archive_str);
++# endif
+ if (arc_str != NULL) {
+ *archive = estrndup(arc_str->val, arc_str->len);
+ } else {
+diff --git a/rararch.c b/rararch.c
+index ed79f10..7cbfa26 100644
+--- a/rararch.c
++++ b/rararch.c
+@@ -28,6 +28,7 @@
+ /* $Id$ */
+
+ #include "zend_types.h"
++#include <zend_API.h>
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+@@ -962,6 +963,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_rararchive_setallowbroken, 0, 0, 1)
+ ZEND_ARG_INFO(0, allow_broken)
+ ZEND_END_ARG_INFO()
+
++#if PHP_MAJOR_VERSION >= 8
++ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_rararchive_getiterator, 0, 0, Traversable, 0)
++ZEND_END_ARG_INFO()
++#endif
++
+ ZEND_BEGIN_ARG_INFO(arginfo_rararchive_void, 0)
+ ZEND_END_ARG_INFO()
+ /* }}} */
+@@ -981,7 +987,7 @@ static zend_function_entry php_rararch_class_functions[] = {
+ PHP_ME(rararch, __toString, arginfo_rararchive_void, ZEND_ACC_PUBLIC)
+ PHP_ME_MAPPING(__construct, rar_bogus_ctor, arginfo_rararchive_void, ZEND_ACC_PRIVATE | ZEND_ACC_CTOR)
+ #if PHP_MAJOR_VERSION >= 8
+- PHP_ME(rararch, getIterator, arginfo_rararchive_void, ZEND_ACC_PUBLIC)
++ PHP_ME(rararch, getIterator, arginfo_rararchive_getiterator, ZEND_ACC_PUBLIC)
+ #endif
+ {NULL, NULL, NULL}
+ };
+diff --git a/rarentry.c b/rarentry.c
+index 5943f38..5e680f6 100644
+--- a/rarentry.c
++++ b/rarentry.c
+@@ -27,11 +27,10 @@
+
+ /* $Id$ */
+
+-#ifdef __cplusplus
+-extern "C" {
++#include <zend_types.h>
++#ifndef _GNU_SOURCE
++# define _GNU_SOURCE
+ #endif
+-
+-#define _GNU_SOURCE
+ #include <string.h>
+
+ #include <php.h>
+@@ -270,8 +269,8 @@ static void _rar_dos_date_to_text(unsigned dos_time, char *date_string) /* {{{ *
+ /* }}} */
+
+ /* {{{ Methods */
+-/* {{{ proto bool RarEntry::extract(string dir [, string filepath = ''
+- [, string password = NULL [, bool extended_data = FALSE]])
++/* {{{ public function extract(?string $dir, ?string $filepath = '',
++ ?string $password = null, bool $extended_data = false): void {}
+ Extract file from the archive */
+ PHP_METHOD(rarentry, extract)
+ { /* lots of variables, but no need to be intimidated */
+@@ -298,7 +297,7 @@ PHP_METHOD(rarentry, extract)
+ * password that's different from the one stored in the rar_file_t object*/
+ rar_cb_user_data cb_udata = {NULL};
+
+- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ss!b", &dir,
++ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s!|s!s!b", &dir,
+ &dir_len, &filepath, &filepath_len, &password, &password_len,
+ &process_ed) == FAILURE ) {
+ return;
+@@ -714,12 +713,21 @@ PHP_METHOD(rarentry, __toString)
+ /* }}} */
+
+ /* {{{ arginfo */
++#if PHP_MAJOR_VERSION < 8
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_rarentry_extract, 0, 0, 1)
+ ZEND_ARG_INFO(0, path)
+ ZEND_ARG_INFO(0, filename)
+ ZEND_ARG_INFO(0, password)
+ ZEND_ARG_INFO(0, extended_data)
+ ZEND_END_ARG_INFO()
++#else
++ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rarentry_extract, 0, 1, _IS_BOOL, 0)
++ ZEND_ARG_TYPE_INFO(0, dir, IS_STRING, 1)
++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filepath, IS_STRING, 1, "\'\'")
++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, password, IS_STRING, 1, "null")
++ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, extended_data, _IS_BOOL, 0, "false")
++ZEND_END_ARG_INFO()
++#endif
+
+ ZEND_BEGIN_ARG_INFO_EX(arginfo_rarentry_getstream, 0, 0, 0)
+ ZEND_ARG_INFO(0, password)
+@@ -829,7 +837,3 @@ void minit_rarentry(TSRMLS_D)
+ REG_RAR_CLASS_CONST_LONG("ATTRIBUTE_UNIX_SYM_LINK", 0x0A000L);
+ REG_RAR_CLASS_CONST_LONG("ATTRIBUTE_UNIX_SOCKET", 0x0C000L);
+ }
+-
+-#ifdef __cplusplus
+-}
+-#endif
+diff --git a/tests/047.phpt b/tests/047.phpt
+index b1b5f53..8bd3e90 100644
+--- a/tests/047.phpt
++++ b/tests/047.phpt
+@@ -10,9 +10,9 @@ function resolve($vol) {
+ else
+ return null;
+ }
+-function int32_to_hex($value) {
+- $value &= 0xffffffff;
+- return str_pad(strtoupper(dechex($value)), 8, "0", STR_PAD_LEFT);
++function int32_to_hex($value) {
++ $value &= 0xffffffff;
++ return str_pad(strtoupper(dechex($value)), 8, "0", STR_PAD_LEFT);
+ }
+ echo "Fail:\n";
+ $rar_file1 = rar_open(dirname(__FILE__).'/multi_broken.part1.rar');
+--
+2.31.1
+