(root)/
glibc-2.38/
hurd/
privports.c
       1  /* Copyright (C) 1993-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  
      20  /* The program might set these if it is the initial task
      21     bootstrapped by the microkernel.  */
      22  
      23  mach_port_t _hurd_host_priv, _hurd_device_master;
      24  
      25  
      26  kern_return_t
      27  __get_privileged_ports (mach_port_t *host_priv_ptr,
      28  			device_t *device_master_ptr)
      29  {
      30    if ((host_priv_ptr && _hurd_host_priv == MACH_PORT_NULL)
      31        || (device_master_ptr && _hurd_device_master == MACH_PORT_NULL))
      32      {
      33        error_t err;
      34  
      35        if (_hurd_ports)
      36  	/* We have gotten some initial ports, so perhaps
      37  	   we have a proc server to talk to.  */
      38  	err = __USEPORT (PROC, __proc_getprivports (port,
      39  						    &_hurd_host_priv,
      40  						    &_hurd_device_master));
      41        else
      42  	return MACH_SEND_INVALID_DEST;
      43  
      44        if (err)
      45  	return err;
      46      }
      47  
      48    if (host_priv_ptr)
      49      {
      50        error_t err = _hurd_host_priv == MACH_PORT_NULL ? 0
      51  	: __mach_port_mod_refs (mach_task_self (),
      52  				_hurd_host_priv, MACH_PORT_RIGHT_SEND, +1);
      53        if (err)
      54  	return err;
      55        *host_priv_ptr = _hurd_host_priv;
      56      }
      57  
      58    if (device_master_ptr)
      59      {
      60        error_t err = _hurd_device_master == MACH_PORT_NULL ? 0
      61  	: __mach_port_mod_refs (mach_task_self (),
      62  				_hurd_device_master, MACH_PORT_RIGHT_SEND, +1);
      63        if (err)
      64  	return err;
      65        *device_master_ptr = _hurd_device_master;
      66      }
      67  
      68    return KERN_SUCCESS;
      69  }
      70  weak_alias (__get_privileged_ports, get_privileged_ports)