Current File : //var/dcc/libexec/updatedcc
#! /bin/sh

# Fetch, build, install, and start a new version of the DCC just
#   as it was configured last time.

# This script should only be used after the DCC has been correctly configured.

# If this script fails in its efforts to use wget, curl, fetch, or ftp
#   to download a new tarball, then manually download a tarball to
#   build subdirectory in the DCC home directory, probably /var/dcc/build.
#   This script unpacks the newest DCC tarball it finds in that directory,
#   which will probably be the manually download file.


# This script should usually not be used if large configuration changes are
#   needed.  Instead use `./configure ...; make install` as usual.  That will
#   create a new version of this script with the ./configure settings captured.
#   However, -eENV=VAL and -cCONF=VAL can be used to tweak an installation,
#	as in `updatedcc -c--with-uid=dcc` `updatedcc -c--without-uid`
#	or `updatedcc -e DBGFLAGS=-g`

#   -e ENV=VAL	set environment variable ENV to VAL before running ./configure

#   -c CONF=VAL	add "CONF=VAL" to the end of the settings given ./configure

#   -s base-URL	fetch the tarball using base-URL instead of the default.
#		    The name of the tarball is appended to base-URL.

#   -V x.y.z	try to fetch version x.y.z of the tarball instead of the
#		    the most recent verison

#   -C pfile	fetch theDCC source using parameters in pfile

#   -T tgt	target instead of "install" for `make`
#		    '-T all' will compile but not install

#   -U		only fetch, unpack, and configure the tarball.  Do not compile
#		    or install the software.

#   -K		cron mode; configure, compile, and install only
#		    if the fetched version differs, and be silent when
#		    nothing is done

#   -k		not cron mode even if there is no controling tty

#   -x		debug
#   -v		verbose


# This script should be run as root, but can be run as the non-root
# user that runs dccm and dccd.  If not run as root, it cannot install
# man pages or user commands including cdcc and dccproc.

# The following environment variables are set by this script to their values
#   when ./configure or this script was last run:
#   Unsetting variables that are not set often yields a non-zero command status
#   so do this before watching for errors from mkdir and so forth
export NOMAN DCC_OWN DCC_GRP DCC_MODE MANOWN MANGRP CFLAGS DCC_CFLAGS PTHREAD_CFLAGS LDFLAGS DCC_LDFLAGS PTHREAD_LDFLAGS LIBS PTHREAD_LIBS CC INSTALL DCCD_MAX_FLOODS DBGFLAGS DCC_UPDATEDCC_FAST
unset NOMAN DCC_OWN DCC_GRP DCC_MODE MANOWN MANGRP CFLAGS DCC_CFLAGS PTHREAD_CFLAGS LDFLAGS DCC_LDFLAGS PTHREAD_LDFLAGS LIBS PTHREAD_LIBS CC INSTALL DCCD_MAX_FLOODS DBGFLAGS DCC_UPDATEDCC_FAST
ENV_SET="CC=gcc "
CC=gcc 
ENV_EXPORT=" CC"


# Copyright (c) 2012 by Rhyolite Software, LLC
#
# This agreement is not applicable to any entity which sells anti-spam
# solutions to others or provides an anti-spam solution as part of a
# security solution sold to other entities, or to a private network
# which employs the DCC or uses data provided by operation of the DCC
# but does not provide corresponding data to other users.
#
# Permission to use, copy, modify, and distribute this software without
# changes for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear in all
# copies and any distributed versions or copies are either unchanged
# or not called anything similar to "DCC" or "Distributed Checksum
# Clearinghouse".
#
# Parties not eligible to receive a license under this agreement can
# obtain a commercial license to use DCC by contacting Rhyolite Software
# at sales@rhyolite.com.
#
# A commercial license would be for Distributed Checksum and Reputation
# Clearinghouse software.  That software includes additional features.  This
# free license for Distributed ChecksumClearinghouse Software does not in any
# way grant permision to use Distributed Checksum and Reputation Clearinghouse
# software
#
# THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC
# BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
# OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
#	Rhyolite Software DCC 1.3.152-1.139 $Revision$
#	Generated automatically from updatedcc.in by configure.

# English messages so grep can suppress them;
#   simple collating sequence for sort
#   sane gcc error messages
LC_ALL=C; export LC_ALL


RELEASE=1.3.152
HTTP_REFERER=DCC-$RELEASE-script; export HTTP_REFERER

