~ubuntu-branches/ubuntu/hardy/php5/hardy-updates

« back to all changes in this revision

Viewing changes to main/php_streams.h

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-10-09 03:14:32 UTC
  • Revision ID: james.westby@ubuntu.com-20051009031432-kspik3lobxstafv9
Tags: upstream-5.0.5
ImportĀ upstreamĀ versionĀ 5.0.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
   +----------------------------------------------------------------------+
 
3
   | PHP Version 5                                                        |
 
4
   +----------------------------------------------------------------------+
 
5
   | Copyright (c) 1997-2004 The PHP Group                                |
 
6
   +----------------------------------------------------------------------+
 
7
   | This source file is subject to version 3.0 of the PHP license,       |
 
8
   | that is bundled with this package in the file LICENSE, and is        |
 
9
   | available through the world-wide-web at the following url:           |
 
10
   | http://www.php.net/license/3_0.txt.                                  |
 
11
   | If you did not receive a copy of the PHP license and are unable to   |
 
12
   | obtain it through the world-wide-web, please send a note to          |
 
13
   | license@php.net so we can mail you a copy immediately.               |
 
14
   +----------------------------------------------------------------------+
 
15
   | Author: Wez Furlong (wez@thebrainroom.com)                           |
 
16
   +----------------------------------------------------------------------+
 
17
 */
 
18
 
 
19
/* $Id: php_streams.h,v 1.95.2.5 2005/07/16 12:14:45 hyanantha Exp $ */
 
20
 
 
21
#ifndef PHP_STREAMS_H
 
22
#define PHP_STREAMS_H
 
23
 
 
24
#ifdef HAVE_SYS_TIME_H
 
25
#include <sys/time.h>
 
26
#endif
 
27
#include <sys/types.h>
 
28
#include <sys/stat.h>
 
29
 
 
30
BEGIN_EXTERN_C()
 
31
PHPAPI int php_file_le_stream(void);
 
32
PHPAPI int php_file_le_pstream(void);
 
33
END_EXTERN_C()
 
34
 
 
35
/* {{{ Streams memory debugging stuff */
 
36
 
 
37
#if ZEND_DEBUG
 
38
/* these have more of a dependency on the definitions of the zend macros than
 
39
 * I would prefer, but doing it this way saves loads of idefs :-/ */
 
40
# define STREAMS_D                      int __php_stream_call_depth ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC 
 
41
# define STREAMS_C                      0 ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC 
 
42
# define STREAMS_REL_C          __php_stream_call_depth + 1 ZEND_FILE_LINE_CC, \
 
43
        __php_stream_call_depth ? __zend_orig_filename : __zend_filename, \
 
44
        __php_stream_call_depth ? __zend_orig_lineno : __zend_lineno 
 
45
 
 
46
# define STREAMS_DC             , STREAMS_D
 
47
# define STREAMS_CC             , STREAMS_C
 
48
# define STREAMS_REL_CC , STREAMS_REL_C
 
49
 
 
50
#else
 
51
# define STREAMS_D
 
52
# define STREAMS_C
 
53
# define STREAMS_REL_C
 
54
# define STREAMS_DC
 
55
# define STREAMS_CC
 
56
# define STREAMS_REL_CC
 
57
#endif
 
58
 
 
59
/* these functions relay the file/line number information. They are depth aware, so they will pass
 
60
 * the ultimate ancestor, which is useful, because there can be several layers of calls */
 
61
#define php_stream_alloc_rel(ops, thisptr, persistent, mode) _php_stream_alloc((ops), (thisptr), (persistent), (mode) STREAMS_REL_CC TSRMLS_CC)
 
62
 
 
63
#define php_stream_copy_to_mem_rel(src, buf, maxlen, persistent) _php_stream_copy_to_mem((src), (buf), (maxlen), (persistent) STREAMS_REL_CC TSRMLS_CC)
 
64
        
 
65
#define php_stream_fopen_rel(filename, mode, opened, options) _php_stream_fopen((filename), (mode), (opened), (options) STREAMS_REL_CC TSRMLS_CC)
 
66
 
 
67
#define php_stream_fopen_with_path_rel(filename, mode, path, opened, options) _php_stream_fopen_with_path((filename), (mode), (path), (opened), (options) STREAMS_REL_CC TSRMLS_CC)
 
68
 
 
69
#define php_stream_fopen_from_fd_rel(fd, mode, persistent_id)    _php_stream_fopen_from_fd((fd), (mode), (persistent_id) STREAMS_REL_CC TSRMLS_CC)
 
70
#define php_stream_fopen_from_file_rel(file, mode)       _php_stream_fopen_from_file((file), (mode) STREAMS_REL_CC TSRMLS_CC)
 
