summaryrefslogtreecommitdiffstats
path: root/zip-systemlibzip.patch
blob: b6d76b1c3900e0820f53da2860f7b7e1961551c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
diff -up zip-1.12.1/config.m4.old zip-1.12.1/config.m4
--- zip-1.12.1/config.m4.old	2013-04-29 11:18:17.000000000 +0200
+++ zip-1.12.1/config.m4	2013-08-08 13:09:18.000000000 +0200
@@ -13,8 +13,60 @@ fi
 PHP_ARG_WITH(pcre-dir, pcre install prefix,
 [  --with-pcre-dir           ZIP: pcre install prefix], no, no)
 
+PHP_ARG_WITH(libzip, libzip,
+[ --with-libzip[=DIR]        ZIP: use libzip], no, no)
+
 if test "$PHP_ZIP" != "no"; then
 
+  if test "$PHP_LIBZIP" != "no"; then
+
+    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
+    dnl system libzip, depends on libzip
+    AC_MSG_CHECKING(for libzip)
+    if test -r $PHP_LIBZIP/include/zip.h; then
+      LIBZIP_CFLAGS="-I$PHP_LIBZIP/include"
+      LIBZIP_LIBDIR="$PHP_LIBZIP/$PHP_LIBDIR"
+      AC_MSG_RESULT(from option: found in $PHP_LIBZIP)
+
+    elif test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libzip; then
+      LIBZIP_CFLAGS=`$PKG_CONFIG libzip --cflags`
+      LIBZIP_LIBDIR=`$PKG_CONFIG libzip --variable=libdir`
+      AC_MSG_RESULT(from pkgconfig: found in $LIBZIP_LIBDIR)
+
+    else
+      for i in /usr/local /usr; do
+        if test -r $i/include/zip.h; then
+          LIBZIP_CFLAGS="-I$i/include"
+          LIBZIP_LIBDIR="$i/$PHP_LIBDIR"
+          AC_MSG_RESULT(in default path: found in $i)
+          break
+        fi
+      done
+    fi
+
+    if test -z "$LIBZIP_LIBDIR"; then
+      AC_MSG_RESULT(not found)
+      AC_MSG_ERROR(Please reinstall the libzip distribution)
+    fi
+
+    dnl Could not think of a simple way to check libzip for overwrite support
+    PHP_CHECK_LIBRARY(zip, zip_open,
+    [
+      PHP_ADD_LIBRARY_WITH_PATH(zip, $LIBZIP_LIBDIR, ZIP_SHARED_LIBADD)
+      AC_DEFINE(HAVE_LIBZIP,1,[ ])
+    ], [
+      AC_MSG_ERROR(could not find usable libzip)
+    ], [
+      -L$LIBZIP_LIBDIR
+    ])
+
+    AC_DEFINE(HAVE_ZIP,1,[ ]) 
+    PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c, $ext_shared,, $LIBZIP_CFLAGS)
+    PHP_SUBST(ZIP_SHARED_LIBADD)
+  else
+
+  dnl bundled libzip, depends on zlib
   if test "$PHP_ZLIB_DIR" != "no" && test "$PHP_ZLIB_DIR" != "yes"; then
     if test -f "$PHP_ZLIB_DIR/include/zlib/zlib.h"; then
       PHP_ZLIB_DIR="$PHP_ZLIB_DIR"
@@ -94,6 +146,7 @@ yes
   PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c $PHP_ZIP_SOURCES, $ext_shared)
   PHP_ADD_BUILD_DIR($ext_builddir/lib, 1)
   PHP_SUBST(ZIP_SHARED_LIBADD)
+fi
 
 
 AC_CHECK_TYPES([int8_t])
