1999-09-18 Roland McGrath <roland@baalperazim.frob.com>
* sysdeps/mach/hurd/wait4.c (__wait4): When proc_wait returns EAGAIN, return zero to indicate no children died yet (assuming WNOHANG). * sysdeps/mach/hurd/setsid.c: #include <hurd/fd.h>. 1999-09-17 Roland McGrath <roland@baalperazim.frob.com> * hurd/port2fd.c (_hurd_port2fd): Never change CTTYID port. * sysdeps/mach/hurd/setsid.c (__setsid): Fix return type -> pid_t. Return _hurd_pgrp instead of 0.
This commit is contained in:
parent
55ffcab7b6
commit
50b076f4dd
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
1999-09-18 Roland McGrath <roland@baalperazim.frob.com>
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/wait4.c (__wait4): When proc_wait returns EAGAIN,
|
||||||
|
return zero to indicate no children died yet (assuming WNOHANG).
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/setsid.c: #include <hurd/fd.h>.
|
||||||
|
|
||||||
|
1999-09-17 Roland McGrath <roland@baalperazim.frob.com>
|
||||||
|
|
||||||
|
* hurd/port2fd.c (_hurd_port2fd): Never change CTTYID port.
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/setsid.c (__setsid): Fix return type -> pid_t.
|
||||||
|
Return _hurd_pgrp instead of 0.
|
||||||
|
|
||||||
1999-09-19 Roland McGrath <roland@baalperazim.frob.com>
|
1999-09-19 Roland McGrath <roland@baalperazim.frob.com>
|
||||||
|
|
||||||
* sysdeps/mach/hurd/brk.c (_hurd_set_brk): Deallocate and reallocate
|
* sysdeps/mach/hurd/brk.c (_hurd_set_brk): Deallocate and reallocate
|
||||||
|
@ -27,46 +27,34 @@
|
|||||||
D should be locked, and will not be unlocked. */
|
D should be locked, and will not be unlocked. */
|
||||||
|
|
||||||
void
|
void
|
||||||
_hurd_port2fd (struct hurd_fd *d, io_t port, int flags)
|
_hurd_port2fd (struct hurd_fd *d, io_t dport, int flags)
|
||||||
{
|
{
|
||||||
io_t ctty;
|
|
||||||
mach_port_t cttyid;
|
mach_port_t cttyid;
|
||||||
int is_ctty = !(flags & O_IGNORE_CTTY) && ! __term_getctty (port, &cttyid);
|
io_t ctty = MACH_PORT_NULL;
|
||||||
|
|
||||||
if (is_ctty)
|
if (!(flags & O_IGNORE_CTTY))
|
||||||
{
|
__USEPORT (CTTYID,
|
||||||
/* This port is capable of being a controlling tty.
|
({
|
||||||
Is it ours? */
|
if (port != MACH_PORT_NULL && /* Do we have a ctty? */
|
||||||
struct hurd_port *const id = &_hurd_ports[INIT_PORT_CTTYID];
|
! __term_getctty (dport, &cttyid)) /* Could this be it? */
|
||||||
__spin_lock (&id->lock);
|
{
|
||||||
if (id->port == MACH_PORT_NULL)
|
__mach_port_deallocate (__mach_task_self (), cttyid);
|
||||||
/* We have no controlling tty, so make this one it. */
|
/* This port is capable of being a controlling tty.
|
||||||
_hurd_port_locked_set (id, cttyid);
|
Is it ours? */
|
||||||
else
|
if (cttyid == port)
|
||||||
{
|
__term_open_ctty (dport, _hurd_pid, _hurd_pgrp, &ctty);
|
||||||
if (cttyid != id->port)
|
/* XXX if this port is our ctty, but we are not doing
|
||||||
/* We have a controlling tty and this is not it. */
|
ctty style i/o because term_become_ctty barfed,
|
||||||
is_ctty = 0;
|
what to do? */
|
||||||
/* Either we don't want CTTYID, or ID->port already is it.
|
}
|
||||||
So we don't need to change ID->port, and we can release
|
0;
|
||||||
the reference to CTTYID. */
|
}));
|
||||||
__spin_unlock (&id->lock);
|
|
||||||
__mach_port_deallocate (__mach_task_self (), cttyid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!is_ctty || __term_open_ctty (port, _hurd_pid, _hurd_pgrp, &ctty) != 0)
|
|
||||||
/* XXX if IS_CTTY, then this port is our ctty, but we are
|
|
||||||
not doing ctty style i/o because term_become_ctty barfed.
|
|
||||||
What to do? */
|
|
||||||
/* No ctty magic happening here. */
|
|
||||||
ctty = MACH_PORT_NULL;
|
|
||||||
|
|
||||||
/* Install PORT in the descriptor cell, leaving it locked. */
|
/* Install PORT in the descriptor cell, leaving it locked. */
|
||||||
{
|
{
|
||||||
mach_port_t old
|
mach_port_t old
|
||||||
= _hurd_userlink_clear (&d->port.users) ? d->port.port : MACH_PORT_NULL;
|
= _hurd_userlink_clear (&d->port.users) ? d->port.port : MACH_PORT_NULL;
|
||||||
d->port.port = port;
|
d->port.port = dport;
|
||||||
d->flags = 0;
|
d->flags = 0;
|
||||||
if (old != MACH_PORT_NULL)
|
if (old != MACH_PORT_NULL)
|
||||||
__mach_port_deallocate (__mach_task_self (), old);
|
__mach_port_deallocate (__mach_task_self (), old);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1993,94,95,97,99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,38 +20,51 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <hurd.h>
|
#include <hurd.h>
|
||||||
#include <hurd/port.h>
|
#include <hurd/port.h>
|
||||||
|
#include <hurd/fd.h>
|
||||||
|
|
||||||
/* Create a new session with the calling process as its leader.
|
/* Create a new session with the calling process as its leader.
|
||||||
The process group IDs of the session and the calling process
|
The process group IDs of the session and the calling process
|
||||||
are set to the process ID of the calling process, which is returned. */
|
are set to the process ID of the calling process, which is returned. */
|
||||||
int
|
pid_t
|
||||||
__setsid ()
|
__setsid (void)
|
||||||
{
|
{
|
||||||
error_t err;
|
error_t err;
|
||||||
unsigned int stamp;
|
unsigned int stamp;
|
||||||
|
|
||||||
|
HURD_CRITICAL_BEGIN;
|
||||||
|
__mutex_lock (&_hurd_dtable_lock);
|
||||||
|
|
||||||
stamp = _hurd_pids_changed_stamp; /* Atomic fetch. */
|
stamp = _hurd_pids_changed_stamp; /* Atomic fetch. */
|
||||||
|
|
||||||
/* Tell the proc server we want to start a new session. */
|
/* Tell the proc server we want to start a new session. */
|
||||||
if (err = __USEPORT (PROC, __proc_setsid (port)))
|
err = __USEPORT (PROC, __proc_setsid (port));
|
||||||
return __hurd_fail (err);
|
if (!err)
|
||||||
|
/* Punt our current ctty. We hold the dtable lock from before the
|
||||||
|
proc_setsid call through clearing the cttyid port so that we can be
|
||||||
|
sure that it's been cleared by the time the signal thread attempts
|
||||||
|
to re-ctty the dtable in response to the pgrp change notification. */
|
||||||
|
_hurd_port_set (&_hurd_ports[INIT_PORT_CTTYID], MACH_PORT_NULL);
|
||||||
|
|
||||||
/* Punt our current ctty. */
|
__mutex_unlock (&_hurd_dtable_lock);
|
||||||
_hurd_setcttyid (MACH_PORT_NULL);
|
|
||||||
|
|
||||||
/* Synchronize with the signal thread to make sure we have
|
if (!err)
|
||||||
received and processed proc_newids before returning to the user. */
|
/* Synchronize with the signal thread to make sure we have
|
||||||
while (_hurd_pids_changed_stamp == stamp)
|
received and processed proc_newids before returning to the user.
|
||||||
{
|
This both updates _hurd_pgrp, and
|
||||||
|
*/
|
||||||
|
while (_hurd_pids_changed_stamp == stamp)
|
||||||
|
{
|
||||||
#ifdef noteven
|
#ifdef noteven
|
||||||
/* XXX we have no need for a mutex, but cthreads demands one. */
|
/* XXX we have no need for a mutex, but cthreads demands one. */
|
||||||
__condition_wait (&_hurd_pids_changed_sync, NULL);
|
__condition_wait (&_hurd_pids_changed_sync, NULL);
|
||||||
#else
|
#else
|
||||||
__swtch_pri(0);
|
__swtch_pri (0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
HURD_CRITICAL_END;
|
||||||
|
|
||||||
|
return err ? __hurd_fail (err) : _hurd_pgrp;
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__setsid, setsid)
|
weak_alias (__setsid, setsid)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
/* Copyright (C) 1993,94,95,96,97,98,99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -35,8 +35,21 @@ __wait4 (pid_t pid, __WAIT_STATUS_DEFN stat_loc, int options,
|
|||||||
err = __USEPORT (PROC, __proc_wait (port, pid, options,
|
err = __USEPORT (PROC, __proc_wait (port, pid, options,
|
||||||
stat_loc ?: &dummy, &sigcode,
|
stat_loc ?: &dummy, &sigcode,
|
||||||
usage ?: &ignored, &dead));
|
usage ?: &ignored, &dead));
|
||||||
|
switch (err)
|
||||||
return err ? (pid_t) __hurd_fail (err) : dead;
|
{
|
||||||
|
case 0: /* Got a child. */
|
||||||
|
return dead;
|
||||||
|
case EAGAIN:
|
||||||
|
/* The RPC returns this error when the WNOHANG flag is set and no
|
||||||
|
selected children are dead (but some are living). In that
|
||||||
|
situation, our return value is zero. (The RPC can't return zero
|
||||||
|
for DEAD without also returning some garbage for the other out
|
||||||
|
parameters, so an error return is much more natural here. Hence
|
||||||
|
the difference between the RPC and the POSIX.1 interface. */
|
||||||
|
return (pid_t) 0;
|
||||||
|
default:
|
||||||
|
return (pid_t) __hurd_fail (err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__wait4, wait4)
|
weak_alias (__wait4, wait4)
|
||||||
|
Loading…
Reference in New Issue
Block a user