DCC_HOMEDIR=/var/dcc
DCC_LIBEXEC=/var/dcc/libexec	    # in case dcc_conf has disappeared
DCCUID=
if test -s $DCC_HOMEDIR/dcc_conf; then
    # override DCC_LIBEXEC and DCCUID from dcc_conf
    . $DCC_HOMEDIR/dcc_conf
fi

BURLS=
VERSION=

ME=`basename $0`
USAGE="$ME: [-xvUKk] [-e ENV=VAL] [-c CONF=VAL] [-s base-URL] [-V x.y.z]\\
	[-C pfile] [-T make-tgt]"
VERBOSE=
DEBUG=
UNPACK=
CRON=
CONFS=
PFILE=""
MAKE_TGT=install
while getopts "xvUKke:c:s:V:p:C:T:" c; do
    case $c in
    x) set -x; DEBUG=-x VERBOSE=yes;;
    v) VERBOSE=yes;;
    U) UNPACK=yes;;
    K) CRON=yes;;
    k) CRON=no;;
    e) NM=`expr "$OPTARG" : '\([^=]*\)=.*'`
	if test -z "$NM"; then
	    echo "-e requires ENV=VAL setting" 1>&2; exit 1
	fi
	VAL=`expr "$OPTARG" : '.*=\([^=]*\)'`
	# quote any odd characters
	VAL=`echo "$VAL" | sed -e 's/\([^-_/:=+,.a-zA-Z0-9]\)/\\\\\1/g'`
	if test -z "$VAL"; then
	    ENV_SET="$ENV_SET; unset $NM"
	else
	    ENV_SET="$ENV_SET; $NM=$VAL"
	fi
	ENV_EXPORT="$ENV_EXPORT $NM"
	;;
    c) CONFS="$CONFS $OPTARG"
	NM=`expr "X$OPTARG" : 'X--homedir=\(..*\)'`
	if test -n "$NM"; then
	    DCC_HOMEDIR="$NM"
	fi
	NM=`expr "X$OPTARG" : 'X--libexecdir=\(..*\)'`
	if test -n "$NM"; then
	    DCC_LIBEXEC="$NM"
	fi
	;;
    s) BURL=`expr "$OPTARG" : '\(.*\)/dcc.tar.Z$' \| "$OPTARG"`
	BURLS="$BURL $OPTARG"
	;;
    V) VERSION=`expr "X$OPTARG" : 'X\([1-9]\.[1-9][0-9]*\.[1-9][0-9]*\)'`
	if test "$VERSION" != "$OPTARG"; then
	    echo "invalid -V $OPTARG" 1>&2; exit 1
	fi
	;;
    C) PFILE="$OPTARG";;
    T) MAKE_TGT="$OPTARG";;
    p) echo "All 3 DCC tarballs are now the same";;
    *) echo "$USAGE" 1>&2; exit 1;;
    esac
done
shift `expr $OPTIND - 1 || true`
if test "$#" -ne 0; then
    echo "$USAGE" 1>&2; exit 1
fi

BDIR="$DCC_HOMEDIR/build"
DCCDIR="$BDIR/dcc"
OK_MARK="$BDIR/.updatedcc_ok"

if test -z "$VERBOSE"; then
    WGETQUIET='-nv'
    CURLQUIET=
    CONFQUIET='--quiet'
    MQUIET=
else
    WGETQUIET=
    CURLQUIET=
    CONFQUIET=
    MQUIET='#'
fi

# assume cron mode if stdin is not a tty
if test -z "$CRON" && test -n "`tty 2>&1 | grep 'not a tty'`"; then
    echo "assume -K because stdin is not a tty"
    CRON=assumed
fi
if test "$CRON" = no; then
    CRON=