71
        
 
72
#define php_stream_fopen_from_pipe_rel(file, mode)       _php_stream_fopen_from_pipe((file), (mode) STREAMS_REL_CC TSRMLS_CC)
 
73
        
 
74
#define php_stream_fopen_tmpfile_rel()  _php_stream_fopen_tmpfile(0 STREAMS_REL_CC TSRMLS_CC)
 
75
 
 
76
#define php_stream_fopen_temporary_file_rel(dir, pfx, opened_path)      _php_stream_fopen_temporary_file((dir), (pfx), (opened_path) STREAMS_REL_CC TSRMLS_CC)
 
77
        
 
78
#define php_stream_open_wrapper_rel(path, mode, options, opened) _php_stream_open_wrapper_ex((path), (mode), (options), (opened), NULL STREAMS_REL_CC TSRMLS_CC)
 
79
#define php_stream_open_wrapper_ex_rel(path, mode, options, opened, context) _php_stream_open_wrapper_ex((path), (mode), (options), (opened), (context) STREAMS_REL_CC TSRMLS_CC)
 
80
 
 
81
#define php_stream_make_seekable_rel(origstream, newstream, flags) _php_stream_make_seekable((origstream), (newstream), (flags) STREAMS_REL_CC TSRMLS_CC)
 
82
 
 
83
/* }}} */
 
84
        
 
85
/* The contents of the php_stream_ops and php_stream should only be accessed
 
86
 * using the functions/macros in this header.
 
87
 * If you need to get at something that doesn't have an API,
 
88
 * drop me a line <wez@thebrainroom.com> and we can sort out a way to do
 
89
 * it properly.
 
90
 * 
 
91
 * The only exceptions to this rule are that stream implementations can use
 
92
 * the php_stream->abstract pointer to hold their context, and streams
 
93
 * opened via stream_open_wrappers can use the zval ptr in
 
94
 * php_stream->wrapperdata to hold meta data for php scripts to
 
95
 * retrieve using file_get_wrapper_data(). */
 
96
 
 
97
typedef struct _php_stream php_stream;
 
98
typedef struct _php_stream_wrapper php_stream_wrapper;
 
99
typedef struct _php_stream_context php_stream_context;
 
100
typedef struct _php_stream_filter php_stream_filter;
 
101
 
 
102
#include "streams/php_stream_context.h"
 
103
#include "streams/php_stream_filter_api.h"
 
104
 
 
105
typedef struct _php_stream_statbuf {
 
106
        struct stat sb; /* regular info */
 
107
        /* extended info to go here some day: content-type etc. etc. */
 
108
} php_stream_statbuf;
 
109
 
 
110
typedef struct _php_stream_dirent {
 
111
        char d_name[MAXPATHLEN];
 
112
} php_stream_dirent;
 
113
 
 
114
/* operations on streams that are file-handles */
 
115
typedef struct _php_stream_ops  {
 
116
        /* stdio like functions - these are mandatory! */
 
117
        size_t (*write)(php_stream *stream, const char *buf, size_t count TSRMLS_DC);
 
118
        size_t (*read)(php_stream *stream, char *buf, size_t count TSRMLS_DC);
 
119
        int    (*close)(php_stream *stream, int close_handle TSRMLS_DC);
 
120
        int    (*flush)(php_stream *stream TSRMLS_DC);
 
121
        
 
122
        const char *label; /* label for this ops structure */
 
123
        
 
124
        /* these are optional */
 
125
        int (*seek)(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC);
 
126
        int (*cast)(php_stream *stream, int castas, void **ret TSRMLS_DC);
 
127
        int (*stat)(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC);
 
128
        int (*set_option)(php_stream *stream, int option, int value, void *ptrparam TSRMLS_DC);
 
129
} php_stream_ops;
 
130
 
 
131
typedef struct _php_stream_wrapper_ops {
 
132
        /* open/create a wrapped stream */
 
133
        php_stream *(*stream_opener)(php_stream_wrapper *wrapper, char *filename, char *mode,
 
134
                        int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC);
 
135
        /* close/destroy a wrapped stream */
 
136
        int (*stream_closer)(php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC);
 
137
        /* stat a wrapped stream */
 
138
        int (*stream_stat)(php_stream_wrapper *wrapper, php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC);
 
139
        /* stat a URL */
 
140
        int (*url_stat)(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC);
 
141
        /* open a "directory" stream */
 
142
        php_stream *(*dir_opener)(php_stream_wrapper *wrapper, char *filename, char *mode,
 
143
                        int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC);
 
144
        
 
145
        const char *label;
 
146
 
 
147
        /* delete a file */
 
148
        int (*unlink)(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC);
 
149
 
 
150
        /* rename a file */
 
151
        int (*rename)(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC);
 
152
 
 
153
        /* Create/Remove directory */
 
154
        int (*stream_mkdir)(php_stream_wrapper *wrapper, char *url, int mode, int options, php_stream_context *context TSRMLS_DC);
 
155
        int (*stream_rmdir)(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC);
 
156
} php_stream_wrapper_ops;
 
