Annotation of embedaddon/php/main/reentrancy.c, revision 1.1.1.3
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.3 ! misho 5: | Copyright (c) 1997-2013 The PHP Group |
1.1 misho 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: | Author: Sascha Schumann <sascha@schumann.cx> |
16: +----------------------------------------------------------------------+
17: */
18:
1.1.1.2 misho 19: /* $Id$ */
1.1 misho 20:
21: #include <sys/types.h>
22: #include <string.h>
23: #include <errno.h>
24: #ifdef HAVE_DIRENT_H
25: #include <dirent.h>
26: #endif
27:
28: #include "php_reentrancy.h"
29: #include "ext/standard/php_rand.h" /* for PHP_RAND_MAX */
30:
31: enum {
32: LOCALTIME_R,
33: CTIME_R,
34: ASCTIME_R,
35: GMTIME_R,
36: READDIR_R,
37: NUMBER_OF_LOCKS
38: };
39:
40: #if defined(PHP_NEED_REENTRANCY)
41:
42: #include <TSRM.h>
43:
44: static MUTEX_T reentrant_locks[NUMBER_OF_LOCKS];
45:
46: #define local_lock(x) tsrm_mutex_lock(reentrant_locks[x])
47: #define local_unlock(x) tsrm_mutex_unlock(reentrant_locks[x])
48:
49: #else
50:
51: #define local_lock(x)
52: #define local_unlock(x)
53:
54: #endif
55:
56: #if defined(PHP_IRIX_TIME_R)
57:
58: #define HAVE_CTIME_R 1
59: #define HAVE_ASCTIME_R 1
60:
61: PHPAPI char *php_ctime_r(const time_t *clock, char *buf)
62: {
63: if (ctime_r(clock, buf) == buf)
64: return (buf);
65: return (NULL);
66: }
67:
68: PHPAPI char *php_asctime_r(const struct tm *tm, char *buf)
69: {
70: if (asctime_r(tm, buf) == buf)
71: return (buf);
72: return (NULL);
73: }
74:
75: #endif
76:
77: #if defined(PHP_HPUX_TIME_R)
78:
79: #define HAVE_LOCALTIME_R 1
80: #define HAVE_CTIME_R 1
81: #define HAVE_ASCTIME_R 1
82: #define HAVE_GMTIME_R 1
83:
84: PHPAPI struct tm *php_localtime_r(const time_t *const timep, struct tm *p_tm)
85: {
86: if (localtime_r(timep, p_tm) == 0)
87: return (p_tm);
88: return (NULL);
89: }
90:
91: PHPAPI char *php_ctime_r(const time_t *clock, char *buf)
92: {
93: if (ctime_r(clock, buf, 26) != -1)
94: return (buf);
95: return (NULL);
96: }
97:
98: PHPAPI char *php_asctime_r(const struct tm *tm, char *buf)
99: {
100: if (asctime_r(tm, buf, 26) != -1)
101: return (buf);
102: return (NULL);
103: }
104:
105: PHPAPI struct tm *php_gmtime_r(const time_t *const timep, struct tm *p_tm)
106: {
107: if (gmtime_r(timep, p_tm) == 0)
108: return (p_tm);
109: return (NULL);
110: }
111:
112: #endif
113:
114: #if defined(__BEOS__)
115:
116: PHPAPI struct tm *php_gmtime_r(const time_t *const timep, struct tm *p_tm)
117: {
118: /* Modified according to LibC definition */
119: if (((struct tm*)gmtime_r(timep, p_tm)) == p_tm)
120: return (p_tm);
121: return (NULL);
122: }
123:
124: #endif /* BEOS */
125:
126: #if !defined(HAVE_POSIX_READDIR_R)
127:
128: PHPAPI int php_readdir_r(DIR *dirp, struct dirent *entry,
129: struct dirent **result)
130: {
131: #if defined(HAVE_OLD_READDIR_R)
132: int ret = 0;
133:
134: /* We cannot rely on the return value of readdir_r
135: as it differs between various platforms
136: (HPUX returns 0 on success whereas Solaris returns non-zero)
137: */
138: entry->d_name[0] = '\0';
139: readdir_r(dirp, entry);
140:
141: if (entry->d_name[0] == '\0') {
142: *result = NULL;
143: ret = errno;
144: } else {
145: *result = entry;
146: }
147: return ret;
148: #else
149: struct dirent *ptr;
150: int ret = 0;
151:
152: local_lock(READDIR_R);
153:
154: errno = 0;
155:
156: ptr = readdir(dirp);
157:
158: if (!ptr && errno != 0)
159: ret = errno;
160:
161: if (ptr)
162: memcpy(entry, ptr, sizeof(*ptr));
163:
164: *result = ptr;
165:
166: local_unlock(READDIR_R);
167:
168: return ret;
169: #endif
170: }
171:
172: #endif
173:
174: #if !defined(HAVE_LOCALTIME_R) && defined(HAVE_LOCALTIME)
175:
176: PHPAPI struct tm *php_localtime_r(const time_t *const timep, struct tm *p_tm)
177: {
178: struct tm *tmp;
179:
180: local_lock(LOCALTIME_R);
181:
182: tmp = localtime(timep);
183: if (tmp) {
184: memcpy(p_tm, tmp, sizeof(struct tm));
185: tmp = p_tm;
186: }
187:
188: local_unlock(LOCALTIME_R);
189:
190: return tmp;
191: }
192:
193: #endif
194:
195: #if !defined(HAVE_CTIME_R) && defined(HAVE_CTIME)
196:
197: PHPAPI char *php_ctime_r(const time_t *clock, char *buf)
198: {
199: char *tmp;
200:
201: local_lock(CTIME_R);
202:
203: tmp = ctime(clock);
204: strcpy(buf, tmp);
205:
206: local_unlock(CTIME_R);
207:
208: return buf;
209: }
210:
211: #endif
212:
213: #if !defined(HAVE_ASCTIME_R) && defined(HAVE_ASCTIME)
214:
215: PHPAPI char *php_asctime_r(const struct tm *tm, char *buf)
216: {
217: char *tmp;
218:
219: local_lock(ASCTIME_R);
220:
221: tmp = asctime(tm);
222: strcpy(buf, tmp);
223:
224: local_unlock(ASCTIME_R);
225:
226: return buf;
227: }
228:
229: #endif
230:
231: #if !defined(HAVE_GMTIME_R) && defined(HAVE_GMTIME)
232:
233: PHPAPI struct tm *php_gmtime_r(const time_t *const timep, struct tm *p_tm)
234: {
235: struct tm *tmp;
236:
237: local_lock(GMTIME_R);
238:
239: tmp = gmtime(timep);
240: if (tmp) {
241: memcpy(p_tm, tmp, sizeof(struct tm));
242: tmp = p_tm;
243: }
244:
245: local_unlock(GMTIME_R);
246:
247: return tmp;
248: }
249:
250: #endif
251:
252: #if defined(PHP_NEED_REENTRANCY)
253:
254: void reentrancy_startup(void)
255: {
256: int i;
257:
258: for (i = 0; i < NUMBER_OF_LOCKS; i++) {
259: reentrant_locks[i] = tsrm_mutex_alloc();
260: }
261: }
262:
263: void reentrancy_shutdown(void)
264: {
265: int i;
266:
267: for (i = 0; i < NUMBER_OF_LOCKS; i++) {
268: tsrm_mutex_free(reentrant_locks[i]);
269: }
270: }
271:
272: #endif
273:
274: #ifndef HAVE_RAND_R
275:
276: /*-
277: * Copyright (c) 1990, 1993
278: * The Regents of the University of California. All rights reserved.
279: *
280: * Redistribution and use in source and binary forms, with or without
281: * modification, are permitted provided that the following conditions
282: * are met:
283: * 1. Redistributions of source code must retain the above copyright
284: * notice, this list of conditions and the following disclaimer.
285: * 2. Redistributions in binary form must reproduce the above copyright
286: * notice, this list of conditions and the following disclaimer in the
287: * documentation and/or other materials provided with the distribution.
288: * 3. All advertising materials mentioning features or use of this software
289: * must display the following acknowledgement:
290: * This product includes software developed by the University of
291: * California, Berkeley and its contributors.
292: * 4. Neither the name of the University nor the names of its contributors
293: * may be used to endorse or promote products derived from this software
294: * without specific prior written permission.
295: *
296: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
297: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
298: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
299: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
300: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
301: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
302: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
303: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
304: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
305: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
306: * SUCH DAMAGE.
307: *
308: * Posix rand_r function added May 1999 by Wes Peters <wes@softweyr.com>.
309: */
310:
311: #include <sys/types.h>
312: #include <stdlib.h>
313:
314: static int
315: do_rand(unsigned long *ctx)
316: {
317: return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)PHP_RAND_MAX + 1));
318: }
319:
320:
321: PHPAPI int
322: php_rand_r(unsigned int *ctx)
323: {
324: u_long val = (u_long) *ctx;
325: *ctx = do_rand(&val);
326: return (int) *ctx;
327: }
328:
329: #endif
330:
331:
332: #ifndef HAVE_STRTOK_R
333:
334: /*
335: * Copyright (c) 1998 Softweyr LLC. All rights reserved.
336: *
337: * strtok_r, from Berkeley strtok
338: * Oct 13, 1998 by Wes Peters <wes@softweyr.com>
339: *
340: * Copyright (c) 1988, 1993
341: * The Regents of the University of California. All rights reserved.
342: *
343: * Redistribution and use in source and binary forms, with or without
344: * modification, are permitted provided that the following conditions
345: * are met:
346: *
347: * 1. Redistributions of source code must retain the above copyright
348: * notices, this list of conditions and the following disclaimer.
349: *
350: * 2. Redistributions in binary form must reproduce the above copyright
351: * notices, this list of conditions and the following disclaimer in the
352: * documentation and/or other materials provided with the distribution.
353: *
354: * 3. All advertising materials mentioning features or use of this software
355: * must display the following acknowledgement:
356: *
357: * This product includes software developed by Softweyr LLC, the
358: * University of California, Berkeley, and its contributors.
359: *
360: * 4. Neither the name of the University nor the names of its contributors
361: * may be used to endorse or promote products derived from this software
362: * without specific prior written permission.
363: *
364: * THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC, THE REGENTS AND CONTRIBUTORS
365: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
366: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
367: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTWEYR LLC, THE
368: * REGENTS, OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
369: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
370: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
371: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
372: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
373: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
374: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
375: */
376:
377: #include <stddef.h>
378:
379: PHPAPI char *
380: php_strtok_r(char *s, const char *delim, char **last)
381: {
382: char *spanp;
383: int c, sc;
384: char *tok;
385:
386: if (s == NULL && (s = *last) == NULL)
387: {
388: return NULL;
389: }
390:
391: /*
392: * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
393: */
394: cont:
395: c = *s++;
396: for (spanp = (char *)delim; (sc = *spanp++) != 0; )
397: {
398: if (c == sc)
399: {
400: goto cont;
401: }
402: }
403:
404: if (c == 0) /* no non-delimiter characters */
405: {
406: *last = NULL;
407: return NULL;
408: }
409: tok = s - 1;
410:
411: /*
412: * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
413: * Note that delim must have one NUL; we stop if we see that, too.
414: */
415: for (;;)
416: {
417: c = *s++;
418: spanp = (char *)delim;
419: do
420: {
421: if ((sc = *spanp++) == c)
422: {
423: if (c == 0)
424: {
425: s = NULL;
426: }
427: else
428: {
429: char *w = s - 1;
430: *w = '\0';
431: }
432: *last = s;
433: return tok;
434: }
435: }
436: while (sc != 0);
437: }
438: /* NOTREACHED */
439: }
440:
441: #endif
442:
443: /*
444: * Local variables:
445: * tab-width: 4
446: * c-basic-offset: 4
447: * End:
448: * vim600: sw=4 ts=4 fdm=marker
449: * vim<600: sw=4 ts=4
450: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>