fi
exec </dev/null
if test -n "$CRON"; then
    # be quite in cron mode unless told otherwise
    if test -z "$VERBOSE" -a "$CRON" != assumed; then
	WGETQUIET='-q'
	CURLQUIET='-s'
	exec >/dev/null
    fi
    exec 3>&1			# preserve stdout in case cron mode does work

    if test -n "$UNPACK"; then
	echo "-u (unpack only) and -K (cron mode) are incompatible" 1>&2
	exit 1
    fi
    if test -n "$VERSION"; then
	echo "-V$VERSION and -K (cron mode) are incompatible" 1>&2
	exit 1
    fi
    # Do nothing if we have run recently.
    #	Pick a somewhat random number of days to reduce the crowds that
    #	otherwise happen on anniversaries of releases.
    #	Some versions of cksum yield 10 digit numbers that some versions of
    #	expr think are negative.
    DAYS=`ls -lia $DCC_HOMEDIR | cksum					\
	| sed -e 's/[	 ]\{1,\}/ + /g' -e 's/\([0-9]\{6\}\)\([0-9]\)/\1 + \2/g'`
    DAYS=`expr '(' '(' $DAYS ')' % 3 ')' + 6`
    if test -d $DCCDIR							\
	    && test -n "`find $OK_MARK -mtime -$DAYS 2>/dev/null`"; then
	echo "fewer than $DAYS days since the last updatedcc -K; stop"
	exit 0
    fi
fi


# see if we have permission
set -e
if test ! -d $BDIR; then
    rm -f $BDIR || true
    mkdir $BDIR
fi
cd $BDIR
if test ! -d $DCCDIR; then
    rm -f $DCCDIR || true
    mkdir $DCCDIR
fi
set +e
for NM in "$DCC_HOMEDIR" "$DCC_LIBEXEC"; do
    if test -z "$NM"; then
	continue
    fi
    if test ! -d "$NM"; then
	NM=`dirname "$NM"`
    fi
    if test ! -w "$NM"; then
	echo "cannot write $NM; must $ME be run as root?" 1>&2
	exit 1
    fi
done
find $DCCDIR -type d | while read SUBDIR; do
	if test ! -w $SUBDIR; then
	    echo "cannot write $SUBDIR; must $ME be run as root?" 1>&2
	    # but maybe this is ok
	    break
	fi
    done

if test -z "$PFILE"; then
    if test -n ""; then
	CONFS="--without-updatedcc-pfile $CONFS"
    fi
    # quietly use $DCC_HOMEDIR/.updatedcc_pfile if it exists
    if test -s "$DCC_HOMEDIR/.updatedcc_pfile"; then
	PFILE="$DCC_HOMEDIR/.updatedcc_pfile"
    fi
else
    PFILE=`echo $PFILE | sed "s@^[^/]@$DCC_HOMEDIR/&@"`
    # add it to the configuration if it is not the default
    if test "$PFILE" != "$DCC_HOMEDIR/.updatedcc_pfile"; then
	CONFS="--with-updatedcc-pfile=$PFILE $CONFS"
    fi
fi
if test -f "$PFILE" -a ! -r "$PFILE"; then
    echo "cannot read $PFILE; must $ME be run as root?" 1>&2
fi
if test -n "$PFILE"; then
    . $PFILE
fi

if test -z "$BURLS"; then
    # $SERVER is set manually or from $DCC_HOMEDIR/.updatedcc_pfile
    if test -n "$SERVER"; then
	BURLS="$SERVER"
    else
	BURLS="http://www.dcc-servers.net/dcc/source http://www.rhyolite.com/dcc/source ftp://ftp.dcc-servers.net/src/dcc ftp://ftp.rhyolite.com/src/dcc"
    fi
fi

# figure out what we are fetching
if test -z "$VERSION"; then
    DLTBALL="dcc.tar.Z"
    TBALL=
    TBALL_PATH="$DLTBALL"
else
    DLTBALL="dcc-$VERSION.tar.Z"
    TBALL="$DLTBALL"
    TBALL_PATH="old/$DLTBALL"
fi
# move an old copy of the tarbal aside
if test -f $DLTBALL; then
    OLD_DLTBALL=$DLTBALL.$$
    mv $DLTBALL $OLD_DLTBALL
fi

# don't blab the password needlessly
print_url () {
    PURL=`echo "$2" | sed -e 's%^\([fhtp]*://\)[^/@:]\{1,\}:[^/@:]\{1,\}@%\1%'`
    echo "using $1 to get $PURL"
}


TRAPS="0 1 2 15"
stop_dccd () {
    if test "$DCC_UPDATEDCC_FAST" = yes; then
	return
    fi
    DCC_UPDATEDCC_FAST= export DCC_UPDATEDCC_FAST

    # trapped signals on some systems must start by turning themselves off,
    #	especially #0
    trap stop_update_early $TRAPS

    # start stopping dccd now in the hope that it will have released the
    #	sockets and database files by the time we need to restart it.
    $DCC_LIBEXEC/stop-dccd $DEBUG
    # switch to a working server
    /usr/local/bin/cdcc -q rtt >/dev/null 2>&1 || true
}

