
1: /* Copyright (C) 1994, 1997, 1999, 2007 Free Software Foundation, Inc. 2: This file is part of the GNU C Library. 3: 4: The GNU C Library is free software; you can redistribute it and/or 5: modify it under the terms of the GNU Lesser General Public 6: License as published by the Free Software Foundation; either 7: version 2.1 of the License, or (at your option) any later version. 8: 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: Lesser General Public License for more details. 13: 14: You should have received a copy of the GNU Lesser General Public 15: License along with the GNU C Library; if not, write to the Free 16: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17: 02111-1307 USA. */ 18: 19: #include <hurd.h> 20: #include <hurd/fd.h> 21: #include <hurd/signal.h> 22: #include <hurd/term.h> 23: #include <fcntl.h> 24: 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. */ 28: 29: void 30: _hurd_port2fd (struct hurd_fd *d, io_t dport, int flags) 31: { 32: mach_port_t cttyid; 33: io_t ctty = MACH_PORT_NULL; 34: 35: if (!(flags & O_IGNORE_CTTY)) 36: __USEPORT (CTTYID, 37: ({ 38: if (port != MACH_PORT_NULL && /* Do we have a ctty? */ 39: ! __term_getctty (dport, &cttyid)) /* Could this be it? */ 40: { 41: __mach_port_deallocate (__mach_task_self (), cttyid); 42: /* This port is capable of being a controlling tty. 43: Is it ours? */ 44: if (cttyid == port) 45: __term_open_ctty (dport, _hurd_pid, _hurd_pgrp, &ctty); 46: /* XXX if this port is our ctty, but we are not doing 47: ctty style i/o because term_become_ctty barfed, 48: what to do? */ 49: } 50: 0; 51: })); 52: 53: /* Install PORT in the descriptor cell, leaving it locked. */ 54: { 55: mach_port_t old 56: = _hurd_userlink_clear (&d->port.users) ? d->port.port : MACH_PORT_NULL; 57: d->port.port = dport; 58: d->flags = (flags & O_CLOEXEC) ? FD_CLOEXEC : 0; 59: if (old != MACH_PORT_NULL) 60: __mach_port_deallocate (__mach_task_self (), old); 61: } 62: 63: _hurd_port_set (&d->ctty, ctty); 64: }