Coverage Report

Created: 2022-02-19 20:31

/src/php-src/main/php_output.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
   +----------------------------------------------------------------------+
3
   | Copyright (c) The PHP Group                                          |
4
   +----------------------------------------------------------------------+
5
   | This source file is subject to version 3.01 of the PHP license,      |
6
   | that is bundled with this package in the file LICENSE, and is        |
7
   | available through the world-wide-web at the following url:           |
8
   | http://www.php.net/license/3_01.txt                                  |
9
   | If you did not receive a copy of the PHP license and are unable to   |
10
   | obtain it through the world-wide-web, please send a note to          |
11
   | license@php.net so we can mail you a copy immediately.               |
12
   +----------------------------------------------------------------------+
13
   | Author: Michael Wallner <mike@php.net>                               |
14
   +----------------------------------------------------------------------+
15
*/
16
17
#ifndef PHP_OUTPUT_H
18
#define PHP_OUTPUT_H
19
20
#define PHP_OUTPUT_NEWAPI 1
21
22
/* handler ops */
23
220M
#define PHP_OUTPUT_HANDLER_WRITE  0x00  /* standard passthru */
24
105k
#define PHP_OUTPUT_HANDLER_START  0x01  /* start */
25
34.6k
#define PHP_OUTPUT_HANDLER_CLEAN  0x02  /* restart */
26
0
#define PHP_OUTPUT_HANDLER_FLUSH  0x04  /* pass along as much as possible */
27
35.2k
#define PHP_OUTPUT_HANDLER_FINAL  0x08  /* finalize */
28
0
#define PHP_OUTPUT_HANDLER_CONT   PHP_OUTPUT_HANDLER_WRITE
29
0
#define PHP_OUTPUT_HANDLER_END    PHP_OUTPUT_HANDLER_FINAL
30
31
/* handler types */
32
35.2k
#define PHP_OUTPUT_HANDLER_INTERNAL   0x0000
33
70.4k
#define PHP_OUTPUT_HANDLER_USER     0x0001
34
35
/* handler ability flags */
36
0
#define PHP_OUTPUT_HANDLER_CLEANABLE  0x0010
37
0
#define PHP_OUTPUT_HANDLER_FLUSHABLE  0x0020
38
35.1k
#define PHP_OUTPUT_HANDLER_REMOVABLE  0x0040
39
35.2k
#define PHP_OUTPUT_HANDLER_STDFLAGS   0x0070
40
41
/* handler status flags */
42
105k
#define PHP_OUTPUT_HANDLER_STARTED    0x1000
43
89.1M
#define PHP_OUTPUT_HANDLER_DISABLED   0x2000
44
35.2k
#define PHP_OUTPUT_HANDLER_PROCESSED  0x4000
45
46
/* handler op return values */
47
typedef enum _php_output_handler_status_t {
48
  PHP_OUTPUT_HANDLER_FAILURE,
49
  PHP_OUTPUT_HANDLER_SUCCESS,
50
  PHP_OUTPUT_HANDLER_NO_DATA
51
} php_output_handler_status_t;
52
53
/* php_output_stack_pop() flags */
54
35.1k
#define PHP_OUTPUT_POP_TRY      0x000
55
35.3k
#define PHP_OUTPUT_POP_FORCE    0x001
56
105k
#define PHP_OUTPUT_POP_DISCARD    0x010
57
0
#define PHP_OUTPUT_POP_SILENT   0x100
58
59
/* real global flags */
60
131M
#define PHP_OUTPUT_IMPLICITFLUSH    0x01
61
130M
#define PHP_OUTPUT_DISABLED       0x02
62
89.1M
#define PHP_OUTPUT_WRITTEN        0x04
63
130M
#define PHP_OUTPUT_SENT         0x08
64
/* supplementary flags for php_output_get_status() */
65
0
#define PHP_OUTPUT_ACTIVE       0x10
66
0
#define PHP_OUTPUT_LOCKED       0x20
67
/* output layer is ready to use */
68
221M
#define PHP_OUTPUT_ACTIVATED    0x100000
69
70
/* handler hooks */
71
typedef enum _php_output_handler_hook_t {
72
  PHP_OUTPUT_HANDLER_HOOK_GET_OPAQ,
73
  PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS,
74
  PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL,
75
  PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE,
76
  PHP_OUTPUT_HANDLER_HOOK_DISABLE,
77
  /* unused */
78
  PHP_OUTPUT_HANDLER_HOOK_LAST
79
} php_output_handler_hook_t;
80
81
72.3k
#define PHP_OUTPUT_HANDLER_INITBUF_SIZE(s) \
82
72.3k
( ((s) > 1) ? \
83
13.2k
  (s) + PHP_OUTPUT_HANDLER_ALIGNTO_SIZE - ((s) % (PHP_OUTPUT_HANDLER_ALIGNTO_SIZE)) : \
84
59.0k
  PHP_OUTPUT_HANDLER_DEFAULT_SIZE \
85
72.3k
)
86
26.4k
#define PHP_OUTPUT_HANDLER_ALIGNTO_SIZE   0x1000
87
59.0k
#define PHP_OUTPUT_HANDLER_DEFAULT_SIZE   0x4000
88
89
typedef struct _php_output_buffer {
90
  char *data;
91
  size_t size;
92
  size_t used;
93
  uint32_t free:1;
94
  uint32_t _reserved:31;
95
} php_output_buffer;
96
97
typedef struct _php_output_context {
98
  int op;
99
  php_output_buffer in;
100
  php_output_buffer out;
101
} php_output_context;
102
103
/* old-style, stateless callback */
104
typedef void (*php_output_handler_func_t)(char *output, size_t output_len, char **handled_output, size_t *handled_output_len, int mode);
105
/* new-style, opaque context callback */
106
typedef int (*php_output_handler_context_func_t)(void **handler_context, php_output_context *output_context);
107
/* output handler context dtor */
108
typedef void (*php_output_handler_context_dtor_t)(void *opaq);
109
/* conflict check callback */
110
typedef int (*php_output_handler_conflict_check_t)(const char *handler_name, size_t handler_name_len);
111
/* ctor for aliases */
112
typedef struct _php_output_handler *(*php_output_handler_alias_ctor_t)(const char *handler_name, size_t handler_name_len, size_t chunk_size, int flags);
113
114
typedef struct _php_output_handler_user_func_t {
115
  zend_fcall_info fci;
116
  zend_fcall_info_cache fcc;
117
  zval zoh;
118
} php_output_handler_user_func_t;
119
120
typedef struct _php_output_handler {
121
  zend_string *name;
122
  int flags;
123
  int level;
124
  size_t size;
125
  php_output_buffer buffer;
126
127
  void *opaq;
128
  void (*dtor)(void *opaq);
129
130
  union {
131
    php_output_handler_user_func_t *user;
132
    php_output_handler_context_func_t internal;
133
  } func;
134
} php_output_handler;
135
136
ZEND_BEGIN_MODULE_GLOBALS(output)
137
  zend_stack handlers;