stop_update_early() {
    trap - $TRAPS
    echo 'stopping update; please wait'
    $DCC_RESTART
    exit 1
}

stop_update_late() {
    trap - $TRAPS
    echo "stopping; emptying $DCCDIR"
    gmake cleandir >/dev/null
    $DCC_RESTART $TRAPS
    exit 1
}

if test -n "$UNPACK"; then
    DCC_RESTART=
else
    DCC_RESTART="$DCC_LIBEXEC/rcDCC $DEBUG start"
    if test -z "$CRON"; then
	# in cron mode let FTP be slow instead of stopping the server
	stop_dccd
    fi
fi


# use fetch, wget, curl, or ftp that understands URLs
#	notice '-c --with-fetch_cmd=X' and '-c --without-fetch_cmd'
PGM=
eval `echo "X $CONFS" | tr ' ' '\n'					\
	| sed -n -e 's/^--with-fetch[-_]cmd=\(.*\)$/PGM=\1/p'		\
		-e 's/^--without-fetch[-_]cmd$/PGM=""/p'`
if test -z "$PGM"; then
    PGM=/usr/bin/wget
fi
PGM_B=`basename $PGM`
SUCCESS=
oldTZ=$TZ; TZ=UTC; export TZ		# Solaris FTP is confused by dates
if test "$PGM_B" = wget; then
    for BURL in $BURLS; do
	URL="$BURL/$TBALL_PATH"
	print_url "$PGM" "$URL"
	# Do not use --mirror because -r results in a 0 exit status
	#   even on failure.
	# Do not use --no-remove-listing, -nr, or --dont-remove-listing
	#   because none of them are supported by all versions of wget.
	# At least some versions of wget exit with 0 after having done
	#   nothing but emitting a usage message.
	if $PGM $WGETQUIET -nd --no-host-directories -N \
		--retr-symlinks --passive-ftp  --referer=$HTTP_REFERER --tries=1 "$URL"; then
	    if test -s $DLTBALL; then
		# notice if we get an HTTP error document with or without
		# HTTP headers
		if test -z "`sed -n -e 2q				\
				-e 's/.*DOCTYPE.*/HTML/p'		\
				-e 's/<HEAD>/HTML/p' -e 's/<head>/HTML/p' \
			$DLTBALL`"; then
		    SUCCESS="yes"
		    break
		fi
		# do not leave a broken file
		rm -f $DLTBALL
	    fi
	fi
	echo
    done
    PGM_B=
fi

if test "$PGM_B" = fetch; then
    for BURL in $BURLS; do
	URL="$BURL/$TBALL_PATH"
	print_url "$PGM" "$URL"
	FETCH_BIND_ADDRESS= export FETCH_BIND_ADDRESS
	if $PGM -p -q -m "$URL"; then
	    if test -s $DLTBALL; then
		SUCCESS="yes"
		break
	    fi
	fi
	echo
    done
    PGM_B=
fi

if test "$PGM_B" = curl; then
    for BURL in $BURLS; do
	URL="$BURL/$TBALL_PATH"
	print_url "$PGM" "$URL"
	if $PGM --referer $HTTP_REFERER -R --connect-timeout 30 --max-time 600 \
		    $CURLQUIET "$URL" -o $DLTBALL; then
	    # --fail does not work on at least some versions of curl
	    if test -s $DLTBALL; then
		# notice if we get an HTTP error document with or without
		# HTTP headers
		if test -z "`sed -n -e 2q				\
				-e 's/.*DOCTYPE.*/HTML/p'		\
				-e 's/<HEAD>/HTML/p' -e 's/<head>/HTML/p' \
			$DLTBALL`"; then
		    SUCCESS="yes"
		    break
		fi
		# do not leave a broken file
		rm -f $DLTBALL
	    fi
	fi
	echo
    done
    PGM_B=
fi

