privports.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* Copyright (C) 1993-2026 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3. The GNU C Library is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Lesser General Public
  5. License as published by the Free Software Foundation; either
  6. version 2.1 of the License, or (at your option) any later version.
  7. The GNU C Library is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public
  12. License along with the GNU C Library; if not, see
  13. <https://www.gnu.org/licenses/>. */
  14. #include <hurd.h>
  15. /* The program might set these if it is the initial task
  16. bootstrapped by the microkernel. */
  17. mach_port_t _hurd_host_priv, _hurd_device_master;
  18. kern_return_t
  19. __get_privileged_ports (mach_port_t *host_priv_ptr,
  20. device_t *device_master_ptr)
  21. {
  22. if ((host_priv_ptr && _hurd_host_priv == MACH_PORT_NULL)
  23. || (device_master_ptr && _hurd_device_master == MACH_PORT_NULL))
  24. {
  25. error_t err;
  26. if (_hurd_ports)
  27. /* We have gotten some initial ports, so perhaps
  28. we have a proc server to talk to. */
  29. err = __USEPORT (PROC, __proc_getprivports (port,
  30. &_hurd_host_priv,
  31. &_hurd_device_master));
  32. else
  33. return MACH_SEND_INVALID_DEST;
  34. if (err)
  35. return err;
  36. }
  37. if (host_priv_ptr)
  38. {
  39. error_t err = _hurd_host_priv == MACH_PORT_NULL ? 0
  40. : __mach_port_mod_refs (mach_task_self (),
  41. _hurd_host_priv, MACH_PORT_RIGHT_SEND, +1);
  42. if (err)
  43. return err;
  44. *host_priv_ptr = _hurd_host_priv;
  45. }
  46. if (device_master_ptr)
  47. {
  48. error_t err = _hurd_device_master == MACH_PORT_NULL ? 0
  49. : __mach_port_mod_refs (mach_task_self (),
  50. _hurd_device_master, MACH_PORT_RIGHT_SEND, +1);
  51. if (err)
  52. return err;
  53. *device_master_ptr = _hurd_device_master;
  54. }
  55. return KERN_SUCCESS;
  56. }
  57. weak_alias (__get_privileged_ports, get_privileged_ports)