mirror of
				https://github.com/rofl0r/proxychains-ng.git
				synced 2025-11-03 16:46:06 +00:00 
			
		
		
		
	This commit adds a new run for pipe2() and O_CLOEXEC. If a program can be executed, define HAVE_PIPE2. Signed-off-by: Tom Li <tomli@tomli.me>
		
			
				
	
	
		
			219 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
prefix=/usr/local
 | 
						|
OUR_CPPFLAGS=
 | 
						|
 | 
						|
# Get a temporary filename
 | 
						|
i=0
 | 
						|
set -C
 | 
						|
while : ; do i=$(($i+1))
 | 
						|
tmpc="./conf$$-$PPID-$i.c"
 | 
						|
2>|/dev/null > "$tmpc" && break
 | 
						|
test "$i" -gt 50 && fail "$0: cannot create temporary file $tmpc"
 | 
						|
done
 | 
						|
set +C
 | 
						|
trap 'rm "$tmpc"' EXIT INT QUIT TERM HUP
 | 
						|
 | 
						|
check_compile() {
 | 
						|
	printf "checking %s ... " "$1"
 | 
						|
	printf "$3" > "$tmpc"
 | 
						|
	local res=0
 | 
						|
	$CC $OUR_CPPFLAGS $CPPFLAGS $2 $CFLAGS "$tmpc" -o /dev/null >/dev/null 2>&1 \
 | 
						|
	|| res=1
 | 
						|
	test x$res = x0 && \
 | 
						|
	{ printf "yes\n" ; test x"$2" = x || OUR_CPPFLAGS="$OUR_CPPFLAGS $2" ; } \
 | 
						|
	|| printf "no\n"
 | 
						|
	return $res
 | 
						|
}
 | 
						|
 | 
						|
check_define() {
 | 
						|
	printf "checking whether \$CC defines %s ... " "$1"
 | 
						|
	local res=1
 | 
						|
	$CC $OUR_CPPFLAGS $CPPFLAGS $CFLAGS -dM -E - </dev/null | grep "$1" >/dev/null && res=0
 | 
						|
	test x$res = x0 && printf "yes\n" || printf "no\n"
 | 
						|
	return $res
 | 
						|
}
 | 
						|
 | 
						|
check_compile_run() {
 | 
						|
	printf "checking %s ... " "$1"
 | 
						|
	printf "$2" > "$tmpc"
 | 
						|
	local res=0
 | 
						|
	$CC $OUR_CPPFLAGS $CPPFLAGS $CFLAGS "$tmpc" -o "$tmpc".out >/dev/null 2>&1 \
 | 
						|
	|| res=1
 | 
						|
	test x$res = x0 && { "$tmpc".out || res=1 ; }
 | 
						|
	rm -f "$tmpc".out
 | 
						|
	test x$res = x0 && printf "yes\n" || printf "no\n"
 | 
						|
	return $res
 | 
						|
}
 | 
						|
 | 
						|
check_link_silent() {
 | 
						|
	printf "$2" > "$tmpc"
 | 
						|
	$CC $OUR_CPPFLAGS $CPPFLAGS $1 $CFLAGS "$tmpc" -o /dev/null >/dev/null 2>&1
 | 
						|
}
 | 
						|
 | 
						|
check_link() {
 | 
						|
	printf "checking %s ... " "$1"
 | 
						|
	local res=0
 | 
						|
	check_link_silent "$2" "$3" || res=1
 | 
						|
	test x$res = x0 && printf "yes\n" || printf "no\n"
 | 
						|
	return $res
 | 
						|
}
 | 
						|
 | 
						|
usage() {
 | 
						|
	echo "supported arguments"
 | 
						|
	echo "--prefix=/path            default: $prefix"
 | 
						|
	echo "--exec_prefix=/path       default: $prefix/bin"
 | 
						|
	echo "--bindir=/path            default: $prefix/bin"
 | 
						|
	echo "--libdir=/path            default: $prefix/lib"
 | 
						|
	echo "--includedir=/path        default: $prefix/include"
 | 
						|
	echo "--sysconfdir=/path        default: $prefix/etc"
 | 
						|
	echo "--ignore-cve              default: no"
 | 
						|
	echo "	if set to yes ignores CVE-2015-3887 and makes it possible"
 | 
						|
	echo "	to preload from current dir (insecure)"
 | 
						|
	echo "--fat-binary : build for both i386 and x86_64 architectures on 64-bit Macs"
 | 
						|
	echo "--help : show this text"
 | 
						|
	exit 1
 | 
						|
}
 | 
						|
 | 
						|