157
 
 
158
struct _php_stream_wrapper      {
 
159
        php_stream_wrapper_ops *wops;   /* operations the wrapper can perform */
 
160
        void *abstract;                                 /* context for the wrapper */
 
161
        int is_url;                                             /* so that PG(allow_url_fopen) can be respected */
 
162
 
 
163
        /* support for wrappers to return (multiple) error messages to the stream opener */
 
164
        int err_count;
 
165
        char **err_stack;
 
166
};
 
167
 
 
168
#define PHP_STREAM_FLAG_NO_SEEK                                         1
 
169
#define PHP_STREAM_FLAG_NO_BUFFER                                       2
 
170
 
 
171
#define PHP_STREAM_FLAG_EOL_UNIX                                        0 /* also includes DOS */
 
172
#define PHP_STREAM_FLAG_DETECT_EOL                                      4
 
173
#define PHP_STREAM_FLAG_EOL_MAC                                         8
 
174
 
 
175
/* set this when the stream might represent "interactive" data.
 
176
 * When set, the read buffer will avoid certain operations that
 
177
 * might otherwise cause the read to block for much longer than
 
178
 * is strictly required. */
 
179
#define PHP_STREAM_FLAG_AVOID_BLOCKING                          16
 
180
        
 
181
struct _php_stream  {
 
182
        php_stream_ops *ops;
 
183
        void *abstract;                 /* convenience pointer for abstraction */
 
184
 
 
185
        php_stream_filter_chain readfilters, writefilters;
 
186
 
 
187
        php_stream_wrapper *wrapper; /* which wrapper was used to open the stream */
 
188
        void *wrapperthis;              /* convenience pointer for a instance of a wrapper */
 
189
        zval *wrapperdata;              /* fgetwrapperdata retrieves this */
 
190
 
 
191
        int fgetss_state;               /* for fgetss to handle multiline tags */
 
192
        int is_persistent;
 
193
        char mode[16];                  /* "rwb" etc. ala stdio */
 
194
        int rsrc_id;                    /* used for auto-cleanup */
 
195
        int in_free;                    /* to prevent recursion during free */
 
196
        /* so we know how to clean it up correctly.  This should be set to
 
197
         * PHP_STREAM_FCLOSE_XXX as appropriate */
 
198
        int fclose_stdiocast;
 
199
        FILE *stdiocast;    /* cache this, otherwise we might leak! */
 
200
#if ZEND_DEBUG
 
201
        int __exposed;  /* non-zero if exposed as a zval somewhere */
 
202
#endif
 
203
        char *orig_path;
 
204
 
 
205
        php_stream_context *context;
 
206
        int flags;      /* PHP_STREAM_FLAG_XXX */
 
207
 
 
208
        /* buffer */
 
209
        off_t position; /* of underlying stream */
 
210
        unsigned char *readbuf;
 
211
        size_t readbuflen;
 
212
        off_t readpos;
 
213
        off_t writepos;
 
214
        
 
215
        /* how much data to read when filling buffer */
 
216
        size_t chunk_size;
 
217
 
 
218
        int eof;
 
219
 
 
220
}; /* php_stream */
 
221
/* state definitions when closing down; these are private to streams.c */
 
222
#define PHP_STREAM_FCLOSE_NONE 0
 
223
#define PHP_STREAM_FCLOSE_FDOPEN        1
 
224
#define PHP_STREAM_FCLOSE_FOPENCOOKIE 2
 
225
 
 
226
/* allocate a new stream for a particular ops */
 
227
BEGIN_EXTERN_C()
 
228
PHPAPI php_stream *_php_stream_alloc(php_stream_ops *ops, void *abstract,
 
229
                const char *persistent_id, const char *mode STREAMS_DC TSRMLS_DC);
 
230
END_EXTERN_C()
 
231
#define php_stream_alloc(ops, thisptr, persistent_id, mode)     _php_stream_alloc((ops), (thisptr), (persistent_id), (mode) STREAMS_CC TSRMLS_CC)
 
232
 
 
233
 
 
234
#define php_stream_get_resource_id(stream)              (stream)->rsrc_id
 
235
#if ZEND_DEBUG
 
236
/* use this to tell the stream that it is OK if we don't explicitly close it */
 
237
# define php_stream_auto_cleanup(stream)        { (stream)->__exposed++; }
 
238
/* use this to assign the stream to a zval and tell the stream that is
 
239
 * has been exported to the engine; it will expect to be closed automatically
 
240
 * when the resources are auto-destructed */
 
