Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 07 Aug 2002 12:20:30 +0300
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        Joe Marcus Clarke <marcus@marcuscom.com>
Cc:        George <jirka@5z.com>, gnome@FreeBSD.ORG
Subject:   Re: GDM 2.4.0.x & FreeBSD
Message-ID:  <3D50E65E.BC416D0@FreeBSD.org>
References:  <20020715225248.GI19585@monique.linux.bogus> <20020729222247.E308-100000@shumai.marcuscom.com>  <20020731170330.GB20594@monique.linux.bogus> <1028675476.690.61.camel@gyros.marcuscom.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Joe Marcus Clarke wrote:
> 
> On Wed, 2002-07-31 at 13:03, George wrote:
> > On Mon, Jul 29, 2002 at 10:25:09PM -0400, Joe Marcus Clarke wrote:
> > > George, I just pulled down your latest diffs from CVS, but the problem
> > > with gdm from /etc/ttys.  I'm still getting the EBADF from slave.c at
> > > lines 1495 and 1500.
> >
> > I suppose these are the dup2 lines.  Hmmm, this is very weird, I can't see
> > why it wouldn't be possible to dup into stdin and stdout.  Perhaps the
> > solution may be to not use stdin and stdout in this case (it's not neccessary
> > really, it's just the original design of the beast).
> >
> > can you try to change this to:
> >
> >       if (pipe1[1] != STDOUT_FILENO) {
> >             close (STDOUT_FILENO);
> >           dup2 (pipe1[1], STDOUT_FILENO);
> >           close (pipe1[1]);
> >       }
> >
> >       if (pipe2[0] != STDIN_FILENO)  {
> >             close (STDIN_FILENO);
> >           dup2 (pipe2[0], STDIN_FILENO);
> >           close (pipe2[0]);
> >       }
> >
> > (Note those if's are just an anality and something I'll get rid of later,
> > they will always trigger)
> >
> > Perhaps we can't dup into those original fd's, though dup2 should do the
> > close for us.
> 
> I tried your new file descriptor patch to slave.c, and this made things
> worse.  Now, gdm doesn't even start.  It continues to start, die, and
> restart, until it does so enough times, then the display is disabled.
> 
> To fix this, I took out the two lines that closed the child end of the
> pipes (lines 1507 and 1508).  On FreeBSD, if one end of a pipe is
> closed, the pipe is considered widowed, and the process gets hit with a
> SIGPIPE.  From FreeBSD's pipe(2) manpage:

This is incorrect interpretation. Actually, for historical reasons
pipe(2) call returns two bi-directional pipes, so that it is
absolutely valid to close unused one both in the clien and server
(check src/lib/libc/gen/popen.c for example).

-Maxim

> 
> "A pipe that has had an end closed is considered widowed.  Writing on
> such a pipe causes the writing process to receive a SIGPIPE signal.
> Widowing a pipe is the only way to deliver end-of-file to a reader:
> after the reader consumes any buffered data, reading a widowed pipe
> returns a zero count.
> 
> The bidirectional nature of this implementation of pipes is not portable
> to older systems, so it is recommended to use the convention for using
> the endpoints in the traditional manner when using a pipe in one direc-
> tion."
> 
> However, even after removing the close calls, the problem with the
> unusable Username field remains.  The file descriptor numbers for the
> pipe ends remain constant at 9 for out and 10 for in.  This is true even
> if gdm is started manually without the --nodaemon option.

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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D50E65E.BC416D0>