spliteq() {
 | 
						|
	arg=$1
 | 
						|
	echo "${arg#*=}"
 | 
						|
	#alternatives echo "$arg" | cut -d= -f2-
 | 
						|
	# or echo "$arg" | sed 's/[^=]*=//'
 | 
						|
}
 | 
						|
 | 
						|
fat_binary=
 | 
						|
ignore_cve=no
 | 
						|
parsearg() {
 | 
						|
	case "$1" in
 | 
						|
	--prefix=*) prefix=`spliteq $1`;;
 | 
						|
	--exec_prefix=*) exec_prefix=`spliteq $1`;;
 | 
						|
	--bindir=*) bindir=`spliteq $1`;;
 | 
						|
	--libdir=*) libdir=`spliteq $1`;;
 | 
						|
	--includedir=*) includedir=`spliteq $1`;;
 | 
						|
	--sysconfdir=*) sysconfdir=`spliteq $1`;;
 | 
						|
	--ignore-cve) ignore_cve=1;;
 | 
						|
	--ignore-cve=*) ignore_cve=`spliteq $1`;;
 | 
						|
	--fat-binary) fat_binary=1;;
 | 
						|
	--help) usage;;
 | 
						|
	esac
 | 
						|
}
 | 
						|
 | 
						|
while true ; do
 | 
						|
	case $1 in
 | 
						|
	-*) parsearg "$1"; shift;;
 | 
						|
	*) break ;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
if [ -z "$exec_prefix" ] ; then
 | 
						|
	exec_prefix=$prefix
 | 
						|
fi
 | 
						|
 | 
						|
if [ -z "$libdir" ] ; then
 | 
						|
	libdir=$prefix/lib
 | 
						|
fi
 | 
						|
 | 
						|
if [ -z "$includedir" ] ; then
 | 
						|
	includedir=$prefix/include
 | 
						|
fi
 | 
						|
 | 
						|
if [ -z "$sysconfdir" ] ; then
 | 
						|
	sysconfdir=$prefix/etc
 | 
						|
fi
 | 
						|
 | 
						|
if [ -z "$bindir" ] ; then
 | 
						|
	bindir=$exec_prefix/bin
 | 
						|
fi
 | 
						|
 | 
						|
if [ -z "$CC" ] ; then
 | 
						|
	CC=cc
 | 
						|
fi
 | 
						|
 | 
						|
echo > config.mak
 | 
						|
 | 
						|
bsd_detected=false
 | 
						|
isbsd() {
 | 
						|
	$bsd_detected
 | 
						|
}
 | 
						|
mac_detected=false
 | 
						|
ismac() {
 | 
						|
	$mac_detected
 | 
						|
}
 | 
						|
mac_64=false
 | 
						|
ismac64() {
 | 
						|
	$mac_64
 | 
						|
}
 | 
						|
solaris_detected=false
 | 
						|
issolaris() {
 | 
						|
	$solaris_detected
 | 
						|
}
 | 
						|
 | 
						|
check_compile 'whether we have GNU-style getservbyname_r()' "-DHAVE_GNU_GETSERVBYNAME_R" \
 | 
						|
'#define _GNU_SOURCE\n#include <netdb.h>\nint main() {\nstruct servent *se = 0;struct servent se_buf;char buf[1024];\ngetservbyname_r("foo", (void*) 0, &se_buf, buf, sizeof(buf), &se);\nreturn 0;}'
 | 
						|
 | 
						|
check_compile 'whether we have pipe2() and O_CLOEXEC' "-DHAVE_PIPE2" \
 | 
						|
'#define _GNU_SOURCE\n#include <fcntl.h>\n#include <unistd.h>\nint main() {\nint pipefd[2];\npipe2(pipefd, O_CLOEXEC);\nreturn 0;}'
 | 
						|
 | 
						|
