Date: Fri, 17 Nov 1995 18:32:43 +0100 (MET) From: grog@lemis.de (Greg Lehey) To: hackers@freebsd.org (FreeBSD Hackers) Subject: Re: elm problem - "solved" Message-ID: <199511171732.SAA26447@allegro.lemis.de>
next in thread | raw e-mail | index | archive | help
David Greenman writes:
> >> I wasn't able to get it working with fcntl locking, either. I compiled
> >> and installed it long before I knew of the existance of a port (one might
> >> have existed, I don't know). I've always had to use flock style locking
> >> - fcntl always seemed to cause the symptoms the original complaint
> >> described.
> >
> >I've followed this up a little, and now believe that fcntl locking is
> >broken. I took an elm I compiled on BSD/386 (in fact, the one I'm
> >using now) and went through with gdb. The result: the system call to
> >fcntl has identical parameters in each case:
> >
> >(gdb) p lock_info
> >$1 = {
> > l_type = 3,
> > l_whence = 0,
> > l_start = 0,
> > l_len = 0,
> > l_pid = 0
> >}
> >
> >l_type is F_WRLCK, and it's calling fcntl with F_SETLK. This works as
> >advertised with BSD/386, but returns with an invalid argument with
> >FreeBSD in all versions I've tried recently.
> >
> >I haven't got any further (can somebody please tell me how to enter
> >ddb from the keyboard? Something goes and messes up my keymap, so I
> >can't get in after booting), but intend to do so some time soon.
>
> If you can put together a short program to demonstrate the bug, I would be
> happy to find and fix it.
Well, we found the problem. lock_info is of type struct flock. In
BSD systems derived from Net/2, and also in Linux, SunOS 4, System
V.3, struct flock is defined as
/*
* Advisory file segment locking data type -
* information passed to system by user
*/
struct flock {
short l_type; /* lock type: read/write, etc. */
short l_whence; /* type of l_start */
off_t l_start; /* starting offset */
off_t l_len; /* len = 0 means until end of file */
pid_t l_pid; /* lock owner */
};
In 4.4BSD, it's defined as
/*
* Advisory file segment locking data type -
* information passed to system by user
*/
struct flock {
off_t l_start; /* starting offset */
off_t l_len; /* len = 0 means until end of file */
pid_t l_pid; /* lock owner */
short l_type; /* lock type: read/write, etc. */
short l_whence; /* type of l_start */
};
Finally, in System V.4, including SunOS 5 (Solaris 2), it is defined
as
typedef struct flock {
short l_type; /* Type of lock */
short l_whence; /* Flag for starting offset */
off_t l_start; /* Relative offset in bytes */
off_t l_len; /* Size; if 0 then until EOF */
long l_sysid; /* Returned with F_GETLK */
pid_t l_pid; /* Returned with F_GETLK */
long l_pad /* reserve area */
} flock_t;
I really have great difficulty understanding why this change was made.
It means that old FreeBSD and BSD/386 binaries won't work correctly
under FreeBSD or BSD/OS Versions 2. I can't see any advantage at all
in this change. Grrrr.
Greg
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199511171732.SAA26447>