# try FTP if it is the right choice or the right choice has not worked
#   Some ftp programs understand HTTP URLs
if test "$PGM_B" = ftp -o ! -s $DLTBALL; then
    if test "$PGM_B" != ftp ; then
	PGM_B=ftp
	PGM=ftp
    fi
    for BURL in $BURLS; do
	URL="$BURL/$TBALL_PATH"
	print_url "$PGM" "$URL"
	$PGM "$URL"
	if test -s $DLTBALL; then
	    SUCCESS="yes"
	    break
	fi
	echo
    done
    # if that did not work, try ancient anonymous FTP
    if test ! -s $DLTBALL; then
	for URL in $BURLS; do
	    HOST=`expr "$URL" : "ftp://\([^/]*\)/"`
	    SRC=`expr "$URL" : "ftp://[^/]*/\(.*\)"`
	    if test -z "$HOST" -o -z "$SRC"; then
		continue
	    fi
	    USR=`expr "$HOST" : "\([^/:]*\):"`
	    if test -z "$USR"; then
		USR=anonymous
		PASSWD=`hostname`
	    else
		PASSWD=`expr "$HOST" : "$USR:\(.*\)@.*"`
		HOST=`expr "$HOST" : ".*@\(.*\)"`
	    fi
	    echo "try old anonymous FTP with $HOST and $SRC"
	    (echo "user $USR $PASSWD ";				\
			echo "binary";				\
			echo "get $SRC/$DLTBALL $DLTBALL")	\
		| ftp -n $HOST
	    if test -s $DLTBALL; then
		SUCCESS="yes"
		break
	    fi
	    # some versions of ftp like to leave empty files
	    rm -f $DLTBALL
	done
    fi
    PGM_B=
fi

if test -n "$PGM_B"; then
    echo "unrecognized fetch program $PGM" 1>&2
    if test -n "$OLD_DLTBALL"; then
	mv $OLD_DLTBALL $DLTBALL
    fi
    exit 1
fi
if test -z "$oldTZ"; then
    unset TZ
else
    TZ=$oldTZ
fi
if test -z "$SUCCESS" -o ! -s $DLTBALL; then
    echo
    echo "failed to fetch a new copy of $DLTBALL" 1>&2
    if test -n "$PFILE"; then
	echo "is $PFILE correct?" 1>&2
    fi
    # try to install an existing tar ball if not in cron mode
    if test -n "$CRON"; then
	if test -n "$OLD_DLTBALL"; then
	    mv $OLD_DLTBALL $DLTBALL
	fi
	exit 1
    fi
    echo
fi
set -e

# pick the newest tarball, possibly one fetched manually and already present
#   instead of the official tarball fetched by this script.
if test -z "$TBALL"; then
    TBALL=`ls -Lt dcc*.tar.Z | head -1`
fi
if test ! -s "$TBALL"; then
    echo "failed to fetch tarball; nothing to install" 1>&2
    if test -n "$OLD_DLTBALL"; then
	mv $OLD_DLTBALL $DLTBALL
    fi
    exit 1
fi
if test -n "$OLD_DLTBALL"; then
    rm $OLD_DLTBALL
fi

NEW_DCC=`zcat "$TBALL" | tar -tf -					\
	    | sed -n -e '2,$d' -e 's@\(dcc-[0-9.]*\)/.*@\1@p'`
if test -z "$NEW_DCC"; then
    echo "failed to find the version of $TBALL" 1>&2
    exit 1
fi

if test -n "$CRON"; then
    exec 1>&3				# restore stdout
    if test "$NEW_DCC" = "dcc-$RELEASE"	\
	&& test -z "`find $TBALL -follow -newer $DCCDIR`"; then
	# This is the same release.
	# We are finished since we should only install new versions for cron
	echo "new $TBALL is the same version $RELEASE; stop"
	touch $OK_MARK
	exit 0
    fi
    stop_dccd
fi

# Move the unpacked tarball into the build directory named dcc
#	while preserving any foreign files.
#   Empty the target build directory of old DCC source and generated files.
MNM=.manifest
if test -d $DCCDIR; then
    if test ! -f $DCCDIR/$MNM; then
	if test `find $DCCDIR -type f -print | wc -l` -gt 50; then
	    # deal with old versions without .manifest files
	    echo delete $DCCDIR
	    rm -rf $DCCDIR
	fi
    else
	cd $DCCDIR
	set +e
	gmake purge >/dev/null 2>&1
	cd $BDIR
	rmdir $DCCDIR 2>/dev/null
	set -e
	if test -d $DCCDIR; then
	    find $DCCDIR -type f -print		\
		| sed -e '1s/./preserving &/' -e '2,$s/./	&/'
	    cd $BDIR
	fi
    fi
fi

echo "unpack $TBALL into $DCCDIR"
rm -rf $NEW_DCC
zcat $TBALL | tar -xf - 2>&1 | head

if test -n "$UNPACK"; then
    echo "will configure but *NOT* build or install $NEW_DCC"
