problems with mc / version from SuSE 9.3



Dear listmembers,
regarding my first posting I found that I was definitively wrong in that the 
current solution of "wrapper"-scripts are no real wrapper scripts as they are  
not actually executed but sourced in order to keep track of the path-moves 
within mc.
What still remains is the problem that the temp-dir is not cleaned at the end. 
IMHO this should not happen.
Therefore I prepared a patch that cures this - the current functionality is 
kept "as is", however, everything is wiped off <TMPDIR>/mc-<USERNAME> after 
the last instance of mc has been terminated.
Take care


Dieter Jurzitza

-- 
-----------------------------------------------------------

                               |
                                \
                 /\_/\           |
                | ~x~ |/-----\   /
                 \   /-       \_/
  ^^__   _        /  _  ____   /
 <°°__ \- \_/     |  |/    |  |
  ||  ||         _| _|    _| _|

if you really want to see the pictures above - use some font
with constant spacing like courier! :-)
-----------------------------------------------------------
--- lib/mc-wrapper.sh.in
+++ lib/mc-wrapper.sh.in
@@ -1,14 +1,45 @@
-MC_USER=`id | sed 's/[^(]*(//;s/).*//'`
-MC_PWD_FILE="${TMPDIR-/tmp}/mc-$MC_USER/mc.pwd.$$"
- bindir@/mc -P "$MC_PWD_FILE" "$@"
-
-if test -r "$MC_PWD_FILE"; then
-	MC_PWD="`cat $MC_PWD_FILE`"
-	if test -n "$MC_PWD" && test -d "$MC_PWD"; then
-		cd "$MC_PWD"
+# This is only sourced, we will have no new shell -> no shell-reference at the top
+export MC_TMPDIR="${TMPDIR-/tmp}/mc-`id -un`"
+export MC_PWD_FILE="${MC_TMPDIR}/mc.pwd.$$"
+
+# start mc, actually!
+ bindir@/mc -P ${MC_PWD_FILE} $@
+
+# go where mc used to be at the end. This is still somewhat tricky
+# as it only works from an alias, not directly!
+if [ -r ${MC_PWD_FILE} ]; then
+	MC_PWD="`cat ${MC_PWD_FILE}`"
+	if test -n "${MC_PWD}" && test -d "${MC_PWD}"; then
+		cd "${MC_PWD}"
 	fi
-	unset MC_PWD
 fi
 
-rm -f "$MC_PWD_FILE"
+#
+# Now we have to clean up.
+# If other mc-instances are active, do nothing, otherwise clean the directory!
+# watch out, the instances could be dead!
+#
+# get the list of proc-id's that belong to the corresponding entries in $MC_TMPDIR
+MC_PROCLIST=`cd ${MC_TMPDIR}; ls -c --color=none mc.pipe* 2>/dev/null | sed 's/mc\.pipe\.//g'| tr '\n' ' '`
+
+# Test whether those processes are active ones. If yes, do nothing!
+# if only one mc-process is still running, we do nothing!
+for i in ${MC_PROCLIST}; do
+	MC_RESULT=`ps -p $i -o pid= -o comm=`
+	if [ "${MC_RESULT}" != "" ]; then
+		break;
+	fi
+done
+
+# Delete everything in /tmp/mc-<USERNAME>, but only if no instances of mc run any more!
+if [ "${MC_RESULT}" = "" ]; then
+	/bin/rm -rf ${MC_TMPDIR}
+	mkdir ${MC_TMPDIR}
+fi
+
 unset MC_PWD_FILE
+unset MC_PROCLIST
+unset MC_RESULT
+unset MC_TMPDIR
+unset MC_PWD
+# That should be it!
--- lib/mc-wrapper.csh.in
+++ lib/mc-wrapper.csh.in
@@ -1,20 +1,46 @@
-set MC_USER="`id | sed 's/[^(]*(//;s/).*//'`"
-
+# This is only sourced, we will have no new shell -> no shell-reference at the top
 if ($?TMPDIR) then
-	setenv MC_PWD_FILE $TMPDIR/mc-$MC_USER/mc.pwd.$$
+	setenv MC_TMPDIR $TMPDIR/mc-"`id -un`"
 else
-	setenv MC_PWD_FILE /tmp/mc-$MC_USER/mc.pwd.$$
+	setenv MC_TMPDIR /tmp/mc-"`id -un`"
 endif
+setenv MC_PWD_FILE $MC_TMPDIR/mc.pwd.$$
 
- bindir@/mc -P "$MC_PWD_FILE" $*
+/usr/bin/mc -P "$MC_PWD_FILE" $*
 
 if (-r "$MC_PWD_FILE") then
 	setenv MC_PWD "`cat $MC_PWD_FILE`"
 	if ( -d "$MC_PWD" ) then
 		cd "$MC_PWD"
 	endif
-	unsetenv MC_PWD
 endif
 
-rm -f "$MC_PWD_FILE"
+#
+# Now we have to clean up.
+# If other mc-instances are active, do nothing, otherwise clean the directory!
+# watch out, the instances could be dead!
+#
+# get the list of proc-id's that belong to the corresponding entries in $MC_TMPDIR
+setenv MC_PROCLIST "`cd ${MC_TMPDIR}; ls -c --color=none mc.pipe* |& sed 's/[^0-9]//g'| tr '\n' ' '`"
+
+# Test whether those processes are active ones. If yes, do nothing!
+# if only one mc-process is still running, we do nothing!
+foreach i (${MC_PROCLIST})
+	setenv MC_RESULT "`ps -p $i -o pid= -o comm=`"
+	if ($?MC_RESULT) then
+		break;
+	endif
+end
+
+# Delete everything in /tmp/mc-<USERNAME>, but only if no instances of mc run any more!
+if ( ! $?MC_RESULT ) then
+	/bin/rm -rf ${MC_TMPDIR}
+	mkdir ${MC_TMPDIR}
+endif
+
 unsetenv MC_PWD_FILE
+unsetenv MC_PROCLIST
+unsetenv MC_RESULT
+unsetenv MC_TMPDIR
+unsetenv MC_PWD
+# That should be it!


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]