
1: /* Copyright (C) 1994, 1997 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: 22: /* Allocate a new file descriptor and install PORT in it. FLAGS are as for 23: `open'; only O_IGNORE_CTTY is meaningful. 24: 25: If the descriptor table is full, set errno, and return -1. 26: If DEALLOC is nonzero, deallocate PORT first. */ 27: int 28: _hurd_intern_fd (io_t port, int flags, int dealloc) 29: { 30: int fd; 31: struct hurd_fd *d; 32: 33: HURD_CRITICAL_BEGIN; 34: d = _hurd_alloc_fd (&fd, 0); 35: if (d != NULL) 36: { 37: _hurd_port2fd (d, port, flags); 38: __spin_unlock (&d->port.lock); 39: } 40: HURD_CRITICAL_END; 41: 42: if (d == NULL) 43: { 44: if (dealloc) 45: __mach_port_deallocate (__mach_task_self (), port); 46: return -1; 47: } 48: 49: return fd; 50: }