OpenSolaris_b135/pkgdefs/common_files/proc.inetd_remove

#
# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
# ident	"%Z%%M%	%I%	%E% SMI"
#
# proc.inetd_remove -- common code for inetd.conf entry removal
#
# inetd_init	: call before any other functions
# inetd_remove	: remove daemons specified as arguments by removing
#		  lines from inetd.conf that match the regular
#		  expressions provided on stdin (one per line)
# inetd_undo	: call if rest of procedure script fails
# inetd_fini	: call if rest of procedure script succeeds
#
# inetd_init and inetd_remove will perform necessary clean-up and
# return a non-zero exit code on failure.

inetconf=${PKG_INSTALL_ROOT:-/}/etc/inet/inetd.conf
inetold=/tmp/inetd.conf.$$
inetsed=/tmp/inetd.sed.$$
inettmp=/tmp/inetd.tmp.$$

inetd_init() {
	cat $inetconf > $inetold
	if [ $? -ne 0 ]; then
		echo "can't create $inetold"
		return 1
	fi
	return 0
}

inetd_fini() {
	rm -f -- $inetold $inetsed $inettmp
	return 0
}

inetd_undo() {
	cat $inetold > $inetconf
	inetd_fini
}

# inetd_check verifies whether any processes are running for the
# supplied FMRI, fails if there are, if not it sends the service to
# maintenance mode.
#
inetd_check() {
    	# Return if we're not removing from the running system
    	if [ "${PKG_INSTALL_ROOT:-/}" != "/" ]; then
	    	return 0
	fi

	for i in "$@"; do
	    	cts=`svcprop -p restarter/contract $i 2>/dev/null`
		if [ -n "$cts" ]; then
			echo "$i running; unable to remove package"
			return 1
		fi
		svcadm mark maintenance $i
	done

	return 0
}

inetd_remove() {
    	inetd_check "$@" || return 1;
	INSTALLED_PKGS=`pkginfo $PKG\\* | wc -l`
	if [ $INSTALLED_PKGS -eq 1 ]; then
		#
		# Remove the additions that were made to /etc/inetd.conf
		#
		sed -e 's:/:\\/:g' -e 's:.*:/&/ d:' > $inetsed
		if [ $? -ne 0 ]; then
			echo "couldn't create $inetsed"
			inetd_undo
			return 1
		fi
		sed -f $inetsed < $inetconf > $inettmp
		if [ $? -ne 0 ]; then
			echo "couldn't create $inettmp"
			inetd_undo
			return 1
		fi

		cmp -s $inetconf $inettmp
		case $? in
		0)	;;
		1)	cat $inettmp > $inetconf
			if [ $? -ne 0 ]; then
				echo "couldn't edit $inetconf"
				inetd_undo
				return 1
			fi

			;;

		*)	echo "couldn't read $inetconf or $inettmp"
			inetd_undo
			return 1
			;;
		esac
	fi
	return 0
}