241
# define php_stream_to_zval(stream, zval)       { ZVAL_RESOURCE(zval, (stream)->rsrc_id); (stream)->__exposed++; }
 
242
#else
 
243
# define php_stream_auto_cleanup(stream)        /* nothing */
 
244
# define php_stream_to_zval(stream, zval)       { ZVAL_RESOURCE(zval, (stream)->rsrc_id); }
 
245
#endif
 
246
 
 
247
#define php_stream_from_zval(xstr, ppzval)      ZEND_FETCH_RESOURCE2((xstr), php_stream *, (ppzval), -1, "stream", php_file_le_stream(), php_file_le_pstream())
 
248
#define php_stream_from_zval_no_verify(xstr, ppzval)    (xstr) = (php_stream*)zend_fetch_resource((ppzval) TSRMLS_CC, -1, "stream", NULL, 2, php_file_le_stream(), php_file_le_pstream())
 
249
 
 
250
BEGIN_EXTERN_C()
 
251
PHPAPI int php_stream_from_persistent_id(const char *persistent_id, php_stream **stream TSRMLS_DC);
 
252
#define PHP_STREAM_PERSISTENT_SUCCESS   0 /* id exists */
 
253
#define PHP_STREAM_PERSISTENT_FAILURE   1 /* id exists but is not a stream! */
 
254
#define PHP_STREAM_PERSISTENT_NOT_EXIST 2 /* id does not exist */
 
255
 
 
256
#define PHP_STREAM_FREE_CALL_DTOR                       1 /* call ops->close */
 
257
#define PHP_STREAM_FREE_RELEASE_STREAM          2 /* pefree(stream) */
 
258
#define PHP_STREAM_FREE_PRESERVE_HANDLE         4 /* tell ops->close to not close it's underlying handle */
 
259
#define PHP_STREAM_FREE_RSRC_DTOR                       8 /* called from the resource list dtor */
 
260
#define PHP_STREAM_FREE_PERSISTENT                      16 /* manually freeing a persistent connection */
 
261
#define PHP_STREAM_FREE_CLOSE                           (PHP_STREAM_FREE_CALL_DTOR | PHP_STREAM_FREE_RELEASE_STREAM)
 
262
#define PHP_STREAM_FREE_CLOSE_CASTED            (PHP_STREAM_FREE_CLOSE | PHP_STREAM_FREE_PRESERVE_HANDLE)
 
263
#define PHP_STREAM_FREE_CLOSE_PERSISTENT        (PHP_STREAM_FREE_CLOSE | PHP_STREAM_FREE_PERSISTENT)
 
264
 
 
265
PHPAPI int _php_stream_free(php_stream *stream, int close_options TSRMLS_DC);
 
266
#define php_stream_free(stream, close_options)  _php_stream_free((stream), (close_options) TSRMLS_CC)
 
267
#define php_stream_close(stream)        _php_stream_free((stream), PHP_STREAM_FREE_CLOSE TSRMLS_CC)
 
268
#define php_stream_pclose(stream)       _php_stream_free((stream), PHP_STREAM_FREE_CLOSE_PERSISTENT TSRMLS_CC)
 
269
 
 
270
PHPAPI int _php_stream_seek(php_stream *stream, off_t offset, int whence TSRMLS_DC);
 
271
#define php_stream_rewind(stream)       _php_stream_seek((stream), 0L, SEEK_SET TSRMLS_CC)
 
272
#define php_stream_seek(stream, offset, whence) _php_stream_seek((stream), (offset), (whence) TSRMLS_CC)
 
273
 
 
274
PHPAPI off_t _php_stream_tell(php_stream *stream TSRMLS_DC);
 
275
#define php_stream_tell(stream) _php_stream_tell((stream) TSRMLS_CC)
 
276
 
 
277
PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t count TSRMLS_DC);
 
278
#define php_stream_read(stream, buf, count)             _php_stream_read((stream), (buf), (count) TSRMLS_CC)
 
279
 
 
280
PHPAPI size_t _php_stream_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC);
 
281
#define php_stream_write_string(stream, str)    _php_stream_write(stream, str, strlen(str) TSRMLS_CC)
 
282
#define php_stream_write(stream, buf, count)    _php_stream_write(stream, (buf), (count) TSRMLS_CC)
 
283
 
 
284
PHPAPI size_t _php_stream_printf(php_stream *stream TSRMLS_DC, const char *fmt, ...);
 
285
/* php_stream_printf macro & function require TSRMLS_CC */
 
286
#define php_stream_printf _php_stream_printf
 
287
 
 
288
PHPAPI int _php_stream_eof(php_stream *stream TSRMLS_DC);
 
289
#define php_stream_eof(stream)  _php_stream_eof((stream) TSRMLS_CC)
 
290
 
 
291
PHPAPI int _php_stream_getc(php_stream *stream TSRMLS_DC);
 
