1dnl
2dnl Check if flush should be called explicitly after buffered io
3dnl
4AC_CACHE_CHECK([whether flush should be called explicitly after a buffered io], ac_cv_flush_io,[
5AC_RUN_IFELSE([AC_LANG_SOURCE([[
6#include <stdio.h>
7#include <stdlib.h>
8#ifdef HAVE_UNISTD_H
9#include <unistd.h>
10#endif
11#include <string.h>
12
13int main(int argc, char **argv)
14{
15	char *filename = tmpnam(NULL);
16	char buffer[64];
17	int result = 0;
18
19	FILE *fp = fopen(filename, "wb");
20	if (NULL == fp)
21		return 0;
22	fputs("line 1\n", fp);
23	fputs("line 2\n", fp);
24	fclose(fp);
25
26	fp = fopen(filename, "rb+");
27	if (NULL == fp)
28		return 0;
29	fgets(buffer, sizeof(buffer), fp);
30	fputs("line 3\n", fp);
31	rewind(fp);
32	fgets(buffer, sizeof(buffer), fp);
33	if (0 != strcmp(buffer, "line 1\n"))
34		result = 1;
35	fgets(buffer, sizeof(buffer), fp);
36	if (0 != strcmp(buffer, "line 3\n"))
37		result = 1;
38	fclose(fp);
39	unlink(filename);
40
41	exit(result);
42}
43]])],[
44  ac_cv_flush_io=no
45],[
46  ac_cv_flush_io=yes
47],[
48  ac_cv_flush_io=no
49])])
50if test "$ac_cv_flush_io" = "yes"; then
51  AC_DEFINE(HAVE_FLUSHIO, 1, [Define if flush should be called explicitly after a buffered io.])
52fi
53
54PHP_CHECK_FUNC(crypt, crypt)
55PHP_CHECK_FUNC(crypt_r, crypt)
56if test "$ac_cv_func_crypt_r" = "yes"; then
57  PHP_CRYPT_R_STYLE
58fi
59
60AC_CACHE_CHECK(for standard DES crypt, ac_cv_crypt_des,[
61  AC_RUN_IFELSE([AC_LANG_SOURCE([[
62#include <string.h>
63
64#if HAVE_UNISTD_H
65#include <unistd.h>
66#endif
67
68#if HAVE_CRYPT_H
69#include <crypt.h>
70#endif
71
72#include <stdlib.h>
73#include <string.h>
74
75int main() {
76#if HAVE_CRYPT
77	char *encrypted = crypt("rasmuslerdorf","rl");
78	return !encrypted || strcmp(encrypted,"rl.3StKT.4T8M");
79#else
80	return 1;
81#endif
82}]])],[
83  ac_cv_crypt_des=yes
84],[
85  ac_cv_crypt_des=no
86],[
87  ac_cv_crypt_des=yes
88])])
89
90AC_CACHE_CHECK(for extended DES crypt, ac_cv_crypt_ext_des,[
91  AC_RUN_IFELSE([AC_LANG_SOURCE([[
92#include <string.h>
93
94#if HAVE_UNISTD_H
95#include <unistd.h>
96#endif
97
98#if HAVE_CRYPT_H
99#include <crypt.h>
100#endif
101
102#include <stdlib.h>
103#include <string.h>
104
105int main() {
106#if HAVE_CRYPT
107	char *encrypted = crypt("rasmuslerdorf","_J9..rasm");
108	return !encrypted || strcmp(encrypted,"_J9..rasmBYk8r9AiWNc");
109#else
110	return 1;
111#endif
112}]])],[
113  ac_cv_crypt_ext_des=yes
114],[
115  ac_cv_crypt_ext_des=no
116],[
117  ac_cv_crypt_ext_des=no
118])])
119
120AC_CACHE_CHECK(for MD5 crypt, ac_cv_crypt_md5,[
121AC_RUN_IFELSE([AC_LANG_SOURCE([[
122#include <string.h>
123
124#if HAVE_UNISTD_H
125#include <unistd.h>
126#endif
127
128#if HAVE_CRYPT_H
129#include <crypt.h>
130#endif
131
132#include <stdlib.h>
133#include <string.h>
134
135int main() {
136#if HAVE_CRYPT
137	char salt[15], answer[40];
138	char *encrypted;
139
140	salt[0]='$'; salt[1]='1'; salt[2]='$';
141	salt[3]='r'; salt[4]='a'; salt[5]='s';
142	salt[6]='m'; salt[7]='u'; salt[8]='s';
143	salt[9]='l'; salt[10]='e'; salt[11]='$';
144	salt[12]='\0';
145	strcpy(answer,salt);
146	strcat(answer,"rISCgZzpwk3UhDidwXvin0");
147	encrypted = crypt("rasmuslerdorf",salt);
148	return !encrypted || strcmp(encrypted,answer);
149#else
150	return 1;
151#endif
152}]])],[
153  ac_cv_crypt_md5=yes
154],[
155  ac_cv_crypt_md5=no
156],[
157  ac_cv_crypt_md5=no
158])])
159
160AC_CACHE_CHECK(for Blowfish crypt, ac_cv_crypt_blowfish,[
161AC_RUN_IFELSE([AC_LANG_SOURCE([[
162#include <string.h>
163
164#if HAVE_UNISTD_H
165#include <unistd.h>
166#endif
167
168#if HAVE_CRYPT_H
169#include <crypt.h>
170#endif
171
172#include <stdlib.h>
173#include <string.h>
174
175int main() {
176#if HAVE_CRYPT
177	char salt[30], answer[70];
178	char *encrypted;
179
180	salt[0]='$'; salt[1]='2'; salt[2]='a'; salt[3]='$'; salt[4]='0'; salt[5]='7'; salt[6]='$'; salt[7]='\0';
181	strcat(salt,"rasmuslerd............");
182	strcpy(answer,salt);
183	strcpy(&answer[29],"nIdrcHdxcUxWomQX9j6kvERCFjTg7Ra");
184	encrypted = crypt("rasmuslerdorf",salt);
185	return !encrypted || strcmp(encrypted,answer);
186#else
187	return 1;
188#endif
189}]])],[
190  ac_cv_crypt_blowfish=yes
191],[
192  ac_cv_crypt_blowfish=no
193],[
194  ac_cv_crypt_blowfish=no
195])])
196
197AC_CACHE_CHECK(for SHA512 crypt, ac_cv_crypt_sha512,[
198AC_RUN_IFELSE([AC_LANG_SOURCE([[
199#include <string.h>
200
201#if HAVE_UNISTD_H
202#include <unistd.h>
203#endif
204
205#if HAVE_CRYPT_H
206#include <crypt.h>
207#endif
208
209#include <stdlib.h>
210#include <string.h>
211
212int main() {
213#if HAVE_CRYPT
214	char salt[21], answer[21+86];
215	char *encrypted;
216
217	strcpy(salt,"\$6\$rasmuslerdorf\$");
218	strcpy(answer, salt);
219	strcat(answer, "EeHCRjm0bljalWuALHSTs1NB9ipEiLEXLhYeXdOpx22gmlmVejnVXFhd84cEKbYxCo.XuUTrW.RLraeEnsvWs/");
220	encrypted = crypt("rasmuslerdorf",salt);
221	return !encrypted || strcmp(encrypted,answer);
222#else
223	return 1;
224#endif
225}]])],[
226  ac_cv_crypt_sha512=yes
227],[
228  ac_cv_crypt_sha512=no
229],[
230  ac_cv_crypt_sha512=no
231])])
232
233AC_CACHE_CHECK(for SHA256 crypt, ac_cv_crypt_sha256,[
234AC_RUN_IFELSE([AC_LANG_SOURCE([[
235#include <string.h>
236
237#if HAVE_UNISTD_H
238#include <unistd.h>
239#endif
240
241#if HAVE_CRYPT_H
242#include <crypt.h>
243#endif
244
245#include <stdlib.h>
246#include <string.h>
247
248int main() {
249#if HAVE_CRYPT
250	char salt[21], answer[21+43];
251	char *encrypted;
252
253	strcpy(salt,"\$5\$rasmuslerdorf\$");
254	strcpy(answer, salt);
255	strcat(answer, "cFAm2puLCujQ9t.0CxiFIIvFi4JyQx5UncCt/xRIX23");
256	encrypted = crypt("rasmuslerdorf",salt);
257	return !encrypted || strcmp(encrypted,answer);
258#else
259	return 1;
260#endif
261}]])],[
262  ac_cv_crypt_sha256=yes
263],[
264  ac_cv_crypt_sha256=no
265],[
266  ac_cv_crypt_sha256=no
267])])
268
269
270PHP_ARG_WITH([external-libcrypt],
271  [for external libcrypt or libxcrypt],
272  [AS_HELP_STRING([--with-external-libcrypt],
273    [Use external libcrypt or libxcrypt])],
274  [no],
275  [no])
276
277dnl
278dnl If one of them is missing, use our own implementation, portable code is then possible
279dnl
280dnl This is currently enabled by default
281if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "$ac_cv_crypt_md5" = "no" || test "$ac_cv_crypt_sha512" = "no" || test "$ac_cv_crypt_sha256" = "no" || test "$ac_cv_func_crypt_r" != "yes" || test "$PHP_EXTERNAL_LIBCRYPT" = "no"; then
282  if test "$PHP_EXTERNAL_LIBCRYPT" = "no"; then
283    AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r])
284
285    PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c)
286   else
287    AC_MSG_ERROR([Cannot use external libcrypt as some algo are missing])
288   fi
289else
290  AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 0, [Whether PHP has to use its own crypt_r])
291fi
292
293dnl
294dnl Check for __attribute__ ((__aligned__)) support in the compiler
295dnl
296AC_CACHE_CHECK(whether the compiler supports aligned attribute, ac_cv_attribute_aligned,[
297AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
298]],[[
299  unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int))));
300]])],[
301  ac_cv_attribute_aligned=yes
302],[
303  ac_cv_attribute_aligned=no
304])])
305if test "$ac_cv_attribute_aligned" = "yes"; then
306  AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [whether the compiler supports __attribute__ ((__aligned__))])
307fi
308
309if test "$cross_compiling" = yes ; then
310  case $host_alias in
311    *linux*)
312      AC_DEFINE([HAVE_FNMATCH], 1,
313		     [Define to 1 if your system has a working POSIX `fnmatch'
314		      function.])
315      ;;
316  esac
317else
318  AC_FUNC_FNMATCH
319fi
320
321dnl
322dnl Check if there is a support means of creating a new process and defining
323dnl which handles it receives
324dnl
325AC_CHECK_FUNCS(fork CreateProcess, [
326  php_can_support_proc_open=yes
327  break
328],[
329  php_can_support_proc_open=no
330])
331AC_MSG_CHECKING([if your OS can spawn processes with inherited handles])
332if test "$php_can_support_proc_open" = "yes"; then
333  AC_MSG_RESULT(yes)
334  AC_DEFINE(PHP_CAN_SUPPORT_PROC_OPEN,1, [Define if your system has fork/vfork/CreateProcess])
335else
336  AC_MSG_RESULT(no)
337fi
338
339PHP_ENABLE_CHROOT_FUNC=no
340case "$PHP_SAPI" in
341  embed)
342    PHP_ENABLE_CHROOT_FUNC=yes
343  ;;
344
345  none)
346    for PROG in $PHP_BINARIES; do
347      case "$PROG" in
348        cgi|cli|phpdbg)
349          PHP_ENABLE_CHROOT_FUNC=yes
350        ;;
351
352        *)
353          PHP_ENABLE_CHROOT_FUNC=no
354          break
355        ;;
356      esac
357   done
358  ;;
359esac
360
361if test "$PHP_ENABLE_CHROOT_FUNC" = "yes"; then
362  AC_DEFINE(ENABLE_CHROOT_FUNC, 1, [Whether to enable chroot() function])
363fi
364
365dnl
366dnl Detect library functions needed by php dns_xxx functions
367dnl ext/standard/php_dns.h will collect these in a single define
368dnl HAVE_FULL_DNS_FUNCS
369dnl
370PHP_CHECK_FUNC(res_nsearch, resolv, bind, socket)
371PHP_CHECK_FUNC(res_ndestroy, resolv, bind, socket)
372PHP_CHECK_FUNC(dns_search, resolv, bind, socket)
373PHP_CHECK_FUNC(dn_expand, resolv, bind, socket)
374PHP_CHECK_FUNC(dn_skipname, resolv, bind, socket)
375
376dnl
377dnl These are old deprecated functions
378dnl
379
380PHP_CHECK_FUNC(res_search, resolv, bind, socket)
381
382dnl
383dnl Check for strptime()
384dnl
385AC_CACHE_CHECK(whether strptime() declaration fails, ac_cv_strptime_decl_fails,[
386AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
387#include <time.h>
388]],[[
389#ifndef HAVE_STRPTIME
390#error no strptime() on this platform
391#else
392/* use invalid strptime() declaration to see if it fails to compile */
393int strptime(const char *s, const char *format, struct tm *tm);
394#endif
395]])],[
396  ac_cv_strptime_decl_fails=no
397],[
398  ac_cv_strptime_decl_fails=yes
399])])
400if test "$ac_cv_strptime_decl_fails" = "yes"; then
401  AC_DEFINE([HAVE_STRPTIME_DECL_FAILS], 1, [whether strptime() declaration fails])
402fi
403
404dnl
405dnl Check for arc4random on BSD systems
406dnl
407AC_CHECK_DECLS([arc4random_buf])
408
409dnl
410dnl Check for argon2
411dnl
412PHP_ARG_WITH([password-argon2],
413  [for Argon2 support],
414  [AS_HELP_STRING([[--with-password-argon2]],
415    [Include Argon2 support in password_*])])
416
417if test "$PHP_PASSWORD_ARGON2" != "no"; then
418  PKG_CHECK_MODULES([ARGON2], [libargon2])
419  PHP_EVAL_INCLINE($ARGON2_CFLAGS)
420  PHP_EVAL_LIBLINE($ARGON2_LIBS)
421
422  AC_DEFINE(HAVE_ARGON2LIB, 1, [ ])
423fi
424
425dnl
426dnl net_get_interfaces
427dnl
428AC_CHECK_HEADERS([net/if.h],[], [],
429[
430  #ifdef HAVE_SYS_SOCKET_H
431  #include <sys/socket.h>
432  #endif
433  #include <net/if.h>
434])
435AC_MSG_CHECKING([for usable getifaddrs])
436AC_LINK_IFELSE([AC_LANG_PROGRAM([[
437  #include <sys/types.h>
438  #include <ifaddrs.h>
439]],[[
440  struct ifaddrs *interfaces;
441  if (!getifaddrs(&interfaces)) {
442      freeifaddrs(interfaces);
443  }
444]])], [ac_have_getifaddrs=yes], [ac_have_getifaddrs=no])
445if test "$ac_have_getifaddrs" = "yes" ; then
446  AC_DEFINE(HAVE_GETIFADDRS, 1, [whether getifaddrs is present and usable])
447  AC_MSG_RESULT(yes)
448else
449  AC_MSG_RESULT(no)
450fi
451
452dnl
453dnl Setup extension sources
454dnl
455PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c crypt.c \
456                            datetime.c dir.c dl.c dns.c exec.c file.c filestat.c \
457                            flock_compat.c formatted_print.c fsock.c head.c html.c image.c \
458                            info.c iptc.c lcg.c link.c mail.c math.c md5.c metaphone.c \
459                            microtime.c pack.c pageinfo.c quot_print.c rand.c mt_rand.c \
460                            soundex.c string.c scanf.c syslog.c type.c uniqid.c url.c \
461                            var.c versioning.c assert.c strnatcmp.c levenshtein.c \
462                            incomplete_class.c url_scanner_ex.c ftp_fopen_wrapper.c \
463                            http_fopen_wrapper.c php_fopen_wrapper.c credits.c css.c \
464                            var_unserializer.c ftok.c sha1.c user_filters.c uuencode.c \
465                            filters.c proc_open.c streamsfuncs.c http.c password.c \
466                            random.c net.c hrtime.c crc32_x86.c,,,
467			    -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
468
469PHP_ADD_MAKEFILE_FRAGMENT
470PHP_INSTALL_HEADERS([ext/standard/])
471