From: GNU Libc Maintainers Date: Sat, 27 Aug 2022 11:38:11 +0000 (+0100) Subject: git-get_dtable X-Git-Tag: archive/raspbian/2.34-7+rpi1~1^2~85 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e6d62359370103f2326cb2cb615a66a38c32cceb;p=glibc.git git-get_dtable Committed for 2.35 commit a51faeee6ae68da63e65eb0a1eb6c9ec2ce2148b Author: Samuel Thibault Date: Sun Jan 2 02:22:13 2022 +0100 hurd: Implement _S_msg_get_dtable This will be needed for implementing lsof. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name git-get_dtable.diff --- diff --git a/hurd/hurdmsg.c b/hurd/hurdmsg.c index de2ce7f7a..f526ace3c 100644 --- a/hurd/hurdmsg.c +++ b/hurd/hurdmsg.c @@ -385,15 +385,58 @@ _S_msg_set_environment (mach_port_t msgport, mach_port_t auth, } -/* XXX */ - kern_return_t _S_msg_get_dtable (mach_port_t process, - mach_port_t refport, + mach_port_t auth, portarray_t *dtable, mach_msg_type_name_t *dtablePoly, mach_msg_type_number_t *dtableCnt) -{ return EOPNOTSUPP; } +{ + mach_port_t *ports; + mach_msg_type_number_t i; + error_t err; + + AUTHCHECK; + + HURD_CRITICAL_BEGIN; + __mutex_lock (&_hurd_dtable_lock); + + if (err = __vm_allocate (__mach_task_self (), (vm_address_t *) &ports, + _hurd_dtablesize * sizeof(mach_port_t), 1)) + goto out; + + for (i = 0; i < _hurd_dtablesize; i++) + { + struct hurd_fd *cell = _hurd_dtable[i]; + if (cell == NULL) + ports[i] = MACH_PORT_NULL; + else + { + __spin_lock (&cell->port.lock); + if (cell->port.port == MACH_PORT_NULL) + ports[i] = MACH_PORT_NULL; + else + { + ports[i] = cell->port.port; + /* We will move this send right. */ + __mach_port_mod_refs (__mach_task_self (), ports[i], + MACH_PORT_RIGHT_SEND, +1); + } + __spin_unlock (&cell->port.lock); + } + } + + *dtable = ports; + *dtablePoly = MACH_MSG_TYPE_MOVE_SEND; + *dtableCnt = _hurd_dtablesize; + +out: + __mutex_unlock (&_hurd_dtable_lock); + HURD_CRITICAL_END; + return err; +} + +/* XXX */ kern_return_t _S_msg_set_dtable (mach_port_t process,