292
#define php_stream_getc(stream) _php_stream_getc((stream) TSRMLS_CC)
 
293
 
 
294
PHPAPI int _php_stream_putc(php_stream *stream, int c TSRMLS_DC);
 
295
#define php_stream_putc(stream, c)      _php_stream_putc((stream), (c) TSRMLS_CC)
 
296
 
 
297
PHPAPI int _php_stream_flush(php_stream *stream, int closing TSRMLS_DC);
 
298
#define php_stream_flush(stream)        _php_stream_flush((stream), 0 TSRMLS_CC)
 
299
 
 
300
PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen, size_t *returned_len TSRMLS_DC);
 
301
#define php_stream_gets(stream, buf, maxlen)    _php_stream_get_line((stream), (buf), (maxlen), NULL TSRMLS_CC)
 
302
 
 
303
#define php_stream_get_line(stream, buf, maxlen, retlen) _php_stream_get_line((stream), (buf), (maxlen), (retlen) TSRMLS_CC)
 
304
PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *returned_len, char *delim, size_t delim_len TSRMLS_DC);
 
305
 
 
306
/* CAREFUL! this is equivalent to puts NOT fputs! */
 
307
PHPAPI int _php_stream_puts(php_stream *stream, char *buf TSRMLS_DC);
 
308
#define php_stream_puts(stream, buf)    _php_stream_puts((stream), (buf) TSRMLS_CC)
 
309
 
 
310
PHPAPI int _php_stream_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC);
 
311
#define php_stream_stat(stream, ssb)    _php_stream_stat((stream), (ssb) TSRMLS_CC)
 
312
 
 
313
PHPAPI int _php_stream_stat_path(char *path, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC);
 
314
#define php_stream_stat_path(path, ssb) _php_stream_stat_path((path), 0, (ssb), NULL TSRMLS_CC)
 
315
#define php_stream_stat_path_ex(path, flags, ssb, context)      _php_stream_stat_path((path), (flags), (ssb), (context) TSRMLS_CC)
 
316
 
 
317
PHPAPI int _php_stream_mkdir(char *path, int mode, int options, php_stream_context *context TSRMLS_DC);
 
318
#define php_stream_mkdir(path, mode, options, context)  _php_stream_mkdir(path, mode, options, context TSRMLS_CC)
 
319
 
 
320
PHPAPI int _php_stream_rmdir(char *path, int options, php_stream_context *context TSRMLS_DC);
 
321
#define php_stream_rmdir(path, options, context)        _php_stream_rmdir(path, options, context TSRMLS_CC)
 
322
 
 
323
PHPAPI php_stream *_php_stream_opendir(char *path, int options, php_stream_context *context STREAMS_DC TSRMLS_DC);
 
324
#define php_stream_opendir(path, options, context)      _php_stream_opendir((path), (options), (context) STREAMS_CC TSRMLS_CC)
 
325
PHPAPI php_stream_dirent *_php_stream_readdir(php_stream *dirstream, php_stream_dirent *ent TSRMLS_DC);
 
326
#define php_stream_readdir(dirstream, dirent)   _php_stream_readdir((dirstream), (dirent) TSRMLS_CC)
 
327
#define php_stream_closedir(dirstream)  php_stream_close((dirstream))
 
328
#define php_stream_rewinddir(dirstream) php_stream_rewind((dirstream))
 
329
 
 
330
PHPAPI int php_stream_dirent_alphasort(const char **a, const char **b);
 
331
PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b);
 
332
 
 
333
PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_stream_context *context,
 
334
                        int (*compare) (const char **a, const char **b) TSRMLS_DC);
 
335
#define php_stream_scandir(dirname, namelist, context, compare) _php_stream_scandir((dirname), (namelist), 0, (context), (compare) TSRMLS_CC)
 
336
 
 
337
PHPAPI int _php_stream_set_option(php_stream *stream, int option, int value, void *ptrparam TSRMLS_DC);
 
338
#define php_stream_set_option(stream, option, value, ptrvalue)  _php_stream_set_option((stream), (option), (value), (ptrvalue) TSRMLS_CC)
 
339
 
 
340
#define php_stream_set_chunk_size(stream, size) _php_stream_set_option((stream), PHP_STREAM_OPTION_SET_CHUNK_SIZE, (size), NULL TSRMLS_CC)
 
341
 
 
342
END_EXTERN_C()
 
343
 
 
344
 
 
345
/* Flags for mkdir method in wrapper ops */
 
346
#define PHP_STREAM_MKDIR_RECURSIVE      1
 
347
/* define REPORT ERRORS 8 (below) */
 
348
 
 
349
/* Flags for rmdir method in wrapper ops */
 
350
/* define REPORT_ERRORS 8 (below) */
 