diff -up zip-1.12.1/libzip-missing.h.old zip-1.12.1/libzip-missing.h
--- zip-1.12.1/libzip-missing.h.old	2013-08-08 13:31:19.000000000 +0200
+++ zip-1.12.1/libzip-missing.h	2013-08-08 13:29:24.000000000 +0200
@@ -0,0 +1,60 @@
+/*** Private API copied from lib/zipint.h ***/
+
+/* error information */
+
+struct zip_error {
+    int zip_err;	/* libzip error code (ZIP_ER_*) */
+    int sys_err;	/* copy of errno (E*) or zlib error code */
+    char *str;		/* string representation or NULL */
+};
+
+
+/* zip archive, part of API */
+
+struct zip {
+    char *zn;				/* file name */
+    FILE *zp;				/* file */
+    unsigned int open_flags;		/* flags passed to zip_open */
+    struct zip_error error;		/* error information */
+
+    unsigned int flags;			/* archive global flags */
+    unsigned int ch_flags;		/* changed archive global flags */
+
+    char *default_password;		/* password used when no other supplied */
+
+    struct zip_string *comment_orig;	/* archive comment */
+    struct zip_string *comment_changes; /* changed archive comment */
+    int comment_changed;		/* whether archive comment was changed */
+
+    zip_uint64_t nentry;		/* number of entries */
+    zip_uint64_t nentry_alloc;		/* number of entries allocated */
+    struct zip_entry *entry;		/* entries */
+
+    unsigned int nfile;			/* number of opened files within archive */
+    unsigned int nfile_alloc;		/* number of files allocated */
+    struct zip_file **file;		/* opened files within archive */
+    
+    char *tempdir;                      /* custom temp dir (needed e.g. for OS X sandboxing) */
+};
+
+/* file in zip archive, part of API */
+
+struct zip_file {
+    struct zip *za;		/* zip archive containing this file */
+    struct zip_error error;	/* error information */
+    int eof;
+    struct zip_source *src;	/* data source */
+};
+
+/*** Private API copied from lib/zip_error.c ***/
+
+void
+_zip_error_clear(struct zip_error *err)
+{
+    if (err == NULL)
+	return;
+
+    err->zip_err = ZIP_ER_OK;
+    err->sys_err = 0;
+}
+
diff -up zip-1.12.1/php_zip.c.old zip-1.12.1/php_zip.c
--- zip-1.12.1/php_zip.c.old	2013-08-08 13:24:00.000000000 +0200
+++ zip-1.12.1/php_zip.c	2013-08-08 13:26:43.000000000 +0200
@@ -29,8 +29,14 @@
 #include "ext/standard/php_string.h"
 #include "ext/pcre/php_pcre.h"
 #include "php_zip.h"
+
+#if defined(HAVE_LIBZIP)
+#include <zip.h>
+#include "libzip-missing.h"
+#else
 #include "lib/zip.h"
 #include "lib/zipint.h"
+#endif
 
 /* zip_open is a macro for renaming libzip zipopen, so we need to use PHP_NAMED_FUNCTION */
 static PHP_NAMED_FUNCTION(zif_zip_open);
diff -up zip-1.12.1/php_zip.h.old zip-1.12.1/php_zip.h
--- zip-1.12.1/php_zip.h.old	2013-08-08 13:33:03.000000000 +0200
+++ zip-1.12.1/php_zip.h	2013-08-08 13:33:34.000000000 +0200
@@ -28,7 +28,11 @@ extern zend_module_entry zip_module_entr
 #include "TSRM.h"
 #endif
 
+#if defined(HAVE_LIBZIP)
+#include <zip.h>
+#else
 #include "lib/zip.h"
+#endif
 
 #define PHP_ZIP_VERSION_STRING "1.12.1"
 
diff -up zip-1.12.1/zip_stream.c.old zip-1.12.1/zip_stream.c
--- zip-1.12.1/zip_stream.c.old	2013-08-08 13:35:24.000000000 +0200
+++ zip-1.12.1/zip_stream.c	2013-08-08 13:35:39.000000000 +0200
@@ -6,8 +6,6 @@
 #if HAVE_ZIP
 #ifdef ZEND_ENGINE_2
 
-#include "lib/zip.h"
-
 #include "php_streams.h"
 #include "ext/standard/file.h"
 #include "ext/standard/php_string.h"