else
    echo "will configure and 'make $MAKE_TGT' $NEW_DCC"
fi
if test ! -d $DCCDIR; then
    rm -rf $DCCDIR
    mv $NEW_DCC $DCCDIR
else
    # install top directories for preserved files first
    find $NEW_DCC -name $MNM -print | sort | while read NM; do
	DIR=`expr $NM : "$NEW_DCC/\(.*\)/$MNM" || true`
	if test -z "$DIR"; then
	    DIR=.
	fi
	if test ! -d $NEW_DCC/$DIR; then
	    # we already moved this directory
	    continue
	fi
	# if we can, move the entire directory from the directory in the
	#	unpacked tarball to the corresponding build directory
	if test ! -d $DCCDIR/$DIR; then
	    # first remove a possible stray file with the target name
	    rm -f $DCCDIR/$DIR || true
	    mv $NEW_DCC/$DIR $DCCDIR/$DIR
	    continue
	fi
	# otherwise move individual files from the unpacked tarball directory
	cd $NEW_DCC/$DIR
	mv `cat $MNM` $DCCDIR/$DIR
	cd $BDIR
	done
    rm -rf $NEW_DCC
fi

cd $DCCDIR

# compute default --with-uid from dcc_conf to quiet complaints from fix-map
if test -n "$DCCUID" \
	-a -z "`echo  --disable-dccm --disable-IPv6 --disable-server $CONFS | grep with-uid=`"; then
    DEF_WITH_UID="--with-uid=$DCCUID"
    echo "infer $DEF_WITH_UID from DCCUID=$DCCUID in $DCC_HOMEDIR/dcc_conf"
else
    DEF_WITH_UID=""
fi

if test -n "$ENV_SET"; then
    echo "+ $ENV_SET; export$ENV_EXPORT"
    eval "$ENV_SET; export$ENV_EXPORT"
fi
echo "+ ./configure $DEF_WITH_UID  --disable-dccm --disable-IPv6 --disable-server $CONFQUIET $CONFS"
./configure $DEF_WITH_UID  --disable-dccm --disable-IPv6 --disable-server $CONFQUIET $CONFS

if test -n "$UNPACK"; then
    exit
fi
trap stop_update_late $TRAPS

gmake $MAKE_TGT 2>&1						\
    | sed -e "$MQUIET/^[a-z0-9_]*.c: In function .*/d"			\
	-e "$MQUIET/ warning: .%.. yields only last 2 digits of year/d"	\
	-e "$MQUIET/^make.*is up to date/d"				\
	-e "$MQUIET/^make.*Nothing to be done for/d"			\
	-e "$MQUIET/^[a-z\/]*cc/s/-W[-a-z]* *//g"			\
	-e "$MQUIET/^[a-z\/]*cc/s@-m[0-9a-z=]* *@@g"			\
	-e "$MQUIET/^[a-z\/]*cc/s@-D_FILE_OFFSET_BITS=64 *@@g"		\
	-e "$MQUIET/^[a-z\/]*cc/s@-D_LARGEFILE_SOURCE *@@g"		\
	-e "$MQUIET/^[a-z\/]*cc/s@-D_REENTRANT *@@g"			\
	-e "$MQUIET/^[a-z\/]*cc/s@-D_GNU_SOURCE *@@g"			\
	-e "$MQUIET/^[a-z\/]*cc/s@-I[-a-zA-Z0-9/.]* *@@g"		\
	-e "$MQUIET/^[a-z\/]*cc/s@-fno-strict-aliasing *@@g"		\
	-e "$MQUIET/^[a-z\/]*cc/s@-pipe *@@g"				\
	-e "$MQUIET/^[a-z\/]*cc/s@-std=gnu99 *@@g"			\
	-e "$MQUIET/^[a-z\/]*cc/s@-fstack-protector *@@g"		\
	-e "$MQUIET/^building static .* library/d"			\
	-e "$MQUIET/^rm -f \.depend/d"					\
	-e "$MQUIET/^mkdep/d"						\
	-e "$MQUIET/^echo .* \.depend/d"				\
	-e "${MQUIET}s@^[-_a-zA-Z0-9/]*\(g*cc\)  *@\1 @g"

touch $OK_MARK

# finally start the new version and switch back to the local server
trap - $TRAPS
$DCC_RESTART
/usr/local/bin/cdcc -q rtt >/dev/null 2>&1