1#!/bin/sh
2# Copyright 2003-2005 Wang, Chun-Pin All rights reserved.
3CurDir=`pwd`
4ConfigH=${CurDir}/include/config.h
5ConfigHIn=${CurDir}/include/config.h.in
6Makefile=${CurDir}/Makefile.inc
7MakefileIn=${CurDir}/Makefile.inc.in
8
9if [ -z "$CC" ]; then
10	CC=gcc
11fi
12if [ -z "$AR" ]; then
13	AR=ar
14fi
15if [ -z "$RANLIB" ]; then
16	RANLIB=ranlib
17fi
18EXTRACFLAGS="$CFLAGS"
19EXTRALDFLAGS="$LDFLAGS"
20
21perl -v > /dev/null 2>&1
22if [ $? != 0 ]; then
23	echo "I am sorry that you need perl to run configure"
24	exit 1
25fi
26
27PrintHelp()
28{
29	echo "Optional Features:"
30	echo "   --with-mysql[=DIR]    Users database is a MySQL database (default=no)"
31	echo "   --with-pgsql[=DIR]    Users database is a PostgreSQL database (default=no)"
32	echo "   --with-ssl[=DIR]      Enable SSL/TLS support (default=no)"
33	echo "   --with-iconv=[DIR]    Enable codepage to unicode conversion for UTF-8 FTP (default=no)"
34	echo "   --prefix=PREFIX       Install architecture-independent files in PREFIX [/usr/local]"
35	echo ""
36	echo "Some influential environment variables:"
37	echo "   CC          C compiler command"
38	echo "   AR          ar command"
39	echo "   RANLIB      ranlib command"
40	echo "   CFLAGS      C compiler flags, e.g. -I<include dir> if your header file"
41	echo "               is in a nonstandard directory <include dir>"
42	echo "   LDFLAGS     Linker flags, e.g. -L<lib dir> if you have libraries in a"
43	echo "               nonstandard directory <lib dir>"
44	echo ""
45
46}
47
48EnableOpt()
49{
50	perl -pi -e "s/#undef $1$/#define $1/" $ConfigH
51}
52
53GetOptionDir()
54{
55	for i in $@;
56	do
57		opt=`echo $i | cut -d= -f 1`
58		arg=`echo $i | cut -d= -f 2`
59		if [ "$opt" = "$arg" ]; then
60			arg=""
61		fi
62		case "$opt" in
63		"--with-mysql")
64			WITH_MYSQL=y
65			MYSQL_DIR=$arg
66			;;
67		"--with-pgsql")
68			WITH_PGSQL=y
69			PGSQL_DIR=$arg
70			;;
71		"--with-ssl")
72			WITH_SSL=y
73			SSL_DIR=$arg
74			;;
75		"--with-iconv")
76			WITH_ICONV=y
77			ICONV_DIR=$arg
78			;;
79		"--prefix")
80			PREFIX=$arg
81			;;
82		*)
83			;;
84		esac
85	done
86}
87
88GetOptionDir $@
89
90if [ -z "$PREFIX" ]; then
91	PREFIX="/usr/local"
92fi
93HostOS=`uname`
94case $HostOS in
95	*[Ll][Ii][Nn][Uu][Xx]*)
96		EXTRACFLAGS="$EXTRACFLAGS -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE";
97		;;
98	*[Ff][Rr][Ee][Ee][Bb][Ss][Dd]*)
99		# Nothing for now.
100		;;
101esac
102
103if [ "$1" = "--help" ]; then
104	PrintHelp
105	exit 0;
106fi
107
108cp $ConfigHIn $ConfigH
109cp $MakefileIn $Makefile
110
111#####################################################
112# Test HAVE_EXLOCK
113#####################################################
114echo -n "O_EXLOCK..............	"
115cat > conftest.c << _ACEOF
116#include <stdio.h>
117#include <sys/types.h>
118#include <fcntl.h>
119int main()
120{
121       int flag=O_EXLOCK;
122}
123
124_ACEOF
125
126${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS}> /dev/null 2>&1
127if [ $? = 0 ]; then
128	echo "[YES]"
129	EnableOpt HAVE_EXLOCK
130else
131	echo "[NO]"
132fi
133
134#####################################################
135# Test HAVE_FDCOPY
136#####################################################
137echo -n "FD_COPY...............	"
138cat > conftest.c << _ACEOF
139#include <stdio.h>
140#include <sys/types.h>
141
142int main()
143{
144       int a, b;
145       FD_COPY(&a, &b);
146}
147_ACEOF
148
149${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
150if [ $? = 0 ]; then
151	echo "[YES]"
152	EnableOpt HAVE_FDCOPY
153else
154	echo "[NO]"
155fi
156
157
158#####################################################
159# Test HAVE_TCPWRAPPER
160#####################################################
161echo -n "TCP Wrapper...........	"
162cat > conftest.c << _ACEOF
163#include <stdio.h>
164#include <tcpd.h>
165int deny_severity;
166int allow_severity;
167
168int main()
169{
170	struct request_info req;
171	hosts_access(&req);
172}
173_ACEOF
174
175${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} -lwrap > /dev/null 2>&1
176if [ $? = 0 ]; then
177	echo "[YES]"
178	EnableOpt HAVE_TCPWRAPPER
179	EXTRALDFLAGS="$EXTRALDFLAGS -lwrap"
180else
181	${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} -lwrap -lnsl > /dev/null 2>&1
182	if [ $? = 0 ]; then
183		echo "[YES]"
184		EnableOpt HAVE_TCPWRAPPER
185		EXTRALDFLAGS="$EXTRALDFLAGS -lwrap -lnsl"
186	else
187		echo "[NO]"
188	fi
189fi
190
191#####################################################
192# Test HAVE_PRINTFLIKE
193#####################################################
194echo -n "Have printflike.......	"
195cat > conftest.c << _ACEOF
196#include <stdio.h>
197void    func(int, const char *, ...) __printflike(2, 3);
198
199int main() {}
200_ACEOF
201
202${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
203if [ $? = 0 ]; then
204	echo "[YES]"
205	EnableOpt HAVE_PRINTFLIKE
206else
207	echo "[NO]"
208fi
209
210#####################################################
211# Test HAVE_PWEXPIRE
212#####################################################
213echo -n "pw_expire.............	"
214cat > conftest.c << _ACEOF
215#include <stdio.h>
216#include <sys/types.h>
217#include <pwd.h>
218
219int main()
220{
221	struct passwd pw;
222	time_t t=pw.pw_expire;
223}
224_ACEOF
225
226${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
227if [ $? = 0 ]; then
228	echo "[YES]"
229	EnableOpt HAVE_PWEXPIRE
230else
231	echo "[NO]"
232fi
233
234#####################################################
235# Test HAVE_BSDGLOB
236#####################################################
237echo -n "bsd glob..............	"
238cat > conftest.c << _ACEOF
239#include <stdio.h>
240#include <sys/types.h>
241#include <glob.h>
242
243int main()
244{
245	glob_t glob;
246	int a=glob.gl_matchc|GLOB_LIMIT;
247}
248_ACEOF
249
250${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
251if [ $? = 0 ]; then
252	echo "[YES]"
253	EnableOpt HAVE_BSDGLOB
254else
255	echo "[NO]"
256fi
257
258#####################################################
259# Test HAVE_MD5FILE
260#####################################################
261echo -n "MD5File...............	"
262cat > conftest.c << _ACEOF
263#include <stdio.h>
264#include <sys/types.h>
265#include <md5.h>
266
267int main()
268{
269	char *szBuf;
270	MD5File("a", szBuf);
271}
272_ACEOF
273
274${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
275if [ $? = 0 ]; then
276	echo "[YES]"
277	EnableOpt HAVE_MD5FILE
278else
279	${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} -lmd > /dev/null 2>&1
280	if [ $? = 0 ]; then
281		echo "[YES]"
282		EnableOpt HAVE_MD5FILE
283		EXTRALDFLAGS="$EXTRALDFLAGS -lmd"
284	else
285		echo "[NO]"
286	fi
287fi
288
289#####################################################
290# Test HAVE_PWCACHE
291#####################################################
292echo -n "user_from_uid.........	"
293cat > conftest.c << _ACEOF
294#include <stdio.h>
295#include <sys/types.h>
296#include <pwd.h>
297#include <grp.h>
298int main()
299{
300	user_from_uid(1, 2);
301	group_from_gid(1, 2);
302}
303_ACEOF
304
305${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
306if [ $? = 0 ]; then
307	echo "[YES]"
308	EnableOpt HAVE_PWCACHE
309else
310	echo "[NO]"
311fi
312
313#####################################################
314# Test HAVE_SHADOW_H
315#####################################################
316echo -n "Shadow passowd........	"
317cat > conftest.c << _ACEOF
318#include <stdio.h>
319#include <sys/types.h>
320#include <shadow.h>
321int main()
322{
323	
324}
325_ACEOF
326
327${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
328if [ $? = 0 ]; then
329	echo "[YES]"
330	EnableOpt HAVE_SHADOW_H
331else
332	echo "[NO]"
333fi
334
335#####################################################
336# Test HAVE_SENDFILE
337#####################################################
338echo -n "Linux sendfile........	"
339cat > conftest.c << _ACEOF
340#include <stdio.h>
341#include <sys/types.h>
342#include <sys/sendfile.h>
343#include <unistd.h>
344int main()
345{
346	int i;
347	off_t o;
348	size_t c;
349	(void)sendfile(i,i,&o,c);
350
351	return 0;
352}
353_ACEOF
354
355${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
356if [ $? = 0 ]; then
357	echo "[YES]"
358	EnableOpt HAVE_SENDFILE
359	EnableOpt HAVE_LINUX_SENDFILE
360else
361	echo "[NO]"
362	#####################################################
363	# Test BSD SENDFILE
364	#####################################################
365	echo -n "FreeBSD sendfile......	"
366	cat > conftest.c << _ACEOF
367#include <stdio.h>
368#include <sys/types.h>
369#include <sys/socket.h>
370#include <sys/uio.h>
371int main()
372{
373	int i;
374	off_t o;
375	size_t n;
376	struct sf_hdtr h;
377	(void)sendfile(i,i,o,n,&h,&o,i);
378
379	return 0;
380}
381
382_ACEOF
383
384	${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
385	if [ $? = 0 ]; then
386		echo "[YES]"
387		EnableOpt HAVE_SENDFILE
388	else
389		echo "[NO]"
390	fi
391fi
392
393
394#####################################################
395# Test USE_PAM
396#####################################################
397echo -n "Use PAM...............	"
398cat > conftest.c << _ACEOF
399#include <stdio.h>
400#include <sys/types.h>
401#include <security/pam_appl.h>
402int main()
403{
404	pam_handle_t *pamh = NULL;
405}
406
407_ACEOF
408
409${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} -lpam > /dev/null 2>&1
410if [ $? = 0 ]; then
411	echo "[YES]"
412	EnableOpt USE_PAM
413	EXTRALDFLAGS="$EXTRALDFLAGS -lpam"
414else
415	echo "[NO]"
416fi
417
418#####################################################
419# Test HAVR_SETPROCTITLE
420#####################################################
421echo -n "Check setproctitle....	"
422cat > conftest.c << _ACEOF
423#include <stdio.h>
424#include <sys/types.h>
425#include <unistd.h>
426
427int main()
428{
429	setproctitle("%s", "alex");
430}
431
432_ACEOF
433
434${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
435if [ $? = 0 ]; then
436	echo "[YES]"
437	EnableOpt HAVR_SETPROCTITLE
438else
439	echo "[NO]"
440fi
441
442#####################################################
443# Test HAVE_SI_LEN
444#####################################################
445echo -n "Check sin_len.........	"
446cat > conftest.c << _ACEOF
447#include <stdio.h>
448#include <sys/types.h>
449#include <netinet/in.h>
450
451int main()
452{
453	struct  sockaddr_in  su_sin;
454	printf("%d\n", su_sin.sin_len);
455}
456
457_ACEOF
458
459${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
460if [ $? = 0 ]; then
461       echo "[YES]"
462       EnableOpt HAVE_SI_LEN
463else
464       echo "[NO]"
465fi
466
467#####################################################
468# Test INET6
469#####################################################
470echo -n "Check IPv6 support....	"
471cat > conftest.c << _ACEOF
472#include <stdio.h>
473#include <sys/types.h>
474#include <netinet/in.h>
475int main()
476{
477	struct  sockaddr_in6 su_sin6;
478	int s;
479	printf("%d\n", su_sin6.sin6_port);
480}
481
482
483_ACEOF
484
485${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
486if [ $? = 0 ]; then
487       echo "[YES]"
488       EnableOpt INET6
489else
490       echo "[NO]"
491fi
492
493#####################################################
494# Test WITH_MYSQL
495#####################################################
496if [ "$WITH_MYSQL" = "y" ]; then
497	echo -n "MySQL.................	"
498
499	for i in $MYSQL_DIR /usr/local /usr;
500	do
501		if [ -z "${MYSQL_INC_DIR}" -a -r $i/include/mysql/mysql.h ]; then
502			MYSQL_INC_DIR="-I$i/include/mysql"
503		elif [ -z "${MYSQL_INC_DIR}" -a -r $i/include/mysql.h ]; then
504			MYSQL_INC_DIR="-I$i/include"
505		fi
506		if [ -z "${MYSQL_LIB_DIR}" -a `ls $i/lib/mysql/libmysqlclient.so* >/dev/null 2>&1; echo $?` = 0 ]; then
507			MYSQL_LIB_DIR="-L$i/lib/mysql -Wl,-rpath,'$i/lib/mysql'"
508		elif [ -z "${MYSQL_LIB_DIR}" -a `ls $i/lib/libmysqlclient.so* >/dev/null 2>&1; echo $?` = 0 ]; then
509			MYSQL_LIB_DIR="-L$i/lib -Wl,-rpath,'$i/lib'"
510		fi
511	done
512
513cat > conftest.c << _ACEOF
514	#include <string.h>
515	#include <mysql.h>
516	int main()
517	{
518		MYSQL *connection = NULL;
519		connection = mysql_init(NULL);
520	}
521	
522_ACEOF
523
524
525	${CC} ${EXTRACFLAGS} $MYSQL_INC_DIR conftest.c -o conftest ${EXTRALDFLAGS} $MYSQL_LIB_DIR -lmysqlclient > /dev/null 2>&1
526	if [ $? = 0 ]; then
527		echo "[YES]"
528		EXTRACFLAGS="$EXTRACFLAGS $MYSQL_INC_DIR"
529		EXTRALDFLAGS="$EXTRALDFLAGS $MYSQL_LIB_DIR -lmysqlclient"
530		EnableOpt WITH_MYSQL
531	else
532		echo "[NO]"
533	fi
534fi
535
536#####################################################
537# Test WITH_PGSQL
538#####################################################
539if [ "$WITH_PGSQL" = "y" ]; then
540	echo -n "PostgreSQL............	"
541
542	for i in $PGSQL_DIR /usr/local /usr/local/pgsql /usr;
543	do
544		if [ -z "${PGSQL_INC_DIR}" -a -r $i/include/libpq-fe.h ]; then
545			PGSQL_INC_DIR="-I$i/include"
546		elif [ -z "${PGSQL_INC_DIR}" -a -r $i/include/pgsql/libpq-fe.h ]; then
547			PGSQL_INC_DIR="-I$i/include/pgsql"
548		fi
549		if [ -z "${PGSQL_LIB_DIR}" -a `ls $i/lib/libpq.so* > /dev/null 2>&1; echo $?` = 0 ]; then
550			PGSQL_LIB_DIR="-L$i/lib -Wl,-rpath,'$i/lib'"
551		elif [ -z "${PGSQL_LIB_DIR}" -a `ls $i/lib/pgsql/libpq.so* >/dev/null 2>&1; echo $?` = 0 ]; then
552			PGSQL_LIB_DIR="-L$i/lib/pgsql -Wl,-rpath,'$i/lib/pgsql'"
553		fi
554	done
555
556cat > conftest.c << _ACEOF
557	#include <libpq-fe.h>
558	int main()
559	{
560		PGconn *connection;
561		connection = PQsetdbLogin(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
562	}
563	
564_ACEOF
565
566	${CC} ${EXTRACFLAGS} $PGSQL_INC_DIR conftest.c -o conftest ${EXTRALDFLAGS} $PGSQL_LIB_DIR -lpq > /dev/null 2>&1
567	if [ $? = 0 ]; then
568		echo "[YES]"
569		EXTRACFLAGS="$EXTRACFLAGS $PGSQL_INC_DIR"
570		EXTRALDFLAGS="$EXTRALDFLAGS $PGSQL_LIB_DIR -lpq"
571		EnableOpt WITH_PGSQL
572	else
573		echo "[NO]"
574	fi
575fi
576
577#####################################################
578# Test SSL Support
579#####################################################
580if [ "$WITH_SSL" = "y" ]; then
581	echo -n "Check SSL support.....	"
582
583cat > conftest.c << _ACEOF
584	#include <stdio.h>
585	#include <sys/types.h>
586	#include <openssl/crypto.h>
587	#include <openssl/bio.h>
588	#include <openssl/buffer.h>
589	#include <openssl/x509.h>
590	#include <openssl/ssl.h>
591	#include <openssl/err.h>
592	int main()
593	{
594		SSL_load_error_strings();
595		SSLeay_add_ssl_algorithms();
596	}
597	
598	
599_ACEOF
600
601	${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} -lssl -lcrypto > /dev/null 2>&1
602	if [ $? = 0 ]; then
603		echo "[YES]"
604		EXTRALDFLAGS="$EXTRALDFLAGS -lssl -lcrypto"
605		EnableOpt WITH_SSL
606	else
607
608		for i in $SSL_DIR /usr/local /usr;
609		do
610			if [ -z "$SSL_INC_DIR" -a -r $i/include/openssl/crypto.h ]; then
611				SSL_INC_DIR="-I$i/include"
612			fi
613			if [ -z "${SSL_LIB_DIR}" -a -r $i/lib/libcrypto.so ]; then
614				SSL_LIB_DIR="-L$i/lib"
615			fi
616		done
617
618		${CC} ${EXTRACFLAGS} ${SSL_INC_DIR} conftest.c -o conftest ${EXTRALDFLAGS} ${SSL_LIB_DIR} -lssl -lcrypto > /dev/null 2>&1
619		if [ $? = 0 ]; then
620			echo "[YES]"
621			EXTRACFLAGS="$EXTRACFLAGS ${SSL_INC_DIR}"
622			EXTRALDFLAGS="$EXTRALDFLAGS ${SSL_LIB_DIR} -lssl -lcrypto"
623			EnableOpt WITH_SSL
624		else
625			echo "[NO]"
626		fi
627	fi
628fi
629
630#####################################################
631# Test WITH_ICONV
632#####################################################
633if [ "$WITH_ICONV" = "y" ]; then
634	echo -n "Check iconv support ..	"
635
636cat > conftest.c << _ACEOF
637		#include <iconv.h>
638		int main()
639		{
640			iconv_t cd = (iconv_t)-1;
641			cd = iconv_open("UTF-8", "Big-5");
642			return 0;
643		}
644		
645_ACEOF
646
647	for i in $ICONV_DIR /usr/local /usr;
648	do
649		if [ -z "${ICONV_INC_DIR}" -a -r $i/include/iconv.h ]; then
650			ICONV_INC_DIR="-I$i/include"
651		fi
652		if [ -z "${ICONV_LIB_DIR}" -a -r $i/lib/libiconv.so ]; then
653			ICONV_LIB_DIR="-L$i/lib"
654		fi
655	done
656
657	${CC} ${EXTRACFLAGS} $ICONV_INC_DIR conftest.c -o conftest ${EXTRALDFLAGS} $ICONV_LIB_DIR -liconv > /dev/null 2>&1
658	if [ $? = 0 ]; then
659		echo "[YES]"
660		EXTRACFLAGS="$EXTRACFLAGS $ICONV_INC_DIR"
661		EXTRALDFLAGS="$EXTRALDFLAGS $ICONV_LIB_DIR -liconv"
662		EnableOpt WITH_ICONV
663	else
664		${CC} ${EXTRACFLAGS} conftest.c -o conftest ${EXTRALDFLAGS} > /dev/null 2>&1
665		if [ $? = 0 ]; then
666			echo "[YES]"
667			EnableOpt WITH_ICONV
668		else
669			echo "[NO]"
670		fi
671	fi
672fi
673
674rm -rf conftest.c conftest
675
676PREFIX=`echo $PREFIX | perl -pi -e "s/\//\\\\\\\\\//g"`
677CC=`echo $CC | perl -pi -e "s/\//\\\\\\\\\//g"`
678AR=`echo $AR | perl -pi -e "s/\//\\\\\\\\\//g"`
679RANLIB=`echo $RANLIB | perl -pi -e "s/\//\\\\\\\\\//g"`
680EXTRACFLAGS=`echo $EXTRACFLAGS | perl -pi -e "s/\//\\\\\\\\\//g"`
681EXTRALDFLAGS=`echo $EXTRALDFLAGS | perl -pi -e "s/\//\\\\\\\\\//g"`
682
683cp $CurDir/os/FreeBSD/smbftpd.sh.in $CurDir/os/FreeBSD/smbftpd.sh
684perl -pi -e "s/\@PREFIX\@/$PREFIX/" $Makefile $CurDir/os/FreeBSD/smbftpd.sh $ConfigH
685perl -pi -e "s/\@CC\@/$CC/" $Makefile
686perl -pi -e "s/\@AR\@/$AR/" $Makefile
687perl -pi -e "s/\@RANLIB\@/$RANLIB/" $Makefile
688perl -pi -e "s/\@EXTRACFLAGS\@/$EXTRACFLAGS/" $Makefile
689perl -pi -e "s/\@EXTRALDFLAGS\@/$EXTRALDFLAGS/" $Makefile
690
691echo ""
692echo "Finished configure."
693echo ""
694