(root)/
glibc-2.38/
hurd/
port2fd.c
       1  /* Copyright (C) 1994-2023 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, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <hurd.h>
      19  #include <hurd/fd.h>
      20  #include <hurd/signal.h>
      21  #include <hurd/term.h>
      22  #include <fcntl.h>
      23  
      24  /* Store PORT in file descriptor D, doing appropriate ctty magic.
      25     FLAGS are as for `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful.
      26     D should be locked, and will not be unlocked.  */
      27  
      28  void
      29  _hurd_port2fd (struct hurd_fd *d, io_t dport, int flags)
      30  {
      31    mach_port_t cttyid;
      32    io_t ctty = MACH_PORT_NULL;
      33  
      34    if (!(flags & O_IGNORE_CTTY))
      35      __USEPORT (CTTYID,
      36  	       ({
      37  		 if (port != MACH_PORT_NULL /* Do we have a ctty? */
      38  		     && ! __term_getctty (dport, &cttyid))
      39  		   /* 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  }