summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--pcsc-build.patch287
-rw-r--r--php-pecl-pcsc.spec214
3 files changed, 505 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..13af741
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,4 @@
+SRCDIR := $(shell pwd)
+NAME := $(shell basename $(SRCDIR))
+include ../../../common/Makefile
+
diff --git a/pcsc-build.patch b/pcsc-build.patch
new file mode 100644
index 0000000..813669d
--- /dev/null
+++ b/pcsc-build.patch
@@ -0,0 +1,287 @@
+--- pecl/pcsc/trunk/config.m4 2014/05/04 14:56:27 333470
++++ pecl/pcsc/trunk/config.m4 2014/05/04 17:05:12 333471
+@@ -29,7 +29,7 @@
+ AC_MSG_RESULT($PCSC_DIR)
+ PHP_ADD_INCLUDE($PCSC_DIR/include/PCSC/)
+ dnl PHP_EVAL_LIBLINE($PCSC_LIBS, PCSC_SHARED_LIBADD)
+- PHP_ADD_LIBRARY_WITH_PATH(pcsclite, "$PCSC_DIR/lib/", PCSC_SHARED_LIBADD)
++ PHP_ADD_LIBRARY_WITH_PATH(pcsclite, "$PCSC_DIR/$PHP_LIBDIR", PCSC_SHARED_LIBADD)
+
+ dnl Finally, tell the build system about the extension and what files are needed
+ PHP_NEW_EXTENSION(pcsc, pcsc.c, $ext_shared)
+--- pecl/pcsc/trunk/config.m4 2014/05/04 17:05:12 333471
++++ pecl/pcsc/trunk/config.m4 2014/05/04 17:20:35 333472
+@@ -33,7 +33,7 @@
+
+ dnl Finally, tell the build system about the extension and what files are needed
+ PHP_NEW_EXTENSION(pcsc, pcsc.c, $ext_shared)
+- PHP_INSTALL_HEADERS([php_pcsc.h])
++ PHP_INSTALL_HEADERS([ext/pcsc], [php_pcsc.h])
+ PHP_SUBST(PCSC_SHARED_LIBADD)
+ fi
+
+--- pecl/pcsc/trunk/pcsc.c 2014/05/04 17:20:35 333472
++++ pecl/pcsc/trunk/pcsc.c 2014/05/04 17:50:17 333473
+@@ -135,71 +135,119 @@
+ PHP_MINIT_FUNCTION(pcsc)
+ {
+ /* Return Codes */
++#ifdef SCARD_E_BAD_SEEK
+ REGISTER_PCSC_CONSTANT(SCARD_E_BAD_SEEK);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_CANCELLED);
+ REGISTER_PCSC_CONSTANT(SCARD_E_CANT_DISPOSE);
+ REGISTER_PCSC_CONSTANT(SCARD_E_CARD_UNSUPPORTED);
++#ifdef SCARD_E_CERTIFICATE_UNAVAILABLE
+ REGISTER_PCSC_CONSTANT(SCARD_E_CERTIFICATE_UNAVAILABLE);
++#endif
++#ifdef SCARD_E_COMM_DATA_LOST
+ REGISTER_PCSC_CONSTANT(SCARD_E_COMM_DATA_LOST);
++#endif
++#ifdef SCARD_E_DIR_NOT_FOUND
+ REGISTER_PCSC_CONSTANT(SCARD_E_DIR_NOT_FOUND);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_DUPLICATE_READER);
++#ifdef SCARD_E_FILE_NOT_FOUND
+ REGISTER_PCSC_CONSTANT(SCARD_E_FILE_NOT_FOUND);
++#endif
++#ifdef SCARD_E_ICC_CREATEORDER
+ REGISTER_PCSC_CONSTANT(SCARD_E_ICC_CREATEORDER);
++#endif
++#ifdef SCARD_E_ICC_INSTALLATION
+ REGISTER_PCSC_CONSTANT(SCARD_E_ICC_INSTALLATION);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_INSUFFICIENT_BUFFER);
+ REGISTER_PCSC_CONSTANT(SCARD_E_INVALID_ATR);
++#ifdef SCARD_E_INVALID_CHV
+ REGISTER_PCSC_CONSTANT(SCARD_E_INVALID_CHV);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_INVALID_HANDLE);
+ REGISTER_PCSC_CONSTANT(SCARD_E_INVALID_PARAMETER);
+ REGISTER_PCSC_CONSTANT(SCARD_E_INVALID_TARGET);
+ REGISTER_PCSC_CONSTANT(SCARD_E_INVALID_VALUE);
++#ifdef SCARD_E_NO_ACCESS
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_ACCESS);
++#endif
++#ifdef SCARD_E_NO_DIR
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_DIR);
++#endif
++#ifdef SCARD_E_NO_FILE
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_FILE);
++#endif
++#ifdef SCARD_E_NO_KEY_CONTAINER
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_KEY_CONTAINER);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_MEMORY);
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_READERS_AVAILABLE);
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_SERVICE);
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_SMARTCARD);
++#ifdef SCARD_E_NO_SUCH_CERTIFICATE
+ REGISTER_PCSC_CONSTANT(SCARD_E_NO_SUCH_CERTIFICATE);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_NOT_READY);
+ REGISTER_PCSC_CONSTANT(SCARD_E_NOT_TRANSACTED);
+ REGISTER_PCSC_CONSTANT(SCARD_E_PCI_TOO_SMALL);
+ REGISTER_PCSC_CONSTANT(SCARD_E_PROTO_MISMATCH);
+ REGISTER_PCSC_CONSTANT(SCARD_E_READER_UNAVAILABLE);
+ REGISTER_PCSC_CONSTANT(SCARD_E_READER_UNSUPPORTED);
++#ifdef SCARD_E_SERVER_TOO_BUSY
+ REGISTER_PCSC_CONSTANT(SCARD_E_SERVER_TOO_BUSY);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_SERVICE_STOPPED);
+ REGISTER_PCSC_CONSTANT(SCARD_E_SHARING_VIOLATION);
+ REGISTER_PCSC_CONSTANT(SCARD_E_SYSTEM_CANCELLED);
+ REGISTER_PCSC_CONSTANT(SCARD_E_TIMEOUT);
++#ifdef SCARD_E_UNEXPECTED
+ REGISTER_PCSC_CONSTANT(SCARD_E_UNEXPECTED);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_UNKNOWN_CARD);
+ REGISTER_PCSC_CONSTANT(SCARD_E_UNKNOWN_READER);
++#ifdef SCARD_E_UNKNOWN_RES_MNG
+ REGISTER_PCSC_CONSTANT(SCARD_E_UNKNOWN_RES_MNG);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_E_UNSUPPORTED_FEATURE);
++#ifdef SCARD_E_WRITE_TOO_MANY
+ REGISTER_PCSC_CONSTANT(SCARD_E_WRITE_TOO_MANY);
++#endif
+
+ REGISTER_PCSC_CONSTANT(SCARD_F_COMM_ERROR);
+ REGISTER_PCSC_CONSTANT(SCARD_F_INTERNAL_ERROR);
+ REGISTER_PCSC_CONSTANT(SCARD_F_UNKNOWN_ERROR);
+ REGISTER_PCSC_CONSTANT(SCARD_F_WAITED_TOO_LONG);
+
++#ifdef SCARD_P_SHUTDOWN
+ REGISTER_PCSC_CONSTANT(SCARD_P_SHUTDOWN);
++#endif
+
+ REGISTER_PCSC_CONSTANT(SCARD_S_SUCCESS);
+
++#ifdef SCARD_W_CANCELLED_BY_USER
+ REGISTER_PCSC_CONSTANT(SCARD_W_CANCELLED_BY_USER);
++#endif
++#ifdef SCARD_W_CARD_NOT_AUTHENTICATED
+ REGISTER_PCSC_CONSTANT(SCARD_W_CARD_NOT_AUTHENTICATED);
++#endif
++#ifdef SCARD_W_CHV_BLOCKED
+ REGISTER_PCSC_CONSTANT(SCARD_W_CHV_BLOCKED);
++#endif
++#ifdef SCARD_W_EOF
+ REGISTER_PCSC_CONSTANT(SCARD_W_EOF);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_W_REMOVED_CARD);
+ REGISTER_PCSC_CONSTANT(SCARD_W_RESET_CARD);
++#ifdef SCARD_W_SECURITY_VIOLATION
+ REGISTER_PCSC_CONSTANT(SCARD_W_SECURITY_VIOLATION);
++#endif
+ REGISTER_PCSC_CONSTANT(SCARD_W_UNPOWERED_CARD);
+ REGISTER_PCSC_CONSTANT(SCARD_W_UNRESPONSIVE_CARD);
+ REGISTER_PCSC_CONSTANT(SCARD_W_UNSUPPORTED_CARD);
++#ifdef SCARD_W_WRONG_CHV
+ REGISTER_PCSC_CONSTANT(SCARD_W_WRONG_CHV);
++#endif
+
+ /* Protocols */
+ REGISTER_PCSC_CONSTANT(SCARD_PROTOCOL_RAW);
+@@ -256,48 +304,80 @@
+ /* map error codes to string */
+ static char* php_pcsc_error_to_string(DWORD dwRC) {
+ switch(dwRC) {
++#ifdef SCARD_E_BAD_SEEK
+ case SCARD_E_BAD_SEEK: return "SCARD_E_BAD_SEEK";
++#endif
+ case SCARD_E_CANCELLED: return "SCARD_E_CANCELLED";
+ case SCARD_E_CANT_DISPOSE: return "SCARD_E_CANT_DISPOSE";
+ case SCARD_E_CARD_UNSUPPORTED: return "SCARD_E_CARD_UNSUPPORTED";
++#ifdef SCARD_E_CERTIFICATE_UNAVAILABLE
+ case SCARD_E_CERTIFICATE_UNAVAILABLE: return "SCARD_E_CERTIFICATE_UNAVAILABLE";
++#endif
++#ifdef SCARD_E_COMM_DATA_LOST
+ case SCARD_E_COMM_DATA_LOST: return "SCARD_E_COMM_DATA_LOST";
++#endif
++#ifdef SCARD_E_DIR_NOT_FOUND
+ case SCARD_E_DIR_NOT_FOUND: return "SCARD_E_DIR_NOT_FOUND";
++#endif
+ case SCARD_E_DUPLICATE_READER: return "SCARD_E_DUPLICATE_READER";
++#ifdef SCARD_E_FILE_NOT_FOUND
+ case SCARD_E_FILE_NOT_FOUND: return "SCARD_E_FILE_NOT_FOUND";
++#endif
++#ifdef SCARD_E_ICC_CREATEORDER
+ case SCARD_E_ICC_CREATEORDER: return "SCARD_E_ICC_CREATEORDER";
++#endif
++#ifdef SCARD_E_ICC_INSTALLATION
+ case SCARD_E_ICC_INSTALLATION: return "SCARD_E_ICC_INSTALLATION";
++#endif
+ case SCARD_E_INSUFFICIENT_BUFFER: return "SCARD_E_INSUFFICIENT_BUFFER";
+ case SCARD_E_INVALID_ATR: return "SCARD_E_INVALID_ATR";
++#ifdef SCARD_E_INVALID_CHV
+ case SCARD_E_INVALID_CHV: return "SCARD_E_INVALID_CHV";
++#endif
+ case SCARD_E_INVALID_HANDLE: return "SCARD_E_INVALID_HANDLE";
+ case SCARD_E_INVALID_PARAMETER: return "SCARD_E_INVALID_PARAMETER";
+ case SCARD_E_INVALID_TARGET: return "SCARD_E_INVALID_TARGET";
+ case SCARD_E_INVALID_VALUE: return "SCARD_E_INVALID_VALUE";
++#ifdef SCARD_E_NO_ACCESS
+ case SCARD_E_NO_ACCESS: return "SCARD_E_NO_ACCESS";
++#endif
++#ifdef SCARD_E_NO_DIR
+ case SCARD_E_NO_DIR: return "SCARD_E_NO_DIR";
++#endif
++#ifdef SCARD_E_NO_FILE
+ case SCARD_E_NO_FILE: return "SCARD_E_NO_FILE";
++#endif
++#ifdef SCARD_E_NO_KEY_CONTAINER
+ case SCARD_E_NO_KEY_CONTAINER: return "SCARD_E_NO_KEY_CONTAINER";
++#endif
+ case SCARD_E_NO_MEMORY: return "SCARD_E_NO_MEMORY";
+ case SCARD_E_NO_READERS_AVAILABLE: return "SCARD_E_NO_READERS_AVAILABLE";
+ case SCARD_E_NO_SERVICE: return "SCARD_E_NO_SERVICE";
+ case SCARD_E_NO_SMARTCARD: return "SCARD_E_NO_SMARTCARD";
++#ifdef SCARD_E_NO_ACCESS
+ case SCARD_E_NO_SUCH_CERTIFICATE: return "SCARD_E_NO_SUCH_CERTIFICATE";
++#endif
+ case SCARD_E_NOT_READY: return "SCARD_E_NOT_READY";
+ case SCARD_E_NOT_TRANSACTED: return "SCARD_E_NOT_TRANSACTED";
+ case SCARD_E_PCI_TOO_SMALL: return "SCARD_E_PCI_TOO_SMALL";
+ case SCARD_E_PROTO_MISMATCH: return "SCARD_E_PROTO_MISMATCH";
+ case SCARD_E_READER_UNAVAILABLE: return "SCARD_E_READER_UNAVAILABLE";
+ case SCARD_E_READER_UNSUPPORTED: return "SCARD_E_READER_UNSUPPORTED";
++#ifdef SCARD_E_SERVER_TOO_BUSY
+ case SCARD_E_SERVER_TOO_BUSY: return "SCARD_E_SERVER_TOO_BUSY";
++#endif
+ case SCARD_E_SERVICE_STOPPED: return "SCARD_E_SERVICE_STOPPED";
+ case SCARD_E_SHARING_VIOLATION: return "SCARD_E_SHARING_VIOLATION";
+ case SCARD_E_SYSTEM_CANCELLED: return "SCARD_E_SYSTEM_CANCELLED";
+ case SCARD_E_TIMEOUT: return "SCARD_E_TIMEOUT";
+- case SCARD_E_UNEXPECTED: return "SCARD_E_UNEXPECTED";
++#ifdef SCARD_E_SERVER_TOO_BUSY
++ case SCARD_E_SERVER_TOO_BUSY: return "SCARD_E_UNEXPECTED";
++#endif
+ case SCARD_E_UNKNOWN_CARD: return "SCARD_E_UNKNOWN_CARD";
+ case SCARD_E_UNKNOWN_READER: return "SCARD_E_UNKNOWN_READER";
++#ifdef SCARD_E_UNKNOWN_RES_MNG
+ case SCARD_E_UNKNOWN_RES_MNG: return "SCARD_E_UNKNOWN_RES_MNG";
++#endif
+ /* apparently E_UNEXPECTED and E_UNSUPPORTED are defined
+ by a buggy header file on Linux, causing a "double used constant"
+ error. Just leave this out on Linux, then.
+@@ -305,14 +385,20 @@
+ #ifdef PHP_WIN32
+ case SCARD_E_UNSUPPORTED_FEATURE: return "SCARD_E_UNSUPPORTED_FEATURE";
+ #endif
++#ifdef SCARD_E_WRITE_TOO_MANY
+ case SCARD_E_WRITE_TOO_MANY: return "SCARD_E_WRITE_TOO_MANY";
++#endif
+ case SCARD_F_COMM_ERROR: return "SCARD_E_WRITE_TOO_MANY";
+ case SCARD_F_INTERNAL_ERROR: return "SCARD_F_INTERNAL_ERROR";
+ case SCARD_F_UNKNOWN_ERROR: return "SCARD_F_UNKNOWN_ERROR";
+ case SCARD_F_WAITED_TOO_LONG: return "SCARD_F_WAITED_TOO_LONG";
++#ifdef SCARD_P_SHUTDOWN
+ case SCARD_P_SHUTDOWN: return "SCARD_P_SHUTDOWN";
++#endif
+ case SCARD_S_SUCCESS: return "SCARD_S_SUCCESS";
++#ifdef SCARD_W_CANCELLED_BY_USER
+ case SCARD_W_CANCELLED_BY_USER: return "SCARD_W_CANCELLED_BY_USER";
++#endif
+ #ifdef SCARD_W_CACHE_ITEM_NOT_FOUND
+ case SCARD_W_CACHE_ITEM_NOT_FOUND: return "SCARD_W_CACHE_ITEM_NOT_FOUND";
+ #endif
+@@ -322,16 +408,26 @@
+ #ifdef SCARD_W_CACHE_ITEM_TOO_BIG
+ case SCARD_W_CACHE_ITEM_TOO_BIG: return "SCARD_W_CACHE_ITEM_TOO_BIG";
+ #endif
++#ifdef SCARD_W_CARD_NOT_AUTHENTICATED
+ case SCARD_W_CARD_NOT_AUTHENTICATED: return "SCARD_W_CARD_NOT_AUTHENTICATED";
++#endif
++#ifdef SCARD_W_CHV_BLOCKED
+ case SCARD_W_CHV_BLOCKED: return "SCARD_W_CHV_BLOCKED";
++#endif
++#ifdef SCARD_W_EOF
+ case SCARD_W_EOF: return "SCARD_W_EOF";
++#endif
+ case SCARD_W_REMOVED_CARD: return "SCARD_W_REMOVED_CARD";
+ case SCARD_W_RESET_CARD: return "SCARD_W_RESET_CARD";
++#ifdef SCARD_W_SECURITY_VIOLATION
+ case SCARD_W_SECURITY_VIOLATION: return "SCARD_W_SECURITY_VIOLATION";
++#endif
+ case SCARD_W_UNPOWERED_CARD: return "SCARD_W_UNPOWERED_CARD";
+ case SCARD_W_UNRESPONSIVE_CARD: return "SCARD_W_UNRESPONSIVE_CARD";
+ case SCARD_W_UNSUPPORTED_CARD: return "SCARD_W_UNSUPPORTED_CARD";
++#ifdef SCARD_W_WRONG_CHV
+ case SCARD_W_WRONG_CHV: return "SCARD_W_WRONG_CHV";
++#endif
+ default: return "Unknown";
+ }
+ }
+--- pecl/pcsc/trunk/pcsc.c 2014/05/04 17:50:17 333473
++++ pecl/pcsc/trunk/pcsc.c 2014/05/04 17:53:25 333474
+@@ -370,8 +370,8 @@
+ case SCARD_E_SHARING_VIOLATION: return "SCARD_E_SHARING_VIOLATION";
+ case SCARD_E_SYSTEM_CANCELLED: return "SCARD_E_SYSTEM_CANCELLED";
+ case SCARD_E_TIMEOUT: return "SCARD_E_TIMEOUT";
+-#ifdef SCARD_E_SERVER_TOO_BUSY
+- case SCARD_E_SERVER_TOO_BUSY: return "SCARD_E_UNEXPECTED";
++#ifdef SCARD_E_UNEXPECTED
++ case SCARD_E_UNEXPECTED: return "SCARD_E_UNEXPECTED";
+ #endif
+ case SCARD_E_UNKNOWN_CARD: return "SCARD_E_UNKNOWN_CARD";
+ case SCARD_E_UNKNOWN_READER: return "SCARD_E_UNKNOWN_READER";
diff --git a/php-pecl-pcsc.spec b/php-pecl-pcsc.spec
new file mode 100644
index 0000000..1c07d28
--- /dev/null
+++ b/php-pecl-pcsc.spec
@@ -0,0 +1,214 @@
+# spec file for php-pecl-pcsc
+#
+# Copyright (c) 2014 Remi Collet
+# License: CC-BY-SA
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# Please, preserve the changelog entries
+#
+%{?scl: %scl_package php-pecl-pcsc}
+%{!?php_inidir: %global php_inidir %{_sysconfdir}/php.d}
+%{!?__pecl: %global __pecl %{_bindir}/pecl}
+%{!?__php: %global __php %{_bindir}/php}
+
+%global with_zts 0%{?__ztsphp:1}
+%global pecl_name pcsc
+%if "%{php_version}" < "5.6"
+%global ini_name %{pecl_name}.ini
+%else
+%global ini_name 40-%{pecl_name}.ini
+%endif
+
+Summary: An extension for PHP using the winscard PC/SC API
+Name: %{?scl_prefix}php-pecl-%{pecl_name}
+Version: 0.3
+Release: 1%{?dist}%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}
+License: BSD
+Group: Development/Languages
+URL: http://pecl.php.net/package/%{pecl_name}
+Source0: http://pecl.php.net/get/%{pecl_name}-%{version}.tgz
+
+# http://svn.php.net/viewvc?view=revision&revision=333471
+# http://svn.php.net/viewvc?view=revision&revision=333472
+# http://svn.php.net/viewvc?view=revision&revision=333473
+# http://svn.php.net/viewvc?view=revision&revision=333474
+Patch0: %{pecl_name}-build.patch
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildRequires: pcsc-lite-devel
+BuildRequires: %{?scl_prefix}php-devel > 5.3
+BuildRequires: %{?scl_prefix}php-pear
+
+Requires(post): %{__pecl}
+Requires(postun): %{__pecl}
+Requires: %{?scl_prefix}php(zend-abi) = %{php_zend_api}
+Requires: %{?scl_prefix}php(api) = %{php_core_api}
+
+Provides: %{?scl_prefix}php-%{pecl_name} = %{version}
+Provides: %{?scl_prefix}php-%{pecl_name}%{?_isa} = %{version}
+Provides: %{?scl_prefix}php-pecl(%{pecl_name}) = %{version}
+Provides: %{?scl_prefix}php-pecl(%{pecl_name})%{?_isa} = %{version}
+
+%if "%{?vendor}" == "Remi Collet"
+# Other third party repo stuff
+%if "%{php_version}" > "5.4"
+Obsoletes: php53-pecl-%{pecl_name}
+Obsoletes: php53u-pecl-%{pecl_name}
+Obsoletes: php54-pecl-%{pecl_name}
+%endif
+%if "%{php_version}" > "5.5"
+Obsoletes: php55u-pecl-%{pecl_name}
+%endif
+%if "%{php_version}" > "5.6"
+Obsoletes: php56u-pecl-%{pecl_name}
+%endif
+%endif
+
+%if 0%{?fedora} < 20 && 0%{?rhel} < 7
+# Filter shared private
+%{?filter_provides_in: %filter_provides_in %{_libdir}/.*\.so$}
+%{?filter_setup}
+%endif
+
+
+%description
+This is an extension for using PC/SC based smart cards with PHP.
+It is a wrapper to the wonderful and free project PCSC-Lite which is the
+middleware to access a smart card using SCard API (PC/SC).
+
+
+%package devel
+Summary: %{name} developer files (header)
+Group: Development/Libraries
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{?scl_prefix}php-devel%{?_isa}
+
+%description devel
+These are the files needed to compile programs using %{name}.
+
+
+%prep
+%setup -q -c
+mv %{pecl_name}-%{version} NTS
+
+cd NTS
+%patch0 -p3 -b .build
+
+# Sanity check, really often broken
+extver=$(sed -n '/#define PHP_PCSC_VERSION/{s/.* "//;s/".*$//;p}' php_pcsc.h)
+if test "x${extver}" != "x%{version}"; then
+ : Error: Upstream extension version is ${extver}, expecting %{version}.
+ exit 1
+fi
+cd ..
+
+%if %{with_zts}
+# Duplicate source tree for NTS / ZTS build
+cp -pr NTS ZTS
+%endif
+
+# Create configuration file
+cat > %{ini_name} << 'EOF'
+; Enable %{pecl_name} extension module
+extension=%{pecl_name}.so
+EOF
+
+
+%build
+cd NTS
+%{_bindir}/phpize
+%configure \
+ --with-php-config=%{_bindir}/php-config \
+ --with-libdir=%{_lib}
+make %{?_smp_mflags}
+
+%if %{with_zts}
+cd ../ZTS
+%{_bindir}/zts-phpize
+%configure \
+ --with-php-config=%{_bindir}/zts-php-config \
+ --with-libdir=%{_lib}
+make %{?_smp_mflags}
+%endif
+
+
+%install
+rm -rf %{buildroot}
+
+make -C NTS \
+ install INSTALL_ROOT=%{buildroot}
+
+# install config file
+install -D -m 644 %{ini_name} %{buildroot}%{php_inidir}/%{ini_name}
+
+# Install XML package description
+install -D -m 644 package.xml %{buildroot}%{pecl_xmldir}/%{name}.xml
+
+%if %{with_zts}
+make -C ZTS \
+ install INSTALL_ROOT=%{buildroot}
+
+install -D -m 644 %{ini_name} %{buildroot}%{php_ztsinidir}/%{ini_name}
+%endif
+
+# Test & Documentation
+for i in $(grep 'role="doc"' package.xml | sed -e 's/^.*name="//;s/".*$//')
+do install -Dpm 644 NTS/$i %{buildroot}%{pecl_docdir}/%{pecl_name}/$i
+done
+
+
+%post
+%{pecl_install} %{pecl_xmldir}/%{name}.xml >/dev/null || :
+
+
+%postun
+if [ $1 -eq 0 ] ; then
+ %{pecl_uninstall} %{pecl_name} >/dev/null || :
+fi
+
+
+%check
+cd NTS
+: Minimal load test for NTS extension
+%{__php} --no-php-ini \
+ --define extension=modules/%{pecl_name}.so \
+ --modules | grep PC/SC
+
+%if %{with_zts}
+cd ../ZTS
+: Minimal load test for ZTS extension
+%{__ztsphp} --no-php-ini \
+ --define extension=modules/%{pecl_name}.so \
+ --modules | grep PC/SC
+%endif
+
+
+%clean
+rm -rf %{buildroot}
+
+
+%files
+%defattr(-,root,root,-)
+%doc %{pecl_docdir}/%{pecl_name}
+%{pecl_xmldir}/%{name}.xml
+
+%config(noreplace) %{php_inidir}/%{ini_name}
+%{php_extdir}/%{pecl_name}.so
+
+%if %{with_zts}
+%config(noreplace) %{php_ztsinidir}/%{ini_name}
+%{php_ztsextdir}/%{pecl_name}.so
+%endif
+
+%files devel
+%defattr(-,root,root,-)
+%{php_incldir}/ext/%{pecl_name}
+
+%if %{with_zts}
+%{php_ztsincldir}/ext/%{pecl_name}
+%endif
+
+
+%changelog
+* Sun May 4 2014 Remi Collet <remi@fedoraproject.org> - 0.3-1
+- initial package, version 0.3 (alpha) \ No newline at end of file