1 /* Copyright (C) 1994 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA. */
21 #include <hurd/signal.h>
22 #include <hurd/term.h>
25 /* Store PORT in file descriptor D, doing appropriate ctty magic.
26 FLAGS are as for `open'; only O_IGNORE_CTTY is meaningful.
27 D should be locked, and will not be unlocked. */
30 _hurd_port2fd (struct hurd_fd
*d
, io_t port
, int flags
)
34 int is_ctty
= !(flags
& O_IGNORE_CTTY
) && ! __term_getctty (port
, &cttyid
);
38 /* This port is capable of being a controlling tty.
40 struct hurd_port
*const id
= &_hurd_ports
[INIT_PORT_CTTYID
];
41 __spin_lock (&id
->lock
);
42 if (id
->port
== MACH_PORT_NULL
)
43 /* We have no controlling tty, so make this one it. */
44 _hurd_port_locked_set (id
, cttyid
);
47 if (cttyid
!= id
->port
)
48 /* We have a controlling tty and this is not it. */
50 /* Either we don't want CTTYID, or ID->port already is it.
51 So we don't need to change ID->port, and we can release
52 the reference to CTTYID. */
53 __spin_unlock (&id
->lock
);
54 __mach_port_deallocate (__mach_task_self (), cttyid
);
58 if (!is_ctty
|| __term_open_ctty (port
, _hurd_pid
, _hurd_pgrp
, &ctty
) != 0)
59 /* XXX if IS_CTTY, then this port is our ctty, but we are
60 not doing ctty style i/o because term_become_ctty barfed.
62 /* No ctty magic happening here. */
63 ctty
= MACH_PORT_NULL
;
65 /* Install PORT in the descriptor cell, leaving it locked. */
68 = _hurd_userlink_clear (&d
->port
.users
) ? d
->port
.port
: MACH_PORT_NULL
;
70 if (old
!= MACH_PORT_NULL
)
71 __mach_port_deallocate (__mach_task_self (), old
);
74 _hurd_port_set (&d
->ctty
, ctty
);