138
  php_output_handler *active;
139
  php_output_handler *running;
140
  const char *output_start_filename;
141
  int output_start_lineno;
142
  int flags;
143
ZEND_END_MODULE_GLOBALS(output)
144
145
PHPAPI ZEND_EXTERN_MODULE_GLOBALS(output)
146
147
/* there should not be a need to use OG() from outside of output.c */
148
#ifdef ZTS
149
# define OG(v) ZEND_TSRMG(output_globals_id, zend_output_globals *, v)
150
#else
151
1.63G
# define OG(v) (output_globals.v)
152
#endif
153
154
/* convenience macros */
155
111M
#define PHPWRITE(str, str_len)    php_output_write((str), (str_len))
156
#define PHPWRITE_H(str, str_len)  php_output_write_unbuffered((str), (str_len))
157
158
0
#define PUTC(c)           php_output_write((const char *) &(c), 1)
159
#define PUTC_H(c)         php_output_write_unbuffered((const char *) &(c), 1)
160
161
29.0M
#define PUTS(str)         do {       \
162
29.0M
  const char *__str = (str);              \
163
29.0M
  php_output_write(__str, strlen(__str)); \
164
29.0M
} while (0)
165
#define PUTS_H(str)         do {              \
166
  const char *__str = (str);                    \
167
  php_output_write_unbuffered(__str, strlen(__str));  \
168
} while (0)
169
170
171
BEGIN_EXTERN_C()
172
173
extern const char php_output_default_handler_name[sizeof("default output handler")];
174
extern const char php_output_devnull_handler_name[sizeof("null output handler")];
175
176
#define php_output_tearup() \
177
  php_output_startup(); \
178
  php_output_activate()
179
#define php_output_teardown() \
180
  php_output_end_all(); \
