Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 May 2007 02:11:14 -0400
From:      Parv <parv@pair.com>
To:        Doug Barton <dougb@FreeBSD.org>
Cc:        ports@FreeBSD.org, Peter Jeremy <peterjeremy@optushome.com.au>, x11@FreeBSD.org
Subject:   Re: X.org 7.2 ports merged into the FreeBSD Ports Tree
Message-ID:  <20070521061114.GA16252@holestein.holy.cow>
In-Reply-To: <4650BD2C.6060801@FreeBSD.org>
References:  <464F62D8.80200@FreeBSD.org> <20070519215700.GC1164@turion.vk2pj.dyndns.org> <464F75BF.80203@FreeBSD.org> <20070519223641.GE1164@turion.vk2pj.dyndns.org> <20070520054309.GA3872@holestein.holy.cow> <4650BD2C.6060801@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--d6Gm4EdcadzBjdND
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

in message <4650BD2C.6060801@FreeBSD.org>,
wrote Doug Barton thusly...
>
>  Parv wrote:
> 
> > I am using FreeBSD 6.  I haven't tried xorg 7.2 port(s) yet, but
> > recently did merge /usr/X11R6 to /usr/local (programs reinstalled,
> > made link to X11R6 to local, and such).  On a reboot after that,
> > scripts indeed ran twice
...
> Could you try restoring the default rc.conf entry, and apply the
> patch I posted to /etc/rc.subr? It would be nice to get testing
> from someone who was actually affected by the problem.

Doug, after commenting out $local_{periodic,startup} lines in
/etc/rc.conf, the patch posted in message
<464F8AAF.2010609@FreeBSD.org> failed to stop double execution of
scripts.

I do not see how the statement on line 1490 ...


  1489  case "$local_rc" in
  1490  *[\ ]*${f}[\ ]*|*[\ ]*${f}) ;;
  1491  *) local_rc="${local_rc} $f" ;;
  1492  esac


... work without actually resolving the paths, at least in case of ...

  lrwxr-xr-x  1 root  wheel  11 May 16 16:30 /usr/X11R6@ -> /misc/local
  lrwxr-xr-x  1 root  wheel  11 Dec 21  2004 /usr/local@ -> /misc/local


... since 'X11R6' will always be different than 'local'.

Please look over the attached patch (where, at least in my case,
after resolving directories in $local_startup, already_seen function
calls can be omitted just before making file list).  The patch is
against this /etc/rc.subr version ...

  # $FreeBSD: src/etc/rc.subr,v 1.34.2.20 2007/03/16 15:34:09 yar Exp


  - Parv

-- 


--d6Gm4EdcadzBjdND
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="rc.subr-nodupes-4.diff"

--- /etc/rc.subr--OLD	Mon May 21 01:36:05 2007
+++ /etc/rc.subr	Mon May 21 01:57:53 2007
@@ -1454,19 +1454,60 @@
 	echo ${devices2}
 }
 
+#  Check if a string, $1, already exists in a space separated collection
+#  of strings, $2.
+#
+already_seen () {
+	local _subset _set  _rc
+	_subset="$1"
+	_set="$2"
+	_rc=
+	case "$_set" in
+		*[\ ]${_subset}[\ ]* | *[\ ]${_subset} | ${_subset}[\ ]* )
+			_rc=0
+		;;
+		* )
+			_rc=1
+		;;
+	esac
+	return $_rc
+}
+
+#  Resolve paths, remove duplicates.  Values are stored in $real_paths, a
+#  space separated string.
+#
+path_resolve () {
+	local _tmp
+	real_paths=''
+	for f in $@; do
+		_tmp=$( realpath "$f" )
+		already_seen "$_tmp" "${real_paths}" && continue
+		real_paths="$_tmp $real_paths"
+	done
+	real_paths=${real_paths% }
+}
+
 # Find scripts in local_startup directories that use the old syntax
 #
 find_local_scripts_old () {
 	zlist=''
 	slist=''
-	for dir in ${local_startup}; do
+	path_resolve ${local_startup}
+	for dir in ${real_paths}; do
+
 		if [ -d "${dir}" ]; then
 			for file in ${dir}/[0-9]*.sh; do
+
+				already_seen "$file" "${zlist}" && continue
+
 				grep '^# PROVIDE:' $file >/dev/null 2>&1 &&
 				    continue
 				zlist="$zlist $file"
 			done
 			for file in ${dir}/[^0-9]*.sh; do
+
+				already_seen "$file" "${slist}" && continue
+
 				grep '^# PROVIDE:' $file >/dev/null 2>&1 &&
 				    continue
 				slist="$slist $file"
@@ -1476,14 +1517,22 @@
 }
 
 find_local_scripts_new () {
+	local dir f
 	local_rc=''
-	for dir in ${local_startup}; do
+	path_resolve ${local_startup}
+	for dir in ${real_paths}; do
+
+		already_seen "$dir" "${local_startup}" && continue
+
 		if [ -d "${dir}" ]; then
-			for file in `grep -l '^# PROVIDE:' ${dir}/* 2>/dev/null`; do
-				case "$file" in
+			for f in `grep -l '^# PROVIDE:' ${dir}/* 2>/dev/null`
+			do
+				case "$f" in
 				*.sample) ;;
-				*)	if [ -x "$file" ]; then
-						local_rc="${local_rc} ${file}"
+				*)
+					already_seen "$f" "${local_rc}" && conitnue
+					if [ -x "$f" ]; then
+						local_rc="${local_rc} $f"
 					fi
 					;;
 				esac

--d6Gm4EdcadzBjdND--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070521061114.GA16252>