configure.ac 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472
  1. dnl AM_ACLOCAL_INCLUDE(m4)
  2. AC_PREREQ(2.65)
  3. AC_INIT([pure-ftpd],[1.0.49],
  4. [https://github.com/jedisct1/pure-ftpd/issues],
  5. [pure-ftpd],
  6. [https://www.pureftpd.org])
  7. AC_CONFIG_SRCDIR(src/ftpd.c)
  8. AC_CONFIG_HEADERS([config.h])
  9. AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar])
  10. m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
  11. AM_MAINTAINER_MODE
  12. AM_DEP_TRACK
  13. AC_CONFIG_LIBOBJ_DIR(src)
  14. AC_SUBST(VERSION)
  15. dnl Checks for programs.
  16. LX_CFLAGS=${CFLAGS-NONE}
  17. AC_PROG_CC
  18. AC_PROG_RANLIB
  19. AC_USE_SYSTEM_EXTENSIONS
  20. AC_SEARCH_LIBS([strerror],[cposix])
  21. AX_CHECK_COMPILE_FLAG([-fPIC], [
  22. AX_CHECK_LINK_FLAG([-fPIC],
  23. [CFLAGS="$CFLAGS -fPIC"]
  24. )
  25. ])
  26. AS_IF([test "$enable_pie" != "no"],[
  27. AX_CHECK_COMPILE_FLAG([-fPIE], [
  28. AX_CHECK_LINK_FLAG([-pie], [
  29. [CFLAGS="$CFLAGS -fPIE"
  30. LDFLAGS="$LDFLAGS -pie"]
  31. ])
  32. ])
  33. ])
  34. AX_CHECK_COMPILE_FLAG([-fwrapv], [CFLAGS="$CFLAGS -fwrapv"])
  35. AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], [CFLAGS="$CFLAGS -fno-strict-aliasing"])
  36. AX_CHECK_COMPILE_FLAG([-fno-strict-overflow], [CFLAGS="$CFLAGS -fno-strict-overflow"])
  37. AS_IF([echo `(uname -s) 2>/dev/null` | $GREP "CYGWIN" > /dev/null], [
  38. AX_CHECK_LINK_FLAG([-Wl,--nxcompat], [LDFLAGS="$LDFLAGS -Wl,--nxcompat"])
  39. ], [
  40. AS_IF([test `(uname -s) 2>/dev/null` = "DragonFly"],
  41. [
  42. AX_CHECK_COMPILE_FLAG([-fstack-protector], [
  43. AX_CHECK_LINK_FLAG([-fstack-protector],
  44. [CFLAGS="$CFLAGS -fstack-protector"]
  45. )
  46. ])
  47. ],
  48. [
  49. AX_CHECK_COMPILE_FLAG([-fstack-protector-all], [
  50. AX_CHECK_LINK_FLAG([-fstack-protector-all],
  51. [CFLAGS="$CFLAGS -fstack-protector-all"]
  52. )
  53. ])
  54. ]
  55. )
  56. ])
  57. AX_CHECK_COMPILE_FLAG([-Winit-self], [CFLAGS="$CFLAGS -Winit-self"])
  58. AX_CHECK_COMPILE_FLAG([-Wwrite-strings], [CFLAGS="$CFLAGS -Wwrite-strings"])
  59. AX_CHECK_COMPILE_FLAG([-Wdiv-by-zero], [CFLAGS="$CFLAGS -Wdiv-by-zero"])
  60. AX_CHECK_COMPILE_FLAG([$CFLAGS -Wno-unused-command-line-argument],
  61. [CFLAGS="$CFLAGS -Wno-unused-command-line-argument"])
  62. AC_ARG_VAR([CWFLAGS], [define to compilation flags for generating extra warnings])
  63. AX_CHECK_COMPILE_FLAG([-Wall], [CWFLAGS="$CWFLAGS -Wall"])
  64. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wextra], [CWFLAGS="$CWFLAGS -Wextra"])
  65. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wbad-function-cast], [CWFLAGS="$CWFLAGS -Wbad-function-cast"])
  66. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wcast-align], [CWFLAGS="$CWFLAGS -Wcast-align"])
  67. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wcast-qual], [CWFLAGS="$CWFLAGS -Wcast-qual"])
  68. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wchar-subscripts], [CWFLAGS="$CWFLAGS -Wchar-subscripts"])
  69. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wcomment], [CWFLAGS="$CWFLAGS -Wcomment"])
  70. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wfloat-equal], [CWFLAGS="$CWFLAGS -Wfloat-equal"])
  71. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wformat=2], [CWFLAGS="$CWFLAGS -Wformat=2"])
  72. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wimplicit], [CWFLAGS="$CWFLAGS -Wimplicit"])
  73. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wmissing-declarations], [CWFLAGS="$CWFLAGS -Wmissing-declarations"])
  74. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wmissing-prototypes], [CWFLAGS="$CWFLAGS -Wmissing-prototypes"])
  75. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wnormalized=id], [CWFLAGS="$CWFLAGS -Wnormalized=id"])
  76. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Woverride-init], [CWFLAGS="$CWFLAGS -Woverride-init"])
  77. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wparentheses], [CWFLAGS="$CWFLAGS -Wparentheses"])
  78. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wpointer-arith], [CWFLAGS="$CWFLAGS -Wpointer-arith"])
  79. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wredundant-decls], [CWFLAGS="$CWFLAGS -Wredundant-decls"])
  80. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wstrict-prototypes], [CWFLAGS="$CWFLAGS -Wstrict-prototypes"])
  81. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wswitch-enum], [CWFLAGS="$CWFLAGS -Wswitch-enum"])
  82. AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wvariable-decl], [CWFLAGS="$CWFLAGS -Wvariable-decl"])
  83. AX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS="$LDFLAGS -Wl,-z,relro"])
  84. AX_CHECK_LINK_FLAG([-Wl,-z,now], [LDFLAGS="$LDFLAGS -Wl,-z,now"])
  85. AX_CHECK_LINK_FLAG([-Wl,-z,noexecstack], [LDFLAGS="$LDFLAGS -Wl,-z,noexecstack"])
  86. if test "x$cross_compiling" != "xyes"; then
  87. for path in \
  88. /usr/kerberos \
  89. /usr/local /opt /usr/local/opt \
  90. /usr/openssl@1.1 /opt/openssl@1.1 /usr/local/opt/openssl@1.1 \
  91. /usr/openssl /opt/openssl /usr/local/opt/openssl; do
  92. if test -d $path/include; then
  93. CPPFLAGS="$CPPFLAGS -I${path}/include"
  94. fi
  95. if test -d $path/lib; then
  96. LDFLAGS="$LDFLAGS -L${path}/lib"
  97. fi
  98. done
  99. fi
  100. CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2"
  101. dnl Checks for header files
  102. AC_SYS_LARGEFILE
  103. AC_HEADER_STDC
  104. AC_HEADER_STAT
  105. AC_HEADER_TIME
  106. AC_HEADER_DIRENT
  107. AC_HEADER_SYS_WAIT
  108. AC_CHECK_HEADERS(unistd.h string.h strings.h sys/param.h ioctl.h sys/ioctl.h)
  109. AC_CHECK_HEADERS(sys/vfs.h sys/statvfs.h sys/sendfile.h sys/uio.h)
  110. AC_CHECK_HEADERS(sys/time.h sys/resource.h sys/capability.h)
  111. AC_CHECK_HEADERS(shadow.h getopt.h stddef.h stdint.h)
  112. AC_CHECK_HEADERS(netinet/in_systm.h netinet/in.h sys/pstat.h sys/file.h)
  113. AC_CHECK_HEADERS(sys/mount.h, [], [],
  114. [#ifdef HAVE_SYS_PARAM_H
  115. # include <sys/param.h>
  116. #endif])
  117. AC_CHECK_HEADERS(fcntl.h sys/fcntl.h sys/loadavg.h sys/ptrace.h)
  118. AC_CHECK_HEADERS(security/pam_appl.h security/pam_misc.h)
  119. AC_CHECK_HEADERS(security/pam_modules.h security/pam_filter.h)
  120. AC_CHECK_HEADERS(pam/pam_appl.h pam/pam_misc.h pam/pam_modules.h)
  121. AC_CHECK_HEADERS(pam/pam_filter.h)
  122. AC_CHECK_HEADERS(sgtty.h termio.h)
  123. AC_CHECK_HEADERS(locale.h)
  124. AC_CHECK_HEADERS(stdarg.h varargs.h)
  125. AC_CHECK_HEADERS(windows.h io.h)
  126. AC_CHECK_HEADERS(crypt.h)
  127. AC_CHECK_HEADERS(utime.h)
  128. AC_CHECK_HEADERS(openssl/ssl.h openssl/ec.h)
  129. AC_CHECK_HEADERS(CoreFoundation/CoreFoundation.h)
  130. AC_SYS_POSIX_TERMIOS
  131. if test "x$ac_cv_sys_posix_termios" = "xyes"; then
  132. AC_DEFINE(HAVE_POSIX_TERMIOS,,[Define if you have POSIX termios])
  133. fi
  134. dnl Check for endianness
  135. AC_C_BIGENDIAN
  136. dnl Checks for types
  137. AC_TYPE_SIGNAL
  138. AC_TYPE_SIZE_T
  139. AC_TYPE_SSIZE_T
  140. AC_TYPE_UID_T
  141. AC_TYPE_PID_T
  142. AC_TYPE_OFF_T
  143. AC_TYPE_MODE_T
  144. AC_STRUCT_TM
  145. AC_STRUCT_TIMEZONE
  146. AC_CHECK_MEMBER(struct tm.tm_gmtoff, [AC_DEFINE(STRUCT_TM_TM_GMTOFF,,[Define if you have struct tm/tm_gmtoff])],,[
  147. #include <sys/types.h>
  148. #include <$ac_cv_struct_tm>
  149. ])
  150. AC_MSG_CHECKING([whether timezone is scalar])
  151. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  152. #include <sys/types.h>
  153. #include <$ac_cv_struct_tm>
  154. ]], [[timezone = 42L]])],[
  155. AC_MSG_RESULT(yes)
  156. AC_DEFINE(HAVE_SCALAR_TIMEZONE,,[Define if your timezone is a scalar number])
  157. ],[ AC_MSG_RESULT(no) ])
  158. AC_CHECK_TYPE(nlink_t, , [AC_DEFINE(nlink_t, int, [nlink_t type])],
  159. [
  160. #ifdef HAVE_UNISTD_H
  161. # include <unistd.h>
  162. #endif
  163. #include <sys/types.h>
  164. #include <sys/stat.h>
  165. ])
  166. AC_CHECK_TYPE(dev_t, , [AC_DEFINE(dev_t, unsigned int, [dev_t type])],
  167. [
  168. #ifdef HAVE_UNISTD_H
  169. # include <unistd.h>
  170. #endif
  171. #include <sys/types.h>
  172. #include <sys/stat.h>
  173. ])
  174. AC_CHECK_TYPE(ino_t, , [AC_DEFINE(ino_t, unsigned long, [ino_t type])],
  175. [
  176. #ifdef HAVE_UNISTD_H
  177. # include <unistd.h>
  178. #endif
  179. #include <sys/types.h>
  180. #include <sys/stat.h>
  181. ])
  182. dnl Check for sizes
  183. AC_CHECK_SIZEOF(short)
  184. AC_CHECK_SIZEOF(int)
  185. AC_CHECK_SIZEOF(long)
  186. AC_CHECK_SIZEOF(long long)
  187. AC_CHECK_SIZEOF(mode_t)
  188. dnl Socket things
  189. AC_CHECK_FUNC(connect, , [AC_CHECK_LIB(socket, connect)])
  190. AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(resolv, gethostbyname)])
  191. AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname)])
  192. if test "x$ac_cv_lib_nsl_gethostbyname" != "xyes" && test "x$ac_cv_func_gethostbyname" != "xyes" ; then
  193. AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(socket, gethostbyname)])
  194. fi
  195. if test "$ac_cv_lib_nsl_gethostbyname" = "$ac_cv_func_gethostbyname" ; then
  196. AC_MSG_CHECKING([if we can include libnsl + libsocket])
  197. LIBS="-lnsl -lsocket $LIBS"
  198. AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[(void) gethostbyname]])],[my_ac_link_result=yes],[my_ac_link_result=no ])
  199. if test "$my_ac_link_result" = "no" ; then
  200. AC_MSG_RESULT([failure])
  201. AC_MSG_ERROR([unable to use gethostbyname()])
  202. else
  203. AC_MSG_RESULT([success])
  204. fi
  205. fi
  206. AC_CHECK_LIB(sendfile, sendfile)
  207. dnl Types - continued
  208. AC_CHECK_TYPE(socklen_t, , [AC_DEFINE(socklen_t, int, [socklen_t type])],
  209. [
  210. #ifdef HAVE_UNISTD_H
  211. # include <unistd.h>
  212. #endif
  213. #include <sys/types.h>
  214. #include <sys/socket.h>
  215. #ifdef HAVE_NETINET_IN_SYSTM_H
  216. # include <netinet/in_systm.h>
  217. #endif
  218. #include <netinet/in.h>
  219. ])
  220. AC_CHECK_TYPE(in_port_t, , [AC_DEFINE(in_port_t, unsigned short, [in_port_t type])],
  221. [
  222. #ifdef HAVE_UNISTD_H
  223. # include <unistd.h>
  224. #endif
  225. #include <sys/types.h>
  226. #include <sys/socket.h>
  227. #ifdef HAVE_NETINET_IN_SYSTM_H
  228. # include <netinet/in_systm.h>
  229. #endif
  230. #include <netinet/in.h>
  231. ])
  232. AC_CHECK_TYPE(sig_atomic_t, , [AC_DEFINE(sig_atomic_t, signed char, [sig_atomic_t type])],
  233. [
  234. #ifdef HAVE_UNISTD_H
  235. # include <unistd.h>
  236. #endif
  237. #include <sys/types.h>
  238. #include <signal.h>
  239. ])
  240. dnl Compiler characteristics
  241. AC_PROG_GCC_TRADITIONAL
  242. AC_C_CONST
  243. AC_C_INLINE
  244. dnl Options
  245. AM_WITH_DMALLOC
  246. AC_ARG_ENABLE(pie,
  247. [AS_HELP_STRING(--enable-pie,Produce position independent executables @<:@default=yes@:>@)],
  248. enable_pie=$enableval, enable_pie="maybe")
  249. AC_ARG_ENABLE(ssp,
  250. [AS_HELP_STRING(--disable-ssp,Don't compile with -fstack-protector)],
  251. [AS_IF([test "x$enableval" = "xno"], [
  252. nxflags=""
  253. for flag in `echo $CFLAGS`; do
  254. case "$flag" in
  255. -fstack-protector*) ;;
  256. *) AS_VAR_APPEND([nxflags], [" $flag"]) ;;
  257. esac
  258. done
  259. CFLAGS="$nxflags"
  260. ])
  261. ])
  262. AC_ARG_WITH(standalone,
  263. [AS_HELP_STRING(--without-standalone,Don't compile the standalone server code)],
  264. [ if test "x$withval" = "xno" ; then
  265. AC_DEFINE(NO_STANDALONE,,[without standalone])
  266. no_standalone=yes
  267. fi ])
  268. AC_ARG_WITH(inetd,
  269. [AS_HELP_STRING(--without-inetd,Don't support super-servers (like inetd))],
  270. [ if test "x$withval" = "xno" ; then
  271. AC_DEFINE(NO_INETD,,[without inetd])
  272. no_inetd=yes
  273. fi ])
  274. if test "x$no_standalone" = "xyes" && test "x$no_inetd" = "xyes" ; then
  275. AC_MSG_ERROR(You can't disable both standalone and inetd mode.)
  276. fi
  277. AC_ARG_WITH(capabilities,
  278. [AS_HELP_STRING(--without-capabilities,Don't use Linux capabilities (default=detect))],
  279. [ if test "x$withval" = "xno" ; then
  280. no_capabilities=1
  281. fi ])
  282. if test -z "$no_capabilities" ; then
  283. AC_CHECK_LIB(cap, cap_init, , )
  284. if test "x$ac_cv_lib_cap_cap_init" = "xyes"; then
  285. if test "x$ac_cv_header_sys_capability_h" = "xyes"; then
  286. AC_DEFINE(USE_CAPABILITIES,,[use capabilities])
  287. fi
  288. fi
  289. fi
  290. AC_ARG_WITH(shadow,
  291. [AS_HELP_STRING(--without-shadow,Don't use shadow passwords (default=detect))],
  292. [ if test "x$withval" = "xno" ; then
  293. no_shadow=1
  294. fi ])
  295. if test -z "$no_shadow" && test "x$ac_cv_header_shadow_h" = "xyes" ; then
  296. AC_CHECK_FUNC(getspnam, AC_DEFINE(USE_SHADOW,,[use shadow passwords]),
  297. AC_CHECK_LIB(shadow, getspnam, AC_DEFINE(USE_SHADOW),
  298. AC_MSG_WARN(shadow.h was found, but getspnam() isn't available)
  299. )
  300. )
  301. fi
  302. AC_ARG_WITH(usernames,
  303. [AS_HELP_STRING(--without-usernames,Use only numerical UIDs/GIDs)],
  304. [ if test "x$withval" = "xno" ; then
  305. AC_DEFINE(NO_FTP_USERS,,[without usernames])
  306. fi ])
  307. AC_ARG_WITH(iplogging,
  308. [AS_HELP_STRING(--without-iplogging,Never log remote IP addresses (privacy))],
  309. [ if test "x$withval" = "xno" ; then
  310. AC_DEFINE(DONT_LOG_IP,,[without iplogging])
  311. fi ])
  312. AC_ARG_WITH(humor,
  313. [AS_HELP_STRING(--without-humor,Disable humor (enabled by default))],
  314. [ if test "x$withval" = "xno" ; then
  315. AC_DEFINE(DISABLE_HUMOR,,[without humor])
  316. fi ])
  317. AC_ARG_WITH(longoptions,
  318. [AS_HELP_STRING(--without-longoptions,Ignored - just for backward compatibility)],
  319. [ if test "x$withval" = "xno" ; then
  320. AC_DEFINE(NO_GETOPT_LONG,,[without longoptions])
  321. fi ])
  322. AC_ARG_WITH(ascii,
  323. [AS_HELP_STRING(--without-ascii,Don't support 7-bits (ASCII) transfers)],
  324. [ if test "x$withval" = "xno" ; then
  325. AC_DEFINE(WITHOUT_ASCII,,[without ascii])
  326. fi ])
  327. AC_ARG_WITH(globbing,
  328. [AS_HELP_STRING(--without-globbing,Don't include globbing code)],
  329. [ if test "x$withval" = "xno" ; then
  330. AC_DEFINE(DISABLE_GLOBBING,,[without globbing])
  331. fi ])
  332. AC_ARG_WITH(nonalnum,
  333. [AS_HELP_STRING(--without-nonalnum,Only allow basic alphanumeric characters in file names)],
  334. [ if test "x$withval" = "xno" ; then
  335. AC_DEFINE(PARANOID_FILE_NAMES,,[disallow non-alphanumeric characters])
  336. fi ])
  337. AC_ARG_WITH(unicode,
  338. [AS_HELP_STRING(--without-unicode,Disable non-latin characters in file names)],
  339. [ if test "x$withval" = "xno" ; then
  340. AC_DEFINE(DISABLE_UNICODE_CONTROL_CHARS,,[disallow unicode control chars])
  341. fi ])
  342. AC_ARG_WITH(sendfile,
  343. [AS_HELP_STRING(--without-sendfile,Don't use zero-copy optimizations (for network FS))],
  344. [ if test "x$withval" = "xno" ; then
  345. AC_DEFINE(DISABLE_SENDFILE,,[without sendfile])
  346. fi ])
  347. AC_ARG_WITH(privsep,
  348. [AS_HELP_STRING(--without-privsep,Disable privilege separation)],
  349. [ if test "x$withval" = "xno" ; then
  350. without_privsep=yes
  351. fi ])
  352. AC_ARG_WITH(boring,
  353. [AS_HELP_STRING(--with-boring,Display only boring messages)],
  354. [ if test "x$withval" = "xyes" ; then
  355. AC_DEFINE(BORING_MODE,,[display only boring messages])
  356. AC_DEFINE(DISABLE_HUMOR)
  357. fi ])
  358. AC_ARG_WITH(brokenrealpath,
  359. [AS_HELP_STRING(--with-brokenrealpath,If your libc has a broken realpath() call)],
  360. [ if test "x$withval" = "xyes" ; then
  361. AC_DEFINE(USE_BUILTIN_REALPATH,,[realpath() is broken])
  362. fi ])
  363. AC_ARG_WITH(minimal,
  364. [AS_HELP_STRING(--with-minimal,Build only a small minimal server)],
  365. [ if test "x$withval" = "xyes" ; then
  366. AC_DEFINE(MINIMAL,,[with minimal])
  367. AC_DEFINE(NO_GETOPT_LONG)
  368. AC_DEFINE(DISABLE_HUMOR)
  369. AC_DEFINE(NO_FTP_USERS)
  370. AC_DEFINE(WITHOUT_ASCII)
  371. AC_DEFINE(BORING_MODE)
  372. CFLAGS="$CFLAGS -Os -fomit-frame-pointer -fno-unroll-loops "
  373. LDFLAGS="$LDFLAGS -s "
  374. fi ])
  375. AC_ARG_WITH(paranoidmsg,
  376. [AS_HELP_STRING(--with-paranoidmsg,Use paranoid but not admin-friendly messages)],
  377. [ if test "x$withval" = "xyes" ; then
  378. AC_DEFINE(PARANOID_MESSAGES,,[with paranoidmsg])
  379. fi ])
  380. AC_ARG_WITH(sysquotas,
  381. [AS_HELP_STRING(--with-sysquotas,Use system (not virtual) quotas)],
  382. [ if test "x$withval" = "xyes" ; then
  383. AC_DEFINE(SYSTEM_QUOTAS,,[with sysquotas])
  384. fi ])
  385. AC_ARG_WITH(altlog,
  386. [AS_HELP_STRING(--with-altlog,Support alternative log format (Apache-like))],
  387. [ if test "x$withval" = "xyes" ; then
  388. AC_DEFINE(WITH_ALTLOG,,[with altlog])
  389. fi ])
  390. AC_ARG_WITH(puredb,
  391. [AS_HELP_STRING(--with-puredb,Support virtual (FTP-only) users)],
  392. [ if test "x$withval" = "xyes" ; then
  393. AC_DEFINE(WITH_PUREDB,,[with puredb])
  394. fi ])
  395. AC_ARG_WITH(extauth,
  396. [AS_HELP_STRING(--with-extauth,Support external authentication modules)],
  397. [ if test "x$withval" = "xyes" ; then
  398. AC_DEFINE(WITH_EXTAUTH,,[with extauth (*BETA*)])
  399. fi ])
  400. AC_ARG_WITH(pam,
  401. [AS_HELP_STRING(--with-pam,Enable PAM support (default=disabled))],
  402. [ if test "x$withval" = "xyes" ; then
  403. with_pam="yes"
  404. fi ])
  405. if test "x`uname`" = "xDarwin"; then
  406. if test "x$with_pam" = "x"; then
  407. with_pam="yes"
  408. fi
  409. fi
  410. if test "x$with_pam" = "xyes" ; then
  411. if test "x$ac_cv_header_security_pam_appl_h" != "xyes" &&
  412. test "x$ac_cv_header_pam_pam_appl_h" != "xyes"; then
  413. AC_MSG_ERROR(PAM headers not found.)
  414. else
  415. AC_CHECK_LIB(dl, dlopen, , )
  416. LIBS="$LIBS -lpam"
  417. AC_DEFINE(USE_PAM,,[use pam])
  418. AC_CHECK_FUNCS(pam_getenvlist)
  419. AC_MSG_CHECKING([whether pam_strerror takes only one argument])
  420. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  421. #include <stdio.h>
  422. #ifdef STDC_HEADERS
  423. # include <stdlib.h>
  424. # include <stddef.h>
  425. #else
  426. # if HAVE_STDLIB_H
  427. # include <stdlib.h>
  428. # endif
  429. #endif
  430. #include <security/pam_appl.h>
  431. ]], [[(void)pam_strerror((pam_handle_t *)NULL, -1)]])],[AC_MSG_RESULT(no)],[
  432. AC_DEFINE(HAVE_OLD_PAM,,[obsolete pam])
  433. AC_MSG_RESULT(yes)
  434. ])
  435. fi
  436. fi
  437. AC_MSG_CHECKING([whether syslog names are available])
  438. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  439. #define SYSLOG_NAMES 1
  440. #include <stdio.h>
  441. #include <syslog.h>
  442. ]], [[
  443. (void) facilitynames
  444. ]])],[
  445. AC_MSG_RESULT(yes)
  446. AC_DEFINE(HAVE_SYSLOG_NAMES,,[define if syslog names are available])
  447. ],[
  448. AC_MSG_RESULT(no)
  449. ])
  450. AC_MSG_CHECKING([whether struct addrinfo is defined])
  451. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  452. #include <stdio.h>
  453. #ifdef HAVE_UNISTD_H
  454. # include <unistd.h>
  455. #endif
  456. #include <sys/types.h>
  457. #include <sys/socket.h>
  458. #include <netdb.h>
  459. ]], [[
  460. do {
  461. struct addrinfo a;
  462. (void) a.ai_flags;
  463. } while(0)
  464. ]])],[
  465. AC_MSG_RESULT(yes)
  466. AC_DEFINE(HAVE_STRUCT_ADDRINFO,,[define if you have struct addrinfo])
  467. ],[
  468. AC_MSG_RESULT(no)
  469. ])
  470. AC_MSG_CHECKING([whether sin_len is defined])
  471. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  472. #include <stdio.h>
  473. #ifdef HAVE_UNISTD_H
  474. # include <unistd.h>
  475. #endif
  476. #include <sys/types.h>
  477. #include <sys/socket.h>
  478. #include <netinet/in.h>
  479. ]], [[
  480. do {
  481. struct sockaddr_in a;
  482. (void) a.sin_len;
  483. } while(0)
  484. ]])],[
  485. AC_MSG_RESULT(yes)
  486. AC_DEFINE(HAVE_SIN_LEN,,[define if you have sin_len])
  487. ],[
  488. AC_MSG_RESULT(no)
  489. ])
  490. AC_MSG_CHECKING([whether __ss_family is defined])
  491. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  492. #include <stdio.h>
  493. #ifdef HAVE_UNISTD_H
  494. # include <unistd.h>
  495. #endif
  496. #include <sys/types.h>
  497. #include <sys/socket.h>
  498. ]], [[
  499. do {
  500. struct sockaddr_storage a;
  501. (void) a.__ss_family;
  502. } while(0)
  503. ]])],[
  504. AC_MSG_RESULT(yes)
  505. AC_DEFINE(HAVE___SS_FAMILY,,[define if you have __ss_family])
  506. ],[
  507. AC_MSG_RESULT(no)
  508. ])
  509. AC_MSG_CHECKING([whether ss_len is defined])
  510. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  511. #include <stdio.h>
  512. #ifdef HAVE_UNISTD_H
  513. # include <unistd.h>
  514. #endif
  515. #include <sys/types.h>
  516. #include <sys/socket.h>
  517. ]], [[
  518. do {
  519. struct sockaddr_storage a;
  520. (void) a.ss_len;
  521. } while(0)
  522. ]])],[
  523. AC_MSG_RESULT(yes)
  524. AC_DEFINE(HAVE_SS_LEN,,[define if you have ss_len])
  525. ],[
  526. AC_MSG_RESULT(no)
  527. ])
  528. AC_MSG_CHECKING([whether __ss_len is defined])
  529. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  530. #include <stdio.h>
  531. #ifdef HAVE_UNISTD_H
  532. # include <unistd.h>
  533. #endif
  534. #include <sys/types.h>
  535. #include <sys/socket.h>
  536. ]], [[
  537. do {
  538. struct sockaddr_storage a;
  539. (void) a.__ss_len;
  540. } while(0)
  541. ]])],[
  542. AC_MSG_RESULT(yes)
  543. AC_DEFINE(HAVE___SS_LEN,,[define if you have __ss_len])
  544. ],[
  545. AC_MSG_RESULT(no)
  546. ])
  547. AC_MSG_CHECKING([if a linuxish sendfile is available])
  548. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  549. #ifdef HAVE_UNISTD_H
  550. # include <unistd.h>
  551. #endif
  552. #include <sys/types.h>
  553. #include <sys/socket.h>
  554. #ifdef HAVE_SYS_UIO_H
  555. # include <sys/uio.h>
  556. #endif
  557. #ifdef HAVE_SYS_SENDFILE_H
  558. # include <sys/sendfile.h>
  559. #endif
  560. ]], [[
  561. do {
  562. int fd = 0;
  563. off_t *off = NULL;
  564. size_t cnt = (size_t) 0;
  565. (void) sendfile(fd, fd, off, cnt);
  566. } while(0)
  567. ]])],[
  568. AC_MSG_RESULT(yes)
  569. AC_DEFINE(SENDFILE_LINUX,,[define if you have a linuxish sendfile])
  570. ],[
  571. AC_MSG_RESULT(no)
  572. ])
  573. AC_MSG_CHECKING([if a linuxish sendfile64 is available])
  574. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  575. #ifdef HAVE_UNISTD_H
  576. # include <unistd.h>
  577. #endif
  578. #include <sys/types.h>
  579. #include <sys/socket.h>
  580. #ifdef HAVE_SYS_UIO_H
  581. # include <sys/uio.h>
  582. #endif
  583. #ifdef HAVE_SYS_SENDFILE_H
  584. # include <sys/sendfile.h>
  585. #endif
  586. ]], [[
  587. do {
  588. int fd = 0;
  589. off_t *off = NULL;
  590. size_t cnt = (size_t) 0;
  591. (void) sendfile64(fd, fd, off, cnt);
  592. } while(0)
  593. ]])],[
  594. AC_MSG_RESULT(yes)
  595. AC_DEFINE(SENDFILE64_LINUX,,[define if you have a linuxish sendfile64])
  596. ],[
  597. AC_MSG_RESULT(no)
  598. ])
  599. AC_MSG_CHECKING([if a freebsdish sendfile is available])
  600. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  601. #ifdef HAVE_UNISTD_H
  602. # include <unistd.h>
  603. #endif
  604. #include <sys/types.h>
  605. #include <sys/socket.h>
  606. #ifdef HAVE_SYS_UIO_H
  607. # include <sys/uio.h>
  608. #endif
  609. #ifdef HAVE_SYS_SENDFILE_H
  610. # include <sys/sendfile.h>
  611. #endif
  612. ]], [[
  613. do {
  614. int fd = 0;
  615. off_t off = (off_t) 0;
  616. size_t cnt = (size_t) 0;
  617. struct sf_hdtr *hdtr = NULL;
  618. (void) sendfile(fd, fd, off, cnt, hdtr, &off, 42);
  619. } while(0)
  620. ]])],[
  621. AC_MSG_RESULT(yes)
  622. AC_DEFINE(SENDFILE_FREEBSD,,[define if you have a freebsdish sendfile])
  623. ],[
  624. AC_MSG_RESULT(no)
  625. ])
  626. AC_MSG_CHECKING([if a hpuxish sendfile is available])
  627. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  628. #include <sys/socket.h>
  629. #include <stdio.h>
  630. ]], [[
  631. do {
  632. int fd = 0;
  633. off_t off = (off_t) 0;
  634. bsize_t nbytes = (size_t) 0;
  635. const struct iovec *hdtrl = NULL;
  636. (void) sendfile(fd, fd, off, nbytes, hdtrl, 42);
  637. } while(0)
  638. ]])],[
  639. AC_MSG_RESULT(yes)
  640. AC_DEFINE(SENDFILE_HPUX,,[define if you have a hpuxish sendfile])
  641. ],[
  642. AC_MSG_RESULT(no)
  643. ])
  644. AC_CHECK_FUNC(sendfilev, , [AC_CHECK_LIB(sendfile, sendfilev)])
  645. AC_MSG_CHECKING([if a solarisish sendfilev is available])
  646. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  647. #ifdef HAVE_UNISTD_H
  648. # include <unistd.h>
  649. #endif
  650. #include <sys/types.h>
  651. #include <sys/socket.h>
  652. #ifdef HAVE_SYS_UIO_H
  653. # include <sys/uio.h>
  654. #endif
  655. #ifdef HAVE_SYS_SENDFILE_H
  656. # include <sys/sendfile.h>
  657. #endif
  658. ]], [[
  659. do {
  660. int fd = 0, sfvcnt = 0;
  661. const struct sendfilevec vec;
  662. size_t xferred;
  663. (void) sendfilev(fd, &vec, sfvcnt, &xferred);
  664. } while(0)
  665. ]])],[
  666. AC_MSG_RESULT(yes)
  667. AC_DEFINE(SENDFILEV_SOLARIS,,[define if you have a solarisish sendfilev])
  668. ],[
  669. AC_MSG_RESULT(no)
  670. ])
  671. AC_ARG_WITH(cookie,
  672. [AS_HELP_STRING(--with-cookie,Support 'fortune' cookies (-F option))],
  673. [ if test "x$withval" = "xyes" ; then
  674. AC_DEFINE(COOKIE,,[with cookie])
  675. fi ])
  676. AC_ARG_WITH(throttling,
  677. [AS_HELP_STRING(--with-throttling,Support bandwidth throttling (disabled by default))],
  678. [ if test "x$withval" = "xyes" ; then
  679. AC_DEFINE(THROTTLING,,[with throttling])
  680. fi ])
  681. AC_ARG_WITH(ratios,
  682. [AS_HELP_STRING(--with-ratios,Support for upload/download ratios)],
  683. [ if test "x$withval" = "xyes" ; then
  684. AC_DEFINE(RATIOS,,[with ratios])
  685. fi ])
  686. AC_ARG_WITH(quotas,
  687. [AS_HELP_STRING(--with-quotas,Support .ftpquota files)],
  688. [ if test "x$withval" = "xyes" ; then
  689. AC_DEFINE(QUOTAS,,[with quotas])
  690. fi ])
  691. AC_ARG_WITH(ftpwho,
  692. [AS_HELP_STRING(--with-ftpwho,Support for pure-ftpwho)],
  693. [ if test "x$withval" = "xyes" ; then
  694. AC_DEFINE(FTPWHO,,[with ftpwho])
  695. fi ])
  696. AC_ARG_WITH(welcomemsg,
  697. [AS_HELP_STRING(--with-welcomemsg,Support welcome.msg backward compatibility (deprecated))],
  698. [ if test "x$withval" = "xyes" ; then
  699. AC_DEFINE(WITH_WELCOME_MSG,,[with welcomemsg])
  700. fi ])
  701. AC_ARG_WITH(uploadscript,
  702. [AS_HELP_STRING(--with-uploadscript,Allow running an external script after an upload (experimental))],
  703. [ if test "x$withval" = "xyes" ; then
  704. AC_DEFINE(WITH_UPLOAD_SCRIPT,,[with uploadscript])
  705. fi ])
  706. AC_ARG_WITH(virtualhosts,
  707. [AS_HELP_STRING(--with-virtualhosts,Handle virtual servers on different IP addresses)],
  708. [ if test "x$withval" = "xyes" ; then
  709. AC_DEFINE(WITH_VIRTUAL_HOSTS,,[with virtualhosts])
  710. fi ])
  711. AC_ARG_WITH(virtualchroot,
  712. [AS_HELP_STRING(--with-virtualchroot,Enable the ability to follow symlinks outside a chroot jail)],
  713. [ if test "x$withval" = "xyes" ; then
  714. AC_DEFINE(WITH_VIRTUAL_CHROOT,,[with virtual chroot])
  715. fi ])
  716. AC_ARG_WITH(diraliases,
  717. [AS_HELP_STRING(--with-diraliases,Enable directory aliases)],
  718. [ if test "x$withval" = "xyes" ; then
  719. AC_DEFINE(WITH_DIRALIASES,,[with directory aliases])
  720. fi ])
  721. AC_ARG_WITH(nonroot,
  722. [AS_HELP_STRING(--with-nonroot,[Compile a limited server designed to be started as a regular user. Only enable this option as a last resort if you really don't have root privileges on the server host.])],
  723. [ if test "x$withval" = "xyes" ; then
  724. AC_DEFINE(NON_ROOT_FTP,,[with nonroot])
  725. AC_DEFINE(WITH_VIRTUAL_CHROOT)
  726. non_root_ftp=yes
  727. without_privsep=yes
  728. fi ])
  729. if test "x$without_privsep" = "xyes" ; then
  730. AC_DEFINE(WITHOUT_PRIVSEP,,[disable privilege separation])
  731. fi
  732. AC_ARG_WITH(peruserlimits,
  733. [AS_HELP_STRING(--with-peruserlimits,Support per-user concurrency limits)],
  734. [ if test "x$withval" = "xyes" ; then
  735. AC_DEFINE(PER_USER_LIMITS,,[with per-user limits])
  736. AC_DEFINE(FTPWHO)
  737. fi ])
  738. AC_ARG_WITH(implicittls,
  739. [AS_HELP_STRING(--with-implicittls,Implicit TLS (port 990) - DO NOT USE unless you know what you are doing)],
  740. [ if test "x$withval" = "xyes" ; then
  741. AC_DEFINE(IMPLICIT_TLS,,[with implicit TLS])
  742. with_tls="yes"
  743. fi ])
  744. AC_ARG_WITH(debug,
  745. [AS_HELP_STRING(--with-debug,For maintainers only - please do not use)],
  746. [ if test "x$withval" = "xyes" ; then
  747. if test "$LX_CFLAGS" = "NONE"; then
  748. nxflags=""
  749. for flag in `echo $CFLAGS`; do
  750. case "$flag" in
  751. -O*) ;;
  752. -g*) ;;
  753. *) nxflags="$nxflags $flag"
  754. esac
  755. done
  756. CFLAGS="$nxflags -O0 -g3 $CWFLAGS"
  757. fi
  758. CPPFLAGS="$CPPFLAGS -DDEBUG=1"
  759. fi ])
  760. AC_ARG_WITH(everything,
  761. [AS_HELP_STRING(--with-everything,Build a big server with almost everything)],
  762. [ if test "x$withval" = "xyes" ; then
  763. AC_DEFINE(WITH_ALTLOG)
  764. AC_DEFINE(COOKIE)
  765. AC_DEFINE(THROTTLING)
  766. AC_DEFINE(RATIOS)
  767. AC_DEFINE(QUOTAS)
  768. AC_DEFINE(WITH_UPLOAD_SCRIPT)
  769. AC_DEFINE(WITH_VIRTUAL_HOSTS)
  770. AC_DEFINE(WITH_PUREDB)
  771. AC_DEFINE(WITH_EXTAUTH)
  772. AC_DEFINE(FTPWHO)
  773. AC_DEFINE(WITH_DIRALIASES)
  774. AC_DEFINE(PER_USER_LIMITS)
  775. with_bonjour='yes'
  776. fi ])
  777. AC_ARG_WITH(language,
  778. [AS_HELP_STRING(--with-language=,< english | albanian | german | romanian | french |
  779. french-funny | polish | spanish | danish | dutch | italian |
  780. brazilian-portuguese | slovak | korean | swedish | norwegian | russian |
  781. traditional-chinese | simplified-chinese | czech | turkish | hungarian |
  782. catalan>)],
  783. [ if test "x$withval" = "xenglish" ; then
  784. AC_DEFINE(MESSAGES_EN,,[english])
  785. elif test "x$withval" = "xalbanian" ; then
  786. AC_DEFINE(MESSAGES_SQ,,[albanian])
  787. elif test "x$withval" = "xgerman" ; then
  788. AC_DEFINE(MESSAGES_DE,,[german])
  789. elif test "x$withval" = "xromanian" ; then
  790. AC_DEFINE(MESSAGES_RO,,[romanian])
  791. elif test "x$withval" = "xfrench" ; then
  792. AC_DEFINE(MESSAGES_FR,,[french])
  793. elif test "x$withval" = "xfrench-funny" ; then
  794. AC_DEFINE(MESSAGES_FR_FUNNY,,[french-funny])
  795. elif test "x$withval" = "xpolish" ; then
  796. AC_DEFINE(MESSAGES_PL,,[polish])
  797. elif test "x$withval" = "xspanish" ; then
  798. AC_DEFINE(MESSAGES_ES,,[spanish])
  799. elif test "x$withval" = "xdanish" ; then
  800. AC_DEFINE(MESSAGES_DA,,[danish])
  801. elif test "x$withval" = "xdutch" ; then
  802. AC_DEFINE(MESSAGES_NL,,[dutch])
  803. elif test "x$withval" = "xitalian" ; then
  804. AC_DEFINE(MESSAGES_IT,,[italian])
  805. elif test "x$withval" = "xbrazilian-portuguese" ; then
  806. AC_DEFINE(MESSAGES_PT_BR,,[brazilian portuguese])
  807. elif test "x$withval" = "xslovak" ; then
  808. AC_DEFINE(MESSAGES_SK,,[slovak])
  809. elif test "x$withval" = "xkorean" ; then
  810. AC_DEFINE(MESSAGES_KR,,[korean])
  811. elif test "x$withval" = "xswedish" ; then
  812. AC_DEFINE(MESSAGES_SV,,[swedish])
  813. elif test "x$withval" = "xnorwegian" ; then
  814. AC_DEFINE(MESSAGES_NO,,[norwegian])
  815. elif test "x$withval" = "xrussian" ; then
  816. AC_DEFINE(MESSAGES_RU,,[russian])
  817. elif test "x$withval" = "xtraditional-chinese" ; then
  818. AC_DEFINE(MESSAGES_ZH_TW,,[traditional chinese])
  819. elif test "x$withval" = "xsimplified-chinese" ; then
  820. AC_DEFINE(MESSAGES_ZH_CN,,[simplified chinese])
  821. elif test "x$withval" = "xczech" ; then
  822. AC_DEFINE(MESSAGES_CS_CZ,,[czech])
  823. elif test "x$withval" = "xturkish" ; then
  824. AC_DEFINE(MESSAGES_TR,,[turkish])
  825. elif test "x$withval" = "xhungarian" ; then
  826. AC_DEFINE(MESSAGES_HU,,[hungarian])
  827. elif test "x$withval" = "xcatalan" ; then
  828. AC_DEFINE(MESSAGES_CA_ES,,[catalan])
  829. else
  830. AC_MSG_WARN(--with-language=$withval is not recognized)
  831. fi ])
  832. dnl Checks for libraries.
  833. AC_CHECK_LIB(crypt, crypt, , )
  834. AC_CHECK_LIB(sodium, crypto_pwhash_scryptsalsa208sha256_str)
  835. dnl Checks for library functions.
  836. AC_FUNC_ALLOCA
  837. AC_FUNC_MMAP
  838. AC_FUNC_MEMCMP
  839. AC_FUNC_STRFTIME
  840. AC_FUNC_STAT
  841. AC_FUNC_VPRINTF
  842. AC_FUNC_GETLOADAVG(src)
  843. AC_FUNC_GETGROUPS
  844. AC_FUNC_WAIT3
  845. AC_FUNC_UTIME_NULL
  846. AC_FUNC_STRTOD
  847. AC_FUNC_SELECT_ARGTYPES
  848. AC_FUNC_MKTIME
  849. AC_FUNC_LSTAT
  850. AC_FUNC_FORK
  851. AC_FUNC_ERROR_AT_LINE
  852. AC_FUNC_CLOSEDIR_VOID
  853. AC_FUNC_CHOWN
  854. AC_C_VOLATILE
  855. AC_CHECK_FUNCS(initgroups setrlimit waitpid setproctitle getopt_long)
  856. AC_CHECK_FUNCS(seteuid setreuid setresuid setegid setregid setresgid)
  857. AC_CHECK_FUNCS(statvfs statfs putenv setenv unsetenv getpagesize realpath)
  858. AC_CHECK_FUNCS(pread posix_fadvise ptrace)
  859. AC_CHECK_FUNCS(strtoull strtoq)
  860. AC_CHECK_FUNCS(strlcpy strlcat)
  861. AC_CHECK_FUNCS(memset munmap strdup fileno mapviewoffile madvise)
  862. AC_CHECK_FUNCS(getaddrinfo getnameinfo inet_ntop inet_pton)
  863. AC_CHECK_FUNCS(setusershell setgroups snprintf vsnprintf vfprintf gethostname)
  864. AC_CHECK_FUNCS(setlocale timegm)
  865. AC_CHECK_FUNCS(tzset utime utimes mknod mkfifo)
  866. AC_CHECK_FUNCS(random srandomdev arc4random arc4random_stir arc4random_addrandom)
  867. AC_CHECK_FUNCS(closefrom explicit_bzero getpwnam_shadow)
  868. AC_MSG_CHECKING([whether statvfs64() is defined])
  869. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
  870. #include <stdio.h>
  871. #ifdef HAVE_UNISTD_H
  872. # include <unistd.h>
  873. #endif
  874. #include <sys/types.h>
  875. #ifdef HAVE_SYS_STATVFS_H
  876. # include <sys/statvfs.h>
  877. #endif
  878. ]], [[
  879. for (;;) {
  880. struct statvfs64 a;
  881. if (statvfs64(".", &a) == 0 || a.f_bsize != 0) {
  882. break;
  883. }
  884. }
  885. ]])],[
  886. AC_MSG_RESULT(yes)
  887. AC_DEFINE(HAVE_STATVFS64,,[define if you have statvfs64])
  888. ],[
  889. AC_MSG_RESULT(no)
  890. ])
  891. AC_MSG_CHECKING(whether snprintf is C99 conformant)
  892. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  893. #include <stdio.h>
  894. #ifdef STDC_HEADERS
  895. # include <stdlib.h>
  896. # include <stddef.h>
  897. #else
  898. # if HAVE_STDLIB_H
  899. # include <stdlib.h>
  900. # endif
  901. #endif
  902. #ifdef HAVE_UNISTD_H
  903. # include <unistd.h>
  904. #endif
  905. int main(void)
  906. {
  907. char buf[4];
  908. (void) fprintf(fopen("conftestval", "w"), "%d\n",
  909. (int) snprintf(buf, sizeof buf, "12345678"));
  910. return 0;
  911. }
  912. ]])],[CONF_SNPRINTF_TYPE=`cat conftestval`
  913. ],[],[CONF_SNPRINTF_TYPE=8])
  914. AC_MSG_RESULT(done)
  915. if test "x$CONF_SNPRINTF_TYPE" = "x" ; then
  916. AC_MSG_WARN(your operating system doesn't implement snprintf)
  917. else
  918. AC_DEFINE_UNQUOTED(CONF_SNPRINTF_TYPE, $CONF_SNPRINTF_TYPE, [return value of an overflowed snprintf])
  919. fi
  920. AC_MSG_CHECKING(whether getgroups 0 is sane)
  921. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  922. #include <stdio.h>
  923. #ifdef STDC_HEADERS
  924. # include <stdlib.h>
  925. # include <stddef.h>
  926. #else
  927. # if HAVE_STDLIB_H
  928. # include <stdlib.h>
  929. # endif
  930. #endif
  931. #ifdef HAVE_UNISTD_H
  932. # include <unistd.h>
  933. #endif
  934. int main(void)
  935. {
  936. return getgroups(0, NULL) <= 0;
  937. }
  938. ]])],[
  939. AC_MSG_RESULT(yes)
  940. AC_DEFINE(SAFE_GETGROUPS_0,,[Define is getgroups(0, NULL) works on your system])
  941. ],[AC_MSG_RESULT(no)
  942. ],[AC_MSG_RESULT(suppose that it doesnt)])
  943. AC_MSG_CHECKING(whether realpath likes unreadable directories)
  944. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  945. #include <stdio.h>
  946. #ifdef STDC_HEADERS
  947. # include <stdlib.h>
  948. # include <stddef.h>
  949. #else
  950. # if HAVE_STDLIB_H
  951. # include <stdlib.h>
  952. # endif
  953. #endif
  954. #include <sys/types.h>
  955. #include <sys/stat.h>
  956. #ifdef HAVE_UNISTD_H
  957. # include <unistd.h>
  958. #endif
  959. #ifdef HAVE_LIMITS_H
  960. # include <limits.h>
  961. #endif
  962. #ifdef HAVE_SYS_PARAM_H
  963. # include <sys/param.h>
  964. #endif
  965. #ifndef PATH_MAX
  966. # define PATH_MAX MAXPATHLEN
  967. #endif
  968. int main(void)
  969. {
  970. char x[PATH_MAX];
  971. if (mkdir("x", 0300) != 0) {
  972. return 1;
  973. }
  974. if (mkdir("x/y", 0300) != 0) {
  975. rmdir("x");
  976. return 2;
  977. }
  978. if (chdir("x") != 0) {
  979. rmdir("x/y");
  980. rmdir("x");
  981. return 3;
  982. }
  983. if (realpath("y", x) == NULL) {
  984. rmdir("y");
  985. rmdir("../x");
  986. return 4;
  987. }
  988. rmdir("y");
  989. rmdir("../x");
  990. return 0;
  991. }
  992. ]])],[
  993. AC_MSG_RESULT(yes)
  994. AC_DEFINE(REALPATH_WORKS_WITH_UNREADABLE_DIRECTORIES,,
  995. [Define if realpath() works on unreadable directories])
  996. ],[AC_MSG_RESULT(no)
  997. AC_DEFINE(USE_BUILTIN_REALPATH)
  998. ],[AC_MSG_RESULT(no)
  999. AC_DEFINE(USE_BUILTIN_REALPATH)])
  1000. AC_MSG_CHECKING(whether you already have a standard MD5 implementation)
  1001. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  1002. #include <stdio.h>
  1003. #include <stdio.h>
  1004. #include <string.h>
  1005. #include <sys/types.h>
  1006. #include <md5.h>
  1007. int main(void)
  1008. {
  1009. MD5_CTX ctx;
  1010. char b[33];
  1011. MD5Init(&ctx);
  1012. MD5Update(&ctx, (const unsigned char *) "test", 4U);
  1013. MD5End(&ctx, b);
  1014. b[32] = 0;
  1015. return strcasecmp(b, "098f6bcd4621d373cade4e832627b4f6");
  1016. }
  1017. ]])],[
  1018. AC_MSG_RESULT(yes)
  1019. AC_DEFINE(USE_SYSTEM_CRYPT_MD5,,[Define if you already have standard
  1020. MD5 functions])
  1021. ],[AC_MSG_RESULT(no)
  1022. ],[AC_MSG_RESULT(assuming no)])
  1023. AC_MSG_CHECKING(whether you already have a standard SHA1 implementation)
  1024. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  1025. #include <stdio.h>
  1026. #include <string.h>
  1027. #include <sys/types.h>
  1028. #include <sha1.h>
  1029. int main(void)
  1030. {
  1031. SHA1_CTX ctx;
  1032. char b[41];
  1033. SHA1Init(&ctx);
  1034. SHA1Update(&ctx, (const unsigned char *) "test", 4U);
  1035. SHA1End(&ctx, b);
  1036. b[40] = 0;
  1037. return strcasecmp(b, "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3");
  1038. }
  1039. ]])],[
  1040. AC_MSG_RESULT(yes)
  1041. AC_DEFINE(USE_SYSTEM_CRYPT_SHA1,,[Define if you already have standard
  1042. SHA1 functions])
  1043. ],[AC_MSG_RESULT(no)
  1044. ],[AC_MSG_RESULT(assuming no)])
  1045. AC_MSG_CHECKING([whether we are inside a Virtuozzo virtual host])
  1046. if test -d /proc/vz; then
  1047. AC_MSG_RESULT(yes)
  1048. AC_DEFINE(VIRTUOZZO,,[Define if you are inside a Virtuozzo virtual
  1049. host])
  1050. else
  1051. AC_MSG_RESULT(no)
  1052. fi
  1053. AC_MSG_CHECKING(default TCP send buffer size)
  1054. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  1055. #include <stdio.h>
  1056. #ifdef STDC_HEADERS
  1057. # include <stdlib.h>
  1058. # include <stddef.h>
  1059. #else
  1060. # if HAVE_STDLIB_H
  1061. # include <stdlib.h>
  1062. # endif
  1063. #endif
  1064. #ifdef HAVE_UNISTD_H
  1065. # include <unistd.h>
  1066. #endif
  1067. #include <sys/types.h>
  1068. #include <sys/socket.h>
  1069. #include <netinet/in.h>
  1070. int main(void)
  1071. {
  1072. int fd,val=0,len=sizeof(int);
  1073. if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) return 1;
  1074. if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &len) < 0) return 1;
  1075. if (val <= 0) return 1;
  1076. fprintf (fopen("conftestval", "w"), "%d\n", val);
  1077. return 0;
  1078. }
  1079. ]])],[CONF_TCP_SO_SNDBUF=`cat conftestval`],[CONF_TCP_SO_SNDBUF=65536],[CONF_TCP_SO_SNDBUF=65536])
  1080. AC_MSG_RESULT($CONF_TCP_SO_SNDBUF)
  1081. AC_DEFINE_UNQUOTED(CONF_TCP_SO_SNDBUF, $CONF_TCP_SO_SNDBUF, [default TCP send buffer])
  1082. AC_MSG_CHECKING(default TCP receive buffer size)
  1083. AC_RUN_IFELSE([AC_LANG_SOURCE([[
  1084. #include <stdio.h>
  1085. #ifdef STDC_HEADERS
  1086. # include <stdlib.h>
  1087. # include <stddef.h>
  1088. #else
  1089. # if HAVE_STDLIB_H
  1090. # include <stdlib.h>
  1091. # endif
  1092. #endif
  1093. #ifdef HAVE_UNISTD_H
  1094. # include <unistd.h>
  1095. #endif
  1096. #include <sys/types.h>
  1097. #include <sys/socket.h>
  1098. #include <netinet/in.h>
  1099. int main(void)
  1100. {
  1101. int fd,val=0,len=sizeof(int);
  1102. if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) return 1;
  1103. if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &val, &len) < 0) return 1;
  1104. if (val <= 0) return 1;
  1105. fprintf (fopen("conftestval", "w"), "%d\n", val);
  1106. return 0;
  1107. }
  1108. ]])],[CONF_TCP_SO_RCVBUF=`cat conftestval`],[CONF_TCP_SO_RCVBUF=65536],[CONF_TCP_SO_RCVBUF=65536])
  1109. AC_MSG_RESULT($CONF_TCP_SO_RCVBUF)
  1110. AC_DEFINE_UNQUOTED(CONF_TCP_SO_RCVBUF, $CONF_TCP_SO_RCVBUF, [defaut TCP receive buffer])
  1111. AC_ARG_WITH(ldap,
  1112. [AS_HELP_STRING(--with-ldap,Users database is an LDAP directory (see doc))],
  1113. [ if test "x$withval" != "xno" ; then
  1114. if test "x$withval" != "x" && test "x$withval" != "xyes" ; then
  1115. LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}"
  1116. LDFLAGS="$LDFLAGS -L${withval}/lib"
  1117. CPPFLAGS="$CPPFLAGS -I${withval}/include"
  1118. fi
  1119. with_ldap="yes"
  1120. AC_DEFINE(WITH_LDAP,,[with ldap])
  1121. AC_CHECK_LIB(resolv, res_query)
  1122. AC_CHECK_LIB(lber, ber_init, ,
  1123. [AC_MSG_ERROR(liblber is needed for LDAP support)])
  1124. AC_CHECK_LIB(ldap, ldap_init, ,
  1125. [AC_MSG_WARN(Initial check for -lldap failed! May need -lssl -lcrypto)
  1126. AC_CHECK_LIB(ldap, ldap_bind, [ldap_ssl_libs=true],
  1127. [AC_MSG_ERROR(libldap is needed for LDAP support)], -lssl -lcrypto)
  1128. ])
  1129. if test "x$ldap_ssl_libs" = "xtrue" ; then
  1130. LDAP_SSL_LIBS='-lssl -lcrypto'
  1131. fi
  1132. fi ])
  1133. AC_SUBST(LDAP_SSL_LIBS)
  1134. AC_ARG_WITH(mysql,
  1135. [AS_HELP_STRING(--with-mysql,Users database is a MySQL database (see doc))],
  1136. [ if test "x$withval" != "xno" ; then
  1137. if test "x$withval" != "x" && test "x$withval" != "xyes" ; then
  1138. LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}"
  1139. LDFLAGS="$LDFLAGS -L${withval}/lib -L${withval}/lib/mysql -L${withval}/mysql/lib"
  1140. CPPFLAGS="$CPPFLAGS -I${withval}/include -I${withval}/include/mysql -I${withval}/mysql/include"
  1141. else
  1142. CFLAGS="$CFLAGS `mariadb_config --cflags 2> /dev/null || mysql_config --cflags`"
  1143. LDFLAGS="$LDFLAGS `mariadb_config --libs 2> /dev/null || mysql_config --libs`"
  1144. fi
  1145. AC_CHECK_LIB(m, floor)
  1146. AC_CHECK_LIB(z, gzclose)
  1147. with_mysql="yes"
  1148. AC_DEFINE(WITH_MYSQL,,[with mysql])
  1149. AC_CHECK_FUNC(mysql_init, , [
  1150. AC_CHECK_LIB(mariadb, mysql_init, , [
  1151. AC_CHECK_LIB(mysqlclient, mysql_init, ,
  1152. [AC_MSG_ERROR(libmysqlclient is needed for MySQL support)])
  1153. ])
  1154. ])
  1155. AC_MSG_CHECKING(whether mysql clients can run)
  1156. AC_LINK_IFELSE([AC_LANG_SOURCE([[
  1157. #include <stdio.h>
  1158. #include <mysql.h>
  1159. int main(void)
  1160. {
  1161. MYSQL *a = mysql_init(NULL);
  1162. return 0;
  1163. }
  1164. ]])],[],[
  1165. AC_MSG_RESULT(no)
  1166. AC_MSG_ERROR(Your MySQL client libraries aren't properly installed)
  1167. ],[])
  1168. AC_MSG_RESULT(yes)
  1169. fi ])
  1170. AC_ARG_WITH(pgsql,
  1171. [AS_HELP_STRING(--with-pgsql,Users database is a PostgreSQL database (see doc))],
  1172. [ if test "x$withval" != "xno" ; then
  1173. if test "x$withval" != "x" && test "x$withval" != "xyes" ; then
  1174. LD_RUN_PATH="${withval}/lib${LD_RUN_PATH:+:}${LD_RUN_PATH}"
  1175. LDFLAGS="$LDFLAGS -L${withval}/lib -L${withval}/lib/pgsql -L${withval}/lib/postgresql -L${withval}/pgsql/lib -L${withval}/postgresql/lib"
  1176. CPPFLAGS="$CPPFLAGS -I${withval}/include -I${withval}/include/pgsql -I${withval}/include/postgresql -I${withval}/pgsql/include -I${withval}/postgresql/include"
  1177. else
  1178. LD_RUN_PATH="`pg_config --libdir`${LD_RUN_PATH:+:}${LD_RUN_PATH}"
  1179. CPPFLAGS="$CPPFLAGS -I`pg_config --includedir`"
  1180. LDFLAGS="$LDFLAGS -L`pg_config --libdir`"
  1181. fi
  1182. AC_CHECK_LIB(m, floor)
  1183. AC_CHECK_LIB(z, gzclose)
  1184. with_pgsql="yes"
  1185. AC_DEFINE(WITH_PGSQL,,[with pgsql])
  1186. AC_CHECK_LIB(pq, PQconnectdb, ,
  1187. [AC_MSG_ERROR(libpq is needed for PostgreSQL support)])
  1188. AC_MSG_CHECKING(whether postgresql clients can run)
  1189. AC_LINK_IFELSE([AC_LANG_SOURCE([[
  1190. #include <stdio.h>
  1191. #include <libpq-fe.h>
  1192. int main(void)
  1193. {
  1194. PGconn *a = PQconnectdb("");
  1195. return 0;
  1196. }
  1197. ]])],[],[
  1198. AC_MSG_RESULT(no)
  1199. AC_MSG_ERROR(Your PostgreSQL client libraries aren't properly installed)
  1200. ],[])
  1201. AC_MSG_RESULT(yes)
  1202. fi ])
  1203. AC_ARG_WITH(tls,
  1204. [AS_HELP_STRING(--with-tls,Enable TLS support)],
  1205. [ if test "x$withval" = "xyes" ; then
  1206. with_tls="yes"
  1207. fi ])
  1208. if test "x$with_tls" = "xyes" ; then
  1209. if test "x$ac_cv_header_openssl_ssl_h" != "xyes" ; then
  1210. AC_MSG_ERROR(OpenSSL headers not found.)
  1211. fi
  1212. AC_CHECK_LIB(crypto, DH_new)
  1213. AC_CHECK_LIB(ssl, SSL_accept)
  1214. AC_CHECK_FUNCS(DH_get_2048_256 TLS_server_method)
  1215. AC_DEFINE(WITH_TLS,,[Enable TLS])
  1216. fi
  1217. AC_ARG_WITH(certfile,
  1218. [AS_HELP_STRING(--with-certfile=,certificate file (default: /etc/ssl/private/pure-ftpd.pem))],
  1219. [ if test "x$withval" != "x" ; then
  1220. certfile="$withval"
  1221. AC_SUBST(certfile)
  1222. CPPFLAGS="$CPPFLAGS -DTLS_CERTIFICATE_FILE='\"$certfile\"'"
  1223. if test ! -e "$certfile"; then
  1224. AC_MSG_WARN(No certificate is installed in $certfile yet)
  1225. fi
  1226. fi ])
  1227. AC_ARG_WITH(keyfile,
  1228. [AS_HELP_STRING(--with-keyfile=,certificate key file (default: /etc/ssl/private/pure-ftpd.pem))],
  1229. [ if test "x$withval" != "x" ; then
  1230. keyfile="$withval"
  1231. AC_SUBST(keyfile)
  1232. CPPFLAGS="$CPPFLAGS -DTLS_KEY_FILE='\"$keyfile\"'"
  1233. if test ! -e "$keyfile"; then
  1234. AC_MSG_WARN(No certificate key is installed in $keyfile yet)
  1235. fi
  1236. fi ])
  1237. AC_ARG_WITH(bonjour,
  1238. [AS_HELP_STRING(--with-bonjour,Enable Bonjour support on MacOS X)],
  1239. [ if test "x$withval" = "xyes" ; then
  1240. with_bonjour="yes"
  1241. fi ])
  1242. if test "x$with_bonjour" = "xyes" ; then
  1243. if test "x$ac_cv_header_CoreFoundation_CoreFoundation_h" = "xyes" ; then
  1244. AC_DEFINE(WITH_BONJOUR,,[Enable Bonjour on MacOS X])
  1245. BONJOUR_LDADD='-framework CoreFoundation -framework CoreServices'
  1246. fi
  1247. fi
  1248. AC_SUBST(BONJOUR_LDADD)
  1249. if test "x$sysconfdir" = 'xNONE' || test "x$sysconfdir" = 'x'; then
  1250. CONFDIR='/etc'
  1251. else
  1252. if test "x$sysconfdir" = 'x${prefix}/etc'; then
  1253. if test "x$prefix" = 'xNONE' || test "x$prefix" = 'x/usr'; then
  1254. CONFDIR='/etc'
  1255. else
  1256. CONFDIR="$sysconfdir"
  1257. fi
  1258. else
  1259. CONFDIR="$sysconfdir"
  1260. fi
  1261. fi
  1262. if test "x$localstatedir" = 'xNONE' || test "x$localstatedir" = 'x'; then
  1263. LOCALSTATEDIR='/var'
  1264. else
  1265. if test "x$localstatedir" = 'x${prefix}/var'; then
  1266. if test "x$prefix" = 'xNONE' || test "x$prefix" = 'x/usr' || test "x$localstatedir" = 'x${prefix}/var' ; then
  1267. LOCALSTATEDIR='/var'
  1268. else
  1269. LOCALSTATEDIR="$localstatedir"
  1270. fi
  1271. else
  1272. LOCALSTATEDIR="$localstatedir"
  1273. fi
  1274. fi
  1275. if test -r /dev/urandom; then
  1276. AC_MSG_NOTICE([You have /dev/urandom - Great])
  1277. AC_DEFINE(HAVE_DEV_URANDOM,,[Define if you have /dev/urandom])
  1278. fi
  1279. if test -r /dev/random; then
  1280. AC_MSG_NOTICE([You have /dev/random - Great])
  1281. AC_DEFINE(HAVE_DEV_RANDOM,,[Define if you have /dev/random])
  1282. fi
  1283. CONFDIR=`eval echo "$CONFDIR"`
  1284. LOCALSTATEDIR=`eval echo "$LOCALSTATEDIR"`
  1285. sysconfdir="$CONFDIR"
  1286. AC_SUBST(sysconfdir)
  1287. localstatedir="$LOCALSTATEDIR"
  1288. AC_SUBST(localstatedir)
  1289. CPPFLAGS="$CPPFLAGS -DCONFDIR=\\\"$sysconfdir\\\""
  1290. CPPFLAGS="$CPPFLAGS -DSTATEDIR=\\\"$localstatedir\\\""
  1291. AC_SUBST(CONFDIR)
  1292. AC_SUBST(LOCALSTATEDIR)
  1293. AH_VERBATIM([NDEBUG], [/* Never ever ignore assertions */
  1294. #ifdef NDEBUG
  1295. #/**/undef/**/ NDEBUG
  1296. #endif])
  1297. AC_CONFIG_FILES(Makefile src/Makefile pam/Makefile man/Makefile
  1298. gui/Makefile m4/Makefile pure-ftpd.conf puredb/Makefile
  1299. puredb/src/Makefile
  1300. man/pure-ftpd.8 man/pure-ftpwho.8 man/pure-mrtginfo.8 man/pure-uploadscript.8
  1301. man/pure-statsdecode.8 man/pure-quotacheck.8 man/pure-pw.8 man/pure-pwconvert.8
  1302. man/pure-authd.8 man/pure-certd.8)
  1303. AC_OUTPUT