181
  php_output_deactivate(); \
182
  php_output_shutdown()
183
184
/* MINIT */
185
PHPAPI void php_output_startup(void);
186
/* MSHUTDOWN */
187
PHPAPI void php_output_shutdown(void);
188
189
PHPAPI void php_output_register_constants(void);
190
191
/* RINIT */
192
PHPAPI int php_output_activate(void);
193
/* RSHUTDOWN */
194
PHPAPI void php_output_deactivate(void);
195
196
PHPAPI void php_output_set_status(int status);
197
PHPAPI int php_output_get_status(void);
198
PHPAPI void php_output_set_implicit_flush(int flush);
199
PHPAPI const char *php_output_get_start_filename(void);
200
PHPAPI int php_output_get_start_lineno(void);
201
202
PHPAPI size_t php_output_write_unbuffered(const char *str, size_t len);
203
PHPAPI size_t php_output_write(const char *str, size_t len);
204
205
PHPAPI int php_output_flush(void);
206
PHPAPI void php_output_flush_all(void);
207
PHPAPI int php_output_clean(void);
208
PHPAPI void php_output_clean_all(void);
209
PHPAPI int php_output_end(void);
210
PHPAPI void php_output_end_all(void);
211
PHPAPI int php_output_discard(void);
212
PHPAPI void php_output_discard_all(void);
213
214
PHPAPI int php_output_get_contents(zval *p);
215
PHPAPI int php_output_get_length(zval *p);
216
PHPAPI int php_output_get_level(void);
217
PHPAPI php_output_handler* php_output_get_active_handler(void);
218
219
PHPAPI int php_output_start_default(void);
220
PHPAPI int php_output_start_devnull(void);
221
222
PHPAPI int php_output_start_user(zval *output_handler, size_t chunk_size, int flags);
223
PHPAPI int php_output_start_internal(const char *name, size_t name_len, php_output_handler_func_t output_handler, size_t chunk_size, int flags);
224
225
PHPAPI php_output_handler *php_output_handler_create_user(zval *handler, size_t chunk_size, int flags);
226
PHPAPI php_output_handler *php_output_handler_create_internal(const char *name, size_t name_len, php_output_handler_context_func_t handler, size_t chunk_size, int flags);
227
228
PHPAPI void php_output_handler_set_context(php_output_handler *handler, void *opaq, void (*dtor)(void*));
229
PHPAPI int php_output_handler_start(php_output_handler *handler);
230
PHPAPI int php_output_handler_started(const char *name, size_t name_len);
231
PHPAPI int php_output_handler_hook(php_output_handler_hook_t type, void *arg);
232
PHPAPI void php_output_handler_dtor(php_output_handler *handler);
233
PHPAPI void php_output_handler_free(php_output_handler **handler);
234
235
PHPAPI int php_output_handler_conflict(const char *handler_new, size_t handler_new_len, const char *handler_set, size_t handler_set_len);
236
PHPAPI int php_output_handler_conflict_register(const char *handler_name, size_t handler_name_len, php_output_handler_conflict_check_t check_func);
237
PHPAPI int php_output_handler_reverse_conflict_register(const char *handler_name, size_t handler_name_len, php_output_handler_conflict_check_t check_func);
238
239
PHPAPI php_output_handler_alias_ctor_t php_output_handler_alias(const char *handler_name, size_t handler_name_len);
240
PHPAPI int php_output_handler_alias_register(const char *handler_name, size_t handler_name_len, php_output_handler_alias_ctor_t func);
241
242
END_EXTERN_C()
243
244
245
PHP_FUNCTION(ob_start);
246
PHP_FUNCTION(ob_flush);
247
PHP_FUNCTION(ob_clean);
248
PHP_FUNCTION(ob_end_flush);
249
PHP_FUNCTION(ob_end_clean);
250
PHP_FUNCTION(ob_get_flush);
251
PHP_FUNCTION(ob_get_clean);
252
PHP_FUNCTION(ob_get_contents);
253
PHP_FUNCTION(ob_get_length);
254
PHP_FUNCTION(ob_get_level);
255
PHP_FUNCTION(ob_get_status);
256
PHP_FUNCTION(ob_implicit_flush);
257
PHP_FUNCTION(ob_list_handlers);
258
259
PHP_FUNCTION(output_add_rewrite_var);
260
PHP_FUNCTION(output_reset_rewrite_vars);
261
262
#endif