351
 
 
352
/* Flags for url_stat method in wrapper ops */
 
353
#define PHP_STREAM_URL_STAT_LINK        1
 
354
#define PHP_STREAM_URL_STAT_QUIET       2
 
355
 
 
356
/* change the blocking mode of stream: value == 1 => blocking, value == 0 => non-blocking. */
 
357
#define PHP_STREAM_OPTION_BLOCKING      1
 
358
 
 
359
/* change the buffering mode of stream. value is a PHP_STREAM_BUFFER_XXXX value, ptrparam is a ptr to a size_t holding
 
360
 * the required buffer size */
 
361
#define PHP_STREAM_OPTION_READ_BUFFER   2
 
362
#define PHP_STREAM_OPTION_WRITE_BUFFER  3
 
363
 
 
364
#define PHP_STREAM_BUFFER_NONE  0       /* unbuffered */
 
365
#define PHP_STREAM_BUFFER_LINE  1       /* line buffered */
 
366
#define PHP_STREAM_BUFFER_FULL  2       /* fully buffered */
 
367
 
 
368
/* set the timeout duration for reads on the stream. ptrparam is a pointer to a struct timeval * */
 
369
#define PHP_STREAM_OPTION_READ_TIMEOUT  4
 
370
#define PHP_STREAM_OPTION_SET_CHUNK_SIZE        5
 
371
 
 
372
/* set or release lock on a stream */
 
373
#define PHP_STREAM_OPTION_LOCKING               6
 
374
 
 
375
/* whether or not locking is supported */
 
376
#define PHP_STREAM_LOCK_SUPPORTED               1       
 
377
 
 
378
#define php_stream_supports_lock(stream)        _php_stream_set_option((stream), PHP_STREAM_OPTION_LOCKING, 0, (void *) PHP_STREAM_LOCK_SUPPORTED TSRMLS_CC) == 0 ? 1 : 0
 
379
#define php_stream_lock(stream, mode)           _php_stream_set_option((stream), PHP_STREAM_OPTION_LOCKING, (mode), (void *) NULL TSRMLS_CC)
 
380
 
 
381
/* option code used by the php_stream_xport_XXX api */
 
382
#define PHP_STREAM_OPTION_XPORT_API                     7 /* see php_stream_transport.h */
 
383
#define PHP_STREAM_OPTION_CRYPTO_API            8 /* see php_stream_transport.h */
 
384
#define PHP_STREAM_OPTION_MMAP_API                      9 /* see php_stream_mmap.h */
 
385
#define PHP_STREAM_OPTION_TRUNCATE_API          10
 
386
 
 
387
#define PHP_STREAM_TRUNCATE_SUPPORTED   0
 
388
#define PHP_STREAM_TRUNCATE_SET_SIZE    1       /* ptrparam is a pointer to a size_t */
 
389
 
 
390
#define php_stream_truncate_supported(stream)   (_php_stream_set_option((stream), PHP_STREAM_OPTION_TRUNCATE_API, PHP_STREAM_TRUNCATE_SUPPORTED, NULL TSRMLS_CC) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0)
 
391
 
 
392
BEGIN_EXTERN_C()
 
393
PHPAPI int _php_stream_truncate_set_size(php_stream *stream, size_t newsize TSRMLS_DC);
 
394
#define php_stream_truncate_set_size(stream, size)      _php_stream_truncate_set_size((stream), (size) TSRMLS_CC)
 
395
END_EXTERN_C()
 
396
 
 
397
#define PHP_STREAM_OPTION_META_DATA_API         11 /* ptrparam is a zval* to which to add meta data information */
 
398
#define php_stream_populate_meta_data(stream, zv)       (_php_stream_set_option((stream), PHP_STREAM_OPTION_META_DATA_API, 0, zv TSRMLS_CC) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0)
 
399
 
 
400
/* Check if the stream is still "live"; for sockets/pipes this means the socket
 
401
 * is still connected; for files, this does not really have meaning */
 
402
#define PHP_STREAM_OPTION_CHECK_LIVENESS        12 /* no parameters */
 
403
 
 
404
#define PHP_STREAM_OPTION_RETURN_OK                      0 /* option set OK */
 
405
#define PHP_STREAM_OPTION_RETURN_ERR            -1 /* problem setting option */
 
406
#define PHP_STREAM_OPTION_RETURN_NOTIMPL        -2 /* underlying stream does not implement; streams can handle it instead */
 
407
 
 
408
/* copy up to maxlen bytes from src to dest.  If maxlen is PHP_STREAM_COPY_ALL, copy until eof(src).
 
409
 * Uses mmap if the src is a plain file and at offset 0 */
 
410
#define PHP_STREAM_COPY_ALL                     ((size_t)-1)
 
