Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Apr 1999 15:51:24 +0200
From:      Graham Wheeler <gram@cdsec.com>
To:        Ladavac Marino <mladavac@metropolitan.at>, hackers@freebsd.org
Subject:   Re: File locking problem
Message-ID:  <371DD7DC.4B5356E@cdsec.com>
References:  <55586E7391ACD211B9730000C11002761795EF@r-lmh-wi-100.corpnet.at>

next in thread | previous in thread | raw e-mail | index | archive | help
Ladavac Marino wrote:
>         [ML]  Please disregard my second "solution".  It won't work (the
> second open will create the file if you specify O_CREAT).  Talking about
> that, the real solution might be to open the file read-write without
> O_CREAT flag--the open will fail if the file was unlinked between dir
> read and open.

That is the solution. I have a routine:

    FILE *OpenExclusive(const char *path, const char *mode);

This routine maps normal fopen() style modes to open() style flags,
does the open() with locking, and then an fdopen().
The code that uses it was quite correctly passing "r+" through as the
mode, but the OpenExclusive routine was incorrectly setting the
O_CREAT flag in this case. After checking Stephens' APitUE fig 5.3
I realised that this was wrong. Removing the O_CREAT solved the 
problem.

I've been using the OpenExclusive routine for a long time, and have
never had problems with it before (probably because this is the
first time I've used it with the "r+" mode, and also because the 
problem actually occurs so intermittently and I couldn't reliably
replicate it), so I wasted a couple of days poring
over the (fairly complex) code of the process that uses it, and 
couldn't find anything wrong (so I posted the problem). I figured
I was misunderstanding file locking in the context of multiple
processes. I'm glad that that wasn't the problem, or I would have had to
implement my locks using UUCP style `semafiles'.

Thanks to everyone for their suggestions.

-- 
Dr Graham Wheeler                          E-mail: gram@cdsec.com
Citadel Data Security                      Phone:  +27(21)423-6065/6/7
Firewalls/Virtual Private Networks         Fax:    +27(21)24-3656
Internet/Intranet Network Specialists      
Data Security Products                     WWW:    http://www.cdsec.com/


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?371DD7DC.4B5356E>