#!/bin/sh # # (C) 1993, 1994 By Darren Reed, avalon@coombs.anu.edu.au # You may distribute this file without changes freely providing this notice # remains intact. This file may not be redistributed or made available for # distribution without the author's prior consent. # trap "" 13 14 15 MV=/bin/mv RM=/bin/rm SETUP=include/setup.h # STDLIBH=undef STDDEFH=undef SYSSYSLOGH=undef MALLOCH=undef PARAMH=undef UNISTDH=undef STRINGH=undef STRINGSH=undef NOINDEX=undef NSTRERROR=undef NSTRTOKEN=undef NSTRTOK=undef NINETADDR=undef NINETNTOA=undef NINETNETOF=undef GETTIMEOFDAY=undef LRAND48=undef CCPATH='' SIGNAL='' BLOCKING='' TMP=/tmp/.Configtmp$$.c EXEC=/tmp/.Configtmp$$ PLATE=/tmp/.ConPlate$$ c='' n='' # 2>/dev/null if [ "`eval echo -n 'a'`" = "-n a" ] ; then c='\c' else n='-n' fi #if [ ! -f Makefile.bak ] ; then # mv Makefile Makefile.bak # cp Makefile.bak Makefile # chmod ugo-xw Makefile Makefile.bak # chmod u+w Makefile #fi echo " " echo " Welcome to autoconfigure for the IRC server." echo "Before running this script and expecting it to work, please fix the" echo "Makefile in this directory (I can only do so much without your help!)" echo "and I'll look into it for help and to checkup on your compiler" echo "preferences, etc" echo " " echo "Enter \"none\" at any prompt to effect a null entry." echo " " FOO=`egrep "^CC=" Makefile 2>/dev/null | sed -e 's/^[^=]*[ ]*=\(.*\)/\1/'` while [ -z "$CCPATH" ] ; do MYP=`echo "$PATH" | sed -e 's/:/ /g'` echo "Which compiler do you use, gcc or cc or...?" echo $n "[$FOO] -> $c" read cc if [ -z "$cc" ] ; then cc=$FOO CCPATH=$FOO elif [ -f $cc ] ; then CCPATH=$cc else for i in $MYP; do if [ -f $i/$cc -a -z "$CCPATH" ] ; then CCPATH=$i/$cc fi done fi done if [ "$FOO" != "$cc" ] ; then MYP=`echo "$CCPATH" | sed -e 's@/@ @g'` set $MYP if [ $2 ] ; then while [ $2 ] ; do shift done fi if [ $1 = "gcc" ] ; then CCPATH="$CCPATH -traditional" fi fi echo "Compiler selected: $CCPATH" echo " " # Check it out cat > $TMP <<_EOF_ main() {} _EOF_ $CCPATH $TMP -o $EXEC >/dev/null 2>&1 if [ ! -f $EXEC ] ; then echo "You don't have $CCPATH or it's broken!" exit 1 fi # Fix Makefile # #$RM -f $TMP #sed -e "s@^CC=\(.*\)@CC=$CCPATH@" Makefile > $TMP #cp $TMP Makefile #$RM -f $TMP # echo "Enter additional flags to give to $CCPATH" FOO=`egrep "^CFLAGS=" Makefile 2>/dev/null | sed -e 's/^[^=]*=[ ]*\(.*\)/\1/'` INC=`egrep "^INCLUDEDIR=" Makefile 2>/dev/null | sed -e 's/^[^=]*=\(.*\)/\1/'` FOO=`echo "$FOO" | sed -e "s@\\$(INCLUDEDIR)@$INC@"` echo $n "[$FOO] -> $c" read cc if [ "$cc" = "none" ] ; then cc='' elif [ -z "$cc" ] ; then cc=$FOO fi CFLAGS=$cc # Fix Makefile # #$RM -f $TMP #sed -e "s@^CFLAGS=\(.*\)@CFLAGS=$CFLAGS@" Makefile > $TMP #cp $TMP Makefile #$RM -f $TMP # echo " " echo "If you need to use any extra libraries when compiling the server," echo "please tell me now (might need to look at the Makefiles) and please" echo "include all the -l and -L flags (I'm lame)." LIBS=`egrep "^IRCDLIBS=" Makefile 2>/dev/null | sed -e 's/^[^=]*=\(.*\)/\1/' | tr -d "\012"` echo $n "[$LIBS] -> $c" read cc; if [ "$cc" = "none" ] ; then cc='' elif [ -z "$cc" ] ; then cc=$LIBS fi LIBS=$cc # Fix Makefile # #$RM -f $TMP #sed -e "s@^IRCDLIBS=\(.*\)@IRCDLIBS=$LIBS@" Makefile > $TMP #cp $TMP Makefile #$RM -f $TMP # COMP="$CCPATH $CFLAGS $TMP -o $EXEC $LIBS" # # echo 'Checking out /usr/include' echo $n "...Looking for /usr/include/stdlib.h...$c" if [ -r /usr/include/stdlib.h ] ; then STDLIBH=define echo 'found!' else echo 'not found :(' fi # gcc has its own stddef.h FOO='' if [ ! -z "`echo $CCPATH | grep gcc`" ] ; then FOO=`$CCPATH -v 2>&1 | head -1 | \ sed -e 's/Reading specs from //' -e 's/specs$/include/'` fi echo $n "...Looking for stddef.h...$c" if [ -r $FOO/stddef.h ] ; then STDDEFH=define echo "found in $FOO!" elif [ -r /usr/include/stddef.h ] ; then STDDEFH=define echo 'found!' else echo 'not found :(' fi echo $n "...Looking for /usr/include/sys/syslog.h...$c" if [ -r /usr/include/sys/syslog.h ] ; then SYSSYSLOGH=define echo 'found!' else echo 'not found :(' fi echo $n "...Looking for malloc.h...$c" if [ -r /usr/include/malloc.h ] ; then MALLOCH=malloc.h echo 'found!' elif [ -r /usr/include/sys/malloc.h ] ; then MALLOCH=sys/malloc.h echo 'found!' else echo 'not found :(' MALLOCH=undef fi echo $n "...Looking for /usr/include/sys/param.h...$c" if [ -r /usr/include/sys/param.h ] ; then PARAMH=define echo 'found!' else echo 'not found :(' fi echo $n "...Looking for /usr/include/unistd.h...$c" if [ -r /usr/include/unistd.h ] ; then UNISTDH=define echo 'found!' else echo 'not found :(' fi echo $n "...Looking for /usr/include/string.h...$c" if [ -r /usr/include/string.h ] ; then STRINGH=define echo 'found!' else echo 'not found :(' fi echo $n "...Looking for /usr/include/strings.h...$c" if [ -r /usr/include/strings.h ] ; then STRINGSH=define echo 'found!' else echo 'not found :(' fi # # to b or not to b # echo " " echo $n "To be or not to be...$c" cat > $TMP <<_EOF_ main() { char a[3], b[3]; bzero(b,3); bcopy(a,b,3); (void)bcmp(a,b,3); exit(0); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "and so it shall be! bcopy/bzero/bcmp are about!" BZERO=bzero else echo "and it wasn't. No bcopy/bzero/bcmp...hmpf" BZERO=memset fi echo " " echo $n "Which one, gettimeofday, or lrand48..$c" cat > $TMP <<_EOF_ #include #include main() { struct timeval tv; (void) gettimeofday(&tv, NULL); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "We have a winner! gettimeofday found." GETTIMEOFDAY=define else echo "No gettimeofday. Lets try lrand48." cat > $TMP <<_EOF_ main() { int a; a=lrand48(); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "Bingo! lrand48!" LRAND48=define fi fi # # check for non-blocking fd style available.. # echo " " echo 'Checking for POSIX/BSD/SYSV non-blocking stuff' if [ -f $TMP -o -d $TMP ] ; then $RM -f $TMP fi cat > $PLATE <<_EOF_ #include #include #include #include #include #include alarmed() { exit(1); } main() { char b[12], x[32]; int f, l = sizeof(x); f = socket(AF_INET, SOCK_DGRAM, 0); if (f >= 0 && !(fcntl(f, F_SETFL, BLOCKING))) { signal(SIGALRM, alarmed); alarm(3); recvfrom(f, b, 12, 0, x, &l); alarm(0); exit(0); } exit(1); } _EOF_ sed -e 's/BLOCKING/O_NONBLOCK/' $PLATE > $TMP $COMP >/dev/null 2>&1 if [ 0 -eq $? ] ; then $EXEC fi if [ 0 -eq $? ] ; then BLOCK=O_NONBLOCK else echo 'O_NONBLOCK not present/working in fcntl.h or sys/ioctl.h' if [ -f $TMP -o -d $TMP ] ; then $RM -f $TMP $EXEC; fi sed -e 's/BLOCKING/O_NDELAY/' $PLATE > $TMP $COMP >/dev/null 2>&1 if [ 0 -eq $? ] ; then $EXEC fi if [ 0 -eq $? ] ; then BLOCK=O_NDELAY else echo 'O_NDELAY not present/working in fcntl.h or sys/ioctl.h' if [ -f $TMP -o -d $TMP ] ; then $RM -f $TMP $EXEC; fi sed -e 's/BLOCKING/FIONBIO/' $PLATE > $TMP $COMP >/dev/null 2>&1 if [ 0 -eq $? ] ; then echo 'FIONBIO not found! No option found!' BLOCK=none else BLOCK=FIONBIO fi fi fi $RM -f $TMP $PLATE $EXEC echo "Blocking selected: $BLOCK"; # # reliable signals ? # echo 'Looking for reliable signals...' echo "Hmmm...wonder if you have 'action from POSIX..." cat > $TMP <<_EOF_ #include main() { /* poor replacement for NULL but who cares here ? */ sigaction(SIGTERM, (struct sigaction *)0L, (struct sigaction *)0L); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "Ooooh, you are a lucky one! 'action from POSIX!" SIGNAL=posix else $RM -f $EXEC $TMP cat > $TMP <<_EOF_ #include int calls = 0; void handler() { if (calls) return; calls++; kill(getpid(), SIGTERM); sleep(1); } main() { signal(SIGTERM, handler); kill(getpid(), SIGTERM); exit (0); } _EOF_ echo $n "Nope, but you have...$c" $COMP >/dev/null 2>&1 $EXEC if [ $? -eq 0 ] ; then echo 'reliable signals! Cheers BSD!' SIGNAL=bsd else echo "yucky, unreliable SYSV!" SIGNAL=sysv fi fi $RM -f $EXEC $TMP # echo 'Now those strings libraries...hmm...which one is it...' cat > $TMP <<_EOF_ #$STRINGH STRINGH #$STRINGSH STRINGSH #ifdef STRINGH #include #endif #ifdef STRINGSH #include #endif main() { char *s = index("foo", 'o'); exit(0); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then echo "Cool...you have index()!" else NOINDEX=define echo "Grmpf...I guess there is a strchr() out there somewhere..." fi $RM -f $EXEC $TMP # # getrusage or times ? # echo $n "One for debugging, mainly, getrusage(2) or times(2)...$c" cat > $TMP <<_EOF_ #include #include #include main() { struct rusage rus; (void)getrusage(RUSAGE_SELF, &rus); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then TIMES=getrusage echo "getrusage()" else $RM -f $EXEC $TMP cat > $TMP <<_EOF_ #include #include #include main() { struct tms tmsbuf; (void)times(&tmsbuf); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -eq 0 ] ; then TIMES=times echo "times()" else echo "couldn't get either ?!" TIMES=none fi fi # # what do we need that isn't here already ? # echo "What else do I need that you don't have..." echo $n "Lets see...$c" cat > $TMP <<_EOF_ main() { char *s = strerror(0); exit(0); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo $n " strerror$c" NSTRERROR=define fi $RM -f $EXEC $TMP cat > $TMP <<_EOF_ #$STRINGH STRINGH #$STRINGSH STRINGSH #ifdef STRINGH #include #endif #ifdef STRINGSH #include #endif main() { char *t = "a", **p = NULL, *s = strtoken(&p, t, ","); if (!strcmp(t, s)) exit(0); exit(1); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo $n " strtoken$c" NSTRTOKEN=define else $EXEC if [ $? -ne 0 ] ; then echo $n " strtoken$c" NSTRTOKEN=define fi fi $RM -f $EXEC $TMP cat > $TMP <<_EOF_ #$STRINGH STRINGH #$STRINGSH STRINGSH #ifdef STRINGH #include #endif #ifdef STRINGSH #include #endif main() { char *t = "a", *s = strtok(t, ","); if (!strcmp(t, s)) exit(0); exit(1); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo $n " strtok$c" NSTRTOK=define else $EXEC if [ $? -ne 0 ] ; then echo $n " strtok$c" NSTRTOK=define fi fi $RM -f $EXEC $TMP cat > $TMP << _EOF_ #include #include main() { struct in_addr in; (void)inet_addr("1.2.3.4"); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo $n " inet_addr$c" NINETADDR=define fi $RM -f $EXEC $TMP cat > $TMP << _EOF_ #include #include main() { struct in_addr in; in.s_addr = 0x12345678; (void)inet_ntoa(in); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo $n " inet_ntoa$c" fi $RM -f $EXEC $TMP cat > $TMP << _EOF_ #include #include main() { struct in_addr in; in.s_addr = 0x87654321; (void)inet_netof(in); } _EOF_ $COMP >/dev/null 2>&1 if [ $? -ne 0 ] ; then echo $n " inet_netof$c" NINETNETOF=define fi $RM -f $EXEC $TMP echo " " # # # echo " " echo "Ok, here's your chance...I think you should use $BLOCK, you want" echo "which of these ? O_NONBLOCK (POSIX) O_NDELAY (BSD) FIONBIO (SYSV)" echo $n "[$BLOCK] -> $c" read cc if [ "$cc" = "none" ] ; then cc='' elif [ -z "$cc" ] ; then cc=$BLOCK fi BLOCK=$cc echo "I found $SIGNAL signals." if [ "$cc" = "none" ] ; then cc='' elif [ "$SIGNAL" = "posix" ] ; then echo "Hmmm...I'm not sure if signal() is reliable or not either..." fi echo "You can choose between posix, bsd and sysv. What'll it be ?" echo $n "[$SIGNAL] -> $c" read cc if [ "$cc" = "none" ] ; then cc='' elif [ -z "$cc" ] ; then cc=$SIGNAL fi SIGNAL=$cc if [ "$TIMES" = "none" ] ; then echo "I didn't find either getrusage or times earlier...If you do have" echo "either of these, please tell me now." else echo "I found $TIMES, out of getrusage and times. getrusage is" echo "more informative. If you wish to swap your choice, please" echo "do so now." fi echo $n "[$TIMES] -> $c" read cc if [ "$cc" = "none" ] ; then cc='' elif [ -z "$cc" ] ; then cc=$TIMES fi TIMES=$cc $RM -f $EXEC $TMP $PLATE $MV -f $SETUP $SETUP.bak 2>/dev/null cat > $SETUP <<_EOF_ #ifndef __setup_include__ #define __setup_include__ #$PARAMH PARAMH #$UNISTDH UNISTDH #$STRINGH STRINGH #$STRINGSH STRINGSH #$STDLIBH STDLIBH #$STDDEFH STDDEFH #$SYSSYSLOGH SYSSYSLOGH #$NOINDEX NOINDEX #$NSTRERROR NEED_STRERROR #$NSTRTOKEN NEED_STRTOKEN #$NSTRTOK NEED_STRTOK #$NINETADDR NEED_INET_ADDR #$NINETNTOA NEED_INET_NTOA #$NINETNETOF NEED_INET_NETOF #$GETTIMEOFDAY GETTIMEOFDAY #$LRAND48 LRAND48 _EOF_ if [ "$MALLOCH" = "undef" ] ; then echo "#undef MALLOCH" >> $SETUP else echo "#define MALLOCH <$MALLOCH>" >> $SETUP fi if [ "$BZERO" = "memset" ] ; then cat >> $SETUP <<_EOF_ #define bzero(a,b) memset(a,0,b) #define bcopy(a,b,c) memcpy(b,a,c) #define bcmp memcmp _EOF_ fi if [ "$BLOCK" = "O_NONBLOCK" ] ; then echo "#define NBLOCK_POSIX" >> $SETUP elif [ "$BLOCK" = "O_NDELAY" ] ; then echo "#define NBLOCK_BSD" >> $SETUP else echo "#define NBLOCK_SYSV" >> $SETUP fi if [ "$SIGNAL" = "posix" ] ; then echo "#define POSIX_SIGNALS" >> $SETUP elif [ "$SIGNAL" = "bsd" ] ; then echo "#define BSD_RELIABLE_SIGNALS" >> $SETUP else echo "#define SYSV_UNRELIABLE_SIGNALS" >> $SETUP fi if [ "$TIMES" = "times" ] ; then echo "#define TIMES_2" >> $SETUP echo "#undef GETRUSAGE_2" >> $SETUP elif [ "$TIMES" = "getrusage" ] ; then echo "#undef TIMES_2" >> $SETUP echo "#define GETRUSAGE_2" >> $SETUP else echo "#undef TIMES_2" >> $SETUP echo "#undef GETRUSAGE_2" >> $SETUP fi echo "#endif" >> $SETUP touch include/config.h echo " " echo "If you would like to issue any shell commands before proceeding, do so" echo "now. My findings are in include/setup.h if you wish to change them." echo $n "--> $c" read cc if [ ! -z "$cc" ] ; then $cc fi exit 0