411
 
 
412
BEGIN_EXTERN_C()
 
413
PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC TSRMLS_DC);
 
414
#define php_stream_copy_to_stream(src, dest, maxlen)    _php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC TSRMLS_CC)
 
415
 
 
416
 
 
417
/* read all data from stream and put into a buffer. Caller must free buffer when done.
 
418
 * The copy will use mmap if available. */
 
419
PHPAPI size_t _php_stream_copy_to_mem(php_stream *src, char **buf, size_t maxlen,
 
420
                int persistent STREAMS_DC TSRMLS_DC);
 
421
#define php_stream_copy_to_mem(src, buf, maxlen, persistent) _php_stream_copy_to_mem((src), (buf), (maxlen), (persistent) STREAMS_CC TSRMLS_CC)
 
422
 
 
423
/* output all data from a stream */
 
424
PHPAPI size_t _php_stream_passthru(php_stream * src STREAMS_DC TSRMLS_DC);
 
425
#define php_stream_passthru(stream)     _php_stream_passthru((stream) STREAMS_CC TSRMLS_CC)
 
426
END_EXTERN_C()
 
427
 
 
428
#include "streams/php_stream_transport.h"
 
429
#include "streams/php_stream_plain_wrapper.h"
 
430
#include "streams/php_stream_userspace.h"
 
431
#include "streams/php_stream_mmap.h"
 
432
 
 
433
/* coerce the stream into some other form */
 
434
/* cast as a stdio FILE * */
 
435
#define PHP_STREAM_AS_STDIO     0
 
436
/* cast as a POSIX fd or socketd */
 
437
#define PHP_STREAM_AS_FD                1
 
438
/* cast as a socketd */
 
439
#define PHP_STREAM_AS_SOCKETD   2
 
440
/* cast as fd/socket for select purposes */
 
441
#define PHP_STREAM_AS_FD_FOR_SELECT 3
 
442
 
 
443
/* try really, really hard to make sure the cast happens (avoid using this flag if possible) */
 
444
#define PHP_STREAM_CAST_TRY_HARD        0x80000000
 
445
#define PHP_STREAM_CAST_RELEASE         0x40000000      /* stream becomes invalid on success */
 
446
#define PHP_STREAM_CAST_INTERNAL        0x20000000      /* stream cast for internal use */
 
447
#define PHP_STREAM_CAST_MASK            (PHP_STREAM_CAST_TRY_HARD | PHP_STREAM_CAST_RELEASE | PHP_STREAM_CAST_INTERNAL)
 
448
BEGIN_EXTERN_C()
 
449
PHPAPI int _php_stream_cast(php_stream *stream, int castas, void **ret, int show_err TSRMLS_DC);
 
450
END_EXTERN_C()
 
451
/* use this to check if a stream can be cast into another form */
 
452
#define php_stream_can_cast(stream, as) _php_stream_cast((stream), (as), NULL, 0 TSRMLS_CC)
 
453
#define php_stream_cast(stream, as, ret, show_err)      _php_stream_cast((stream), (as), (ret), (show_err) TSRMLS_CC)
 
454
 
 
455
/* use this to check if a stream is of a particular type:
 
456
 * PHPAPI int php_stream_is(php_stream *stream, php_stream_ops *ops); */
 
457
#define php_stream_is(stream, anops)            ((stream)->ops == anops)
 
458
#define PHP_STREAM_IS_STDIO &php_stream_stdio_ops
 
459
 
 
460
#define php_stream_is_persistent(stream)        (stream)->is_persistent
 
461
 
 
462
/* Wrappers support */
 
463
 
 
464
#define IGNORE_PATH                     0
 
465
#define USE_PATH                        1
 
466
#define IGNORE_URL                      2
 
467
#define ENFORCE_SAFE_MODE       4
 
468
#define REPORT_ERRORS           8
 
469
/* If you don't need to write to the stream, but really need to
 
470
 * be able to seek, use this flag in your options. */
 
471
#define STREAM_MUST_SEEK        16
 
472
/* If you are going to end up casting the stream into a FILE* or
 
473
 * a socket, pass this flag and the streams/wrappers will not use
 
474
 * buffering mechanisms while reading the headers, so that HTTP
 
475
 * wrapped streams will work consistently.
 
476
 * If you omit this flag, streams will use buffering and should end 
 
477
 * up working more optimally.
 
478
 * */
 
479
#define STREAM_WILL_CAST        32
 
480
 
 
481
/* this flag applies to php_stream_locate_url_wrapper */
 
482
#define STREAM_LOCATE_WRAPPERS_ONLY     64
 
483
 
 
484
/* this flag is only used by include/require functions */
 
485
#define STREAM_OPEN_FOR_INCLUDE         128
 
486
 
 
487
/* this flag tells streams to ONLY open urls */
 