check_define __APPLE__ && {
 | 
						|
	mac_detected=true
 | 
						|
	check_define __x86_64__ && mac_64=true
 | 
						|
}
 | 
						|
check_define __FreeBSD__ && bsd_detected=true
 | 
						|
check_define __OpenBSD__ && {
 | 
						|
bsd_detected=true
 | 
						|
echo "CFLAGS+=-DIS_OPENBSD">>config.mak
 | 
						|
check_compile_run 'whether OpenBSDs fclose() (illegally) calls close()' \
 | 
						|
'#include <stdio.h>\n#include<stdlib.h>\nint close(int x){exit(0);}int main(){fclose(stdin);return 1;}' && \
 | 
						|
OUR_CPPFLAGS="$OUR_CPPFLAGS -DBROKEN_FCLOSE"
 | 
						|
}
 | 
						|
check_define __sun && check_define __SVR4 && solaris_detected=true
 | 
						|
 | 
						|
echo "CC=$CC">>config.mak
 | 
						|
[ -z "$CPPFLAGS" ] || echo "CPPFLAGS=$CPPFLAGS">>config.mak
 | 
						|
[ -z "$CFLAGS" ] || echo "USER_CFLAGS=$CFLAGS">>config.mak
 | 
						|
[ -z "$LDFLAGS" ] || echo "USER_LDFLAGS=$LDFLAGS">>config.mak
 | 
						|
echo prefix=$prefix>>config.mak
 | 
						|
echo exec_prefix=$exec_prefix>>config.mak
 | 
						|
echo bindir=$bindir>>config.mak
 | 
						|
echo libdir=$libdir>>config.mak
 | 
						|
echo includedir=$includedir>>config.mak
 | 
						|
echo sysconfdir=$sysconfdir>>config.mak
 | 
						|
[ "$ignore_cve" = "no" ] && echo "CPPFLAGS+= -DSUPER_SECURE">>config.mak
 | 
						|
[ -z "$OUR_CPPFLAGS" ] || echo "CPPFLAGS+= $OUR_CPPFLAGS" >>config.mak
 | 
						|
 | 
						|
check_link "whether we can use -Wl,--no-as-needed" "-Wl,--no-as-needed" \
 | 
						|
"int main() { return 0; }" || echo NO_AS_NEEDED= >> config.mak
 | 
						|
 | 
						|
LD_SONAME_FLAG=
 | 
						|
printf "checking what's the option to use in linker to set library name ... "
 | 
						|
for o in --soname -h -soname -install_name; do
 | 
						|
	check_link_silent "-shared -Wl,$o,libconftest.so" "void test_func(int a) {}" && LD_SONAME_FLAG=$o && break
 | 
						|
done
 | 
						|
if [ -z "$LD_SONAME_FLAG" ]; then
 | 
						|
	printf '\ncannot find an option to set library name\n'
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
echo "$LD_SONAME_FLAG"
 | 
						|
echo "LD_SET_SONAME = -Wl,$LD_SONAME_FLAG," >> config.mak
 | 
						|
 | 
						|
make_cmd=make
 | 
						|
if ismac ; then
 | 
						|
	echo LDSO_SUFFIX=dylib>>config.mak
 | 
						|
	echo MAC_CFLAGS+=-DIS_MAC=1>>config.mak
 | 
						|
	if ismac64 && [ "$fat_binary" = 1 ] ; then
 | 
						|
		echo "Configuring a fat binary for i386 and x86_64"
 | 
						|
		echo MAC_CFLAGS+=-arch i386 -arch x86_64>>config.mak
 | 
						|
		echo LDFLAGS+=-arch i386 -arch x86_64>>config.mak
 | 
						|
	fi
 | 
						|
elif isbsd ; then
 | 
						|
	echo LIBDL=>>config.mak
 | 
						|
	echo "CFLAGS+=-DIS_BSD">>config.mak
 | 
						|
	make_cmd=gmake
 | 
						|
elif issolaris; then
 | 
						|
	echo "CFLAGS+=-DIS_SOLARIS -D__EXTENSIONS__" >> config.mak
 | 
						|
	echo "SOCKET_LIBS=-lsocket -lnsl" >> config.mak
 | 
						|
fi
 | 
						|
 | 
						|
echo "Done, now run $make_cmd && $make_cmd install"
 |