[GRASS5] $ETC/cleanup fails on directories in .tmp/

Glynn Clements glynn at gclements.plus.com
Tue Apr 4 05:29:37 EDT 2006


Markus Neteler wrote:

> a couple of GRASS modules generate subdirectories within the .tmp/
> directory of mapsets. I have discovered that etc/clean_temp fails
> on cleaning those as it is written to remove files only:
> 
> strace /home/neteler/soft/61grass_cvsexp/dist.i686-pc-linux-gnu/etc/clean_temp
> ...
> unlink("31611.0")                       = -1 EISDIR (Is a directory)
> stat64("31944.0", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
> kill(31944, SIG_0)                      = -1 ESRCH (No such process)
> unlink("31944.0")                       = -1 EISDIR (Is a directory)
> stat64("32038.0", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
> kill(32038, SIG_0)                      = -1 ESRCH (No such process)
> unlink("32038.0")                       = -1 EISDIR (Is a directory)
> ...
> 
> The C file is lib/init/clean_temp.c
> 
> I would appreciate if someone could add dir removal to this command
> to avoid that tons of files are left over. I am asking since this is
> probably sensible code which may carry some risk if badly implemented
> and which needs to be portable.

G_remove() does recursive removal of directories; changing the
unlink() to G_remove() should work.

[It was using a fixed 1K buffer with no overflow check. I've enlarged
the buffer to 4K and added an overflow check.]

Also, clean_temp should use opendir/readdir/closedir to enumerate the
directory contents rather than popen("ls").

If no-one else does it before, I'll look into it when I've had some
sleep (writing an "rm -rf" equivalent should probably be done when
fully awake).

-- 
Glynn Clements <glynn at gclements.plus.com>




More information about the grass-dev mailing list