summaryrefslogtreecommitdiff
path: root/ext/zlib/zlib_fopen_wrapper.c
diff options
context:
space:
mode:
authorHartmut Holzgraefe <hholzgra@php.net>2000-11-21 00:40:13 +0000
committerHartmut Holzgraefe <hholzgra@php.net>2000-11-21 00:40:13 +0000
commitcedb39ee560fde66b7c5fddeaba2aeed0deffcf5 (patch)
treedb8e584984967ed7ea1a878dfbed13b963b0f85b /ext/zlib/zlib_fopen_wrapper.c
parentee23c5310860b42b0b028bdbc7ccc8d7c1b30ec0 (diff)
downloadphp-git-cedb39ee560fde66b7c5fddeaba2aeed0deffcf5.tar.gz
all the _GNU_SOURCE dependant stuff is now in zlib_fopen_wrapper.c
so all the #define/#include workarounds in zlib.c are no longer needed
Diffstat (limited to 'ext/zlib/zlib_fopen_wrapper.c')
-rw-r--r--ext/zlib/zlib_fopen_wrapper.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c
new file mode 100644
index 0000000000..d2eab5939f
--- /dev/null
+++ b/ext/zlib/zlib_fopen_wrapper.c
@@ -0,0 +1,105 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.02 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_02.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Stefan Röhrich <sr@linux.de> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#define IS_EXT_MODULE
+#define _GNU_SOURCE
+
+#include "php.h"
+#include "php_zlib.h"
+#include "fopen-wrappers.h"
+
+#if HAVE_FOPENCOOKIE
+
+
+struct gz_cookie {
+ gzFile gz_file;
+};
+
+static ssize_t gz_reader(void *cookie, char *buffer, size_t size)
+{
+ return gzread(((struct gz_cookie *)cookie)->gz_file,buffer,size);
+}
+
+static ssize_t gz_writer(void *cookie, const char *buffer, size_t size) {
+ return gzwrite(((struct gz_cookie *)cookie)->gz_file,(char *)buffer,size);
+}
+
+static int gz_seeker(void *cookie,off_t position, int whence) {
+ return gzseek(((struct gz_cookie *)cookie)->gz_file,(z_off_t)position,whence);
+}
+
+static int gz_closer(void *cookie) {
+ int ret=gzclose(((struct gz_cookie *)cookie)->gz_file);
+ free(cookie);
+ cookie=NULL;
+ return ret;
+}
+
+
+
+static COOKIE_IO_FUNCTIONS_T gz_cookie_functions =
+{ gz_reader
+, gz_writer
+, gz_seeker
+, gz_closer
+};
+
+FILE *zlib_fopen_wrapper(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path)
+{
+ struct gz_cookie *gc = NULL;
+ FILE *fp;
+ int fissock=0, fsocketd=0;
+
+ gc = (struct gz_cookie *)malloc(sizeof(struct gz_cookie));
+
+ if(gc) {
+ *issock = 0;
+
+ while(*path!=':')
+ path++;
+
+ path++;
+
+ fp = php_fopen_wrapper(path, mode, options|IGNORE_URL, &fissock, &fsocketd, NULL);
+
+ if (!fp) {
+ free(gc);
+ return NULL;
+ }
+
+ gc->gz_file = gzdopen(fileno(fp), mode);
+
+ if(gc->gz_file) {
+ return fopencookie(gc,mode,gz_cookie_functions);
+ } else {
+ free(gc);
+ return NULL;
+ }
+ }
+ errno = ENOENT;
+ return NULL;
+}
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */