1/*
2   +----------------------------------------------------------------------+
3   | PHP Version 5                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2013 The PHP Group                                |
6   +----------------------------------------------------------------------+
7   | This source file is subject to version 3.01 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_01.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   | Authors: Andi Gutmans <andi@zend.com>                                |
16   |          Zeev Suraski <zeev@zend.com>                                |
17   +----------------------------------------------------------------------+
18 */
19
20/* $Id$ */
21
22#ifndef PHP_H
23#define PHP_H
24
25#ifdef HAVE_DMALLOC
26#include <dmalloc.h>
27#endif
28
29#define PHP_API_VERSION 20090626
30#define PHP_HAVE_STREAMS
31#define YYDEBUG 0
32
33#include "php_version.h"
34#include "zend.h"
35#include "zend_qsort.h"
36#include "php_compat.h"
37
38#include "zend_API.h"
39
40#undef sprintf
41#define sprintf php_sprintf
42
43/* PHP's DEBUG value must match Zend's ZEND_DEBUG value */
44#undef PHP_DEBUG
45#define PHP_DEBUG ZEND_DEBUG
46
47#ifdef PHP_WIN32
48#   include "tsrm_win32.h"
49#   include "win95nt.h"
50#   ifdef PHP_EXPORTS
51#       define PHPAPI __declspec(dllexport)
52#   else
53#       define PHPAPI __declspec(dllimport)
54#   endif
55#   define PHP_DIR_SEPARATOR '\\'
56#   define PHP_EOL "\r\n"
57#else
58#   if defined(__GNUC__) && __GNUC__ >= 4
59#       define PHPAPI __attribute__ ((visibility("default")))
60#   else
61#       define PHPAPI
62#   endif
63#   define THREAD_LS
64#   define PHP_DIR_SEPARATOR '/'
65#   define PHP_EOL "\n"
66#endif
67
68#ifdef NETWARE
69/* For php_get_uname() function */
70#define PHP_UNAME  "NetWare"
71#define PHP_OS      PHP_UNAME
72#endif
73
74#if HAVE_ASSERT_H
75#if PHP_DEBUG
76#undef NDEBUG
77#else
78#ifndef NDEBUG
79#define NDEBUG
80#endif
81#endif
82#include <assert.h>
83#else /* HAVE_ASSERT_H */
84#define assert(expr) ((void) (0))
85#endif /* HAVE_ASSERT_H */
86
87#define APACHE 0
88
89#if HAVE_UNIX_H
90#include <unix.h>
91#endif
92
93#if HAVE_ALLOCA_H
94#include <alloca.h>
95#endif
96
97#if HAVE_BUILD_DEFS_H
98#include <build-defs.h>
99#endif
100
101/*
102 * This is a fast version of strlcpy which should be used, if you
103 * know the size of the destination buffer and if you know
104 * the length of the source string.
105 *
106 * size is the allocated number of bytes of dst
107 * src_size is the number of bytes excluding the NUL of src
108 */
109
110#define PHP_STRLCPY(dst, src, size, src_size)   \
111    {                                           \
112        size_t php_str_len;                     \
113                                                \
114        if (src_size >= size)                   \
115            php_str_len = size - 1;             \
116        else                                    \
117            php_str_len = src_size;             \
118        memcpy(dst, src, php_str_len);          \
119        dst[php_str_len] = '\0';                \
120    }
121
122#ifndef HAVE_STRLCPY
123BEGIN_EXTERN_C()
124PHPAPI size_t php_strlcpy(char *dst, const char *src, size_t siz);
125END_EXTERN_C()
126#undef strlcpy
127#define strlcpy php_strlcpy
128#endif
129
130#ifndef HAVE_STRLCAT
131BEGIN_EXTERN_C()
132PHPAPI size_t php_strlcat(char *dst, const char *src, size_t siz);
133END_EXTERN_C()
134#undef strlcat
135#define strlcat php_strlcat
136#endif
137
138#ifndef HAVE_STRTOK_R
139BEGIN_EXTERN_C()
140char *strtok_r(char *s, const char *delim, char **last);
141END_EXTERN_C()
142#endif
143
144#ifndef HAVE_SOCKLEN_T
145typedef unsigned int socklen_t;
146#endif
147
148#define CREATE_MUTEX(a, b)
149#define SET_MUTEX(a)
150#define FREE_MUTEX(a)
151
152/*
153 * Then the ODBC support can use both iodbc and Solid,
154 * uncomment this.
155 * #define HAVE_ODBC (HAVE_IODBC|HAVE_SOLID)
156 */
157
158#include <stdlib.h>
159#include <ctype.h>
160#if HAVE_UNISTD_H
161#include <unistd.h>
162#endif
163#if HAVE_STDARG_H
164#include <stdarg.h>
165#else
166# if HAVE_SYS_VARARGS_H
167# include <sys/varargs.h>
168# endif
169#endif
170
171#ifndef va_copy
172# ifdef __va_copy
173#  define va_copy(ap1, ap2)         __va_copy((ap1), (ap2))
174# else
175#  define va_copy(ap1, ap2)         memcpy((&ap1), (&ap2), sizeof(va_list))
176# endif
177#endif
178
179#include "zend_hash.h"
180#include "php3_compat.h"
181#include "zend_alloc.h"
182#include "zend_stack.h"
183
184#if STDC_HEADERS
185# include <string.h>
186#else
187# ifndef HAVE_MEMCPY
188#  define memcpy(d, s, n)   bcopy((s), (d), (n))
189# endif
190# ifndef HAVE_MEMMOVE
191#  define memmove(d, s, n)  bcopy ((s), (d), (n))
192# endif
193#endif
194
195#include "safe_mode.h"
196
197#ifndef HAVE_STRERROR
198char *strerror(int);
199#endif
200
201#if HAVE_PWD_H
202# ifdef PHP_WIN32
203#include "win32/param.h"
204# else
205#include <pwd.h>
206#include <sys/param.h>
207# endif
208#endif
209
210#if HAVE_LIMITS_H
211#include <limits.h>
212#endif
213
214#ifndef LONG_MAX
215#define LONG_MAX 2147483647L
216#endif
217
218#ifndef LONG_MIN
219#define LONG_MIN (- LONG_MAX - 1)
220#endif
221
222#ifndef INT_MAX
223#define INT_MAX 2147483647
224#endif
225
226#ifndef INT_MIN
227#define INT_MIN (- INT_MAX - 1)
228#endif
229
230#define PHP_GCC_VERSION ZEND_GCC_VERSION
231#define PHP_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_MALLOC
232#define PHP_ATTRIBUTE_FORMAT ZEND_ATTRIBUTE_FORMAT
233
234BEGIN_EXTERN_C()
235#include "snprintf.h"
236END_EXTERN_C()
237#include "spprintf.h"
238
239#define EXEC_INPUT_BUF 4096
240
241#define PHP_MIME_TYPE "application/x-httpd-php"
242
243/* macros */
244#define STR_PRINT(str)  ((str)?(str):"")
245
246#ifndef MAXPATHLEN
247# ifdef PATH_MAX
248#  define MAXPATHLEN PATH_MAX
249# elif defined(MAX_PATH)
250#  define MAXPATHLEN MAX_PATH
251# else
252#  define MAXPATHLEN 256    /* Should be safe for any weird systems that do not define it */
253# endif
254#endif
255
256
257/* global variables */
258#if !defined(PHP_WIN32)
259#define PHP_SLEEP_NON_VOID
260#define php_sleep sleep
261extern char **environ;
262#endif  /* !defined(PHP_WIN32) */
263
264#ifdef PHP_PWRITE_64
265ssize_t pwrite(int, void *, size_t, off64_t);
266#endif
267
268#ifdef PHP_PREAD_64
269ssize_t pread(int, void *, size_t, off64_t);
270#endif
271
272BEGIN_EXTERN_C()
273void phperror(char *error);
274PHPAPI int php_write(void *buf, uint size TSRMLS_DC);
275PHPAPI int php_printf(const char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, 1,
276        2);
277PHPAPI void php_log_err(char *log_message TSRMLS_DC);
278int Debug(char *format, ...) PHP_ATTRIBUTE_FORMAT(printf, 1, 2);
279int cfgparse(void);
280END_EXTERN_C()
281
282#define php_error zend_error
283#define error_handling_t zend_error_handling_t
284
285BEGIN_EXTERN_C()
286static inline ZEND_ATTRIBUTE_DEPRECATED void php_set_error_handling(error_handling_t error_handling, zend_class_entry *exception_class TSRMLS_DC)
287{
288    zend_replace_error_handling(error_handling, exception_class, NULL TSRMLS_CC);
289}
290static inline ZEND_ATTRIBUTE_DEPRECATED void php_std_error_handling() {}
291
292PHPAPI void php_verror(const char *docref, const char *params, int type, const char *format, va_list args TSRMLS_DC) PHP_ATTRIBUTE_FORMAT(printf, 4, 0);
293
294#ifdef ZTS
295#define PHP_ATTR_FMT_OFFSET 1
296#else
297#define PHP_ATTR_FMT_OFFSET 0
298#endif
299
300/* PHPAPI void php_error(int type, const char *format, ...); */
301PHPAPI void php_error_docref0(const char *docref TSRMLS_DC, int type, const char *format, ...)
302    PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 3, PHP_ATTR_FMT_OFFSET + 4);
303PHPAPI void php_error_docref1(const char *docref TSRMLS_DC, const char *param1, int type, const char *format, ...)
304    PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 4, PHP_ATTR_FMT_OFFSET + 5);
305PHPAPI void php_error_docref2(const char *docref TSRMLS_DC, const char *param1, const char *param2, int type, const char *format, ...)
306    PHP_ATTRIBUTE_FORMAT(printf, PHP_ATTR_FMT_OFFSET + 5, PHP_ATTR_FMT_OFFSET + 6);
307#ifdef PHP_WIN32
308PHPAPI void php_win32_docref2_from_error(DWORD error, const char *param1, const char *param2 TSRMLS_DC);
309#endif
310END_EXTERN_C()
311
312#define php_error_docref php_error_docref0
313
314#define zenderror phperror
315#define zendlex phplex
316
317#define phpparse zendparse
318#define phprestart zendrestart
319#define phpin zendin
320
321#define php_memnstr zend_memnstr
322
323/* functions */
324BEGIN_EXTERN_C()
325PHPAPI extern int (*php_register_internal_extensions_func)(TSRMLS_D);
326PHPAPI int php_register_internal_extensions(TSRMLS_D);
327PHPAPI int php_mergesort(void *base, size_t nmemb, register size_t size, int (*cmp)(const void *, const void * TSRMLS_DC) TSRMLS_DC);
328PHPAPI void php_register_pre_request_shutdown(void (*func)(void *), void *userdata);
329PHPAPI void php_com_initialize(TSRMLS_D);
330END_EXTERN_C()
331
332/* PHP-named Zend macro wrappers */
333#define PHP_FN                  ZEND_FN
334#define PHP_MN                  ZEND_MN
335#define PHP_NAMED_FUNCTION      ZEND_NAMED_FUNCTION
336#define PHP_FUNCTION            ZEND_FUNCTION
337#define PHP_METHOD              ZEND_METHOD
338
339#define PHP_RAW_NAMED_FE ZEND_RAW_NAMED_FE
340#define PHP_NAMED_FE    ZEND_NAMED_FE
341#define PHP_FE          ZEND_FE
342#define PHP_DEP_FE      ZEND_DEP_FE
343#define PHP_FALIAS      ZEND_FALIAS
344#define PHP_DEP_FALIAS  ZEND_DEP_FALIAS
345#define PHP_ME          ZEND_ME
346#define PHP_MALIAS      ZEND_MALIAS
347#define PHP_ABSTRACT_ME ZEND_ABSTRACT_ME
348#define PHP_ME_MAPPING  ZEND_ME_MAPPING
349#define PHP_FE_END      ZEND_FE_END
350
351#define PHP_MODULE_STARTUP_N    ZEND_MODULE_STARTUP_N
352#define PHP_MODULE_SHUTDOWN_N   ZEND_MODULE_SHUTDOWN_N
353#define PHP_MODULE_ACTIVATE_N   ZEND_MODULE_ACTIVATE_N
354#define PHP_MODULE_DEACTIVATE_N ZEND_MODULE_DEACTIVATE_N
355#define PHP_MODULE_INFO_N       ZEND_MODULE_INFO_N
356
357#define PHP_MODULE_STARTUP_D    ZEND_MODULE_STARTUP_D
358#define PHP_MODULE_SHUTDOWN_D   ZEND_MODULE_SHUTDOWN_D
359#define PHP_MODULE_ACTIVATE_D   ZEND_MODULE_ACTIVATE_D
360#define PHP_MODULE_DEACTIVATE_D ZEND_MODULE_DEACTIVATE_D
361#define PHP_MODULE_INFO_D       ZEND_MODULE_INFO_D
362
363/* Compatibility macros */
364#define PHP_MINIT       ZEND_MODULE_STARTUP_N
365#define PHP_MSHUTDOWN   ZEND_MODULE_SHUTDOWN_N
366#define PHP_RINIT       ZEND_MODULE_ACTIVATE_N
367#define PHP_RSHUTDOWN   ZEND_MODULE_DEACTIVATE_N
368#define PHP_MINFO       ZEND_MODULE_INFO_N
369#define PHP_GINIT       ZEND_GINIT
370#define PHP_GSHUTDOWN   ZEND_GSHUTDOWN
371
372#define PHP_MINIT_FUNCTION      ZEND_MODULE_STARTUP_D
373#define PHP_MSHUTDOWN_FUNCTION  ZEND_MODULE_SHUTDOWN_D
374#define PHP_RINIT_FUNCTION      ZEND_MODULE_ACTIVATE_D
375#define PHP_RSHUTDOWN_FUNCTION  ZEND_MODULE_DEACTIVATE_D
376#define PHP_MINFO_FUNCTION      ZEND_MODULE_INFO_D
377#define PHP_GINIT_FUNCTION      ZEND_GINIT_FUNCTION
378#define PHP_GSHUTDOWN_FUNCTION  ZEND_GSHUTDOWN_FUNCTION
379
380#define PHP_MODULE_GLOBALS      ZEND_MODULE_GLOBALS
381
382
383/* Output support */
384#include "main/php_output.h"
385#define PHPWRITE(str, str_len)      php_body_write((str), (str_len) TSRMLS_CC)
386#define PUTS(str)                   do {            \
387    const char *__str = (str);                      \
388    php_body_write(__str, strlen(__str) TSRMLS_CC); \
389} while (0)
390
391#define PUTC(c)                     (php_body_write(&(c), 1 TSRMLS_CC), (c))
392#define PHPWRITE_H(str, str_len)    php_header_write((str), (str_len) TSRMLS_CC)
393#define PUTS_H(str)                 do {                \
394    const char *__str = (str);                          \
395    php_header_write(__str, strlen(__str) TSRMLS_CC);   \
396} while (0)
397
398#define PUTC_H(c)                   (php_header_write(&(c), 1 TSRMLS_CC), (c))
399
400#include "php_streams.h"
401#include "php_memory_streams.h"
402#include "fopen_wrappers.h"
403
404
405/* Virtual current working directory support */
406#include "tsrm_virtual_cwd.h"
407
408#include "zend_constants.h"
409
410/* connection status states */
411#define PHP_CONNECTION_NORMAL  0
412#define PHP_CONNECTION_ABORTED 1
413#define PHP_CONNECTION_TIMEOUT 2
414
415#include "php_reentrancy.h"
416
417/* Finding offsets of elements within structures.
418 * Taken from the Apache code, which in turn, was taken from X code...
419 */
420
421#ifndef XtOffset
422#if defined(CRAY) || (defined(__arm) && !(defined(LINUX) || defined(__riscos__)))
423#ifdef __STDC__
424#define XtOffset(p_type, field) _Offsetof(p_type, field)
425#else
426#ifdef CRAY2
427#define XtOffset(p_type, field) \
428    (sizeof(int)*((unsigned int)&(((p_type)NULL)->field)))
429
430#else /* !CRAY2 */
431
432#define XtOffset(p_type, field) ((unsigned int)&(((p_type)NULL)->field))
433
434#endif /* !CRAY2 */
435#endif /* __STDC__ */
436#else /* ! (CRAY || __arm) */
437
438#define XtOffset(p_type, field) \
439    ((long) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
440
441#endif /* !CRAY */
442#endif /* ! XtOffset */
443
444#ifndef XtOffsetOf
445#ifdef offsetof
446#define XtOffsetOf(s_type, field) offsetof(s_type, field)
447#else
448#define XtOffsetOf(s_type, field) XtOffset(s_type*, field)
449#endif
450#endif /* !XtOffsetOf */
451
452#endif
453
454/*
455 * Local variables:
456 * tab-width: 4
457 * c-basic-offset: 4
458 * End:
459 * vim600: sw=4 ts=4 fdm=marker
460 * vim<600: sw=4 ts=4
461 */
462