488
#define STREAM_USE_URL                  256
 
489
 
 
490
/* this flag is used when only the headers from HTTP request are to be fetched */
 
491
#define STREAM_ONLY_GET_HEADERS         512
 
492
 
 
493
/* don't apply open_basedir checks */
 
494
#define STREAM_DISABLE_OPEN_BASEDIR     1024
 
495
 
 
496
/* get (or create) a persistent version of the stream */
 
497
#define STREAM_OPEN_PERSISTENT  2048
 
498
 
 
499
/* Antique - no longer has meaning */
 
500
#define IGNORE_URL_WIN 0
 
501
 
 
502
int php_init_stream_wrappers(int module_number TSRMLS_DC);
 
503
int php_shutdown_stream_wrappers(int module_number TSRMLS_DC);
 
504
void php_shutdown_stream_hashes(TSRMLS_D);
 
505
PHP_RSHUTDOWN_FUNCTION(streams);
 
506
 
 
507
BEGIN_EXTERN_C()
 
508
PHPAPI int php_register_url_stream_wrapper(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC);
 
509
PHPAPI int php_unregister_url_stream_wrapper(char *protocol TSRMLS_DC);
 
510
PHPAPI int php_register_url_stream_wrapper_volatile(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC);
 
511
PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC);
 
512
PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char **path_for_open, int options TSRMLS_DC);
 
513
PHPAPI char *php_stream_locate_eol(php_stream *stream, char *buf, size_t buf_len TSRMLS_DC);
 
514
 
 
515
#define php_stream_open_wrapper(path, mode, options, opened)    _php_stream_open_wrapper_ex((path), (mode), (options), (opened), NULL STREAMS_CC TSRMLS_CC)
 
516
#define php_stream_open_wrapper_ex(path, mode, options, opened, context)        _php_stream_open_wrapper_ex((path), (mode), (options), (opened), (context) STREAMS_CC TSRMLS_CC)
 
517
 
 
518
#define php_stream_get_from_zval(stream, zstream, mode, options, opened, context) \
 
519
                if (Z_TYPE_PP((zstream)) == IS_RESOURCE) { \
 
520
                        php_stream_from_zval((stream), (zstream)); \
 
521
                } else (stream) = Z_TYPE_PP((zstream)) == IS_STRING ?  \
 
522
                        php_stream_open_wrapper_ex(Z_STRVAL_PP((zstream)), (mode), (options), (opened), (context)) : NULL
 
523
 
 
524
/* pushes an error message onto the stack for a wrapper instance */
 
525
PHPAPI void php_stream_wrapper_log_error(php_stream_wrapper *wrapper, int options TSRMLS_DC, const char *fmt, ...);
 
526
 
 
527
 
 
528
#define PHP_STREAM_UNCHANGED    0 /* orig stream was seekable anyway */
 
529
#define PHP_STREAM_RELEASED             1 /* newstream should be used; origstream is no longer valid */
 
530
#define PHP_STREAM_FAILED               2 /* an error occurred while attempting conversion */
 
531
#define PHP_STREAM_CRITICAL             3 /* an error occurred; origstream is in an unknown state; you should close origstream */
 
532
#define PHP_STREAM_NO_PREFERENCE        0
 
533
#define PHP_STREAM_PREFER_STDIO         1
 
534
#define PHP_STREAM_FORCE_CONVERSION     2
 
535
/* DO NOT call this on streams that are referenced by resources! */
 
536
PHPAPI int _php_stream_make_seekable(php_stream *origstream, php_stream **newstream, int flags STREAMS_DC TSRMLS_DC);
 
537
#define php_stream_make_seekable(origstream, newstream, flags)  _php_stream_make_seekable((origstream), (newstream), (flags) STREAMS_CC TSRMLS_CC)
 
538
 
 
539
/* Give other modules access to the url_stream_wrappers_hash and stream_filters_hash */
 
540
PHPAPI HashTable *_php_stream_get_url_stream_wrappers_hash(TSRMLS_D);
 
541
#define php_stream_get_url_stream_wrappers_hash()       _php_stream_get_url_stream_wrappers_hash(TSRMLS_C)
 
542
PHPAPI HashTable *_php_get_stream_filters_hash(TSRMLS_D);
 
543
#define php_get_stream_filters_hash()   _php_get_stream_filters_hash(TSRMLS_C)
 
544
PHPAPI HashTable *php_get_stream_filters_hash_global();
 
545
END_EXTERN_C()
 
546
#endif
 
547
 
 
548
/*
 
549
 * Local variables:
 
550
 * tab-width: 4
 
551
 * c-basic-offset: 4
 
552
 * End:
 
553
 * vim600: sw=4 ts=4 fdm=marker
 
554
 * vim<600: sw=4 ts=4
 
555
 */