bin/104044: [patch] rc.d/cleartmp works incorrectly
Andrey Simonenko
simon at comsys.ntu-kpi.kiev.ua
Thu Oct 12 10:40:21 UTC 2006
The following reply was made to PR bin/104044; it has been noted by GNATS.
From: Andrey Simonenko <simon at comsys.ntu-kpi.kiev.ua>
To: Yar Tikhiy <yar at comp.chem.msu.su>
Cc: Florent Thoumie <flz at xbsd.org>, bug-followup at freebsd.org
Subject: Re: bin/104044: [patch] rc.d/cleartmp works incorrectly
Date: Thu, 12 Oct 2006 13:36:29 +0300
On Tue, Oct 10, 2006 at 03:31:35PM +0400, Yar Tikhiy wrote:
> On Tue, Oct 10, 2006 at 02:34:43PM +0400, Yar Tikhiy wrote:
> >
> > > 2. Ignore error code from rm and always run find, that is
> > > use "rm ... ; find ..." instead of "rm ... && find ...":
> > > one can create many files with long names and rm will not
> > > be called because of "Argument list too long" error, so
> > > find should do all of the work.
> >
> > By the way, did you consider omitting the first rm at all and just
> > using "find ... -print0 | xargs -0 rm -rf" ? The first rm can be
> > an optimization as long as we use find with -exec. OTOH, xargs -0
> > would buy us the same performance and robustness without hacks.
> > Both find and xargs should be available to cleartmp. Here's the
> > code. Note "type -d" omitted.
> >
> > if checkyesno ${rcvar1}; then
> > # This is not needed with mfs /tmp, but doesn't hurt anything.
> > echo "Clearing /tmp."
> > find -x /tmp/. ! -name . \
> > ! \( -name lost+found -type d -user root \) \
> > ! \( \( -name quota.user -or -name quota.group \) \
> > -type f -user root \) \
> > -prune -print0 | xargs -0 rm -rf
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > elif ...
>
> It seems we can use just "-delete" here. If run as root, find
> deletes entries with funny permissions or flags as well as rm does.
> BTW, find will descend into lost+found and delete its contents in
> both cases (rm w/ -prune, or -delete), which is good IMHO.
--- cleartmp.orig Mon Apr 10 16:10:30 2006
+++ cleartmp Thu Oct 12 13:08:00 2006
@@ -10,47 +10,33 @@
. /etc/rc.subr
name="cleartmp"
-rcvar=`set_rcvar clear_tmp`
-
+rcvar1=`set_rcvar clear_tmp`
start_cmd="${name}_start"
-cleartmp_prestart()
+cleartmp_start()
{
- checkyesno clear_tmp_X || return
-
local x11_socket_dirs="/tmp/.X11-unix /tmp/.ICE-unix /tmp/.font-unix \
/tmp/.XIM-unix"
- # Remove X lock files, since they will prevent you from restarting X.
- rm -f /tmp/.X[0-9]-lock
-
- # Create socket directories with correct permissions to avoid
- # security problem.
- #
- rm -fr ${x11_socket_dirs}
- mkdir -m 1777 ${x11_socket_dirs}
-}
-
-cleartmp_start()
-{
- echo "Clearing /tmp."
- #
- # Prune quickly with one rm, then use find to clean up
- # /tmp/[lq]* (this is not needed with mfs /tmp, but
- # doesn't hurt anything).
- #
- (cd /tmp && rm -rf [a-km-pr-zA-Z]* &&
- find -x . ! -name . ! -name lost+found ! -name quota.user \
- ! -name quota.group ! -name .X11-unix ! -name .ICE-unix \
- ! -name .font-unix ! -name .XIM-unix \
- -exec rm -rf -- {} \; -type d -prune)
+ if checkyesno ${rcvar1}; then
+ # This is not needed for mfs /tmp, but doesn't hurt anything.
+ echo "Clearing /tmp."
+ find -x /tmp/. ! -name . \
+ ! \( -name lost+found -type d -user root \) \
+ ! \( \( -name quota.user -or -name quota.group \) \
+ -type f -user root \) \
+ -delete
+ elif checkyesno clear_tmp_X; then
+ # Remove X lock files, since they will prevent you from
+ # restarting X. Remove other X related directories.
+ echo "Clearing /tmp (X related)."
+ rm -rf /tmp/.X[0-9]-lock ${x11_socket_dirs}
+ fi
+ if checkyesno clear_tmp_X; then
+ # Create X related directories.
+ mkdir -m 1777 ${x11_socket_dirs}
+ fi
}
load_rc_config $name
-
-# The clear_tmp_X variable should be tested even if clear_tmp_enable is NO
-case "$1" in
-*start) cleartmp_prestart ;;
-esac
-
run_rc_command "$1"
More information about the freebsd-rc
mailing list