aboutsummaryrefslogtreecommitdiff
path: root/hurd
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2017-06-08 15:39:03 -0400
committerZack Weinberg <zackw@panix.com>2017-06-08 15:39:03 -0400
commit5046dbb4a7eba5eccfd258f92f4735c9ffc8d069 (patch)
tree4470480d904b65cf14ca524f96f79eca818c3eaf /hurd
parent199fc19d3aaaf57944ef036e15904febe877fc93 (diff)
downloadglibc-5046dbb4a7eba5eccfd258f92f4735c9ffc8d069.tar
glibc-5046dbb4a7eba5eccfd258f92f4735c9ffc8d069.tar.gz
glibc-5046dbb4a7eba5eccfd258f92f4735c9ffc8d069.tar.bz2
glibc-5046dbb4a7eba5eccfd258f92f4735c9ffc8d069.zip
Prepare for radical source tree reorganization.zack/build-layout-experiment
All top-level files and directories are moved into a temporary storage directory, REORG.TODO, except for files that will certainly still exist in their current form at top level when we're done (COPYING, COPYING.LIB, LICENSES, NEWS, README), all old ChangeLog files (which are moved to the new directory OldChangeLogs, instead), and the generated file INSTALL (which is just deleted; in the new order, there will be no generated files checked into version control).
Diffstat (limited to 'hurd')
-rw-r--r--hurd/Depend9
-rw-r--r--hurd/Makefile98
-rw-r--r--hurd/Notes37
-rw-r--r--hurd/Versions144
-rw-r--r--hurd/alloc-fd.c140
-rw-r--r--hurd/catch-exc.c131
-rw-r--r--hurd/catch-signal.c167
-rw-r--r--hurd/compat-20.c37
-rw-r--r--hurd/ctty-input.c79
-rw-r--r--hurd/ctty-output.c84
-rw-r--r--hurd/dtable.c304
-rw-r--r--hurd/exc2signal.c70
-rw-r--r--hurd/faultexc.defs5
-rw-r--r--hurd/fchroot.c49
-rw-r--r--hurd/fd-close.c45
-rw-r--r--hurd/fd-read.c54
-rw-r--r--hurd/fd-write.c42
-rw-r--r--hurd/fopenport.c132
-rw-r--r--hurd/get-host.c92
-rw-r--r--hurd/getdport.c58
-rw-r--r--hurd/geteuids.c68
-rw-r--r--hurd/getumask.c24
-rw-r--r--hurd/hurd-raise.c50
-rw-r--r--hurd/hurd.h345
-rw-r--r--hurd/hurd/fd.h275
-rw-r--r--hurd/hurd/id.h54
-rw-r--r--hurd/hurd/ioctl.h81
-rw-r--r--hurd/hurd/lookup.h190
-rw-r--r--hurd/hurd/port.h158
-rw-r--r--hurd/hurd/resource.h51
-rw-r--r--hurd/hurd/signal.h364
-rw-r--r--hurd/hurd/sigpreempt.h102
-rw-r--r--hurd/hurd/threadvar.h116
-rw-r--r--hurd/hurd/userlink.h147
-rw-r--r--hurd/hurd/xattr.h34
-rw-r--r--hurd/hurdauth.c236
-rw-r--r--hurd/hurdchdir.c59
-rw-r--r--hurd/hurdexec.c403
-rw-r--r--hurd/hurdfault.c237
-rw-r--r--hurd/hurdfault.h50
-rw-r--r--hurd/hurdfchdir.c58
-rw-r--r--hurd/hurdhost.h27
-rw-r--r--hurd/hurdid.c90
-rw-r--r--hurd/hurdinit.c225
-rw-r--r--hurd/hurdioctl.c331
-rw-r--r--hurd/hurdkill.c92
-rw-r--r--hurd/hurdlookup.c281
-rw-r--r--hurd/hurdmalloc.c449
-rw-r--r--hurd/hurdmalloc.h21
-rw-r--r--hurd/hurdmsg.c419
-rw-r--r--hurd/hurdpid.c71
-rw-r--r--hurd/hurdports.c51
-rw-r--r--hurd/hurdprio.c88
-rw-r--r--hurd/hurdrlimit.c58
-rw-r--r--hurd/hurdselect.c491
-rw-r--r--hurd/hurdsig.c1405
-rw-r--r--hurd/hurdsock.c120
-rw-r--r--hurd/hurdsocket.h30
-rw-r--r--hurd/hurdstartup.c194
-rw-r--r--hurd/hurdstartup.h63
-rw-r--r--hurd/intern-fd.c49
-rw-r--r--hurd/intr-msg.c424
-rw-r--r--hurd/intr-rpc.defs22
-rw-r--r--hurd/intr-rpc.h24
-rw-r--r--hurd/longjmp-ts.c31
-rw-r--r--hurd/lookup-at.c115
-rw-r--r--hurd/lookup-retry.c331
-rw-r--r--hurd/msgportdemux.c68
-rw-r--r--hurd/new-fd.c41
-rw-r--r--hurd/openport.c28
-rw-r--r--hurd/path-lookup.c122
-rw-r--r--hurd/pid2task.c31
-rw-r--r--hurd/port-cleanup.c30
-rw-r--r--hurd/port2fd.c63
-rw-r--r--hurd/ports-get.c45
-rw-r--r--hurd/ports-set.c56
-rw-r--r--hurd/preempt-sig.c67
-rw-r--r--hurd/privports.c70
-rw-r--r--hurd/report-wait.c243
-rw-r--r--hurd/set-host.c49
-rw-r--r--hurd/setauth.c122
-rw-r--r--hurd/seteuids.c58
-rw-r--r--hurd/siginfo.c26
-rw-r--r--hurd/sigunwind.c149
-rw-r--r--hurd/task2pid.c29
-rw-r--r--hurd/thread-cancel.c100
-rw-r--r--hurd/thread-self.c25
-rw-r--r--hurd/trampoline.c36
-rw-r--r--hurd/vpprintf.c59
-rw-r--r--hurd/xattr.c200
90 files changed, 0 insertions, 12098 deletions
diff --git a/hurd/Depend b/hurd/Depend
deleted file mode 100644
index b108b245b8..0000000000
--- a/hurd/Depend
+++ /dev/null
@@ -1,9 +0,0 @@
-# This file says that the mach subdirectory should appear before this one.
-# The mach and hurd subdirectories have many generated header files which
-# much of the rest of the library depends on, so it is best to build them
-# first (and mach before hurd, at that). The before-compile additions in
-# sysdeps/{mach,hurd}/Makefile should make it reliably work for these files
-# not to exist when making in other directories, but it will be slower that
-# way with more somewhat expensive `make' invocations.
-
-mach
diff --git a/hurd/Makefile b/hurd/Makefile
deleted file mode 100644
index 9205822b24..0000000000
--- a/hurd/Makefile
+++ /dev/null
@@ -1,98 +0,0 @@
-# Copyright (C) 1991-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-subdir := hurd
-
-include ../Makeconfig
-
-headers = hurd.h $(interface-headers) \
- $(addprefix hurd/,fd.h id.h port.h signal.h sigpreempt.h ioctl.h\
- userlink.h resource.h threadvar.h lookup.h)
-
-inline-headers = hurd.h $(addprefix hurd/,fd.h signal.h \
- userlink.h threadvar.h port.h)
-
-# The RPC interfaces go in a separate library.
-interface-library := libhurduser
-user-interfaces := $(addprefix hurd/,\
- auth startup \
- process process_request \
- msg msg_reply msg_request \
- exec exec_startup crash interrupt \
- fs fsys io term tioctl socket ifsock \
- login password pfinet \
- )
-server-interfaces := hurd/msg faultexc
-
-routines = hurdstartup hurdinit \
- hurdid hurdpid hurdrlimit hurdprio hurdexec hurdselect \
- hurdlookup lookup-retry lookup-at \
- get-host set-host \
- path-lookup \
- setauth \
- pid2task task2pid \
- geteuids seteuids getumask fchroot \
- hurdsock hurdauth \
- hurdchdir hurdfchdir \
- privports \
- msgportdemux \
- fopenport \
- vpprintf \
- ports-get ports-set hurdports hurdmsg \
- errno-loc \
- $(sig) $(dtable) $(inlines) port-cleanup report-wait xattr
-sig = hurdsig hurdfault siginfo hurd-raise preempt-sig \
- trampoline longjmp-ts catch-exc exc2signal hurdkill sigunwind \
- thread-self thread-cancel intr-msg catch-signal
-dtable = dtable port2fd new-fd alloc-fd intern-fd \
- getdport openport \
- fd-close fd-read fd-write hurdioctl ctty-input ctty-output
-inlines = $(inline-headers:%.h=%-inlines)
-
-# XXX this is a temporary hack; see hurdmalloc.h
-routines += hurdmalloc
-
-# Binary compatibility for libc.so.0.2[GLIBC_2.0].
-ifeq ($(build-shared),yes)
-routines += compat-20
-endif
-
-shared-only-routines = compat-20
-
-# For each of the $(inline-headers), generate a trivial source
-# file that will #include it to define its inline functions as real functions.
-$(inlines:%=$(objpfx)%.c): $(objpfx)%-inlines.c: %.h
- (h="`echo $(subst /,_,$*) | tr '[a-z]' '[A-Z]'`"; \
- echo "#define _$${h}_H_EXTERN_INLINE /* Define real function. */"; \
- echo '#include "$<"') > $@-new
- mv -f $@-new $@
-generated += $(inlines:=.c)
-
-include ../mach/Machrules
-include ../Rules
-
-# intr-rpc.defs defines the INTR_INTERFACE macro to make the generated RPC
-# stubs import <hurd/signal.h> and #define __mach_msg to
-# _hurd_intr_rpc_mach_msg.
-user-MIGFLAGS += -imacros intr-rpc.defs
-
-# The special exc server for sigthread faults uses a special prefix.
-MIGFLAGS-faultexc = -prefix _hurdsig_fault_
-
-# We need this static dependency to get faultexc.h generated the first time.
-$(objpfx)hurdfault.o $(objpfx)hurdfault.d: \
- $(objpfx)faultexc_server.h $(objpfx)faultexc_server.c
diff --git a/hurd/Notes b/hurd/Notes
deleted file mode 100644
index 9052f29096..0000000000
--- a/hurd/Notes
+++ /dev/null
@@ -1,37 +0,0 @@
-The library pays attention to some envariables:
-
-CORESERVER -- Name of core server naming point; falls back to /servers/core
-COREFILE -- Name of file to write core dump in; falls back to core
-GNUTARGET -- Passed to core server to specify flavor of core dump format
-
-New functions:
-
-int openport (io_t port);
-FILE *fopenport (mach_port_t, const char *mode);
-file_t getdport (int fd);
-
-task_t pid2task (pid_t);
-pid_t task2pid (task_t);
-
-int fchroot (int fd);
-mode_t getumask (void);
-
-int getuids (int n, uid_t *uidset);
-
-error_t hurd_path_lookup (file_t root, file_t cwd,
- const char *path, int flags, mode_t mode,
- file_t *port);
-error_t hurd_path_split (file_t root, file_t cwd,
- const char *path,
- file_t *dir, char **name);
-file_t path_lookup (const char *path, int flags, mode_t mode);
-file_t path_split (const char *path, char **name);
-
-process_t getproc (void);
-int setproc (process_t);
-file_t getcrdir (void);
-int setcrdir (file_t);
-file_t getcwdir (void);
-int setcwdir (file_t);
-auth_t getauth (void);
-int setauth (auth_t); /* Reauthenticates all library ports. */
diff --git a/hurd/Versions b/hurd/Versions
deleted file mode 100644
index 77f5b4271e..0000000000
--- a/hurd/Versions
+++ /dev/null
@@ -1,144 +0,0 @@
-libc {
- GLIBC_2.0 {
- # necessary for the Hurd brk implementation
- _end;
-
- # variables used in macros & inline functions
- __hurd_sigthread_stack_base; __hurd_sigthread_stack_end;
- __hurd_sigthread_variables;
- __hurd_threadvar_max;
- __hurd_threadvar_stack_mask; __hurd_threadvar_stack_offset;
-
- # functions used in macros & inline functions
- __hurd_errno_location;
-
- # functions used in libmachuser and libhurduser
- _S_catch_exception_raise;
- _S_catch_exception_raise_state;
- _S_catch_exception_raise_state_identity;
- _S_msg_add_auth; _S_msg_del_auth;
- _S_msg_describe_ports;
- _S_msg_get_dtable; _S_msg_set_dtable;
- _S_msg_get_env_variable; _S_msg_set_env_variable;
- _S_msg_get_environment; _S_msg_set_environment;
- _S_msg_get_fd; _S_msg_set_fd;
- _S_msg_get_init_int; _S_msg_set_init_int;
- _S_msg_get_init_ints; _S_msg_set_init_ints;
- _S_msg_get_init_port; _S_msg_set_init_port;
- _S_msg_get_init_ports; _S_msg_set_init_ports;
- _S_msg_proc_newids; _S_msg_report_wait;
- _S_msg_sig_post; _S_msg_sig_post_untraced;
- _hurd_intr_rpc_mach_msg;
- _hurdsig_fault_catch_exception_raise;
- _hurdsig_fault_catch_exception_raise_state;
- _hurdsig_fault_catch_exception_raise_state_identity;
-
- # "quasi-internal" variables
- _hurd_device_master;
- _hurd_dtable; _hurd_dtablesize; _hurd_dtable_lock;
- _hurd_host_priv;
- _hurd_msgport;
- _hurd_ports;
-
- # "quasi-internal" functions
- _hurd_canonicalize_directory_name_internal;
- _hurd_critical_section_lock;
- _hurd_critical_section_unlock;
- _hurd_exception2signal;
- _hurd_exec;
- _hurd_fd_get;
- _hurd_init;
- _hurd_intern_fd;
- _hurd_port_cleanup;
- _hurd_port_free;
- _hurd_port_get;
- _hurd_port_locked_get;
- _hurd_ports_use;
- _hurd_thread_sigstate;
-
- # functions in normal name space
-
- # f*
- file_name_lookup; file_name_lookup_under; file_name_path_lookup;
- file_name_split;
- fopenport;
-
- # g*
- get_privileged_ports;
- getauth; getcrdir; getcwdir; getcttyid; getdport; getproc; getumask;
-
- # h*
- hurd_catch_signal;
- hurd_check_cancel;
- hurd_file_name_lookup; hurd_file_name_lookup_retry;
- hurd_file_name_path_lookup; hurd_file_name_split;
- hurd_preempt_signals;
- hurd_safe_copyin; hurd_safe_copyout;
- hurd_safe_memmove; hurd_safe_memset;
- hurd_sig_post;
- hurd_thread_cancel; hurd_thread_self;
- hurd_unpreempt_signals;
-
- # o*
- openport;
-
- # p*
- pid2task;
-
- # s*
- setauth; setcrdir; setcwdir; setproc; setcttyid;
-
- # t*
- task2pid;
-
- # v*
- vpprintf;
- }
- GLIBC_2.1 {
- # "quasi-internal" functions
- _hurd_proc_init;
-
- # g*
- geteuids;
-
- # s*
- seteuids;
- }
- GLIBC_2.1.3 {
- # d*
- directory_name_split;
-
- # h*
- hurd_directory_name_split;
- }
- GLIBC_2.2.5 {
- # These always existed as inlines but the real functions were not exported.
- __hurd_fail;
- _hurd_self_sigstate;
-
- # Same for these "quasi-internal" functions
- _hurd_port_init;
- _hurd_port_set;
-
- # internal symbols used by other libraries (e.g. librt)
- _hurd_raise_signal;
- _hurdsig_interrupt_timeout;
- _hurdsig_fault_preemptor; _hurdsig_fault_env;
- }
- GLIBC_2.2.6 {
- # functions used in macros & inline functions
- __errno_location;
- }
-
- HURD_CTHREADS_0.3 {
- # weak refs to libthreads functions that libc calls iff libthreads in use
- cthread_fork; cthread_detach;
-
- # variables used for detecting cthreads
- _cthread_exit_routine; _cthread_init_routine;
-
- # cthreads functions with stubs in libc
- cthread_keycreate; cthread_getspecific; cthread_setspecific;
- __libc_getspecific;
- }
-}
diff --git a/hurd/alloc-fd.c b/hurd/alloc-fd.c
deleted file mode 100644
index 18e542ce5f..0000000000
--- a/hurd/alloc-fd.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/resource.h>
-#include <stdlib.h>
-#include "hurdmalloc.h" /* XXX */
-
-/* Allocate a new file descriptor and return it, locked. The new
- descriptor number will be no less than FIRST_FD. If the table is full,
- set errno to EMFILE and return NULL. If FIRST_FD is negative or bigger
- than the size of the table, set errno to EINVAL and return NULL. */
-
-struct hurd_fd *
-_hurd_alloc_fd (int *fd, int first_fd)
-{
- int i;
- void *crit;
- long int rlimit;
-
- if (first_fd < 0)
- {
- errno = EINVAL;
- return NULL;
- }
-
- crit = _hurd_critical_section_lock ();
-
- __mutex_lock (&_hurd_dtable_lock);
-
- search:
- for (i = first_fd; i < _hurd_dtablesize; ++i)
- {
- struct hurd_fd *d = _hurd_dtable[i];
- if (d == NULL)
- {
- /* Allocate a new descriptor structure for this slot,
- initializing its port cells to nil. The test below will catch
- and return this descriptor cell after locking it. */
- d = _hurd_new_fd (MACH_PORT_NULL, MACH_PORT_NULL);
- if (d == NULL)
- {
- __mutex_unlock (&_hurd_dtable_lock);
- _hurd_critical_section_unlock (crit);
- return NULL;
- }
- _hurd_dtable[i] = d;
- }
-
- __spin_lock (&d->port.lock);
- if (d->port.port == MACH_PORT_NULL)
- {
- __mutex_unlock (&_hurd_dtable_lock);
- _hurd_critical_section_unlock (crit);
- if (fd != NULL)
- *fd = i;
- return d;
- }
- else
- __spin_unlock (&d->port.lock);
- }
-
- __mutex_lock (&_hurd_rlimit_lock);
- rlimit = _hurd_rlimits[RLIMIT_OFILE].rlim_cur;
- __mutex_unlock (&_hurd_rlimit_lock);
-
- if (first_fd < rlimit)
- {
- /* The descriptor table is full. Check if we have reached the
- resource limit, or only the allocated size. */
- if (_hurd_dtablesize < rlimit)
- {
- /* Enlarge the table. */
- int save = errno;
- struct hurd_fd **new;
- /* Try to double the table size, but don't exceed the limit,
- and make sure it exceeds FIRST_FD. */
- int size = _hurd_dtablesize * 2;
- if (size > rlimit)
- size = rlimit;
- else if (size <= first_fd)
- size = first_fd + 1;
-
- if (size * sizeof (*_hurd_dtable) < size)
- {
- /* Integer overflow! */
- errno = ENOMEM;
- goto out;
- }
-
- /* If we fail to allocate that, decrement the desired size
- until we succeed in allocating it. */
- do
- new = realloc (_hurd_dtable, size * sizeof (*_hurd_dtable));
- while (new == NULL && size-- > first_fd);
-
- if (new != NULL)
- {
- /* We managed to allocate a new table. Now install it. */
- errno = save;
- if (first_fd < _hurd_dtablesize)
- first_fd = _hurd_dtablesize;
- /* Initialize the new slots. */
- for (i = _hurd_dtablesize; i < size; ++i)
- new[i] = NULL;
- _hurd_dtablesize = size;
- _hurd_dtable = new;
- /* Go back to the loop to initialize the first new slot. */
- goto search;
- }
- else
- errno = ENOMEM;
- }
- else
- errno = EMFILE;
- }
- else
- errno = EINVAL; /* Bogus FIRST_FD value. */
-
- out:
- __mutex_unlock (&_hurd_dtable_lock);
- _hurd_critical_section_unlock (crit);
-
- return NULL;
-}
diff --git a/hurd/catch-exc.c b/hurd/catch-exc.c
deleted file mode 100644
index 1a4fa95c9f..0000000000
--- a/hurd/catch-exc.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <mach/exc_server.h>
-#include <hurd/signal.h>
-#include <assert.h>
-
-/* Called by the microkernel when a thread gets an exception. */
-
-kern_return_t
-_S_catch_exception_raise (mach_port_t port,
- thread_t thread,
- task_t task,
-#ifdef EXC_MASK_ALL /* New interface flavor. */
- exception_type_t exception,
- exception_data_t code,
- mach_msg_type_number_t codeCnt
-#else /* Vanilla Mach 3.0 interface. */
- integer_t exception,
- integer_t code, integer_t subcode
-#endif
- )
-{
- struct hurd_sigstate *ss;
- int signo;
- struct hurd_signal_detail d;
-
- if (task != __mach_task_self ())
- /* The sender wasn't the kernel. */
- return EPERM;
-
- d.exc = exception;
-#ifdef EXC_MASK_ALL
- assert (codeCnt >= 2);
- d.exc_code = code[0];
- d.exc_subcode = code[1];
-#else
- d.exc_code = code;
- d.exc_subcode = subcode;
-#endif
-
- /* Call the machine-dependent function to translate the Mach exception
- codes into a signal number and subcode. */
- _hurd_exception2signal (&d, &signo);
-
- /* Find the sigstate structure for the faulting thread. */
- __mutex_lock (&_hurd_siglock);
- for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
- if (ss->thread == thread)
- break;
- __mutex_unlock (&_hurd_siglock);
- if (ss == NULL)
- ss = _hurd_thread_sigstate (thread); /* Allocate a fresh one. */
-
- if (__spin_lock_locked (&ss->lock))
- {
- /* Loser. The thread faulted with its sigstate lock held. Its
- sigstate data is now suspect. So we reset the parts of it which
- could cause trouble for the signal thread. Anything else
- clobbered therein will just hose this user thread, but it's
- faulting already.
-
- This is almost certainly a library bug: unless random memory
- clobberation caused the sigstate lock to gratuitously appear held,
- no code should do anything that can fault while holding the
- sigstate lock. */
-
- __spin_unlock (&ss->critical_section_lock);
- ss->context = NULL;
- __spin_unlock (&ss->lock);
- }
-
- /* Post the signal. */
- _hurd_internal_post_signal (ss, signo, &d,
- MACH_PORT_NULL, MACH_MSG_TYPE_PORT_SEND,
- 0);
-
- return KERN_SUCCESS;
-}
-
-#ifdef EXC_MASK_ALL
-/* XXX New interface flavor has additional RPCs that we could be using
- instead. These RPCs roll a thread_get_state/thread_set_state into
- the message, so the signal thread ought to use these to save some calls.
- */
-kern_return_t
-_S_catch_exception_raise_state (mach_port_t port,
- exception_type_t exception,
- exception_data_t code,
- mach_msg_type_number_t codeCnt,
- int *flavor,
- thread_state_t old_state,
- mach_msg_type_number_t old_stateCnt,
- thread_state_t new_state,
- mach_msg_type_number_t *new_stateCnt)
-{
- abort ();
- return KERN_FAILURE;
-}
-
-kern_return_t
-_S_catch_exception_raise_state_identity (mach_port_t exception_port,
- thread_t thread,
- task_t task,
- exception_type_t exception,
- exception_data_t code,
- mach_msg_type_number_t codeCnt,
- int *flavor,
- thread_state_t old_state,
- mach_msg_type_number_t old_stateCnt,
- thread_state_t new_state,
- mach_msg_type_number_t *new_stateCnt)
-{
- abort ();
- return KERN_FAILURE;
-}
-#endif
diff --git a/hurd/catch-signal.c b/hurd/catch-signal.c
deleted file mode 100644
index 1d606ecaf0..0000000000
--- a/hurd/catch-signal.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/* Convenience function to catch expected signals during an operation.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/signal.h>
-#include <hurd/sigpreempt.h>
-#include <string.h>
-#include <assert.h>
-
-error_t
-hurd_catch_signal (sigset_t sigset,
- unsigned long int first, unsigned long int last,
- error_t (*operate) (struct hurd_signal_preemptor *),
- sighandler_t handler)
-{
- /* We need to restore the signal mask, because otherwise the
- signal-handling code will have blocked the caught signal and for
- instance calling hurd_catch_signal again would then dump core. */
- sigjmp_buf buf;
- void throw (int signo, long int sigcode, struct sigcontext *scp)
- { siglongjmp (buf, scp->sc_error ?: EGRATUITOUS); }
-
- struct hurd_signal_preemptor preemptor =
- {
- sigset, first, last,
- NULL, handler == SIG_ERR ? (sighandler_t) &throw : handler,
- };
-
- struct hurd_sigstate *const ss = _hurd_self_sigstate ();
- error_t error;
-
- if (handler != SIG_ERR)
- /* Not our handler; don't bother saving state. */
- error = 0;
- else
- /* This returns again with nonzero value when we preempt a signal. */
- error = sigsetjmp (buf, 1);
-
- if (error == 0)
- {
- /* Install a signal preemptor for the thread. */
- __spin_lock (&ss->lock);
- preemptor.next = ss->preemptors;
- ss->preemptors = &preemptor;
- __spin_unlock (&ss->lock);
-
- /* Try the operation that might crash. */
- (*operate) (&preemptor);
- }
-
- /* Either FUNCTION completed happily and ERROR is still zero, or it hit
- an expected signal and `throw' made setjmp return the signal error
- code in ERROR. Now we can remove the preemptor and return. */
-
- __spin_lock (&ss->lock);
- assert (ss->preemptors == &preemptor);
- ss->preemptors = preemptor.next;
- __spin_unlock (&ss->lock);
-
- return error;
-}
-
-
-error_t
-hurd_safe_memset (void *dest, int byte, size_t nbytes)
-{
- error_t operate (struct hurd_signal_preemptor *preemptor)
- {
- memset (dest, byte, nbytes);
- return 0;
- }
- return hurd_catch_signal (sigmask (SIGBUS) | sigmask (SIGSEGV),
- (vm_address_t) dest, (vm_address_t) dest + nbytes,
- &operate, SIG_ERR);
-}
-
-
-error_t
-hurd_safe_copyout (void *dest, const void *src, size_t nbytes)
-{
- error_t operate (struct hurd_signal_preemptor *preemptor)
- {
- memcpy (dest, src, nbytes);
- return 0;
- }
- return hurd_catch_signal (sigmask (SIGBUS) | sigmask (SIGSEGV),
- (vm_address_t) dest, (vm_address_t) dest + nbytes,
- &operate, SIG_ERR);
-}
-
-error_t
-hurd_safe_copyin (void *dest, const void *src, size_t nbytes)
-{
- error_t operate (struct hurd_signal_preemptor *preemptor)
- {
- memcpy (dest, src, nbytes);
- return 0;
- }
- return hurd_catch_signal (sigmask (SIGBUS) | sigmask (SIGSEGV),
- (vm_address_t) src, (vm_address_t) src + nbytes,
- &operate, SIG_ERR);
-}
-
-error_t
-hurd_safe_memmove (void *dest, const void *src, size_t nbytes)
-{
- jmp_buf buf;
- void throw (int signo, long int sigcode, struct sigcontext *scp)
- { longjmp (buf, scp->sc_error ?: EGRATUITOUS); }
-
- struct hurd_signal_preemptor src_preemptor =
- {
- sigmask (SIGBUS) | sigmask (SIGSEGV),
- (vm_address_t) src, (vm_address_t) src + nbytes,
- NULL, (sighandler_t) &throw,
- };
- struct hurd_signal_preemptor dest_preemptor =
- {
- sigmask (SIGBUS) | sigmask (SIGSEGV),
- (vm_address_t) dest, (vm_address_t) dest + nbytes,
- NULL, (sighandler_t) &throw,
- &src_preemptor
- };
-
- struct hurd_sigstate *const ss = _hurd_self_sigstate ();
- error_t error;
-
- /* This returns again with nonzero value when we preempt a signal. */
- error = setjmp (buf);
-
- if (error == 0)
- {
- /* Install a signal preemptor for the thread. */
- __spin_lock (&ss->lock);
- src_preemptor.next = ss->preemptors;
- ss->preemptors = &dest_preemptor;
- __spin_unlock (&ss->lock);
-
- /* Do the copy; it might fault. */
- memmove (dest, src, nbytes);
- }
-
- /* Either memmove completed happily and ERROR is still zero, or it hit
- an expected signal and `throw' made setjmp return the signal error
- code in ERROR. Now we can remove the preemptor and return. */
-
- __spin_lock (&ss->lock);
- assert (ss->preemptors == &dest_preemptor);
- ss->preemptors = src_preemptor.next;
- __spin_unlock (&ss->lock);
-
- return error;
-}
diff --git a/hurd/compat-20.c b/hurd/compat-20.c
deleted file mode 100644
index 0fd1701b26..0000000000
--- a/hurd/compat-20.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Old-versioned functions for binary compatibility with glibc-2.0.
- Copyright (C) 1998-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-/* This file provides definitions for binary compatibility with
- the GLIBC_2.0 version set for the libc.so.0.2 soname.
-
- These definitions can be removed when the soname changes. */
-
-#include <shlib-compat.h>
-#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
-
-void
-attribute_compat_text_section
-_hurd_proc_init_compat_20 (char **argv)
-{
- _hurd_proc_init (argv, NULL, 0);
-}
-compat_symbol (libc, _hurd_proc_init_compat_20, _hurd_proc_init, GLIBC_2_0);
-
-#endif
diff --git a/hurd/ctty-input.c b/hurd/ctty-input.c
deleted file mode 100644
index 826d78bed8..0000000000
--- a/hurd/ctty-input.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* _hurd_ctty_input -- Do an input RPC and generate SIGTTIN if necessary.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-
-/* Call *RPC on PORT and/or CTTY. If a call on CTTY returns EBACKGROUND,
- generate SIGTTIN or EIO as appropriate. */
-
-error_t
-_hurd_ctty_input (io_t port, io_t ctty, error_t (*rpc) (io_t))
-{
- error_t err;
-
- if (ctty == MACH_PORT_NULL)
- return (*rpc) (port);
-
- do
- {
- err = (*rpc) (ctty);
- if (err == EBACKGROUND)
- {
- /* We are a background job and tried to read from the tty.
- We should probably get a SIGTTIN signal. */
- if (_hurd_orphaned)
- /* Our process group is orphaned. Don't stop; just fail. */
- err = EIO;
- else
- {
- struct hurd_sigstate *ss = _hurd_self_sigstate ();
- __spin_lock (&ss->lock);
- if (__sigismember (&ss->blocked, SIGTTIN) ||
- ss->actions[SIGTTIN].sa_handler == SIG_IGN)
- /* We are blocking or ignoring SIGTTIN. Just fail. */
- err = EIO;
- __spin_unlock (&ss->lock);
-
- if (err == EBACKGROUND)
- {
- /* Send a SIGTTIN signal to our process group.
-
- We must remember here not to clobber ERR, since
- the loop condition below uses it to recall that
- we should retry after a stop. */
-
- __USEPORT (CTTYID, _hurd_sig_post (0, SIGTTIN, port));
- /* XXX what to do if error here? */
-
- /* At this point we should have just run the handler for
- SIGTTIN or resumed after being stopped. Now this is
- still a "system call", so check to see if we should
- restart it. */
- __spin_lock (&ss->lock);
- if (!(ss->actions[SIGTTIN].sa_flags & SA_RESTART))
- err = EINTR;
- __spin_unlock (&ss->lock);
- }
- }
- }
- /* If the last RPC generated a SIGTTIN, loop to try it again. */
- } while (err == EBACKGROUND);
-
- return err;
-}
diff --git a/hurd/ctty-output.c b/hurd/ctty-output.c
deleted file mode 100644
index 357adb6563..0000000000
--- a/hurd/ctty-output.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* _hurd_ctty_output -- Do an output RPC and generate SIGTTOU if necessary.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-
-/* Call *RPC on PORT and/or CTTY. If a call on CTTY returns EBACKGROUND,
- generate SIGTTOU if appropriate. */
-
-error_t
-_hurd_ctty_output (io_t port, io_t ctty, error_t (*rpc) (io_t))
-{
- if (ctty == MACH_PORT_NULL)
- return (*rpc) (port);
- else
- {
- struct hurd_sigstate *ss = _hurd_self_sigstate ();
- error_t err;
-
- do
- {
- /* Don't use the ctty io port if we are blocking or ignoring
- SIGTTOU. We redo this check at the top of the loop in case
- the signal handler changed the state. */
- __spin_lock (&ss->lock);
- if (__sigismember (&ss->blocked, SIGTTOU) ||
- ss->actions[SIGTTOU].sa_handler == SIG_IGN)
- err = EIO;
- else
- err = 0;
- __spin_unlock (&ss->lock);
-
- if (err)
- return (*rpc) (port);
-
- err = (*rpc) (ctty);
- if (err == EBACKGROUND)
- {
- if (_hurd_orphaned)
- /* Our process group is orphaned, so we never generate a
- signal; we just fail. */
- err = EIO;
- else
- {
- /* Send a SIGTTOU signal to our process group.
-
- We must remember here not to clobber ERR, since
- the loop condition below uses it to recall that
- we should retry after a stop. */
-
- __USEPORT (CTTYID, _hurd_sig_post (0, SIGTTOU, port));
- /* XXX what to do if error here? */
-
- /* At this point we should have just run the handler for
- SIGTTOU or resumed after being stopped. Now this is
- still a "system call", so check to see if we should
- restart it. */
- __spin_lock (&ss->lock);
- if (!(ss->actions[SIGTTOU].sa_flags & SA_RESTART))
- err = EINTR;
- __spin_unlock (&ss->lock);
- }
- }
- /* If the last RPC generated a SIGTTOU, loop to try it again. */
- } while (err == EBACKGROUND);
-
- return err;
- }
-}
diff --git a/hurd/dtable.c b/hurd/dtable.c
deleted file mode 100644
index 46bad42c3c..0000000000
--- a/hurd/dtable.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/term.h>
-#include <hurd/fd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <cthreads.h> /* For `struct mutex'. */
-#include "set-hooks.h"
-#include "hurdmalloc.h" /* XXX */
-
-
-struct mutex _hurd_dtable_lock = MUTEX_INITIALIZER; /* XXX ld bug; must init */
-struct hurd_fd **_hurd_dtable;
-int _hurd_dtablesize;
-
-
-DEFINE_HOOK (_hurd_fd_subinit, (void));
-
-/* Initialize the file descriptor table at startup. */
-
-static void
-init_dtable (void)
-{
- int i;
-
- __mutex_init (&_hurd_dtable_lock);
-
- /* The initial size of the descriptor table is that of the passed-in
- table. It will be expanded as necessary up to _hurd_dtable_rlimit. */
- _hurd_dtablesize = _hurd_init_dtablesize;
-
- /* Allocate the vector of pointers. */
- _hurd_dtable = malloc (_hurd_dtablesize * sizeof (*_hurd_dtable));
- if (_hurd_dtablesize != 0 && _hurd_dtable == NULL)
- __libc_fatal ("hurd: Can't allocate file descriptor table\n");
-
- /* Initialize the descriptor table. */
- for (i = 0; (unsigned int) i < _hurd_init_dtablesize; ++i)
- {
- if (_hurd_init_dtable[i] == MACH_PORT_NULL)
- /* An unused descriptor is marked by a null pointer. */
- _hurd_dtable[i] = NULL;
- else
- {
- /* Allocate a new file descriptor structure. */
- struct hurd_fd *new = malloc (sizeof (struct hurd_fd));
- if (new == NULL)
- __libc_fatal ("hurd: Can't allocate initial file descriptors\n");
-
- /* Initialize the port cells. */
- _hurd_port_init (&new->port, MACH_PORT_NULL);
- _hurd_port_init (&new->ctty, MACH_PORT_NULL);
-
- /* Install the port in the descriptor.
- This sets up all the ctty magic. */
- _hurd_port2fd (new, _hurd_init_dtable[i], 0);
-
- _hurd_dtable[i] = new;
- }
- }
-
- /* Clear out the initial descriptor table.
- Everything must use _hurd_dtable now. */
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) _hurd_init_dtable,
- _hurd_init_dtablesize * sizeof (_hurd_init_dtable[0]));
- _hurd_init_dtable = NULL;
- _hurd_init_dtablesize = 0;
-
- /* Initialize the remaining empty slots in the table. */
- for (; i < _hurd_dtablesize; ++i)
- _hurd_dtable[i] = NULL;
-
- /* Run things that want to run after the file descriptor table
- is initialized. */
- RUN_HOOK (_hurd_fd_subinit, ());
-
- (void) &init_dtable; /* Avoid "defined but not used" warning. */
-}
-
-text_set_element (_hurd_subinit, init_dtable);
-
-/* XXX when the linker supports it, the following functions should all be
- elsewhere and just have text_set_elements here. */
-
-/* Called by `getdport' to do its work. */
-
-static file_t
-get_dtable_port (int fd)
-{
- struct hurd_fd *d = _hurd_fd_get (fd);
- file_t dport;
-
- if (!d)
- return __hurd_fail (EBADF), MACH_PORT_NULL;
-
- HURD_CRITICAL_BEGIN;
-
- dport = HURD_PORT_USE (&d->port,
- ({
- error_t err;
- mach_port_t outport;
- err = __mach_port_mod_refs (__mach_task_self (),
- port,
- MACH_PORT_RIGHT_SEND,
- 1);
- if (err)
- {
- errno = err;
- outport = MACH_PORT_NULL;
- }
- else
- outport = port;
- outport;
- }));
-
- HURD_CRITICAL_END;
-
- return dport;
-}
-
-file_t (*_hurd_getdport_fn) (int fd) = get_dtable_port;
-
-#include <hurd/signal.h>
-
-/* We are in the child fork; the dtable lock is still held.
- The parent has inserted send rights for all the normal io ports,
- but we must recover ctty-special ports for ourselves. */
-static error_t
-fork_child_dtable (void)
-{
- error_t err;
- int i;
-
- err = 0;
-
- for (i = 0; !err && i < _hurd_dtablesize; ++i)
- {
- struct hurd_fd *d = _hurd_dtable[i];
- if (d == NULL)
- continue;
-
- /* No other thread is using the send rights in the child task. */
- d->port.users = d->ctty.users = NULL;
-
- if (d->ctty.port != MACH_PORT_NULL)
- {
- /* There was a ctty-special port in the parent.
- We need to get one for ourselves too. */
- __mach_port_deallocate (__mach_task_self (), d->ctty.port);
- err = __term_open_ctty (d->port.port, _hurd_pid, _hurd_pgrp,
- &d->ctty.port);
- if (err)
- d->ctty.port = MACH_PORT_NULL;
- }
-
- /* XXX for each fd with a cntlmap, reauth and re-map_cntl. */
- }
- return err;
-
- (void) &fork_child_dtable; /* Avoid "defined but not used" warning. */
-}
-
-data_set_element (_hurd_fork_locks, _hurd_dtable_lock); /* XXX ld bug: bss */
-text_set_element (_hurd_fork_child_hook, fork_child_dtable);
-
-/* Called when our process group has changed. */
-
-static void
-ctty_new_pgrp (void)
-{
- int i;
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_dtable_lock);
-
- if (__USEPORT (CTTYID, port == MACH_PORT_NULL))
- {
- /* We have no controlling terminal. If we haven't had one recently,
- but our pgrp is being pointlessly diddled anyway, then we will
- have nothing to do in the loop below because no fd will have a
- ctty port at all.
-
- More likely, a setsid call is responsible both for the change
- in pgrp and for clearing the cttyid port. In that case, setsid
- held the dtable lock while updating the dtable to clear all the
- ctty ports, and ergo must have finished doing so before we run here.
- So we can be sure, again, that the loop below has no work to do. */
- }
- else
- for (i = 0; i < _hurd_dtablesize; ++i)
- {
- struct hurd_fd *const d = _hurd_dtable[i];
- struct hurd_userlink ulink, ctty_ulink;
- io_t port, ctty;
-
- if (d == NULL)
- /* Nothing to do for an unused descriptor cell. */
- continue;
-
- port = _hurd_port_get (&d->port, &ulink);
- ctty = _hurd_port_get (&d->ctty, &ctty_ulink);
-
- if (ctty != MACH_PORT_NULL)
- {
- /* This fd has a ctty-special port. We need a new one, to tell
- the io server of our different process group. */
- io_t new;
- if (__term_open_ctty (port, _hurd_pid, _hurd_pgrp, &new))
- new = MACH_PORT_NULL;
- _hurd_port_set (&d->ctty, new);
- }
-
- _hurd_port_free (&d->port, &ulink, port);
- _hurd_port_free (&d->ctty, &ctty_ulink, ctty);
- }
-
- __mutex_unlock (&_hurd_dtable_lock);
- HURD_CRITICAL_END;
-
- (void) &ctty_new_pgrp; /* Avoid "defined but not used" warning. */
-}
-
-text_set_element (_hurd_pgrp_changed_hook, ctty_new_pgrp);
-
-/* Called to reauthenticate the dtable when the auth port changes. */
-
-static void
-reauth_dtable (void)
-{
- int i;
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_dtable_lock);
-
- for (i = 0; i < _hurd_dtablesize; ++i)
- {
- struct hurd_fd *const d = _hurd_dtable[i];
- mach_port_t new, newctty, ref;
-
- if (d == NULL)
- /* Nothing to do for an unused descriptor cell. */
- continue;
-
- ref = __mach_reply_port ();
-
- /* Take the descriptor cell's lock. */
- __spin_lock (&d->port.lock);
-
- /* Reauthenticate the descriptor's port. */
- if (d->port.port != MACH_PORT_NULL &&
- ! __io_reauthenticate (d->port.port,
- ref, MACH_MSG_TYPE_MAKE_SEND) &&
- ! __USEPORT (AUTH, __auth_user_authenticate
- (port,
- ref, MACH_MSG_TYPE_MAKE_SEND,
- &new)))
- {
- /* Replace the port in the descriptor cell
- with the newly reauthenticated port. */
-
- if (d->ctty.port != MACH_PORT_NULL &&
- ! __io_reauthenticate (d->ctty.port,
- ref, MACH_MSG_TYPE_MAKE_SEND) &&
- ! __USEPORT (AUTH, __auth_user_authenticate
- (port,
- ref, MACH_MSG_TYPE_MAKE_SEND,
- &newctty)))
- _hurd_port_set (&d->ctty, newctty);
-
- _hurd_port_locked_set (&d->port, new);
- }
- else
- /* Lost. Leave this descriptor cell alone. */
- __spin_unlock (&d->port.lock);
-
- __mach_port_destroy (__mach_task_self (), ref);
- }
-
- __mutex_unlock (&_hurd_dtable_lock);
- HURD_CRITICAL_END;
-
- (void) &reauth_dtable; /* Avoid "defined but not used" warning. */
-}
-
-text_set_element (_hurd_reauth_hook, reauth_dtable);
diff --git a/hurd/exc2signal.c b/hurd/exc2signal.c
deleted file mode 100644
index 3b9df0cca8..0000000000
--- a/hurd/exc2signal.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Translate Mach exception codes into signal numbers. Stub version.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-
-/* This file must be modified with machine-dependent details. */
-#error "need to write sysdeps/mach/hurd/MACHINE/exc2signal.c"
-
-/* Translate the Mach exception codes, as received in an `exception_raise' RPC,
- into a signal number and signal subcode. */
-
-void
-_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
-{
- detail->error = 0;
-
- switch (detail->exc)
- {
- default:
- *signo = SIGIOT;
- detail->code = detail->exc;
- break;
-
- case EXC_BAD_ACCESS:
- if (detail->exc_code == KERN_PROTECTION_FAILURE)
- *signo = SIGSEGV;
- else
- *signo = SIGBUS;
- detail->code = detail->exc_subcode;
- detail->error = detail->exc_code;
- break;
-
- case EXC_BAD_INSTRUCTION:
- *signo = SIGILL;
- detail->code = 0;
- break;
-
- case EXC_ARITHMETIC:
- *signo = SIGFPE;
- detail->code = 0;
- break;
-
- case EXC_EMULATION:
- case EXC_SOFTWARE:
- *signo = SIGEMT;
- detail->code = 0;
- break;
-
- case EXC_BREAKPOINT:
- *signo = SIGTRAP;
- detail->code = 0;
- break;
- }
-}
diff --git a/hurd/faultexc.defs b/hurd/faultexc.defs
deleted file mode 100644
index fe7f02a4cc..0000000000
--- a/hurd/faultexc.defs
+++ /dev/null
@@ -1,5 +0,0 @@
-/* This file is processed by mig with -prefix _hurdsig_fault_
- to create the special exception server used for signal thread
- fault recovery. */
-
-#include <mach/exc.defs>
diff --git a/hurd/fchroot.c b/hurd/fchroot.c
deleted file mode 100644
index 877a3e9ea6..0000000000
--- a/hurd/fchroot.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <unistd.h>
-
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/port.h>
-
-/* Change the current root directory to FD. */
-int
-fchroot (int fd)
-{
- error_t err;
- file_t dir;
-
- err = HURD_DPORT_USE (fd,
- ({
- dir = __file_name_lookup_under (port, ".", 0, 0);
- dir == MACH_PORT_NULL ? errno : 0;
- }));
-
- if (! err)
- {
- file_t root;
-
- /* Prevent going through DIR's .. */
- err = __file_reparent (dir, MACH_PORT_NULL, &root);
- __mach_port_deallocate (__mach_task_self (), dir);
- if (! err)
- _hurd_port_set (&_hurd_ports[INIT_PORT_CRDIR], root);
- }
-
- return err ? __hurd_fail (err) : 0;
-}
diff --git a/hurd/fd-close.c b/hurd/fd-close.c
deleted file mode 100644
index 2024517705..0000000000
--- a/hurd/fd-close.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/fd.h>
-
-error_t
-_hurd_fd_close (struct hurd_fd *fd)
-{
- error_t err;
-
- HURD_CRITICAL_BEGIN;
-
- __spin_lock (&fd->port.lock);
- if (fd->port.port == MACH_PORT_NULL)
- {
- __spin_unlock (&fd->port.lock);
- err = EBADF;
- }
- else
- {
- /* Clear the descriptor's port cells.
- This deallocates the ports if noone else is still using them. */
- _hurd_port_set (&fd->ctty, MACH_PORT_NULL);
- _hurd_port_locked_set (&fd->port, MACH_PORT_NULL);
- err = 0;
- }
-
- HURD_CRITICAL_END;
-
- return err;
-}
diff --git a/hurd/fd-read.c b/hurd/fd-read.c
deleted file mode 100644
index 361b96f969..0000000000
--- a/hurd/fd-read.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <string.h>
-
-error_t
-_hurd_fd_read (struct hurd_fd *fd, void *buf, size_t *nbytes, loff_t offset)
-{
- error_t err;
- char *data;
- mach_msg_type_number_t nread;
-
- error_t readfd (io_t port)
- {
- return __io_read (port, &data, &nread, offset, *nbytes);
- }
-
- data = buf;
- nread = *nbytes;
- if (err = HURD_FD_PORT_USE (fd, _hurd_ctty_input (port, ctty, readfd)))
- return err;
-
- if (data != buf)
- {
- if (nread > *nbytes) /* Sanity check for bogus server. */
- {
- __vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
- return EGRATUITOUS;
- }
- memcpy (buf, data, nread);
- __vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
- }
-
- *nbytes = nread;
- return 0;
-}
diff --git a/hurd/fd-write.c b/hurd/fd-write.c
deleted file mode 100644
index 8ab9bbd43b..0000000000
--- a/hurd/fd-write.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* _hurd_fd_write -- write to a file descriptor; handles job control et al.
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-
-error_t
-_hurd_fd_write (struct hurd_fd *fd,
- const void *buf, size_t *nbytes, loff_t offset)
-{
- error_t err;
- mach_msg_type_number_t wrote;
-
- error_t writefd (io_t port)
- {
- return __io_write (port, buf, *nbytes, offset, &wrote);
- }
-
- err = HURD_FD_PORT_USE (fd, _hurd_ctty_output (port, ctty, writefd));
-
- if (! err)
- *nbytes = wrote;
-
- return err;
-}
diff --git a/hurd/fopenport.c b/hurd/fopenport.c
deleted file mode 100644
index 42be313e6a..0000000000
--- a/hurd/fopenport.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <string.h>
-
-/* Read up to N chars into BUF from COOKIE.
- Return how many chars were read, 0 for EOF or -1 for error. */
-static ssize_t
-readio (void *cookie, char *buf, size_t n)
-{
- mach_msg_type_number_t nread;
- error_t err;
- char *bufp = buf;
-
- nread = n;
- if (err = __io_read ((io_t) cookie, &bufp, &nread, -1, n))
- return __hurd_fail (err);
-
- if (bufp != buf)
- {
- memcpy (buf, bufp, nread);
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) bufp, (vm_size_t) nread);
- }
-
- return nread;
-}
-
-/* Write up to N chars from BUF to COOKIE.
- Return how many chars were written or -1 for error. */
-static ssize_t
-writeio (void *cookie, const char *buf, size_t n)
-{
- mach_msg_type_number_t wrote;
- error_t err;
-
- if (err = __io_write ((io_t) cookie, buf, n, -1, &wrote))
- return __hurd_fail (err);
-
- return wrote;
-}
-
-/* Move COOKIE's file position *POS bytes, according to WHENCE.
- The current file position is stored in *POS.
- Returns zero if successful, nonzero if not. */
-static int
-seekio (void *cookie,
- _IO_off64_t *pos,
- int whence)
-{
- error_t err = __io_seek ((file_t) cookie, *pos, whence, pos);
- return err ? __hurd_fail (err) : 0;
-}
-
-/* Close the file associated with COOKIE.
- Return 0 for success or -1 for failure. */
-static int
-closeio (void *cookie)
-{
- error_t error = __mach_port_deallocate (__mach_task_self (),
- (mach_port_t) cookie);
- if (error)
- return __hurd_fail (error);
- return 0;
-}
-
-#include "../libio/libioP.h"
-#define fopencookie _IO_fopencookie
-static const cookie_io_functions_t funcsio =
-{ readio, writeio, seekio, closeio };
-
-
-/* Open a stream on PORT. MODE is as for fopen. */
-
-FILE *
-__fopenport (mach_port_t port, const char *mode)
-{
- int pflags;
- int needflags;
- error_t err;
-
- const char *m = mode;
-
- switch (*m++)
- {
- case 'r':
- needflags = O_READ;
- break;
- case 'w':
- needflags = O_WRITE;
- break;
- case 'a':
- needflags = O_WRITE|O_APPEND;
- break;
- default:
- return NULL;
- }
- if (m[0] == '+' || (m[0] == 'b' && m[1] == '+'))
- needflags |= O_RDWR;
-
- /* Verify the PORT is valid allows the access MODE specifies. */
-
- if (err = __io_get_openmodes (port, &pflags))
- return __hurd_fail (err), NULL;
-
- /* Check the access mode. */
- if ((pflags & needflags) != needflags)
- {
- errno = EBADF;
- return NULL;
- }
-
- return fopencookie ((void *) port, mode, funcsio);
-}
-weak_alias (__fopenport, fopenport)
diff --git a/hurd/get-host.c b/hurd/get-host.c
deleted file mode 100644
index be8345fbf9..0000000000
--- a/hurd/get-host.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Get a host configuration item kept as the whole contents of a file.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <fcntl.h>
-#include <hurd.h>
-#include <hurd/lookup.h>
-#include "hurdhost.h"
-#include <string.h>
-
-ssize_t
-_hurd_get_host_config (const char *item, char *buf, size_t buflen)
-{
- error_t err;
- char *data;
- mach_msg_type_number_t nread, more;
- file_t config;
-
- err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0,
- item, O_RDONLY, 0, &config);
- switch (err)
- {
- case 0: /* Success; read file contents below. */
- break;
-
- case ENOENT: /* ? Others? All errors? */
- /* The file does not exist, so no value has been set. Rather than
- causing gethostname et al to fail with ENOENT, give an empty value
- as other systems do before sethostname has been called. */
- if (buflen != 0)
- *buf = '\0';
- return 0;
-
- default:
- return __hurd_fail (err);
- }
-
- data = buf;
- nread = buflen;
- err = __io_read (config, &data, &nread, -1, buflen);
- if (! err)
- /* Check if there is more in the file we didn't read. */
- err = __io_readable (config, &more);
- __mach_port_deallocate (__mach_task_self (), config);
- if (err)
- return __hurd_fail (err);
- if (data != buf)
- {
- memcpy (buf, data, nread);
- __vm_deallocate (__mach_task_self (), (vm_address_t) data, nread);
- }
-
- /* If the file is empty, give an empty value. */
- if (nread == 0)
- {
- if (buflen != 0)
- *buf = '\0';
- return 0;
- }
-
- /* Remove newlines in case someone wrote the file by hand. */
- while (nread > 0 && buf[nread - 1] == '\n')
- buf[--nread] = '\0';
-
- /* Null-terminate the result if there is enough space. */
- if (nread < buflen)
- buf[nread] = '\0';
- else
- if (buf[nread - 1] != '\0')
- more = 1;
-
- if (more)
- /* If we didn't read the whole file, tell the caller to use a bigger
- buffer next time. */
- return __hurd_fail (ENAMETOOLONG);
-
- return nread;
-}
diff --git a/hurd/getdport.c b/hurd/getdport.c
deleted file mode 100644
index d400a9f62d..0000000000
--- a/hurd/getdport.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
-
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-/* This is initialized in dtable.c when that gets linked in.
- If dtable.c is not linked in, it will be zero. */
-static file_t (*_default_hurd_getdport_fn) (int fd) = 0;
-weak_alias (_default_hurd_getdport_fn, _hurd_getdport_fn)
-
-file_t
-__getdport (int fd)
-{
- if (_hurd_getdport_fn)
- /* dtable.c has defined the function to fetch a port from the real file
- descriptor table. */
- return (*_hurd_getdport_fn) (fd);
-
- /* getdport is the only use of file descriptors,
- so we don't bother allocating a real table. */
-
- if (_hurd_init_dtable == NULL)
- {
- /* Never had a descriptor table. */
- errno = EBADF;
- return MACH_PORT_NULL;
- }
-
- if (fd < 0 || (unsigned int) fd > _hurd_init_dtablesize ||
- _hurd_init_dtable[fd] == MACH_PORT_NULL)
- {
- errno = EBADF;
- return MACH_PORT_NULL;
- }
- else
- {
- __mach_port_mod_refs (__mach_task_self (), _hurd_init_dtable[fd],
- MACH_PORT_RIGHT_SEND, 1);
- return _hurd_init_dtable[fd];
- }
-}
-
-weak_alias (__getdport, getdport)
diff --git a/hurd/geteuids.c b/hurd/geteuids.c
deleted file mode 100644
index 5c0796fef9..0000000000
--- a/hurd/geteuids.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/id.h>
-#include <string.h>
-
-int
-geteuids (int n, uid_t *uidset)
-{
- error_t err;
- int nuids;
- void *crit;
-
- crit = _hurd_critical_section_lock ();
- __mutex_lock (&_hurd_id.lock);
-
- if (err = _hurd_check_ids ())
- {
- __mutex_unlock (&_hurd_id.lock);
- _hurd_critical_section_unlock (crit);
- return __hurd_fail (err);
- }
-
- nuids = _hurd_id.gen.nuids;
-
- if (n != 0)
- {
- /* Copy the uids onto stack storage and then release the idlock. */
- uid_t uids[nuids];
- memcpy (uids, _hurd_id.gen.uids, sizeof (uids));
- __mutex_unlock (&_hurd_id.lock);
- _hurd_critical_section_unlock (crit);
-
- /* Now that the lock is released, we can safely copy the
- uid set into the user's array, which might fault. */
- if (nuids > n)
- nuids = n;
- memcpy (uidset, uids, nuids * sizeof (uid_t));
- }
- else
- {
- __mutex_unlock (&_hurd_id.lock);
- _hurd_critical_section_unlock (crit);
- }
-
- return nuids;
-}
-
-/* XXX Remove this alias when we bump the libc soname. */
-
-#ifdef SHARED
-weak_alias (geteuids, __getuids)
-#endif
diff --git a/hurd/getumask.c b/hurd/getumask.c
deleted file mode 100644
index 452a671720..0000000000
--- a/hurd/getumask.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright (C) 1992-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-mode_t
-getumask (void)
-{
- return _hurd_umask;
-}
diff --git a/hurd/hurd-raise.c b/hurd/hurd-raise.c
deleted file mode 100644
index af99db38bd..0000000000
--- a/hurd/hurd-raise.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-#include <hurd/msg.h>
-#include <setjmp.h>
-
-/* Handle signal SIGNO in the calling thread.
- If SS is not NULL it is the sigstate for the calling thread;
- SS->lock is held on entry and released before return. */
-
-int
-_hurd_raise_signal (struct hurd_sigstate *ss,
- int signo, const struct hurd_signal_detail *detail)
-{
- if (ss == NULL)
- {
- ss = _hurd_self_sigstate ();
- __spin_lock (&ss->lock);
- }
-
- /* Mark SIGNO as pending to be delivered. */
- __sigaddset (&ss->pending, signo);
- ss->pending_data[signo] = *detail;
-
- __spin_unlock (&ss->lock);
-
- /* Send a message to the signal thread so it will wake up and check for
- pending signals. This is a generic "poll request" message (SIGNO==0)
- rather than delivering this signal and its detail, because we have
- already marked the signal as pending for the particular thread we
- want. Generating the signal with an RPC might deliver it to some
- other thread. */
- return __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
-}
diff --git a/hurd/hurd.h b/hurd/hurd.h
deleted file mode 100644
index 3caa69fbdf..0000000000
--- a/hurd/hurd.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_H
-
-#define _HURD_H 1
-#include <features.h>
-
-
-/* Get types, macros, constants and function declarations
- for all Mach microkernel interaction. */
-#include <mach.h>
-#include <mach/mig_errors.h>
-
-/* Get types and constants necessary for Hurd interfaces. */
-#include <hurd/hurd_types.h>
-
-/* Get MiG stub declarations for commonly used Hurd interfaces. */
-#include <hurd/auth.h>
-#include <hurd/process.h>
-#include <hurd/fs.h>
-#include <hurd/io.h>
-
-/* Get `struct hurd_port' and related definitions implementing lightweight
- user references for ports. These are used pervasively throughout the C
- library; this is here to avoid putting it in nearly every source file. */
-#include <hurd/port.h>
-
-#include <errno.h>
-
-#ifndef _HURD_H_EXTERN_INLINE
-#define _HURD_H_EXTERN_INLINE __extern_inline
-#endif
-
-_HURD_H_EXTERN_INLINE int
-__hurd_fail (error_t err)
-{
- switch (err)
- {
- case EMACH_SEND_INVALID_DEST:
- case EMIG_SERVER_DIED:
- /* The server has disappeared! */
- err = (error_t) EIEIO;
- break;
-
- case KERN_NO_SPACE:
- err = (error_t) ENOMEM;
- break;
-
- case KERN_INVALID_ARGUMENT:
- err = (error_t) EINVAL;
- break;
-
- case 0:
- return 0;
-
- default:
- break;
- }
-
- errno = err;
- return -1;
-}
-
-/* Basic ports and info, initialized by startup. */
-
-extern int _hurd_exec_flags; /* Flags word passed in exec_startup. */
-extern struct hurd_port *_hurd_ports;
-extern unsigned int _hurd_nports;
-extern mode_t _hurd_umask;
-extern sigset_t _hurdsig_traced;
-
-/* Shorthand macro for internal library code referencing _hurd_ports (see
- <hurd/port.h>). */
-
-#define __USEPORT(which, expr) \
- HURD_PORT_USE (&_hurd_ports[INIT_PORT_##which], (expr))
-
-/* Function version of __USEPORT: calls OPERATE with a send right. */
-
-extern error_t _hurd_ports_use (int which, error_t (*operate) (mach_port_t));
-
-
-/* Base address and size of the initial stack set up by the exec server.
- If using cthreads, this stack is deallocated in startup.
- Not locked. */
-
-extern vm_address_t _hurd_stack_base;
-extern vm_size_t _hurd_stack_size;
-
-/* Initial file descriptor table we were passed at startup. If we are
- using a real dtable, these are turned into that and then cleared at
- startup. If not, these are never changed after startup. Not locked. */
-
-extern mach_port_t *_hurd_init_dtable;
-extern mach_msg_type_number_t _hurd_init_dtablesize;
-
-/* Current process IDs. */
-
-extern pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp;
-extern int _hurd_orphaned;
-
-/* This variable is incremented every time the process IDs change. */
-extern unsigned int _hurd_pids_changed_stamp;
-
-/* This condition is broadcast every time the process IDs change. */
-extern struct condition _hurd_pids_changed_sync;
-
-/* Unix `data break', for brk and sbrk.
- If brk and sbrk are not used, this info will not be initialized or used. */
-
-
-/* Data break. This is what `sbrk (0)' returns. */
-
-extern vm_address_t _hurd_brk;
-
-/* End of allocated space. This is generally `round_page (_hurd_brk)'. */
-
-extern vm_address_t _hurd_data_end;
-
-/* This mutex locks _hurd_brk and _hurd_data_end. */
-
-extern struct mutex _hurd_brk_lock;
-
-/* Set the data break to NEWBRK; _hurd_brk_lock must
- be held, and is released on return. */
-
-extern int _hurd_set_brk (vm_address_t newbrk);
-
-#include <bits/types/FILE.h>
-
-/* Calls to get and set basic ports. */
-
-extern error_t _hurd_ports_get (unsigned int which, mach_port_t *result);
-extern error_t _hurd_ports_set (unsigned int which, mach_port_t newport);
-
-extern process_t getproc (void);
-extern file_t getcwdir (void), getcrdir (void);
-extern auth_t getauth (void);
-extern mach_port_t getcttyid (void);
-extern int setproc (process_t);
-extern int setcwdir (file_t), setcrdir (file_t);
-extern int setcttyid (mach_port_t);
-
-/* Does reauth with the proc server and fd io servers. */
-extern int __setauth (auth_t), setauth (auth_t);
-
-
-/* Modify a port cell by looking up a directory name.
- This verifies that it is a directory and that we have search permission. */
-extern int _hurd_change_directory_port_from_name (struct hurd_port *portcell,
- const char *name);
-/* Same thing, but using an open file descriptor.
- Also verifies that it is a directory and that we have search permission. */
-extern int _hurd_change_directory_port_from_fd (struct hurd_port *portcell,
- int fd);
-
-
-
-/* Get and set the effective UID set. */
-extern int geteuids (int __n, uid_t *__uidset);
-extern int seteuids (int __n, const uid_t *__uidset);
-
-
-/* Split FILE into a directory and a name within the directory. The
- directory lookup uses the current root and working directory. If
- successful, stores in *NAME a pointer into FILE where the name
- within directory begins and returns a port to the directory;
- otherwise sets `errno' and returns MACH_PORT_NULL. */
-
-extern file_t __file_name_split (const char *file, char **name);
-extern file_t file_name_split (const char *file, char **name);
-
-/* Split DIRECTORY into a parent directory and a name within the directory.
- This is the same as file_name_split, but ignores trailing slashes. */
-
-extern file_t __directory_name_split (const char *file, char **name);
-extern file_t directory_name_split (const char *file, char **name);
-
-/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>).
- The file lookup uses the current root and working directory.
- Returns a port to the file if successful; otherwise sets `errno'
- and returns MACH_PORT_NULL. */
-
-extern file_t __file_name_lookup (const char *file, int flags, mode_t mode);
-extern file_t file_name_lookup (const char *file, int flags, mode_t mode);
-
-/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>). The
- file lookup uses the current root directory, but uses STARTDIR as the
- "working directory" for file relative names. Returns a port to the file
- if successful; otherwise sets `errno' and returns MACH_PORT_NULL. */
-
-extern file_t __file_name_lookup_under (file_t startdir, const char *file,
- int flags, mode_t mode);
-extern file_t file_name_lookup_under (file_t startdir, const char *file,
- int flags, mode_t mode);
-
-
-/* Lookup FILE_NAME and return the node opened with FLAGS & MODE
- (see hurd_file_name_lookup for details), but a simple file name (without
- any directory prefixes) will be consecutively prefixed with the pathnames
- in the `:' separated list PATH until one succeeds in a successful lookup.
- If none succeed, then the first error that wasn't ENOENT is returned, or
- ENOENT if no other errors were returned. If PREFIXED_NAME is non-NULL,
- then if the result is looked up directly, *PREFIXED_NAME is set to NULL, and
- if it is looked up using a prefix from PATH, *PREFIXED_NAME is set to
- malloc'd storage containing the prefixed name. */
-extern file_t file_name_path_lookup (const char *file_name, const char *path,
- int flags, mode_t mode,
- char **prefixed_name);
-
-
-
-/* Open a file descriptor on a port. FLAGS are as for `open'; flags
- affected by io_set_openmodes are not changed by this. If successful,
- this consumes a user reference for PORT (which will be deallocated on
- close). */
-
-extern int openport (io_t port, int flags);
-
-/* Open a stream on a port. MODE is as for `fopen'.
- If successful, this consumes a user reference for PORT
- (which will be deallocated on fclose). */
-
-extern FILE *fopenport (io_t port, const char *mode);
-extern FILE *__fopenport (io_t port, const char *mode);
-
-
-/* Execute a file, replacing TASK's current program image. */
-
-extern error_t _hurd_exec (task_t task,
- file_t file,
- char *const argv[],
- char *const envp[]);
-
-
-/* Inform the proc server we have exited with STATUS, and kill the
- task thoroughly. This function never returns, no matter what. */
-
-extern void _hurd_exit (int status) __attribute__ ((noreturn));
-
-
-/* Initialize the library data structures from the
- ints and ports passed to us by the exec server.
- Then vm_deallocate PORTARRAY and INTARRAY. */
-
-extern void _hurd_init (int flags, char **argv,
- mach_port_t *portarray, size_t portarraysize,
- int *intarray, size_t intarraysize);
-
-/* Do startup handshaking with the proc server, and initialize library data
- structures that require proc server interaction. This includes
- initializing signals; see _hurdsig_init in <hurd/signal.h>. */
-
-extern void _hurd_proc_init (char **argv,
- const int *intarray, size_t intarraysize);
-
-
-/* Return the socket server for sockaddr domain DOMAIN. If DEAD is
- nonzero, remove the old cached port and always do a fresh lookup.
-
- It is assumed that a socket server will stay alive during a complex socket
- operation involving several RPCs. But a socket server may die during
- long idle periods between socket operations. Callers should first pass
- zero for DEAD; if the first socket RPC tried on the returned port fails
- with MACH_SEND_INVALID_DEST or MIG_SERVER_DIED (indicating the server
- went away), the caller should call _hurd_socket_server again with DEAD
- nonzero and retry the RPC on the new socket server port. */
-
-extern socket_t _hurd_socket_server (int domain, int dead);
-
-/* Send a `sig_post' RPC to process number PID. If PID is zero,
- send the message to all processes in the current process's process group.
- If PID is < -1, send SIG to all processes in process group - PID.
- SIG and REFPORT are passed along in the request message. */
-
-extern error_t _hurd_sig_post (pid_t pid, int sig, mach_port_t refport);
-extern error_t hurd_sig_post (pid_t pid, int sig, mach_port_t refport);
-
-/* Fetch the host privileged port and device master port from the proc
- server. They are fetched only once and then cached in the
- variables below. A special program that gets them from somewhere
- other than the proc server (such as a bootstrap filesystem) can set
- these variables to install the ports. */
-
-extern kern_return_t __get_privileged_ports (mach_port_t *host_priv_ptr,
- device_t *device_master_ptr);
-extern kern_return_t get_privileged_ports (mach_port_t *host_priv_ptr,
- device_t *device_master_ptr);
-extern mach_port_t _hurd_host_priv, _hurd_device_master;
-
-/* Return the PID of the task whose control port is TASK.
- On error, sets `errno' and returns -1. */
-
-extern pid_t __task2pid (task_t task), task2pid (task_t task);
-
-/* Return the task control port of process PID.
- On error, sets `errno' and returns MACH_PORT_NULL. */
-
-extern task_t __pid2task (pid_t pid), pid2task (pid_t pid);
-
-/* Return the current thread's thread port. This is a cheap operation (no
- system call), but it relies on Hurd signal state being set up. */
-extern thread_t hurd_thread_self (void);
-
-
-/* Cancel pending operations on THREAD. If it is doing an interruptible RPC,
- that RPC will now return EINTR; otherwise, the "cancelled" flag will be
- set, causing the next `hurd_check_cancel' call to return nonzero or the
- next interruptible RPC to return EINTR (whichever is called first). */
-extern error_t hurd_thread_cancel (thread_t thread);
-
-/* Test and clear the calling thread's "cancelled" flag. */
-extern int hurd_check_cancel (void);
-
-
-/* Return the io server port for file descriptor FD.
- This adds a Mach user reference to the returned port.
- On error, sets `errno' and returns MACH_PORT_NULL. */
-
-extern io_t __getdport (int fd), getdport (int fd);
-
-
-#include <stdarg.h>
-
-/* Write formatted output to PORT, a Mach port supporting the i/o protocol,
- according to the format string FORMAT, using the argument list in ARG. */
-int vpprintf (io_t port, const char *format, va_list arg);
-
-
-#endif /* hurd.h */
diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h
deleted file mode 100644
index 8954be0d50..0000000000
--- a/hurd/hurd/fd.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/* File descriptors.
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_FD_H
-
-#define _HURD_FD_H 1
-#include <features.h>
-
-#include <cthreads.h>
-
-#include <hurd/hurd_types.h>
-#include <hurd/port.h>
-#include <sys/socket.h>
-
-
-/* Structure representing a file descriptor. */
-
-struct hurd_fd
- {
- struct hurd_port port; /* io server port. */
- int flags; /* fcntl flags; locked by port.lock. */
-
- /* Normal port to the ctty. When `port' is our ctty, this is a port to
- the same io object but which never returns EBACKGROUND; when not,
- this is nil. */
- struct hurd_port ctty;
- };
-
-
-/* Current file descriptor table. */
-
-extern int _hurd_dtablesize;
-extern struct hurd_fd **_hurd_dtable;
-extern struct mutex _hurd_dtable_lock; /* Locks those two variables. */
-
-#include <hurd/signal.h>
-
-#ifndef _HURD_FD_H_EXTERN_INLINE
-#define _HURD_FD_H_EXTERN_INLINE __extern_inline
-#endif
-
-/* Returns the descriptor cell for FD. If FD is invalid or unused, return
- NULL. The cell is unlocked; when ready to use it, lock it and check for
- it being unused. */
-
-_HURD_FD_H_EXTERN_INLINE struct hurd_fd *
-_hurd_fd_get (int fd)
-{
- struct hurd_fd *descriptor;
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_dtable_lock);
- if (fd < 0 || fd >= _hurd_dtablesize)
- descriptor = NULL;
- else
- {
- struct hurd_fd *cell = _hurd_dtable[fd];
- if (cell == NULL)
- /* No descriptor allocated at this index. */
- descriptor = NULL;
- else
- {
- __spin_lock (&cell->port.lock);
- if (cell->port.port == MACH_PORT_NULL)
- /* The descriptor at this index has no port in it.
- This happens if it existed before but was closed. */
- descriptor = NULL;
- else
- descriptor = cell;
- __spin_unlock (&cell->port.lock);
- }
- }
- __mutex_unlock (&_hurd_dtable_lock);
- HURD_CRITICAL_END;
-
- return descriptor;
-}
-
-
-/* Evaluate EXPR with the variable `descriptor' bound to a pointer to the
- file descriptor structure for FD. */
-
-#define HURD_FD_USE(fd, expr) \
- ({ struct hurd_fd *descriptor = _hurd_fd_get (fd); \
- descriptor == NULL ? EBADF : (expr); })
-
-/* Evaluate EXPR with the variable `port' bound to the port to FD, and
- `ctty' bound to the ctty port. */
-
-#define HURD_DPORT_USE(fd, expr) \
- HURD_FD_USE ((fd), HURD_FD_PORT_USE (descriptor, (expr)))
-
-/* Likewise, but FD is a pointer to the file descriptor structure. */
-
-#define HURD_FD_PORT_USE(fd, expr) \
- ({ error_t __result; \
- struct hurd_fd *const __d = (fd); \
- struct hurd_userlink __ulink, __ctty_ulink; \
- io_t port, ctty; \
- void *crit = _hurd_critical_section_lock (); \
- __spin_lock (&__d->port.lock); \
- if (__d->port.port == MACH_PORT_NULL) \
- { \
- __spin_unlock (&__d->port.lock); \
- _hurd_critical_section_unlock (crit); \
- __result = EBADF; \
- } \
- else \
- { \
- ctty = _hurd_port_get (&__d->ctty, &__ctty_ulink); \
- port = _hurd_port_locked_get (&__d->port, &__ulink); \
- _hurd_critical_section_unlock (crit); \
- __result = (expr); \
- _hurd_port_free (&__d->port, &__ulink, port); \
- if (ctty != MACH_PORT_NULL) \
- _hurd_port_free (&__d->ctty, &__ctty_ulink, ctty); \
- } \
- __result; })
-
-#include <errno.h>
-
-/* Check if ERR should generate a signal.
- Returns the signal to take, or zero if none. */
-
-_HURD_FD_H_EXTERN_INLINE int
-_hurd_fd_error_signal (error_t err)
-{
- switch (err)
- {
- case EMACH_SEND_INVALID_DEST:
- case EMIG_SERVER_DIED:
- /* The server has disappeared! */
- return SIGLOST;
- case EPIPE:
- return SIGPIPE;
- default:
- /* Having a default case avoids -Wenum-switch warnings. */
- return 0;
- }
-}
-
-/* Handle an error from an RPC on a file descriptor's port. You should
- always use this function to handle errors from RPCs made on file
- descriptor ports. Some errors are translated into signals. */
-
-_HURD_FD_H_EXTERN_INLINE error_t
-_hurd_fd_error (int fd, error_t err)
-{
- int signo = _hurd_fd_error_signal (err);
- if (signo)
- {
- const struct hurd_signal_detail detail
- = { code: fd, error: err, exc: 0 };
- _hurd_raise_signal (NULL, signo, &detail);
- }
- return err;
-}
-
-/* Handle error code ERR from an RPC on file descriptor FD's port.
- Set `errno' to the appropriate error code, and always return -1. */
-
-_HURD_FD_H_EXTERN_INLINE int
-__hurd_dfail (int fd, error_t err)
-{
- errno = _hurd_fd_error (fd, err);
- return -1;
-}
-
-/* Likewise, but do not raise SIGPIPE on EPIPE if flags contain
- MSG_NOSIGNAL. */
-
-_HURD_FD_H_EXTERN_INLINE int
-__hurd_sockfail (int fd, int flags, error_t err)
-{
- if (!(flags & MSG_NOSIGNAL) || err != EPIPE)
- err = _hurd_fd_error (fd, err);
- errno = err;
- return -1;
-}
-
-/* Set up *FD to have PORT its server port, doing appropriate ctty magic.
- Does no locking or unlocking. */
-
-extern void _hurd_port2fd (struct hurd_fd *fd, io_t port, int flags);
-
-/* Allocate a new file descriptor and install PORT in it (doing any
- appropriate ctty magic); consumes a user reference on PORT. FLAGS are
- as for `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful, but all are
- saved.
-
- If the descriptor table is full, set errno, and return -1.
- If DEALLOC is nonzero, deallocate PORT first. */
-
-extern int _hurd_intern_fd (io_t port, int flags, int dealloc);
-
-/* Allocate a new file descriptor in the table and return it, locked. The
- new descriptor number will be no less than FIRST_FD. If the table is
- full, set errno to EMFILE and return NULL. If FIRST_FD is negative or
- bigger than the size of the table, set errno to EINVAL and return NULL. */
-
-extern struct hurd_fd *_hurd_alloc_fd (int *fd_ptr, int first_fd);
-
-/* Allocate a new file descriptor structure and initialize its port cells
- with PORT and CTTY. (This does not affect the descriptor table.) */
-
-extern struct hurd_fd *_hurd_new_fd (io_t port, io_t ctty);
-
-/* Close a file descriptor, making it available for future reallocation. */
-
-extern error_t _hurd_fd_close (struct hurd_fd *fd);
-
-/* Read and write data from a file descriptor; just like `read' and `write'
- if OFFSET is -1, or like `pread' and `pwrite' if OFFSET is not -1.
- If successful, stores the amount actually read or written in *NBYTES. */
-
-extern error_t _hurd_fd_read (struct hurd_fd *fd,
- void *buf, size_t *nbytes, loff_t offset);
-extern error_t _hurd_fd_write (struct hurd_fd *fd,
- const void *buf, size_t *nbytes, loff_t offset);
-
-
-/* Call *RPC on PORT and/or CTTY; if a call on CTTY returns EBACKGROUND,
- generate SIGTTIN/SIGTTOU or EIO as appropriate. */
-
-extern error_t _hurd_ctty_input (io_t port, io_t ctty, error_t (*rpc) (io_t));
-extern error_t _hurd_ctty_output (io_t port, io_t ctty, error_t (*rpc) (io_t));
-
-
-/* The guts of `select' and `poll'. Check the first NFDS descriptors
- either in POLLFDS (if nonnull) or in each of READFDS, WRITEFDS,
- EXCEPTFDS that is nonnull. If TIMEOUT is not NULL, time out after
- waiting the interval specified therein. If SIGMASK is nonnull,
- the set of blocked signals is temporarily set to that during this call.
- Returns the number of ready descriptors, or -1 for errors. */
-struct pollfd;
-struct timespec;
-extern int _hurd_select (int nfds, struct pollfd *pollfds,
- fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
- const struct timespec *timeout,
- const sigset_t *sigmask);
-
-/* Variant of file_name_lookup used in *at function implementations.
- AT_FLAGS may only contain AT_SYMLINK_FOLLOW or AT_SYMLINK_NOFOLLOW,
- which will remove and add O_NOLINK from FLAGS respectively.
- Other bits cause EINVAL. */
-extern file_t __file_name_lookup_at (int fd, int at_flags,
- const char *file_name,
- int flags, mode_t mode);
-
-/* Variant of file_name_split used in *at function implementations. */
-extern file_t __file_name_split_at (int fd, const char *file_name,
- char **name);
-
-/* Variant of directory_name_split used in *at function implementations. */
-extern file_t __directory_name_split_at (int fd, const char *directory_name,
- char **name);
-
-
-
-#endif /* hurd/fd.h */
diff --git a/hurd/hurd/id.h b/hurd/hurd/id.h
deleted file mode 100644
index ef1292ebe8..0000000000
--- a/hurd/hurd/id.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* User and group IDs.
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_ID_H
-
-#define _HURD_ID_H 1
-#include <features.h>
-
-#include <cthreads.h> /* For `struct mutex'. */
-
-/* Structure describing authorization data for the process. */
-
-struct hurd_id_data
- {
- struct mutex lock;
-
- int valid; /* If following data are up to date. */
-
- struct
- {
- uid_t *uids;
- gid_t *gids;
- mach_msg_type_number_t nuids, ngids;
- } gen, aux;
-
- auth_t rid_auth; /* Cache used by access. */
- };
-
-/* Current data. */
-
-extern struct hurd_id_data _hurd_id;
-
-
-/* Update _hurd_id (caller should be holding the lock). */
-
-extern error_t _hurd_check_ids (void);
-
-
-#endif /* hurd/id.h */
diff --git a/hurd/hurd/ioctl.h b/hurd/hurd/ioctl.h
deleted file mode 100644
index 0423b8cb9f..0000000000
--- a/hurd/hurd/ioctl.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* User-registered handlers for specific `ioctl' requests.
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_IOCTL_H
-#define _HURD_IOCTL_H 1
-
-#define __need___va_list
-#include <stdarg.h>
-#include <bits/ioctls.h>
-
-
-/* Type of handler function, called like ioctl to do its entire job. */
-typedef int (*ioctl_handler_t) (int fd, int request, void *arg);
-
-/* Structure that records an ioctl handler. */
-struct ioctl_handler
- {
- /* Range of handled _IOC_NOTYPE (REQUEST) values. */
- int first_request, last_request;
-
- /* Handler function, called like ioctl to do its entire job. */
- ioctl_handler_t handler;
-
- struct ioctl_handler *next; /* Next handler. */
- };
-
-
-/* Register HANDLER to handle ioctls with REQUEST values between
- FIRST_REQUEST and LAST_REQUEST inclusive. Returns zero if successful.
- Return nonzero and sets `errno' for an error. */
-
-extern int hurd_register_ioctl_handler (int first_request, int last_request,
- ioctl_handler_t handler);
-
-
-/* Define a library-internal handler for ioctl commands between FIRST and
- LAST inclusive. The last element gratuitously references HANDLER to
- avoid `defined but not used' warnings. */
-
-#define _HURD_HANDLE_IOCTLS_1(handler, first, last, moniker) \
- static const struct ioctl_handler handler##_ioctl_handler##moniker \
- __attribute__ ((__unused__)) = \
- { _IOC_NOTYPE (first), _IOC_NOTYPE (last), \
- (ioctl_handler_t) (handler), NULL }; \
- text_set_element (_hurd_ioctl_handler_lists, \
- handler##_ioctl_handler##moniker)
-#define _HURD_HANDLE_IOCTLS(handler, first, last) \
- _HURD_HANDLE_IOCTLS_1 (handler, first, last, first##_to_##last)
-
-/* Define a library-internal handler for a single ioctl command. */
-
-#define _HURD_HANDLE_IOCTL(handler, ioctl) \
- _HURD_HANDLE_IOCTLS_1 (handler, ioctl, ioctl, ioctl##_only)
-
-
-/* Install a new CTTYID port, atomically updating the dtable appropriately.
- This consumes the send right passed in. */
-
-void _hurd_locked_install_cttyid (mach_port_t cttyid);
-
-/* Lookup the handler for the given ioctl request. */
-
-ioctl_handler_t _hurd_lookup_ioctl_handler (int request);
-
-
-#endif /* hurd/ioctl.h */
diff --git a/hurd/hurd/lookup.h b/hurd/hurd/lookup.h
deleted file mode 100644
index 99052994c7..0000000000
--- a/hurd/hurd/lookup.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Declarations of file name translation functions for the GNU Hurd.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_LOOKUP_H
-#define _HURD_LOOKUP_H 1
-
-/* These functions all take two callback functions as the first two arguments.
- The first callback function USE_INIT_PORT is called as follows:
-
- error_t use_init_port (int which, error_t (*operate) (mach_port_t));
-
- WHICH is nonnegative value less than INIT_PORT_MAX, indicating which
- init port is required. The callback function should call *OPERATE
- with a send right to the appropriate init port. No user reference
- is consumed; the right will only be used after *OPERATE returns if
- *OPERATE has added its own user reference.
-
- LOOKUP is a function to do the actual filesystem lookup. It is passed the
- same arguments that the dir_lookup rpc accepts, and if 0, __dir_lookup is
- used.
-
- The second callback function GET_DTABLE_PORT should behave like `getdport'.
-
- All these functions return zero on success or an error code on failure. */
-
-
-/* Open a port to FILE with the given FLAGS and MODE (see <fcntl.h>). If
- successful, returns zero and store the port to FILE in *PORT; otherwise
- returns an error code. */
-
-error_t __hurd_file_name_lookup (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name, int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name,
- int flags, mode_t mode,
- file_t *result);
-error_t hurd_file_name_lookup (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name, int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name,
- int flags, mode_t mode,
- file_t *result);
-
-
-/* Split FILE into a directory and a name within the directory. Look up a
- port for the directory and store it in *DIR; store in *NAME a pointer
- into FILE where the name within directory begins. */
-
-error_t __hurd_file_name_split (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup) (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name,
- file_t *dir, char **name);
-error_t hurd_file_name_split (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup) (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name,
- file_t *dir, char **name);
-
-/* Split DIRECTORY into a parent directory and a name within the directory.
- This is the same as hurd_file_name_split, but ignores trailing slashes. */
-
-error_t __hurd_directory_name_split (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup) (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *directory_name,
- file_t *dir, char **name);
-error_t hurd_directory_name_split (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup) (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *directory_name,
- file_t *dir, char **name);
-
-
-/* Process the values returned by `dir_lookup' et al, and loop doing
- `dir_lookup' calls until one returns FS_RETRY_NONE. The arguments
- should be those just passed to and/or returned from `dir_lookup',
- `fsys_getroot', or `file_invoke_translator'. This function consumes the
- reference in *RESULT even if it returns an error. */
-
-error_t __hurd_file_name_lookup_retry (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry,
- string_t retry_name,
- mach_port_t *result),
- enum retry_type doretry,
- char retryname[1024],
- int flags, mode_t mode,
- file_t *result);
-error_t hurd_file_name_lookup_retry (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry,
- string_t retry_name,
- mach_port_t *result),
- enum retry_type doretry,
- char retryname[1024],
- int flags, mode_t mode,
- file_t *result);
-
-
-/* If FILE_NAME contains a '/', or PATH is NULL, call FUN with FILE_NAME, and
- return the result (if PREFIXED_NAME is non-NULL, setting *PREFIXED_NAME to
- NULL). Otherwise, call FUN repeatedly with FILE_NAME prefixed with each
- successive `:' separated element of PATH, returning whenever FUN returns
- 0 (if PREFIXED_NAME is non-NULL, setting *PREFIXED_NAME to the resulting
- prefixed path). If FUN never returns 0, return the first non-ENOENT
- return value, or ENOENT if there is none. */
-error_t file_name_path_scan (const char *file_name, const char *path,
- error_t (*fun)(const char *name),
- char **prefixed_name);
-
-/* Lookup FILE_NAME and return the node opened with FLAGS & MODE in result
- (see hurd_file_name_lookup for details), but a simple filename (without
- any directory prefixes) will be consecutively prefixed with the pathnames
- in the `:' separated list PATH until one succeeds in a successful lookup.
- If none succeed, then the first error that wasn't ENOENT is returned, or
- ENOENT if no other errors were returned. If PREFIXED_NAME is non-NULL,
- then if RESULT is looked up directly, *PREFIXED_NAME is set to NULL, and
- if it is looked up using a prefix from PATH, *PREFIXED_NAME is set to
- malloced storage containing the prefixed name. */
-error_t hurd_file_name_path_lookup (error_t (*use_init_port)
- (int which,
- error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry,
- string_t retry_name,
- mach_port_t *result),
- const char *file_name, const char *path,
- int flags, mode_t mode,
- file_t *result, char **prefixed_name);
-
-#endif /* hurd/lookup.h */
diff --git a/hurd/hurd/port.h b/hurd/hurd/port.h
deleted file mode 100644
index 94874f8f25..0000000000
--- a/hurd/hurd/port.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Lightweight user references for ports.
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_PORT_H
-
-#define _HURD_PORT_H 1
-#include <features.h>
-
-#include <mach.h>
-#include <hurd/userlink.h>
-#include <spin-lock.h>
-#include <hurd/signal.h>
-
-
-/* Structure describing a cell containing a port. With the lock held, a
- user extracts PORT, and attaches his own link (in local storage) to the
- USERS chain. PORT can then safely be used. When PORT is no longer
- needed, with the lock held, the user removes his link from the chain.
- If his link is the last, and PORT has changed since he fetched it, the
- user deallocates the port he used. See <hurd/userlink.h>. */
-
-struct hurd_port
- {
- spin_lock_t lock; /* Locks rest. */
- struct hurd_userlink *users; /* Chain of users; see below. */
- mach_port_t port; /* Port. */
- };
-
-
-/* Evaluate EXPR with the variable `port' bound to the port in PORTCELL. */
-
-#define HURD_PORT_USE(portcell, expr) \
- ({ struct hurd_port *const __p = (portcell); \
- struct hurd_userlink __link; \
- const mach_port_t port = _hurd_port_get (__p, &__link); \
- __typeof(expr) __result = (expr); \
- _hurd_port_free (__p, &__link, port); \
- __result; })
-
-
-#ifndef _HURD_PORT_H_EXTERN_INLINE
-#define _HURD_PORT_H_EXTERN_INLINE __extern_inline
-#endif
-
-
-/* Initialize *PORT to INIT. */
-
-_HURD_PORT_H_EXTERN_INLINE void
-_hurd_port_init (struct hurd_port *port, mach_port_t init)
-{
- __spin_lock_init (&port->lock);
- port->users = NULL;
- port->port = init;
-}
-
-
-/* Cleanup function for non-local exits. */
-extern void _hurd_port_cleanup (void *, jmp_buf, int);
-
-/* Get a reference to *PORT, which is locked.
- Pass return value and LINK to _hurd_port_free when done. */
-
-_HURD_PORT_H_EXTERN_INLINE mach_port_t
-_hurd_port_locked_get (struct hurd_port *port,
- struct hurd_userlink *link)
-{
- mach_port_t result;
- result = port->port;
- if (result != MACH_PORT_NULL)
- {
- link->cleanup = &_hurd_port_cleanup;
- link->cleanup_data = (void *) result;
- _hurd_userlink_link (&port->users, link);
- }
- __spin_unlock (&port->lock);
- return result;
-}
-
-/* Same, but locks PORT first. */
-
-_HURD_PORT_H_EXTERN_INLINE mach_port_t
-_hurd_port_get (struct hurd_port *port,
- struct hurd_userlink *link)
-{
- mach_port_t result;
- HURD_CRITICAL_BEGIN;
- __spin_lock (&port->lock);
- result = _hurd_port_locked_get (port, link);
- HURD_CRITICAL_END;
- return result;
-}
-
-
-/* Free a reference gotten with `USED_PORT = _hurd_port_get (PORT, LINK);' */
-
-_HURD_PORT_H_EXTERN_INLINE void
-_hurd_port_free (struct hurd_port *port,
- struct hurd_userlink *link,
- mach_port_t used_port)
-{
- int dealloc;
- if (used_port == MACH_PORT_NULL)
- /* When we fetch an empty port cell with _hurd_port_get,
- it does not link us on the users chain, since there is
- no shared resource. */
- return;
- HURD_CRITICAL_BEGIN;
- __spin_lock (&port->lock);
- dealloc = _hurd_userlink_unlink (link);
- __spin_unlock (&port->lock);
- HURD_CRITICAL_END;
- if (dealloc)
- __mach_port_deallocate (__mach_task_self (), used_port);
-}
-
-
-/* Set *PORT's port to NEWPORT. NEWPORT's reference is consumed by PORT->port.
- PORT->lock is locked. */
-
-_HURD_PORT_H_EXTERN_INLINE void
-_hurd_port_locked_set (struct hurd_port *port, mach_port_t newport)
-{
- mach_port_t old;
- old = _hurd_userlink_clear (&port->users) ? port->port : MACH_PORT_NULL;
- port->port = newport;
- __spin_unlock (&port->lock);
- if (old != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (), old);
-}
-
-/* Same, but locks PORT first. */
-
-_HURD_PORT_H_EXTERN_INLINE void
-_hurd_port_set (struct hurd_port *port, mach_port_t newport)
-{
- HURD_CRITICAL_BEGIN;
- __spin_lock (&port->lock);
- _hurd_port_locked_set (port, newport);
- HURD_CRITICAL_END;
-}
-
-
-#endif /* hurd/port.h */
diff --git a/hurd/hurd/resource.h b/hurd/hurd/resource.h
deleted file mode 100644
index c550d04f07..0000000000
--- a/hurd/hurd/resource.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Resource limits for the Hurd.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_RESOURCE_H
-#define _HURD_RESOURCE_H
-
-#include <sys/types.h>
-#include <sys/resource.h>
-#include <errno.h>
-#include <hurd/process.h>
-
-/* This array contains the current resource limits for the process. */
-extern struct rlimit _hurd_rlimits[RLIM_NLIMITS];
-extern struct mutex _hurd_rlimit_lock; /* Locks _hurd_rlimits. */
-
-
-/* Helper function for getpriority and setpriority. Maps FN over all the
- processes specified by WHICH and WHO. PI is non-null if a
- proc_getprocinfo was already done; FN may use *PI arbitrarily, it is
- reset on the next call; PI_FLAGS is passed to proc_getprocinfo. Returns
- FN's result the first time it returns nonzero. If FN never returns
- nonzero, this returns zero. */
-extern error_t _hurd_priority_which_map (enum __priority_which which, int who,
- error_t (*fn) (pid_t pid,
- struct procinfo *pi),
- int pi_flags);
-
-/* Convert between Mach priority values and the priority
- values used by getpriority, setpriority, and nice. */
-#define MACH_PRIORITY_TO_NICE(prio) ((prio) - 25)
-#define NICE_TO_MACH_PRIORITY(nice) ((nice) + 25)
-
-
-
-
-#endif
diff --git a/hurd/hurd/signal.h b/hurd/hurd/signal.h
deleted file mode 100644
index e03d53e6d7..0000000000
--- a/hurd/hurd/signal.h
+++ /dev/null
@@ -1,364 +0,0 @@
-/* Implementing POSIX.1 signals under the Hurd.
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_SIGNAL_H
-
-#define _HURD_SIGNAL_H 1
-#include <features.h>
-/* Make sure <signal.h> is going to define NSIG. */
-#ifndef __USE_GNU
-#error "Must have `_GNU_SOURCE' feature test macro to use this file"
-#endif
-
-#define __need_size_t
-#define __need_NULL
-#include <stddef.h>
-
-#include <mach/mach_types.h>
-#include <mach/port.h>
-#include <mach/message.h>
-#include <hurd/hurd_types.h>
-#include <signal.h>
-#include <errno.h>
-#include <hurd/msg.h>
-
-#include <cthreads.h> /* For `struct mutex'. */
-#include <setjmp.h> /* For `jmp_buf'. */
-#include <spin-lock.h>
-#include <hurd/threadvar.h> /* We cache sigstate in a threadvar. */
-struct hurd_signal_preemptor; /* <hurd/sigpreempt.h> */
-
-
-/* Full details of a signal. */
-struct hurd_signal_detail
- {
- /* Codes from origination Mach exception_raise message. */
- integer_t exc, exc_code, exc_subcode;
- /* Sigcode as passed or computed from exception codes. */
- integer_t code;
- /* Error code as passed or extracted from exception codes. */
- error_t error;
- };
-
-
-/* Per-thread signal state. */
-
-struct hurd_sigstate
- {
- spin_lock_t critical_section_lock; /* Held if in critical section. */
-
- spin_lock_t lock; /* Locks most of the rest of the structure. */
-
- thread_t thread;
- struct hurd_sigstate *next; /* Linked-list of thread sigstates. */
-
- sigset_t blocked; /* What signals are blocked. */
- sigset_t pending; /* Pending signals, possibly blocked. */
- struct sigaction actions[NSIG];
- stack_t sigaltstack;
-
- /* Chain of thread-local signal preemptors; see <hurd/sigpreempt.h>.
- Each element of this chain is in local stack storage, and the chain
- parallels the stack: the head of this chain is in the innermost
- stack frame, and each next element in an outermore frame. */
- struct hurd_signal_preemptor *preemptors;
-
- /* For each signal that may be pending, the details to deliver it with. */
- struct hurd_signal_detail pending_data[NSIG];
-
- /* If `suspended' is set when this thread gets a signal,
- the signal thread sends an empty message to it. */
- mach_port_t suspended;
-
- /* The following members are not locked. They are used only by this
- thread, or by the signal thread with this thread suspended. */
-
- volatile mach_port_t intr_port; /* Port interruptible RPC was sent on. */
-
- /* If this is not null, the thread is in sigreturn awaiting delivery of
- pending signals. This context (the machine-dependent portions only)
- will be passed to sigreturn after running the handler for a pending
- signal, instead of examining the thread state. */
- struct sigcontext *context;
-
- /* This is the head of the thread's list of active resources; see
- <hurd/userlink.h> for details. This member is only used by the
- thread itself, and always inside a critical section. */
- struct hurd_userlink *active_resources;
-
- /* These are locked normally. */
- int cancel; /* Flag set by hurd_thread_cancel. */
- void (*cancel_hook) (void); /* Called on cancellation. */
- };
-
-/* Linked list of states of all threads whose state has been asked for. */
-
-extern struct hurd_sigstate *_hurd_sigstates;
-
-extern struct mutex _hurd_siglock; /* Locks _hurd_sigstates. */
-
-/* Get the sigstate of a given thread, taking its lock. */
-
-extern struct hurd_sigstate *_hurd_thread_sigstate (thread_t);
-
-/* Get the sigstate of the current thread.
- This uses a per-thread variable to optimize the lookup. */
-
-extern struct hurd_sigstate *_hurd_self_sigstate (void)
- /* This declaration tells the compiler that the value is constant.
- We assume this won't be called twice from the same stack frame
- by different threads. */
- __attribute__ ((__const__));
-
-#ifndef _HURD_SIGNAL_H_EXTERN_INLINE
-#define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline
-#endif
-
-_HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate *
-_hurd_self_sigstate (void)
-{
- struct hurd_sigstate **location = (struct hurd_sigstate **)
- (void *) __hurd_threadvar_location (_HURD_THREADVAR_SIGSTATE);
- if (*location == NULL)
- *location = _hurd_thread_sigstate (__mach_thread_self ());
- return *location;
-}
-
-/* Thread listening on our message port; also called the "signal thread". */
-
-extern thread_t _hurd_msgport_thread;
-
-/* Our message port. We hold the receive right and _hurd_msgport_thread
- listens for messages on it. We also hold a send right, for convenience. */
-
-extern mach_port_t _hurd_msgport;
-
-
-/* Thread to receive process-global signals. */
-
-extern thread_t _hurd_sigthread;
-
-
-/* Resource limit on core file size. Enforced by hurdsig.c. */
-extern int _hurd_core_limit;
-
-/* Critical sections.
-
- A critical section is a section of code which cannot safely be interrupted
- to run a signal handler; for example, code that holds any lock cannot be
- interrupted lest the signal handler try to take the same lock and
- deadlock result. */
-
-_HURD_SIGNAL_H_EXTERN_INLINE void *
-_hurd_critical_section_lock (void)
-{
- struct hurd_sigstate **location = (struct hurd_sigstate **)
- (void *) __hurd_threadvar_location (_HURD_THREADVAR_SIGSTATE);
- struct hurd_sigstate *ss = *location;
- if (ss == NULL)
- {
- /* The thread variable is unset; this must be the first time we've
- asked for it. In this case, the critical section flag cannot
- possible already be set. Look up our sigstate structure the slow
- way. */
- ss = *location = _hurd_thread_sigstate (__mach_thread_self ());
- }
-
- if (! __spin_try_lock (&ss->critical_section_lock))
- /* We are already in a critical section, so do nothing. */
- return NULL;
-
- /* With the critical section lock held no signal handler will run.
- Return our sigstate pointer; this will be passed to
- _hurd_critical_section_unlock to unlock it. */
- return ss;
-}
-
-_HURD_SIGNAL_H_EXTERN_INLINE void
-_hurd_critical_section_unlock (void *our_lock)
-{
- if (our_lock == NULL)
- /* The critical section lock was held when we began. Do nothing. */
- return;
- else
- {
- /* It was us who acquired the critical section lock. Unlock it. */
- struct hurd_sigstate *ss = (struct hurd_sigstate *) our_lock;
- sigset_t pending;
- __spin_lock (&ss->lock);
- __spin_unlock (&ss->critical_section_lock);
- pending = ss->pending & ~ss->blocked;
- __spin_unlock (&ss->lock);
- if (! __sigisemptyset (&pending))
- /* There are unblocked signals pending, which weren't
- delivered because we were in the critical section.
- Tell the signal thread to deliver them now. */
- __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
- }
-}
-
-/* Convenient macros for simple uses of critical sections.
- These two must be used as a pair at the same C scoping level. */
-
-#define HURD_CRITICAL_BEGIN \
- { void *__hurd_critical__ = _hurd_critical_section_lock ()
-#define HURD_CRITICAL_END \
- _hurd_critical_section_unlock (__hurd_critical__); } while (0)
-
-/* Initialize the signal code, and start the signal thread.
- Arguments give the "init ints" from exec_startup. */
-
-extern void _hurdsig_init (const int *intarray, size_t intarraysize);
-
-/* Initialize proc server-assisted fault recovery for the signal thread. */
-
-extern void _hurdsig_fault_init (void);
-
-/* Raise a signal as described by SIGNO an DETAIL, on the thread whose
- sigstate SS points to. If SS is a null pointer, this instead affects
- the calling thread. */
-
-extern int _hurd_raise_signal (struct hurd_sigstate *ss, int signo,
- const struct hurd_signal_detail *detail);
-
-/* Translate a Mach exception into a signal (machine-dependent). */
-
-extern void _hurd_exception2signal (struct hurd_signal_detail *detail,
- int *signo);
-
-
-/* Make the thread described by SS take the signal described by SIGNO and
- DETAIL. If the process is traced, this will in fact stop with a SIGNO
- as the stop signal unless UNTRACED is nonzero. When the signal can be
- considered delivered, sends a sig_post reply message on REPLY_PORT
- indicating success. SS is not locked. */
-
-extern void _hurd_internal_post_signal (struct hurd_sigstate *ss,
- int signo,
- struct hurd_signal_detail *detail,
- mach_port_t reply_port,
- mach_msg_type_name_t reply_port_type,
- int untraced);
-
-/* Set up STATE and SS to handle signal SIGNO by running HANDLER. If
- RPC_WAIT is nonzero, the thread needs to wait for a pending RPC to
- finish before running the signal handler. The handler is passed SIGNO,
- SIGCODE, and the returned `struct sigcontext' (which resides on the
- stack the handler will use, and which describes the state of the thread
- encoded in STATE before running the handler). */
-
-struct machine_thread_all_state;
-extern struct sigcontext *
-_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
- int signo, struct hurd_signal_detail *detail,
- int rpc_wait, struct machine_thread_all_state *state);
-
-/* Function run by the signal thread to receive from the signal port. */
-
-extern void _hurd_msgport_receive (void);
-
-/* Set up STATE with a thread state that, when resumed, is
- like `longjmp (_hurd_sigthread_fault_env, 1)'. */
-
-extern void _hurd_initialize_fault_recovery_state (void *state);
-
-/* Set up STATE to do the equivalent of `longjmp (ENV, VAL);'. */
-
-extern void _hurd_longjmp_thread_state (void *state, jmp_buf env, int value);
-
-/* Function run for SIGINFO when its action is SIG_DFL and the current
- process is the session leader. */
-
-extern void _hurd_siginfo_handler (int);
-
-/* Replacement for mach_msg used in RPCs to provide Hurd interruption
- semantics. Args are all the same as for mach_msg. intr-rpc.h arranges
- for this version to be used automatically by the RPC stubs the library
- builds in place of the normal mach_msg. */
-error_t _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
- mach_msg_option_t option,
- mach_msg_size_t send_size,
- mach_msg_size_t rcv_size,
- mach_port_t rcv_name,
- mach_msg_timeout_t timeout,
- mach_port_t notify);
-
-
-/* Milliseconds to wait for an interruptible RPC to return after
- `interrupt_operation'. */
-
-extern mach_msg_timeout_t _hurd_interrupted_rpc_timeout;
-
-
-/* Mask of signals that cannot be caught, blocked, or ignored. */
-#define _SIG_CANT_MASK (__sigmask (SIGSTOP) | __sigmask (SIGKILL))
-
-/* Do an RPC to a process's message port.
-
- Each argument is an expression which returns an error code; each
- expression may be evaluated several times. FETCH_MSGPORT_EXPR should
- fetch the appropriate message port and store it in the local variable
- `msgport'; it will be deallocated after use. FETCH_REFPORT_EXPR should
- fetch the appropriate message port and store it in the local variable
- `refport' (if no reference port is needed in the call, then
- FETCH_REFPORT_EXPR should be simply KERN_SUCCESS or 0); if
- DEALLOC_REFPORT evaluates to nonzero it will be deallocated after use,
- otherwise the FETCH_REFPORT_EXPR must take care of user references to
- `refport'. RPC_EXPR should perform the desired RPC operation using
- `msgport' and `refport'.
-
- The reason for the complexity is that a process's message port and
- reference port may change between fetching those ports and completing an
- RPC using them (usually they change only when a process execs). The RPC
- will fail with MACH_SEND_INVALID_DEST if the msgport dies before we can
- send the RPC request; or with MIG_SERVER_DIED if the msgport was
- destroyed after we sent the RPC request but before it was serviced. In
- either of these cases, we retry the entire operation, discarding the old
- message and reference ports and fetch them anew. */
-
-#define HURD_MSGPORT_RPC(fetch_msgport_expr, \
- fetch_refport_expr, dealloc_refport, \
- rpc_expr) \
-({ \
- error_t __err; \
- mach_port_t msgport, refport = MACH_PORT_NULL; \
- do \
- { \
- /* Get the message port. */ \
- __err = (error_t) (fetch_msgport_expr); \
- if (__err) \
- break; \
- /* Get the reference port. */ \
- __err = (error_t) (fetch_refport_expr); \
- if (__err) \
- { \
- /* Couldn't get it; deallocate MSGPORT and fail. */ \
- __mach_port_deallocate (__mach_task_self (), msgport); \
- break; \
- } \
- __err = (error_t) (rpc_expr); \
- __mach_port_deallocate (__mach_task_self (), msgport); \
- if ((dealloc_refport) && refport != MACH_PORT_NULL) \
- __mach_port_deallocate (__mach_task_self (), refport); \
- } while (__err == MACH_SEND_INVALID_DEST || \
- __err == MIG_SERVER_DIED); \
- __err; \
-})
-
-
-#endif /* hurd/signal.h */
diff --git a/hurd/hurd/sigpreempt.h b/hurd/hurd/sigpreempt.h
deleted file mode 100644
index 406f0f58fa..0000000000
--- a/hurd/hurd/sigpreempt.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* Preemption of Hurd signals before POSIX.1 semantics take over.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_SIGPREEMPT_H
-
-#define _HURD_SIGPREEMPT_H 1
-#include <errno.h>
-#include <signal.h> /* For sigset_t, sighandler_t, SIG_ERR. */
-struct hurd_sigstate; /* <hurd/signal.h> */
-struct hurd_signal_detail; /* <hurd/signal.h> */
-
-struct hurd_signal_preemptor
- {
- /* These members select which signals this structure will apply to.
- The rest of the structure is only consulted if these match. */
- sigset_t signals; /* Signals preempted. */
- unsigned long int first, last; /* Range of sigcode values preempted. */
-
- /* This function will be called (with SS->lock held) to decide what to
- do with the signal described. It may modify the codes of the signal
- passed. If the return value is SIG_ERR, the next matching preemptor
- is tried, or the normal handling is done for the signal (which may
- have been changed by the preemptor function). Otherwise, the signal
- is processed as if the return value were its handler setting. */
- sighandler_t (*preemptor) (struct hurd_signal_preemptor *preemptor,
- struct hurd_sigstate *ss,
- int *signo, struct hurd_signal_detail *detail);
- /* If PREEMPTOR is null, act as if it returned HANDLER. */
- sighandler_t handler;
-
- struct hurd_signal_preemptor *next; /* List structure. */
- };
-
-#define HURD_PREEMPT_SIGNAL_P(preemptor, signo, sigcode) \
- (((preemptor)->signals & sigmask (signo)) && \
- (sigcode) >= (preemptor)->first && (sigcode) <= (preemptor)->last)
-
-
-/* Signal preemptors applying to all threads; locked by _hurd_siglock. */
-extern struct hurd_signal_preemptor *_hurdsig_preemptors;
-extern sigset_t _hurdsig_preempted_set;
-
-
-/* The caller must initialize all members of *PREEMPTOR except `next'.
- The preemptor is registered on the global list. */
-void hurd_preempt_signals (struct hurd_signal_preemptor *preemptor);
-
-/* Remove a preemptor registered with hurd_preempt_signals. */
-void hurd_unpreempt_signals (struct hurd_signal_preemptor *preemptor);
-
-
-/* Call *OPERATE and return its value. If a signal in SIGSET with a sigcode
- in the range [FIRST,LAST] arrives during the call, catch it. If HANDLER
- is a function, it handles the signal in the normal way (i.e. it should
- longjmp unless it can restart the insn on return). If it is SIG_ERR,
- hurd_catch_signal returns the sc_error value from the signal (or
- EGRATUITOUS if that is zero).
-
- The preemptor structure is passed to *OPERATE, which may modify its
- sigcode range or functions at any time during which it is guaranteed no
- signal in SIGSET will arrive. */
-
-error_t hurd_catch_signal (sigset_t sigset,
- unsigned long int first, unsigned long int last,
- error_t (*operate) (struct hurd_signal_preemptor *),
- sighandler_t handler);
-
-
-/* Convenience functions using `hurd_catch_signal'. */
-
-
-/* Like `memset', but catch faults in DEST. */
-error_t hurd_safe_memset (void *dest, int byte, size_t nbytes);
-
-/* Like `memcpy', but catch faults in SRC. */
-error_t hurd_safe_copyin (void *dest, const void *src, size_t nbytes);
-
-/* Like `memcpy', but catch faults in DEST. */
-error_t hurd_safe_copyout (void *dest, const void *src, size_t nbytes);
-
-/* Like `memmove', but catch faults in SRC or DEST.
- If only one region is expected to fault, it is more efficient
- to use `hurd_safe_copyin' or `hurd_safe_copyout' as appropriate. */
-error_t hurd_safe_memmove (void *dest, const void *src, size_t nbytes);
-
-
-#endif /* hurd/sigpreempt.h */
diff --git a/hurd/hurd/threadvar.h b/hurd/hurd/threadvar.h
deleted file mode 100644
index 72982e1744..0000000000
--- a/hurd/hurd/threadvar.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Internal per-thread variables for the Hurd.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_THREADVAR_H
-#define _HURD_THREADVAR_H
-
-#include <features.h>
-
-/* The per-thread variables are found by ANDing this mask
- with the value of the stack pointer and then adding this offset.
-
- In the multi-threaded case, cthreads initialization sets
- __hurd_threadvar_stack_mask to ~(cthread_stack_size - 1), a mask which
- finds the base of the fixed-size cthreads stack; and
- __hurd_threadvar_stack_offset to a small offset that skips the data
- cthreads itself maintains at the base of each thread's stack.
-
- In the single-threaded case, __hurd_threadvar_stack_mask is zero, so the
- stack pointer is ignored; and __hurd_threadvar_stack_offset gives the
- address of a small allocated region which contains the variables for the
- single thread. */
-
-extern unsigned long int __hurd_threadvar_stack_mask;
-extern unsigned long int __hurd_threadvar_stack_offset;
-
-/* A special case must always be made for the signal thread. Even when there
- is only one user thread and an allocated region can be used for the user
- thread's variables, the signal thread needs to have its own location for
- per-thread variables. The variables __hurd_sigthread_stack_base and
- __hurd_sigthread_stack_end define the bounds of the stack used by the
- signal thread, so that thread can always be specifically identified. */
-
-extern unsigned long int __hurd_sigthread_stack_base;
-extern unsigned long int __hurd_sigthread_stack_end;
-extern unsigned long int *__hurd_sigthread_variables;
-
-
-/* At the location described by the two variables above,
- there are __hurd_threadvar_max `unsigned long int's of per-thread data. */
-extern unsigned int __hurd_threadvar_max;
-
-/* These values are the indices for the standard per-thread variables. */
-enum __hurd_threadvar_index
- {
- _HURD_THREADVAR_MIG_REPLY, /* Reply port for MiG user stub functions. */
- _HURD_THREADVAR_ERRNO, /* `errno' value for this thread. */
- _HURD_THREADVAR_SIGSTATE, /* This thread's `struct hurd_sigstate'. */
- _HURD_THREADVAR_DYNAMIC_USER, /* Dynamically-assigned user variables. */
- _HURD_THREADVAR_MALLOC, /* For use of malloc. */
- _HURD_THREADVAR_DL_ERROR, /* For use of -ldl and dynamic linker. */
- _HURD_THREADVAR_RPC_VARS, /* For state of RPC functions. */
- _HURD_THREADVAR_LOCALE, /* For thread-local locale setting. */
- _HURD_THREADVAR_CTYPE_B, /* Cache of thread-local locale data. */
- _HURD_THREADVAR_CTYPE_TOLOWER, /* Cache of thread-local locale data. */
- _HURD_THREADVAR_CTYPE_TOUPPER, /* Cache of thread-local locale data. */
- _HURD_THREADVAR_MAX /* Default value for __hurd_threadvar_max. */
- };
-
-
-#ifndef _HURD_THREADVAR_H_EXTERN_INLINE
-#define _HURD_THREADVAR_H_EXTERN_INLINE __extern_inline
-#endif
-
-/* Return the location of the value for the per-thread variable with index
- INDEX used by the thread whose stack pointer is SP. */
-
-extern unsigned long int *__hurd_threadvar_location_from_sp
- (enum __hurd_threadvar_index __index, void *__sp);
-_HURD_THREADVAR_H_EXTERN_INLINE unsigned long int *
-__hurd_threadvar_location_from_sp (enum __hurd_threadvar_index __index,
- void *__sp)
-{
- unsigned long int __stack = (unsigned long int) __sp;
- return &((__stack >= __hurd_sigthread_stack_base &&
- __stack < __hurd_sigthread_stack_end)
- ? __hurd_sigthread_variables
- : (unsigned long int *) ((__stack & __hurd_threadvar_stack_mask) +
- __hurd_threadvar_stack_offset))[__index];
-}
-
-#include <machine-sp.h> /* Define __thread_stack_pointer. */
-
-/* Return the location of the current thread's value for the
- per-thread variable with index INDEX. */
-
-extern unsigned long int *
-__hurd_threadvar_location (enum __hurd_threadvar_index __index) __THROW
- /* This declaration tells the compiler that the value is constant
- given the same argument. We assume this won't be called twice from
- the same stack frame by different threads. */
- __attribute__ ((__const__));
-
-_HURD_THREADVAR_H_EXTERN_INLINE unsigned long int *
-__hurd_threadvar_location (enum __hurd_threadvar_index __index)
-{
- return __hurd_threadvar_location_from_sp (__index,
- __thread_stack_pointer ());
-}
-
-
-#endif /* hurd/threadvar.h */
diff --git a/hurd/hurd/userlink.h b/hurd/hurd/userlink.h
deleted file mode 100644
index 4946402df5..0000000000
--- a/hurd/hurd/userlink.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* Support for chains recording users of a resource; `struct hurd_userlink'.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_USERLINK_H
-
-#define _HURD_USERLINK_H 1
-#include <features.h>
-
-#define __need_NULL
-#include <stddef.h>
-
-#include <hurd/signal.h>
-#include <setjmp.h>
-
-
-/* This structure records a link in two doubly-linked lists.
- We call these the per-resource user list and the per-thread
- active-resource list.
-
- Users of a given resource are recorded by their presence in a list
- associated with that resource. A user attaches his own link (in local
- storage on his stack) to a shared chain at the time he begins using some
- resource. When finished with that resource, the user removes his link
- from the chain. If his link is the last (there are no other users of
- the resource), and his chain has been detached from the shared cell (the
- resource in the cell has been replaced), then the user deallocates the
- resource that he used.
-
- All uses of shared resources by a single thread are linked together by
- its `active-resource' list; the head of this list is stored in the
- per-thread sigstate structure. When the thread makes a non-local exit
- (i.e. longjmp), it will examine its active-resource list, and each link
- residing in a stack frame being jumped out of will be unlinked from both
- the resource's user list and the thread's active-resource list, and
- deallocate the resource if that was the last user link for that resource.
-
- NOTE: Access to a thread's active-resource list must always be done
- inside a signal-proof critical section; the functions in this file
- assume they are called inside a critical section, and do no locking of
- their own. Also important: the longjmp cleanup relies on all userlink
- structures residing on the stack of the using thread. */
-
-struct hurd_userlink
- {
- struct
- {
- struct hurd_userlink *next, **prevp;
- } resource, thread;
-
- /* This function is called when a non-local exit
- unwinds the frame containing this link. */
- void (*cleanup) (void *cleanup_data, jmp_buf env, int val);
- void *cleanup_data;
- };
-
-
-#ifndef _HURD_USERLINK_H_EXTERN_INLINE
-#define _HURD_USERLINK_H_EXTERN_INLINE __extern_inline
-#endif
-
-
-/* Attach LINK to the chain of users at *CHAINP. */
-
-_HURD_USERLINK_H_EXTERN_INLINE void
-_hurd_userlink_link (struct hurd_userlink **chainp,
- struct hurd_userlink *link)
-{
- struct hurd_userlink **thread_chainp;
-
- link->resource.next = *chainp;
- if (link->resource.next)
- link->resource.next->resource.prevp = &link->resource.next;
- link->resource.prevp = chainp;
- *chainp = link;
-
- /* Also chain it on the current thread's list of active resources. */
- thread_chainp = &_hurd_self_sigstate ()->active_resources;
- link->thread.next = *thread_chainp;
- if (link->thread.next)
- link->thread.next->thread.prevp = &link->thread.next;
- link->thread.prevp = thread_chainp;
- *thread_chainp = link;
-}
-
-
-/* Detach LINK from its chain. Returns nonzero iff this was the
- last user of the resource and it should be deallocated. */
-
-_HURD_USERLINK_H_EXTERN_INLINE int
-_hurd_userlink_unlink (struct hurd_userlink *link)
-{
- /* We should deallocate the resource used if this chain has been detached
- from the cell (and thus has a nil `prevp'), and there is no next link
- representing another user reference to the same resource. */
- int dealloc = ! link->resource.next && ! link->resource.prevp;
-
- /* Remove our link from the chain of current users. */
- if (link->resource.prevp)
- *link->resource.prevp = link->resource.next;
- if (link->resource.next)
- link->resource.next->resource.prevp = link->resource.prevp;
-
- /* Remove our link from the chain of currently active resources
- for this thread. */
- *link->thread.prevp = link->thread.next;
- if (link->thread.next)
- link->thread.next->thread.prevp = link->thread.prevp;
-
- return dealloc;
-}
-
-
-/* Clear all users from *CHAINP. Call this when the resource *CHAINP
- protects is changing. If the return value is nonzero, no users are on
- the chain and the caller should deallocate the resource. If the return
- value is zero, someone is still using the resource and they will
- deallocate it when they are finished. */
-
-_HURD_USERLINK_H_EXTERN_INLINE int
-_hurd_userlink_clear (struct hurd_userlink **chainp)
-{
- if (*chainp == NULL)
- return 1;
-
- /* Detach the chain of current users from the cell. The last user to
- remove his link from that chain will deallocate the old resource. */
- (*chainp)->resource.prevp = NULL;
- *chainp = NULL;
- return 0;
-}
-
-#endif /* hurd/userlink.h */
diff --git a/hurd/hurd/xattr.h b/hurd/hurd/xattr.h
deleted file mode 100644
index bc4c2ce451..0000000000
--- a/hurd/hurd/xattr.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Access to extended attributes on files for GNU/Hurd.
- Copyright (C) 2005-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_XATTR_H
-#define _HURD_XATTR_H 1
-
-#include <sys/xattr.h> /* This defines the XATTR_* flags. */
-
-/* These are the internal versions of getxattr/setxattr/listxattr. */
-extern error_t _hurd_xattr_get (io_t port, const char *name,
- void *value, size_t *size);
-extern error_t _hurd_xattr_set (io_t port, const char *name,
- const void *value, size_t size, int flags);
-extern error_t _hurd_xattr_remove (io_t port, const char *name);
-extern error_t _hurd_xattr_list (io_t port, void *buffer, size_t *size);
-
-
-
-#endif /* hurd/xattr.h */
diff --git a/hurd/hurdauth.c b/hurd/hurdauth.c
deleted file mode 100644
index 6a7d69d027..0000000000
--- a/hurd/hurdauth.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/msg_server.h>
-#include <hurd/id.h>
-#include <string.h>
-
-int
-_hurd_refport_secure_p (mach_port_t ref)
-{
- if (ref == __mach_task_self ())
- return 1;
- if (__USEPORT (AUTH, ref == port))
- return 1;
- return 0;
-}
-
-kern_return_t
-_S_msg_add_auth (mach_port_t me,
- auth_t addauth)
-{
- error_t err;
- auth_t newauth;
- uid_t *genuids, *gengids, *auxuids, *auxgids;
- mach_msg_type_number_t ngenuids, ngengids, nauxuids, nauxgids;
- uid_t *newgenuids, *newgengids, *newauxuids, *newauxgids;
- mach_msg_type_number_t nnewgenuids, nnewgengids, nnewauxuids, nnewauxgids;
-
- /* Create a list of ids and store it in NEWLISTP, length NEWLISTLEN.
- Keep all the ids in EXIST (len NEXIST), adding in those from NEW
- (len NNEW) which are not already there. */
- error_t make_list (uid_t **newlistp, mach_msg_type_number_t *newlistlen,
- uid_t *exist, mach_msg_type_number_t nexist,
- uid_t *new, mach_msg_type_number_t nnew)
- {
- error_t urp;
- int i, j, k;
- vm_size_t offset;
-
- urp = vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
- nexist + nnew * sizeof (uid_t), 1);
- if (urp)
- return urp;
-
- j = 0;
- for (i = 0; i < nexist; i++)
- (*newlistp)[j++] = exist[i];
-
- for (i = 0; i < nnew; i++)
- {
- for (k = 0; k < nexist; k++)
- if (exist[k] == new[i])
- break;
- if (k < nexist)
- continue;
-
- (*newlistp)[j++] = new[i];
- }
-
- offset = (round_page (nexist + nnew * sizeof (uid_t))
- - round_page (j * sizeof (uid_t)));
- if (offset)
- vm_deallocate (mach_task_self (),
- (vm_address_t) (*newlistp
- + (nexist + nnew * sizeof (uid_t))),
- offset);
- *newlistlen = j;
- return 0;
- }
-
- /* Find out what ids ADDAUTH refers to */
-
- genuids = gengids = auxuids = auxgids = 0;
- ngenuids = ngengids = nauxuids = nauxgids = 0;
- err = __auth_getids (addauth,
- &genuids, &ngenuids,
- &auxuids, &nauxuids,
- &gengids, &ngengids,
- &auxgids, &nauxgids);
- if (err)
- return err;
-
- /* OR in these ids to what we already have, creating a new list. */
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_id.lock);
- _hurd_check_ids ();
-
-#define MAKE(genaux,uidgid) \
- make_list (&new ## genaux ## uidgid ## s, \
- &nnew ## genaux ## uidgid ## s, \
- _hurd_id.genaux.uidgid ## s, \
- _hurd_id.genaux.n ## uidgid ## s, \
- genaux ## uidgid ## s, \
- n ## genaux ## uidgid ## s)
-
- err = MAKE (gen, uid);
- if (!err)
- MAKE (aux, uid);
- if (!err)
- MAKE (gen, gid);
- if (!err)
- MAKE (aux, gid);
-#undef MAKE
-
- __mutex_unlock (&_hurd_id.lock);
- HURD_CRITICAL_END;
-
-
- /* Create the new auth port */
-
- if (!err)
- err = __USEPORT (AUTH,
- __auth_makeauth (port,
- &addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
- newgenuids, nnewgenuids,
- newauxuids, nnewauxuids,
- newgengids, nnewgengids,
- newauxgids, nnewauxgids,
- &newauth));
-
-#define freeup(array, len) \
- if (array) \
- vm_deallocate (mach_task_self (), (vm_address_t) array, \
- len * sizeof (uid_t));
-
- freeup (genuids, ngenuids);
- freeup (auxuids, nauxuids);
- freeup (gengids, ngengids);
- freeup (auxgids, nauxgids);
- freeup (newgenuids, nnewgenuids);
- freeup (newauxuids, nnewauxuids);
- freeup (newgengids, nnewgengids);
- freeup (newauxgids, nnewauxgids);
-#undef freeup
-
- if (err)
- return err;
-
- /* And install it. */
-
- err = __setauth (newauth);
- __mach_port_deallocate (__mach_task_self (), newauth);
- if (err)
- return errno;
-
- return 0;
-}
-
-kern_return_t
-_S_msg_del_auth (mach_port_t me,
- task_t task,
- intarray_t uids, mach_msg_type_number_t nuids,
- intarray_t gids, mach_msg_type_number_t ngids)
-{
- error_t err;
- auth_t newauth;
-
- if (!_hurd_refport_secure_p (task))
- return EPERM;
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_id.lock);
- err = _hurd_check_ids ();
-
- if (!err)
- {
- size_t i, j;
- size_t nu = _hurd_id.gen.nuids, ng = _hurd_id.gen.ngids;
- uid_t newu[nu];
- gid_t newg[ng];
-
- memcpy (newu, _hurd_id.gen.uids, nu * sizeof (uid_t));
- memcpy (newg, _hurd_id.gen.gids, ng * sizeof (gid_t));
-
- for (j = 0; j < nuids; ++j)
- {
- const uid_t uid = uids[j];
- for (i = 0; i < nu; ++i)
- if (newu[i] == uid)
- /* Move the last uid into this slot, and decrease the
- number of uids so the last slot is no longer used. */
- newu[i] = newu[--nu];
- }
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) uids, nuids * sizeof (uid_t));
-
- for (j = 0; j < ngids; ++j)
- {
- const gid_t gid = gids[j];
- for (i = 0; i < nu; ++i)
- if (newu[i] == gid)
- /* Move the last gid into this slot, and decrease the
- number of gids so the last slot is no longer used. */
- newu[i] = newu[--nu];
- }
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) gids, ngids * sizeof (gid_t));
-
- err = __USEPORT (AUTH, __auth_makeauth
- (port,
- NULL, MACH_MSG_TYPE_COPY_SEND, 0,
- newu, nu,
- _hurd_id.aux.uids, _hurd_id.aux.nuids,
- newg, ng,
- _hurd_id.aux.uids, _hurd_id.aux.ngids,
- &newauth));
- }
- __mutex_unlock (&_hurd_id.lock);
- HURD_CRITICAL_END;
-
- if (err)
- return err;
-
- err = __setauth (newauth);
- __mach_port_deallocate (__mach_task_self (), newauth);
- if (err)
- return errno;
-
- return 0;
-}
diff --git a/hurd/hurdchdir.c b/hurd/hurdchdir.c
deleted file mode 100644
index b38734d8f6..0000000000
--- a/hurd/hurdchdir.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Change a port cell to a directory by looking up a name.
- Copyright (C) 1999-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/port.h>
-#include <hurd/fd.h>
-#include <fcntl.h>
-#include <string.h>
-
-int
-_hurd_change_directory_port_from_name (struct hurd_port *portcell,
- const char *name)
-{
- size_t len;
- const char *lookup;
- file_t dir;
-
- /* Append trailing "/." to directory name to force ENOTDIR if it's not a
- directory and EACCES if we don't have search permission. */
- len = strlen (name);
- if (len >= 2 && name[len - 2] == '/' && name[len - 1] == '.')
- lookup = name;
- else if (len == 0)
- /* Special-case empty file name according to POSIX. */
- return __hurd_fail (ENOENT);
- else
- {
- char *n = alloca (len + 3);
- memcpy (n, name, len);
- n[len] = '/';
- n[len + 1] = '.';
- n[len + 2] = '\0';
- lookup = n;
- }
-
- dir = __file_name_lookup (lookup, 0, 0);
- if (dir == MACH_PORT_NULL)
- return -1;
-
- _hurd_port_set (portcell, dir);
- return 0;
-}
diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c
deleted file mode 100644
index 98b8dca674..0000000000
--- a/hurd/hurdexec.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/signal.h>
-#include <hurd/id.h>
-#include <assert.h>
-#include <argz.h>
-
-/* Overlay TASK, executing FILE with arguments ARGV and environment ENVP.
- If TASK == mach_task_self (), some ports are dealloc'd by the exec server.
- ARGV and ENVP are terminated by NULL pointers. */
-error_t
-_hurd_exec (task_t task, file_t file,
- char *const argv[], char *const envp[])
-{
- error_t err;
- char *args, *env;
- size_t argslen, envlen;
- int ints[INIT_INT_MAX];
- mach_port_t ports[_hurd_nports];
- struct hurd_userlink ulink_ports[_hurd_nports];
- inline void free_port (unsigned int i)
- {
- _hurd_port_free (&_hurd_ports[i], &ulink_ports[i], ports[i]);
- }
- file_t *dtable;
- unsigned int dtablesize, i;
- struct hurd_port **dtable_cells;
- struct hurd_userlink *ulink_dtable;
- struct hurd_sigstate *ss;
- mach_port_t *please_dealloc, *pdp;
- int reauth = 0;
-
- /* XXX needs to be hurdmalloc XXX */
- if (argv == NULL)
- args = NULL, argslen = 0;
- else if (err = __argz_create (argv, &args, &argslen))
- return err;
- if (envp == NULL)
- env = NULL, envlen = 0;
- else if (err = __argz_create (envp, &env, &envlen))
- goto outargs;
-
- /* Load up the ports to give to the new program. */
- for (i = 0; i < _hurd_nports; ++i)
- if (i == INIT_PORT_PROC && task != __mach_task_self ())
- {
- /* This is another task, so we need to ask the proc server
- for the right proc server port for it. */
- if (err = __USEPORT (PROC, __proc_task2proc (port, task, &ports[i])))
- {
- while (--i > 0)
- free_port (i);
- goto outenv;
- }
- }
- else
- ports[i] = _hurd_port_get (&_hurd_ports[i], &ulink_ports[i]);
-
-
- /* Load up the ints to give the new program. */
- for (i = 0; i < INIT_INT_MAX; ++i)
- switch (i)
- {
- case INIT_UMASK:
- ints[i] = _hurd_umask;
- break;
-
- case INIT_SIGMASK:
- case INIT_SIGIGN:
- case INIT_SIGPENDING:
- /* We will set these all below. */
- break;
-
- case INIT_TRACEMASK:
- ints[i] = _hurdsig_traced;
- break;
-
- default:
- ints[i] = 0;
- }
-
- ss = _hurd_self_sigstate ();
-
- assert (! __spin_lock_locked (&ss->critical_section_lock));
- __spin_lock (&ss->critical_section_lock);
-
- __spin_lock (&ss->lock);
- ints[INIT_SIGMASK] = ss->blocked;
- ints[INIT_SIGPENDING] = ss->pending;
- ints[INIT_SIGIGN] = 0;
- for (i = 1; i < NSIG; ++i)
- if (ss->actions[i].sa_handler == SIG_IGN)
- ints[INIT_SIGIGN] |= __sigmask (i);
-
- /* We hold the sigstate lock until the exec has failed so that no signal
- can arrive between when we pack the blocked and ignored signals, and
- when the exec actually happens. A signal handler could change what
- signals are blocked and ignored. Either the change will be reflected
- in the exec, or the signal will never be delivered. Setting the
- critical section flag avoids anything we call trying to acquire the
- sigstate lock. */
-
- __spin_unlock (&ss->lock);
-
- /* Pack up the descriptor table to give the new program. */
- __mutex_lock (&_hurd_dtable_lock);
-
- dtablesize = _hurd_dtable ? _hurd_dtablesize : _hurd_init_dtablesize;
-
- if (task == __mach_task_self ())
- /* Request the exec server to deallocate some ports from us if the exec
- succeeds. The init ports and descriptor ports will arrive in the
- new program's exec_startup message. If we failed to deallocate
- them, the new program would have duplicate user references for them.
- But we cannot deallocate them ourselves, because we must still have
- them after a failed exec call. */
- please_dealloc = __alloca ((_hurd_nports + 3 + (3 * dtablesize))
- * sizeof (mach_port_t));
- else
- please_dealloc = NULL;
- pdp = please_dealloc;
-
- if (_hurd_dtable != NULL)
- {
- dtable = __alloca (dtablesize * sizeof (dtable[0]));
- ulink_dtable = __alloca (dtablesize * sizeof (ulink_dtable[0]));
- dtable_cells = __alloca (dtablesize * sizeof (dtable_cells[0]));
- for (i = 0; i < dtablesize; ++i)
- {
- struct hurd_fd *const d = _hurd_dtable[i];
- if (d == NULL)
- {
- dtable[i] = MACH_PORT_NULL;
- continue;
- }
- __spin_lock (&d->port.lock);
- if (d->flags & FD_CLOEXEC)
- {
- /* This descriptor is marked to be closed on exec.
- So don't pass it to the new program. */
- dtable[i] = MACH_PORT_NULL;
- if (pdp && d->port.port != MACH_PORT_NULL)
- {
- /* We still need to deallocate the ports. */
- *pdp++ = d->port.port;
- if (d->ctty.port != MACH_PORT_NULL)
- *pdp++ = d->ctty.port;
- }
- __spin_unlock (&d->port.lock);
- }
- else
- {
- if (pdp && d->ctty.port != MACH_PORT_NULL)
- /* All the elements of DTABLE are added to PLEASE_DEALLOC
- below, so we needn't add the port itself.
- But we must deallocate the ctty port as well as
- the normal port that got installed in DTABLE[I]. */
- *pdp++ = d->ctty.port;
- dtable[i] = _hurd_port_locked_get (&d->port, &ulink_dtable[i]);
- dtable_cells[i] = &d->port;
- }
- }
- }
- else
- {
- dtable = _hurd_init_dtable;
- ulink_dtable = NULL;
- dtable_cells = NULL;
- }
-
- /* Prune trailing null ports from the descriptor table. */
- while (dtablesize > 0 && dtable[dtablesize - 1] == MACH_PORT_NULL)
- --dtablesize;
-
- /* See if we need to diddle the auth port of the new program.
- The purpose of this is to get the effect setting the saved-set UID and
- GID to the respective effective IDs after the exec, as POSIX.1 requires.
- Note that we don't reauthenticate with the proc server; that would be a
- no-op since it only keeps track of the effective UIDs, and if it did
- keep track of the available IDs we would have the problem that we'd be
- changing the IDs before the exec and have to change them back after a
- failure. Arguably we could skip all the reauthentications because the
- available IDs have no bearing on any filesystem. But the conservative
- approach is to reauthenticate all the io ports so that no state anywhere
- reflects that our whole ID set differs from what we've set it to. */
- __mutex_lock (&_hurd_id.lock);
- err = _hurd_check_ids ();
- if (err == 0 && ((_hurd_id.aux.nuids >= 2 && _hurd_id.gen.nuids >= 1
- && _hurd_id.aux.uids[1] != _hurd_id.gen.uids[0])
- || (_hurd_id.aux.ngids >= 2 && _hurd_id.gen.ngids >= 1
- && _hurd_id.aux.gids[1] != _hurd_id.gen.gids[0])))
- {
- /* We have euid != svuid or egid != svgid. POSIX.1 says that exec
- sets svuid = euid and svgid = egid. So we must get a new auth
- port and reauthenticate everything with it. We'll pass the new
- ports in file_exec instead of our own ports. */
-
- auth_t newauth;
-
- _hurd_id.aux.uids[1] = _hurd_id.gen.uids[0];
- _hurd_id.aux.gids[1] = _hurd_id.gen.gids[0];
- _hurd_id.valid = 0;
- if (_hurd_id.rid_auth != MACH_PORT_NULL)
- {
- __mach_port_deallocate (__mach_task_self (), _hurd_id.rid_auth);
- _hurd_id.rid_auth = MACH_PORT_NULL;
- }
-
- err = __auth_makeauth (ports[INIT_PORT_AUTH],
- NULL, MACH_MSG_TYPE_COPY_SEND, 0,
- _hurd_id.gen.uids, _hurd_id.gen.nuids,
- _hurd_id.aux.uids, _hurd_id.aux.nuids,
- _hurd_id.gen.gids, _hurd_id.gen.ngids,
- _hurd_id.aux.gids, _hurd_id.aux.ngids,
- &newauth);
- if (err == 0)
- {
- /* Now we have to reauthenticate the ports with this new ID.
- */
-
- inline error_t reauth_io (io_t port, io_t *newport)
- {
- mach_port_t ref = __mach_reply_port ();
- *newport = MACH_PORT_NULL;
- error_t err = __io_reauthenticate (port,
- ref, MACH_MSG_TYPE_MAKE_SEND);
- if (!err)
- err = __auth_user_authenticate (newauth,
- ref, MACH_MSG_TYPE_MAKE_SEND,
- newport);
- __mach_port_destroy (__mach_task_self (), ref);
- return err;
- }
- inline void reauth_port (unsigned int idx)
- {
- io_t newport;
- err = reauth_io (ports[idx], &newport) ?: err;
- if (pdp)
- *pdp++ = ports[idx]; /* XXX presumed still in _hurd_ports */
- free_port (idx);
- ports[idx] = newport;
- }
-
- if (pdp)
- *pdp++ = ports[INIT_PORT_AUTH];
- free_port (INIT_PORT_AUTH);
- ports[INIT_PORT_AUTH] = newauth;
-
- reauth_port (INIT_PORT_CRDIR);
- reauth_port (INIT_PORT_CWDIR);
-
- if (!err)
- {
- /* Now we'll reauthenticate each file descriptor. */
- if (ulink_dtable == NULL)
- {
- assert (dtable == _hurd_init_dtable);
- dtable = __alloca (dtablesize * sizeof (dtable[0]));
- for (i = 0; i < dtablesize; ++i)
- if (_hurd_init_dtable[i] != MACH_PORT_NULL)
- {
- if (pdp)
- *pdp++ = _hurd_init_dtable[i];
- err = reauth_io (_hurd_init_dtable[i], &dtable[i]);
- if (err)
- {
- while (++i < dtablesize)
- dtable[i] = MACH_PORT_NULL;
- break;
- }
- }
- else
- dtable[i] = MACH_PORT_NULL;
- }
- else
- {
- if (pdp)
- {
- /* Ask to deallocate all the old fd ports,
- since we will have new ones in DTABLE. */
- memcpy (pdp, dtable, dtablesize * sizeof pdp[0]);
- pdp += dtablesize;
- }
- for (i = 0; i < dtablesize; ++i)
- if (dtable[i] != MACH_PORT_NULL)
- {
- io_t newport;
- err = reauth_io (dtable[i], &newport);
- _hurd_port_free (dtable_cells[i], &ulink_dtable[i],
- dtable[i]);
- dtable[i] = newport;
- if (err)
- {
- while (++i < dtablesize)
- _hurd_port_free (dtable_cells[i],
- &ulink_dtable[i], dtable[i]);
- break;
- }
- }
- ulink_dtable = NULL;
- dtable_cells = NULL;
- }
- }
- }
-
- reauth = 1;
- }
- __mutex_unlock (&_hurd_id.lock);
-
- /* The information is all set up now. Try to exec the file. */
- if (!err)
- {
- int flags;
-
- if (pdp)
- {
- /* Request the exec server to deallocate some ports from us if
- the exec succeeds. The init ports and descriptor ports will
- arrive in the new program's exec_startup message. If we
- failed to deallocate them, the new program would have
- duplicate user references for them. But we cannot deallocate
- them ourselves, because we must still have them after a failed
- exec call. */
-
- for (i = 0; i < _hurd_nports; ++i)
- *pdp++ = ports[i];
- for (i = 0; i < dtablesize; ++i)
- *pdp++ = dtable[i];
- }
-
- flags = 0;
-#ifdef EXEC_SIGTRAP
- /* PTRACE_TRACEME sets all bits in _hurdsig_traced, which is
- propagated through exec by INIT_TRACEMASK, so this checks if
- PTRACE_TRACEME has been called in this process in any of its
- current or prior lives. */
- if (__sigismember (&_hurdsig_traced, SIGKILL))
- flags |= EXEC_SIGTRAP;
-#endif
- err = __file_exec (file, task, flags,
- args, argslen, env, envlen,
- dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize,
- ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports,
- ints, INIT_INT_MAX,
- please_dealloc, pdp - please_dealloc,
- &_hurd_msgport, task == __mach_task_self () ? 1 : 0);
- }
-
- /* Release references to the standard ports. */
- for (i = 0; i < _hurd_nports; ++i)
- if ((i == INIT_PORT_PROC && task != __mach_task_self ())
- || (reauth && (i == INIT_PORT_AUTH
- || i == INIT_PORT_CRDIR || i == INIT_PORT_CWDIR)))
- __mach_port_deallocate (__mach_task_self (), ports[i]);
- else
- free_port (i);
-
- /* Release references to the file descriptor ports. */
- if (ulink_dtable != NULL)
- {
- for (i = 0; i < dtablesize; ++i)
- if (dtable[i] != MACH_PORT_NULL)
- _hurd_port_free (dtable_cells[i], &ulink_dtable[i], dtable[i]);
- }
- else if (dtable && dtable != _hurd_init_dtable)
- for (i = 0; i < dtablesize; ++i)
- __mach_port_deallocate (__mach_task_self (), dtable[i]);
-
- /* Release lock on the file descriptor table. */
- __mutex_unlock (&_hurd_dtable_lock);
-
- /* Safe to let signals happen now. */
- _hurd_critical_section_unlock (ss);
-
- outargs:
- free (args);
- outenv:
- free (env);
- return err;
-}
diff --git a/hurd/hurdfault.c b/hurd/hurdfault.c
deleted file mode 100644
index 9cd65b6cd9..0000000000
--- a/hurd/hurdfault.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/* Handle faults in the signal thread.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-#include "hurdfault.h"
-#include <errno.h>
-#include <string.h>
-#include <setjmp.h>
-#include <stdio.h>
-#include <thread_state.h>
-#include "faultexc_server.h" /* mig-generated header for our exc server. */
-#include <assert.h>
-
-jmp_buf _hurdsig_fault_env;
-struct hurd_signal_preemptor _hurdsig_fault_preemptor = {0};
-
-/* XXX temporary to deal with spelling fix */
-weak_alias (_hurdsig_fault_preemptor, _hurdsig_fault_preempter)
-
-static mach_port_t forward_sigexc;
-
-kern_return_t
-_hurdsig_fault_catch_exception_raise (mach_port_t port,
- thread_t thread,
- task_t task,
-#ifdef EXC_MASK_ALL /* New interface flavor. */
- exception_type_t exception,
- exception_data_t code,
- mach_msg_type_number_t codeCnt
-#else /* Vanilla Mach 3.0 interface. */
- integer_t exception,
- integer_t code, integer_t subcode
-#endif
- )
-{
- int signo;
- struct hurd_signal_detail d;
-
- if (port != forward_sigexc ||
- thread != _hurd_msgport_thread || task != __mach_task_self ())
- return EPERM; /* Strange bogosity. */
-
- d.exc = exception;
-#ifdef EXC_MASK_ALL
- assert (codeCnt >= 2);
- d.exc_code = code[0];
- d.exc_subcode = code[1];
-#else
- d.exc_code = code;
- d.exc_subcode = subcode;
-#endif
-
- /* Call the machine-dependent function to translate the Mach exception
- codes into a signal number and subcode. */
- _hurd_exception2signal (&d, &signo);
-
- return HURD_PREEMPT_SIGNAL_P (&_hurdsig_fault_preemptor, signo, d.code)
- ? 0 : EGREGIOUS;
-}
-
-#ifdef EXC_MASK_ALL
-/* XXX New interface flavor has additional RPCs that we could be using
- instead. These RPCs roll a thread_get_state/thread_set_state into
- the message, so the signal thread ought to use these to save some calls.
- */
-kern_return_t
-_hurdsig_fault_catch_exception_raise_state
-(mach_port_t port,
- exception_type_t exception,
- exception_data_t code,
- mach_msg_type_number_t codeCnt,
- int *flavor,
- thread_state_t old_state,
- mach_msg_type_number_t old_stateCnt,
- thread_state_t new_state,
- mach_msg_type_number_t *new_stateCnt)
-{
- abort ();
- return KERN_FAILURE;
-}
-
-kern_return_t
-_hurdsig_fault_catch_exception_raise_state_identity
-(mach_port_t exception_port,
- thread_t thread,
- task_t task,
- exception_type_t exception,
- exception_data_t code,
- mach_msg_type_number_t codeCnt,
- int *flavor,
- thread_state_t old_state,
- mach_msg_type_number_t old_stateCnt,
- thread_state_t new_state,
- mach_msg_type_number_t *new_stateCnt)
-{
- abort ();
- return KERN_FAILURE;
-}
-#endif
-
-
-#ifdef NDR_CHAR_ASCII /* OSF Mach flavors have different names. */
-# define mig_reply_header_t mig_reply_error_t
-#endif
-
-static void
-faulted (void)
-{
- struct
- {
- mach_msg_header_t head;
- char buf[64];
- } request;
- mig_reply_header_t reply;
- extern int _hurdsig_fault_exc_server (mach_msg_header_t *,
- mach_msg_header_t *);
-
- /* Wait for the exception_raise message forwarded by the proc server. */
-
- if (__mach_msg (&request.head, MACH_RCV_MSG, 0,
- sizeof request, forward_sigexc,
- MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL)
- != MACH_MSG_SUCCESS)
- __libc_fatal ("msg receive failed on signal thread exc\n");
-
- /* Run the exc demuxer which should call the server function above.
- That function returns 0 if the exception was expected. */
- _hurdsig_fault_exc_server (&request.head, &reply.Head);
- if (reply.Head.msgh_remote_port != MACH_PORT_NULL)
- __mach_msg (&reply.Head, MACH_SEND_MSG, reply.Head.msgh_size,
- 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
- if (reply.RetCode == MIG_BAD_ID)
- __mach_msg_destroy (&request.head);
-
- if (reply.RetCode)
- __libc_fatal ("BUG: unexpected fault in signal thread\n");
-
- _hurdsig_fault_preemptor.signals = 0;
- longjmp (_hurdsig_fault_env, 1);
-}
-
-static char faultstack[1024];
-
-/* Send exceptions for the signal thread to the proc server.
- It will forward the message on to our message port,
- and then restore the thread's state to code which
- does `longjmp (_hurd_sigthread_fault_env, 1)'. */
-
-void
-_hurdsig_fault_init (void)
-{
- error_t err;
- struct machine_thread_state state;
- mach_port_t sigexc;
-
- /* Allocate a port to receive signal thread exceptions.
- We will move this receive right to the proc server. */
- err = __mach_port_allocate (__mach_task_self (),
- MACH_PORT_RIGHT_RECEIVE, &sigexc);
- assert_perror (err);
- err = __mach_port_allocate (__mach_task_self (),
- MACH_PORT_RIGHT_RECEIVE, &forward_sigexc);
- assert_perror (err);
-
- /* Allocate a port to receive the exception msgs forwarded
- from the proc server. */
- err = __mach_port_insert_right (__mach_task_self (), sigexc,
- sigexc, MACH_MSG_TYPE_MAKE_SEND);
- assert_perror (err);
-
- /* Set the queue limit for this port to just one. The proc server will
- notice if we ever get a second exception while one remains queued and
- unreceived, and decide we are hopelessly buggy. */
-#ifdef MACH_PORT_RECEIVE_STATUS_COUNT
- {
- const mach_port_limits_t lim = { mpl_qlimit: 1 };
- assert (MACH_PORT_RECEIVE_STATUS_COUNT == sizeof lim / sizeof (natural_t));
- err = __mach_port_set_attributes (__mach_task_self (), forward_sigexc,
- MACH_PORT_RECEIVE_STATUS,
- (mach_port_info_t) &lim,
- MACH_PORT_RECEIVE_STATUS_COUNT);
- }
-#else
- err = __mach_port_set_qlimit (__mach_task_self (), forward_sigexc, 1);
-#endif
- assert_perror (err);
-
- /* This state will be restored when we fault.
- It runs the function above. */
- memset (&state, 0, sizeof state);
- MACHINE_THREAD_STATE_SET_PC (&state, faulted);
- MACHINE_THREAD_STATE_SET_SP (&state, faultstack, sizeof faultstack);
-
- err = __USEPORT
- (PROC,
- __proc_handle_exceptions (port,
- sigexc,
- forward_sigexc, MACH_MSG_TYPE_MAKE_SEND,
- MACHINE_THREAD_STATE_FLAVOR,
- (natural_t *) &state,
- MACHINE_THREAD_STATE_COUNT));
- assert_perror (err);
-
- /* Direct signal thread exceptions to the proc server. */
-#ifdef THREAD_EXCEPTION_PORT
- err = __thread_set_special_port (_hurd_msgport_thread,
- THREAD_EXCEPTION_PORT, sigexc);
-#elif defined (EXC_MASK_ALL)
- __thread_set_exception_ports (_hurd_msgport_thread,
- EXC_MASK_ALL & ~(EXC_MASK_SYSCALL
- | EXC_MASK_MACH_SYSCALL
- | EXC_MASK_RPC_ALERT),
- sigexc,
- EXCEPTION_STATE_IDENTITY,
- MACHINE_THREAD_STATE);
-#else
-# error thread_set_exception_ports?
-#endif
- __mach_port_deallocate (__mach_task_self (), sigexc);
- assert_perror (err);
-}
diff --git a/hurd/hurdfault.h b/hurd/hurdfault.h
deleted file mode 100644
index 9da5b684dc..0000000000
--- a/hurd/hurdfault.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Declarations for handling faults in the signal thread.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_FAULT_H
-#define _HURD_FAULT_H
-
-#include <hurd/sigpreempt.h>
-#include <setjmp.h>
-
-/* Call this before code that might fault in the signal thread; SIGNO is
- the signal expected to possibly arrive. This behaves like setjmp: it
- returns zero the first time, and returns again nonzero if the signal
- does arrive. */
-
-#define _hurdsig_catch_fault(sigset, firstcode, lastcode) \
- (_hurdsig_fault_preemptor.signals = (sigset), \
- _hurdsig_fault_preemptor.first = (long int) (firstcode), \
- _hurdsig_fault_preemptor.last = (long int) (lastcode), \
- setjmp (_hurdsig_fault_env))
-
-/* Call this at the end of a section protected by _hurdsig_catch_fault. */
-
-#define _hurdsig_end_catch_fault() \
- (_hurdsig_fault_preemptor.signals = 0)
-
-extern jmp_buf _hurdsig_fault_env;
-extern struct hurd_signal_preemptor _hurdsig_fault_preemptor;
-
-
-#define _hurdsig_catch_memory_fault(object) \
- _hurdsig_catch_fault (sigmask (SIGSEGV) | sigmask (SIGBUS), \
- (object), (object) + 1)
-
-
-#endif /* hurdfault.h */
diff --git a/hurd/hurdfchdir.c b/hurd/hurdfchdir.c
deleted file mode 100644
index 97c758b67f..0000000000
--- a/hurd/hurdfchdir.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Change a port cell to a directory in an open file descriptor.
- Copyright (C) 1999-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/port.h>
-#include <hurd/fd.h>
-#include <fcntl.h>
-
-int
-_hurd_change_directory_port_from_fd (struct hurd_port *portcell, int fd)
-{
- int ret;
- struct hurd_fd *d = _hurd_fd_get (fd);
-
- if (!d)
- return __hurd_fail (EBADF);
-
- HURD_CRITICAL_BEGIN;
-
- ret = HURD_PORT_USE (&d->port,
- ({
- int ret;
- /* We look up "." to force ENOTDIR if it's not a
- directory and EACCES if we don't have search
- permission. */
- file_t dir = __file_name_lookup_under (port, ".",
- O_NOTRANS, 0);
- if (dir == MACH_PORT_NULL)
- ret = -1;
- else
- {
- _hurd_port_set (portcell, dir);
- ret = 0;
- }
- ret;
- }));
-
- HURD_CRITICAL_END;
-
- return ret;
-}
diff --git a/hurd/hurdhost.h b/hurd/hurdhost.h
deleted file mode 100644
index c4e89517bc..0000000000
--- a/hurd/hurdhost.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Host configuration items kept as the whole contents of a file.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/* Fetch and atomically store the contents of the file ITEM.
- Returns the size read or written, or -1 for errors.
- If BUFLEN is not big enough to contain the whole contents,
- BUFLEN bytes of BUF are filled in and we fail with ENAMETOOLONG. */
-
-ssize_t _hurd_get_host_config (const char *item,
- char *buf, size_t buflen);
-ssize_t _hurd_set_host_config (const char *item,
- const char *value, size_t valuelen);
diff --git a/hurd/hurdid.c b/hurd/hurdid.c
deleted file mode 100644
index 66d760beef..0000000000
--- a/hurd/hurdid.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/id.h>
-
-struct hurd_id_data _hurd_id;
-
-
-/* Check that _hurd_id.{gen,aux} are valid and update them if not.
- Expects _hurd_id.lock to be held and does not release it. */
-
-error_t
-_hurd_check_ids (void)
-{
- if (! _hurd_id.valid)
- {
- inline void dealloc (__typeof (_hurd_id.gen) *p)
- {
- if (p->uids)
- {
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) p->uids,
- p->nuids * sizeof (uid_t));
- p->uids = NULL;
- }
- p->nuids = 0;
- if (p->gids)
- {
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) p->gids,
- p->ngids * sizeof (gid_t));
- p->gids = NULL;
- }
- p->ngids = 0;
- }
-
- error_t err;
-
- dealloc (&_hurd_id.gen);
- dealloc (&_hurd_id.aux);
-
- if (_hurd_id.rid_auth != MACH_PORT_NULL)
- {
- __mach_port_deallocate (__mach_task_self (), _hurd_id.rid_auth);
- _hurd_id.rid_auth = MACH_PORT_NULL;
- }
-
- if (err = __USEPORT (AUTH, __auth_getids
- (port,
- &_hurd_id.gen.uids, &_hurd_id.gen.nuids,
- &_hurd_id.aux.uids, &_hurd_id.aux.nuids,
- &_hurd_id.gen.gids, &_hurd_id.gen.ngids,
- &_hurd_id.aux.gids, &_hurd_id.aux.ngids)))
- return err;
-
- _hurd_id.valid = 1;
- }
-
- return 0;
-}
-
-static void
-init_id (void)
-{
- __mutex_init (&_hurd_id.lock);
- _hurd_id.valid = 0;
- _hurd_id.rid_auth = MACH_PORT_NULL;
- _hurd_id.gen.uids = _hurd_id.aux.uids = NULL;
- _hurd_id.gen.nuids = _hurd_id.aux.nuids = 0;
- _hurd_id.gen.gids = _hurd_id.aux.gids = NULL;
- _hurd_id.gen.ngids = _hurd_id.aux.ngids = 0;
-
- (void) &init_id; /* Avoid "defined but not used" warning. */
-}
-text_set_element (_hurd_preinit_hook, init_id);
diff --git a/hurd/hurdinit.c b/hurd/hurdinit.c
deleted file mode 100644
index 5afdfbc890..0000000000
--- a/hurd/hurdinit.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/* Copyright (C) 1992-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sys/stat.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <hurd.h>
-#include <hurd/port.h>
-#include "set-hooks.h"
-#include "hurdmalloc.h" /* XXX */
-
-
-int _hurd_exec_flags;
-struct hurd_port *_hurd_ports;
-unsigned int _hurd_nports;
-mode_t _hurd_umask;
-sigset_t _hurdsig_traced;
-
-char **__libc_argv;
-int __libc_argc;
-
-
-error_t
-_hurd_ports_use (int which, error_t (*operate) (mach_port_t))
-{
- if (__glibc_unlikely (_hurd_ports == NULL))
- /* This means that _hurd_init has not been called yet, which is
- normally only the case in the bootstrap filesystem, and there
- only in the early phases of booting. */
- return EGRATUITOUS;
-
- return HURD_PORT_USE (&_hurd_ports[which], (*operate) (port));
-}
-
-DEFINE_HOOK (_hurd_subinit, (void));
-
-__typeof (_hurd_proc_init) _hurd_new_proc_init; /* below */
-
-/* Initialize the library data structures from the
- ints and ports passed to us by the exec server.
-
- PORTARRAY and INTARRAY are vm_deallocate'd. */
-
-void
-_hurd_init (int flags, char **argv,
- mach_port_t *portarray, size_t portarraysize,
- int *intarray, size_t intarraysize)
-{
- size_t i;
-
- _hurd_exec_flags = flags;
-
- _hurd_ports = malloc (portarraysize * sizeof (*_hurd_ports));
- if (_hurd_ports == NULL)
- __libc_fatal ("Can't allocate _hurd_ports\n");
- _hurd_nports = portarraysize;
-
- /* See what ports we were passed. */
- for (i = 0; i < portarraysize; ++i)
- _hurd_port_init (&_hurd_ports[i], portarray[i]);
-
- /* When the user asks for the bootstrap port,
- he will get the one the exec server passed us. */
- __task_set_special_port (__mach_task_self (), TASK_BOOTSTRAP_PORT,
- portarray[INIT_PORT_BOOTSTRAP]);
-
- if (intarraysize > INIT_UMASK)
- _hurd_umask = intarray[INIT_UMASK] & 0777;
- else
- _hurd_umask = CMASK;
-
- if (intarraysize > INIT_TRACEMASK)
- _hurdsig_traced = intarray[INIT_TRACEMASK];
-
- /* Tell the proc server we exist, if it does. */
- if (portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
- _hurd_new_proc_init (argv, intarray, intarraysize);
-
- /* All done with init ints and ports. */
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) intarray,
- intarraysize * sizeof (int));
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) portarray,
- portarraysize * sizeof (mach_port_t));
-
- if (flags & EXEC_SECURE)
- /* XXX if secure exec, elide environment variables
- which the library uses and could be security holes.
- CORESERVER, COREFILE
- */ ;
-
- /* Call other things which want to do some initialization. These are not
- on the __libc_subinit hook because things there like to be able to
- assume the availability of the POSIX.1 services we provide. */
- RUN_HOOK (_hurd_subinit, ());
-}
-
-#include <hurd/signal.h>
-
-/* The user can do "int _hide_arguments = 1;" to make
- sure the arguments are never visible with `ps'. */
-int _hide_arguments, _hide_environment;
-
-/* Hook for things which should be initialized as soon as the proc
- server is available. */
-DEFINE_HOOK (_hurd_proc_subinit, (void));
-
-/* Do startup handshaking with the proc server just installed in _hurd_ports.
- Call _hurdsig_init to set up signal processing. */
-
-void
-_hurd_new_proc_init (char **argv,
- const int *intarray, size_t intarraysize)
-{
- mach_port_t oldmsg;
- struct hurd_userlink ulink;
- process_t procserver;
-
- /* Initialize the signal code; Mach exceptions will become signals. */
- _hurdsig_init (intarray, intarraysize);
-
- /* The signal thread is now prepared to receive messages.
- It is safe to give the port to the proc server. */
-
- procserver = _hurd_port_get (&_hurd_ports[INIT_PORT_PROC], &ulink);
-
- /* Give the proc server our message port. */
- __proc_setmsgport (procserver, _hurd_msgport, &oldmsg);
- if (oldmsg != MACH_PORT_NULL)
- /* Deallocate the old msg port we replaced. */
- __mach_port_deallocate (__mach_task_self (), oldmsg);
-
- /* Tell the proc server where our args and environment are. */
- __proc_set_arg_locations (procserver,
- _hide_arguments ? 0 : (vm_address_t) argv,
- _hide_environment ? 0 : (vm_address_t) __environ);
-
- _hurd_port_free (&_hurd_ports[INIT_PORT_PROC], &ulink, procserver);
-
- /* Initialize proc server-assisted fault recovery for the signal thread. */
- _hurdsig_fault_init ();
-
- /* Call other things which want to do some initialization. These are not
- on the _hurd_subinit hook because things there assume that things done
- here, like _hurd_pid, are already initialized. */
- RUN_HOOK (_hurd_proc_subinit, ());
-
- /* XXX This code should probably be removed entirely at some point. This
- conditional should make it reasonably usable with old gdb's for a
- while. Eventually it probably makes most sense for the exec server to
- mask out EXEC_SIGTRAP so the debugged program is closer to not being
- able to tell it's being debugged. */
- if (!__sigisemptyset (&_hurdsig_traced)
-#ifdef EXEC_SIGTRAP
- && !(_hurd_exec_flags & EXEC_SIGTRAP)
-#endif
- )
- /* This process is "traced", meaning it should stop on signals or exec.
- We are all set up now to handle signals. Stop ourselves, to inform
- our parent (presumably a debugger) that the exec has completed. */
- __msg_sig_post (_hurd_msgport, SIGTRAP, 0, __mach_task_self ());
-}
-
-#include <shlib-compat.h>
-versioned_symbol (libc, _hurd_new_proc_init, _hurd_proc_init, GLIBC_2_1);
-
-/* Called when we get a message telling us to change our proc server port. */
-
-error_t
-_hurd_setproc (process_t procserver)
-{
- error_t err;
- mach_port_t oldmsg;
-
- /* Give the proc server our message port. */
- if (err = __proc_setmsgport (procserver, _hurd_msgport, &oldmsg))
- return err;
- if (oldmsg != MACH_PORT_NULL)
- /* Deallocate the old msg port we replaced. */
- __mach_port_deallocate (__mach_task_self (), oldmsg);
-
- /* Tell the proc server where our args and environment are. */
- if (err = __proc_set_arg_locations (procserver,
- _hide_arguments ? 0 :
- (vm_address_t) __libc_argv,
- _hide_environment ? 0 :
- (vm_address_t) __environ))
- return err;
-
- /* Those calls worked, so the port looks good. */
- _hurd_port_set (&_hurd_ports[INIT_PORT_PROC], procserver);
-
- {
- pid_t oldpgrp = _hurd_pgrp;
-
- /* Call these functions again so they can fetch the
- new information from the new proc server. */
- RUN_HOOK (_hurd_proc_subinit, ());
-
- if (_hurd_pgrp != oldpgrp)
- {
- /* Run things that want notification of a pgrp change. */
- DECLARE_HOOK (_hurd_pgrp_changed_hook, (pid_t));
- RUN_HOOK (_hurd_pgrp_changed_hook, (_hurd_pgrp));
- }
- }
-
- return 0;
-}
diff --git a/hurd/hurdioctl.c b/hurd/hurdioctl.c
deleted file mode 100644
index 73ec3ea3cc..0000000000
--- a/hurd/hurdioctl.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/* ioctl commands which must be done in the C library.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <sys/ioctl.h>
-#include <hurd/ioctl.h>
-#include <string.h>
-
-
-/* Symbol set of ioctl handler lists. If there are user-registered
- handlers, one of these lists will contain them. The other lists are
- handlers built into the library. */
-symbol_set_define (_hurd_ioctl_handler_lists)
-
-/* Look up REQUEST in the set of handlers. */
-ioctl_handler_t
-_hurd_lookup_ioctl_handler (int request)
-{
- void *const *ptr;
- const struct ioctl_handler *h;
-
- /* Mask off the type bits, so that we see requests in a single group as a
- contiguous block of values. */
- request = _IOC_NOTYPE (request);
-
- for (ptr = symbol_set_first_element (_hurd_ioctl_handler_lists);
- !symbol_set_end_p (_hurd_ioctl_handler_lists, ptr);
- ++ptr)
- for (h = *ptr; h != NULL; h = h->next)
- if (request >= h->first_request && request <= h->last_request)
- return h->handler;
-
- return NULL;
-}
-
-#include <fcntl.h>
-
-/* Find out how many bytes may be read from FD without blocking. */
-
-static int
-fioctl (int fd,
- int request,
- int *arg)
-{
- error_t err;
-
- *(volatile int *) arg = *arg;
-
- switch (request)
- {
- default:
- err = ENOTTY;
- break;
-
- case FIONREAD:
- {
- mach_msg_type_number_t navail;
- err = HURD_DPORT_USE (fd, __io_readable (port, &navail));
- if (!err)
- *arg = (int) navail;
- }
- break;
-
- case FIONBIO:
- err = HURD_DPORT_USE (fd, (*arg ?
- __io_set_some_openmodes :
- __io_clear_some_openmodes)
- (port, O_NONBLOCK));
- break;
-
- case FIOASYNC:
- err = HURD_DPORT_USE (fd, (*arg ?
- __io_set_some_openmodes :
- __io_clear_some_openmodes)
- (port, O_ASYNC));
- break;
-
- case FIOSETOWN:
- err = HURD_DPORT_USE (fd, __io_mod_owner (port, *arg));
- break;
-
- case FIOGETOWN:
- err = HURD_DPORT_USE (fd, __io_get_owner (port, arg));
- break;
- }
-
- return err ? __hurd_dfail (fd, err) : 0;
-}
-
-_HURD_HANDLE_IOCTLS (fioctl, FIOGETOWN, FIONREAD);
-
-
-static int
-fioclex (int fd,
- int request)
-{
- int flag;
-
- switch (request)
- {
- default:
- return __hurd_fail (ENOTTY);
- case FIOCLEX:
- flag = FD_CLOEXEC;
- break;
- case FIONCLEX:
- flag = 0;
- break;
- }
-
- return __fcntl (fd, F_SETFD, flag);
-}
-_HURD_HANDLE_IOCTLS (fioclex, FIOCLEX, FIONCLEX);
-
-#include <hurd/term.h>
-#include <hurd/tioctl.h>
-
-/* Install a new CTTYID port, atomically updating the dtable appropriately.
- This consumes the send right passed in. */
-
-void
-_hurd_locked_install_cttyid (mach_port_t cttyid)
-{
- mach_port_t old;
- struct hurd_port *const port = &_hurd_ports[INIT_PORT_CTTYID];
- struct hurd_userlink ulink;
- int i;
-
- /* Install the new cttyid port, and preserve it with a ulink.
- We unroll the _hurd_port_set + _hurd_port_get here so that
- there is no window where the cell is unlocked and CTTYID could
- be changed by another thread. (We also delay the deallocation
- of the old port until the end, to minimize the duration of the
- critical section.)
-
- It is important that changing the cttyid port is only ever done by
- holding the dtable lock continuously while updating the port cell and
- re-ctty'ing the dtable; dtable.c assumes we do this. Otherwise, the
- pgrp-change notification code in dtable.c has to worry about racing
- against us here in odd situations. The one exception to this is
- setsid, which holds the dtable lock while changing the pgrp and
- clearing the cttyid port, and then unlocks the dtable lock to allow
-
-
- */
-
- __spin_lock (&port->lock);
- old = _hurd_userlink_clear (&port->users) ? port->port : MACH_PORT_NULL;
- port->port = cttyid;
- cttyid = _hurd_port_locked_get (port, &ulink);
-
- for (i = 0; i < _hurd_dtablesize; ++i)
- {
- struct hurd_fd *const d = _hurd_dtable[i];
- mach_port_t newctty = MACH_PORT_NULL;
-
- if (d == NULL)
- /* Nothing to do for an unused descriptor cell. */
- continue;
-
- if (cttyid != MACH_PORT_NULL)
- /* We do have some controlling tty. */
- HURD_PORT_USE (&d->port,
- ({ mach_port_t id;
- /* Get the io object's cttyid port. */
- if (! __term_getctty (port, &id))
- {
- if (id == cttyid /* Is it ours? */
- /* Get the ctty io port. */
- && __term_open_ctty (port,
- _hurd_pid, _hurd_pgrp,
- &newctty))
- /* XXX it is our ctty but the call failed? */
- newctty = MACH_PORT_NULL;
- __mach_port_deallocate (__mach_task_self (), id);
- }
- 0;
- }));
-
- /* Install the new ctty port. */
- _hurd_port_set (&d->ctty, newctty);
- }
-
- __mutex_unlock (&_hurd_dtable_lock);
-
- if (old != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (), old);
- _hurd_port_free (port, &ulink, cttyid);
-}
-
-static void
-install_ctty (mach_port_t cttyid)
-{
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_dtable_lock);
- _hurd_locked_install_cttyid (cttyid);
- HURD_CRITICAL_END;
-}
-
-
-/* Called when we have received a message saying to use a new ctty ID port. */
-
-error_t
-_hurd_setcttyid (mach_port_t cttyid)
-{
- error_t err;
-
- if (cttyid != MACH_PORT_NULL)
- {
- /* Give the new send right a user reference.
- This is a good way to check that it is valid. */
- if (err = __mach_port_mod_refs (__mach_task_self (), cttyid,
- MACH_PORT_RIGHT_SEND, 1))
- return err;
- }
-
- /* Install the port, consuming the reference we just created. */
- install_ctty (cttyid);
-
- return 0;
-}
-
-
-static inline error_t
-do_tiocsctty (io_t port, io_t ctty)
-{
- mach_port_t cttyid;
- error_t err;
-
- if (ctty != MACH_PORT_NULL)
- /* PORT is already the ctty. Nothing to do. */
- return 0;
-
- /* Get PORT's cttyid port. */
- err = __term_getctty (port, &cttyid);
- if (err)
- return err;
-
- /* Change the terminal's pgrp to ours. */
- err = __tioctl_tiocspgrp (port, _hurd_pgrp);
- if (err)
- __mach_port_deallocate (__mach_task_self (), cttyid);
- else
- /* Make it our own. */
- install_ctty (cttyid);
-
- return err;
-}
-
-/* Make FD be the controlling terminal.
- This function is called for `ioctl (fd, TCIOSCTTY)'. */
-
-static int
-tiocsctty (int fd,
- int request) /* Always TIOCSCTTY. */
-{
- return __hurd_fail (HURD_DPORT_USE (fd, do_tiocsctty (port, ctty)));
-}
-_HURD_HANDLE_IOCTL (tiocsctty, TIOCSCTTY);
-
-/* Dissociate from the controlling terminal. */
-
-static int
-tiocnotty (int fd,
- int request) /* Always TIOCNOTTY. */
-{
- mach_port_t fd_cttyid;
- error_t err;
-
- if (err = HURD_DPORT_USE (fd, __term_getctty (port, &fd_cttyid)))
- return __hurd_fail (err);
-
- if (__USEPORT (CTTYID, port != fd_cttyid))
- err = EINVAL;
-
- __mach_port_deallocate (__mach_task_self (), fd_cttyid);
-
- if (err)
- return __hurd_fail (err);
-
- /* Clear our cttyid port. */
- install_ctty (MACH_PORT_NULL);
-
- return 0;
-}
-_HURD_HANDLE_IOCTL (tiocnotty, TIOCNOTTY);
-
-#include <hurd/pfinet.h>
-#include <net/if.h>
-#include <netinet/in.h>
-
-/* Fill in the buffer IFC->IFC_BUF of length IFC->IFC_LEN with a list
- of ifr structures, one for each network interface. */
-static int
-siocgifconf (int fd, int request, struct ifconf *ifc)
-{
- error_t err;
- size_t data_len = ifc->ifc_len;
- char *data = ifc->ifc_buf;
-
- if (data_len <= 0)
- return 0;
-
- err = HURD_DPORT_USE (fd, __pfinet_siocgifconf (port, ifc->ifc_len,
- &data, &data_len));
- if (data_len < ifc->ifc_len)
- ifc->ifc_len = data_len;
- if (data != ifc->ifc_buf)
- {
- memcpy (ifc->ifc_buf, data, ifc->ifc_len);
- __vm_deallocate (__mach_task_self (), (vm_address_t) data, data_len);
- }
- return err ? __hurd_dfail (fd, err) : 0;
-}
-_HURD_HANDLE_IOCTL (siocgifconf, SIOCGIFCONF);
diff --git a/hurd/hurdkill.c b/hurd/hurdkill.c
deleted file mode 100644
index e8375d3d3d..0000000000
--- a/hurd/hurdkill.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <sys/types.h>
-#include <signal.h>
-#include <hurd.h>
-#include <hurd/port.h>
-#include <hurd/signal.h>
-#include <hurd/msg.h>
-
-/* Send a `sig_post' RPC to process number PID. If PID is zero,
- send the message to all processes in the current process's process group.
- If PID is < -1, send SIG to all processes in process group - PID.
- SIG and REFPORT are passed along in the request message. */
-error_t
-_hurd_sig_post (pid_t pid, int sig, mach_port_t arg_refport)
-{
- int delivered = 0; /* Set when we deliver any signal. */
- error_t err;
- mach_port_t proc;
- struct hurd_userlink ulink;
-
- inline void kill_pid (pid_t pid) /* Kill one PID. */
- {
- err = HURD_MSGPORT_RPC (__proc_getmsgport (proc, pid, &msgport),
- (refport = arg_refport, 0), 0,
- /* If no message port we cannot send signals. */
- msgport == MACH_PORT_NULL ? EPERM :
- __msg_sig_post (msgport, sig, 0, refport));
- if (! err)
- delivered = 1;
- }
-
- proc = _hurd_port_get (&_hurd_ports[INIT_PORT_PROC], &ulink);
-
- if (pid <= 0)
- {
- /* Send SIG to each process in pgrp (- PID). */
- mach_msg_type_number_t npids = 10, i;
- pid_t pidsbuf[10], *pids = pidsbuf;
-
- err = __proc_getpgrppids (proc, - pid, &pids, &npids);
- if (!err)
- {
- int self = 0;
- for (i = 0; i < npids; ++i)
- if (pids[i] == _hurd_pid)
- /* We must do ourselves last so we are not suspended
- and fail to suspend the other processes in the pgrp. */
- self = 1;
- else
- {
- kill_pid (pids[i]);
- if (err == ESRCH)
- /* The process died already. Ignore it. */
- err = 0;
- }
- if (pids != pidsbuf)
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) pids, npids * sizeof (pids[0]));
-
- if (self)
- kill_pid (_hurd_pid);
- }
- }
- else
- kill_pid (pid);
-
- _hurd_port_free (&_hurd_ports[INIT_PORT_PROC], &ulink, proc);
-
- /* If we delivered no signals, but ERR is clear, this must mean that
- every kill_pid call failed with ESRCH, meaning all the processes in
- the pgrp died between proc_getpgrppids and kill_pid; in that case we
- fail with ESRCH. */
- return delivered ? 0 : err ?: ESRCH;
-}
-weak_alias (_hurd_sig_post, hurd_sig_post)
diff --git a/hurd/hurdlookup.c b/hurd/hurdlookup.c
deleted file mode 100644
index 84cb3d3015..0000000000
--- a/hurd/hurdlookup.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* Copyright (C) 1992-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/lookup.h>
-#include <string.h>
-#include <fcntl.h>
-
-
-/* Translate the error from dir_lookup into the error the user sees. */
-static inline error_t
-lookup_error (error_t error)
-{
- switch (error)
- {
- case EOPNOTSUPP:
- case MIG_BAD_ID:
- /* These indicate that the server does not understand dir_lookup
- at all. If it were a directory, it would, by definition. */
- return ENOTDIR;
- default:
- return error;
- }
-}
-
-error_t
-__hurd_file_name_lookup (error_t (*use_init_port)
- (int which, error_t (*operate) (file_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name, int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name, int flags, mode_t mode,
- file_t *result)
-{
- error_t err;
- enum retry_type doretry;
- char retryname[1024]; /* XXX string_t LOSES! */
- int startport;
-
- error_t lookup_op (mach_port_t startdir)
- {
- return lookup_error ((*lookup) (startdir, file_name, flags, mode,
- &doretry, retryname, result));
- }
-
- if (! lookup)
- lookup = __dir_lookup;
-
- if (file_name[0] == '\0')
- return ENOENT;
-
- startport = (file_name[0] == '/') ? INIT_PORT_CRDIR : INIT_PORT_CWDIR;
- while (file_name[0] == '/')
- file_name++;
-
- if (flags & O_NOFOLLOW) /* See lookup-retry.c about O_NOFOLLOW. */
- flags |= O_NOTRANS;
-
- if (flags & O_DIRECTORY)
- {
- /* The caller wants to require that the file we look up is a directory.
- We can do this without an extra RPC by appending a trailing slash
- to the file name we look up. */
- size_t len = strlen (file_name);
- if (len == 0)
- file_name = "/";
- else if (file_name[len - 1] != '/')
- {
- char *n = alloca (len + 2);
- memcpy (n, file_name, len);
- n[len] = '/';
- n[len + 1] = '\0';
- file_name = n;
- }
- }
-
- err = (*use_init_port) (startport, &lookup_op);
- if (! err)
- err = __hurd_file_name_lookup_retry (use_init_port, get_dtable_port,
- lookup, doretry, retryname,
- flags, mode, result);
-
- return err;
-}
-weak_alias (__hurd_file_name_lookup, hurd_file_name_lookup)
-
-error_t
-__hurd_file_name_split (error_t (*use_init_port)
- (int which, error_t (*operate) (file_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name, int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name,
- file_t *dir, char **name)
-{
- error_t addref (file_t crdir)
- {
- *dir = crdir;
- return __mach_port_mod_refs (__mach_task_self (),
- crdir, MACH_PORT_RIGHT_SEND, +1);
- }
-
- const char *lastslash = strrchr (file_name, '/');
-
- if (lastslash != NULL)
- {
- if (lastslash == file_name)
- {
- /* "/foobar" => crdir + "foobar". */
- *name = (char *) file_name + 1;
- return (*use_init_port) (INIT_PORT_CRDIR, &addref);
- }
- else
- {
- /* "/dir1/dir2/.../file". */
- char dirname[lastslash - file_name + 1];
- memcpy (dirname, file_name, lastslash - file_name);
- dirname[lastslash - file_name] = '\0';
- *name = (char *) lastslash + 1;
- return
- __hurd_file_name_lookup (use_init_port, get_dtable_port, lookup,
- dirname, 0, 0, dir);
- }
- }
- else if (file_name[0] == '\0')
- return ENOENT;
- else
- {
- /* "foobar" => cwdir + "foobar". */
- *name = (char *) file_name;
- return (*use_init_port) (INIT_PORT_CWDIR, &addref);
- }
-}
-weak_alias (__hurd_file_name_split, hurd_file_name_split)
-
-/* This is the same as hurd_file_name_split, except that it ignores
- trailing slashes (so *NAME is never ""). */
-error_t
-__hurd_directory_name_split (error_t (*use_init_port)
- (int which, error_t (*operate) (file_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name, int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name,
- file_t *dir, char **name)
-{
- error_t addref (file_t crdir)
- {
- *dir = crdir;
- return __mach_port_mod_refs (__mach_task_self (),
- crdir, MACH_PORT_RIGHT_SEND, +1);
- }
-
- const char *lastslash = strrchr (file_name, '/');
-
- if (lastslash != NULL && lastslash[1] == '\0')
- {
- /* Trailing slash doesn't count. Look back further. */
-
- /* Back up over all trailing slashes. */
- while (lastslash > file_name && *lastslash == '/')
- --lastslash;
-
- /* Find the last one earlier in the string, before the trailing ones. */
- lastslash = __memrchr (file_name, '/', lastslash - file_name);
- }
-
- if (lastslash != NULL)
- {
- if (lastslash == file_name)
- {
- /* "/foobar" => crdir + "foobar". */
- *name = (char *) file_name + 1;
- return (*use_init_port) (INIT_PORT_CRDIR, &addref);
- }
- else
- {
- /* "/dir1/dir2/.../file". */
- char dirname[lastslash - file_name + 1];
- memcpy (dirname, file_name, lastslash - file_name);
- dirname[lastslash - file_name] = '\0';
- *name = (char *) lastslash + 1;
- return
- __hurd_file_name_lookup (use_init_port, get_dtable_port, lookup,
- dirname, 0, 0, dir);
- }
- }
- else if (file_name[0] == '\0')
- return ENOENT;
- else
- {
- /* "foobar" => cwdir + "foobar". */
- *name = (char *) file_name;
- return (*use_init_port) (INIT_PORT_CWDIR, &addref);
- }
-}
-weak_alias (__hurd_directory_name_split, hurd_directory_name_split)
-
-
-file_t
-__file_name_lookup (const char *file_name, int flags, mode_t mode)
-{
- error_t err;
- file_t result;
-
- err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0,
- file_name, flags, mode & ~_hurd_umask,
- &result);
-
- return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
-}
-weak_alias (__file_name_lookup, file_name_lookup)
-
-
-file_t
-__file_name_split (const char *file_name, char **name)
-{
- error_t err;
- file_t result;
-
- err = __hurd_file_name_split (&_hurd_ports_use, &__getdport, 0,
- file_name, &result, name);
-
- return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
-}
-weak_alias (__file_name_split, file_name_split)
-
-file_t
-__directory_name_split (const char *directory_name, char **name)
-{
- error_t err;
- file_t result;
-
- err = __hurd_directory_name_split (&_hurd_ports_use, &__getdport, 0,
- directory_name, &result, name);
-
- return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
-}
-weak_alias (__directory_name_split, directory_name_split)
-
-
-file_t
-__file_name_lookup_under (file_t startdir,
- const char *file_name, int flags, mode_t mode)
-{
- error_t err;
- file_t result;
-
- error_t use_init_port (int which, error_t (*operate) (mach_port_t))
- {
- return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
- _hurd_ports_use (which, operate));
- }
-
- err = __hurd_file_name_lookup (&use_init_port, &__getdport, 0,
- file_name, flags, mode & ~_hurd_umask,
- &result);
-
- return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
-}
-weak_alias (__file_name_lookup_under, file_name_lookup_under)
diff --git a/hurd/hurdmalloc.c b/hurd/hurdmalloc.c
deleted file mode 100644
index 65fb959d84..0000000000
--- a/hurd/hurdmalloc.c
+++ /dev/null
@@ -1,449 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-#include "hurdmalloc.h" /* XXX see that file */
-
-#include <mach.h>
-#define vm_allocate __vm_allocate
-#define vm_page_size __vm_page_size
-
-/*
- * Mach Operating System
- * Copyright (c) 1991,1990,1989 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
-/*
- * (pre-GNU) HISTORY
- *
- * Revision 2.7 91/05/14 17:57:34 mrt
- * Correcting copyright
- *
- * Revision 2.6 91/02/14 14:20:26 mrt
- * Added new Mach copyright
- * [91/02/13 12:41:21 mrt]
- *
- * Revision 2.5 90/11/05 14:37:33 rpd
- * Added malloc_fork* code.
- * [90/11/02 rwd]
- *
- * Add spin_lock_t.
- * [90/10/31 rwd]
- *
- * Revision 2.4 90/08/07 14:31:28 rpd
- * Removed RCS keyword nonsense.
- *
- * Revision 2.3 90/06/02 15:14:00 rpd
- * Converted to new IPC.
- * [90/03/20 20:56:57 rpd]
- *
- * Revision 2.2 89/12/08 19:53:59 rwd
- * Removed conditionals.
- * [89/10/23 rwd]
- *
- * Revision 2.1 89/08/03 17:09:46 rwd
- * Created.
- *
- *
- * 13-Sep-88 Eric Cooper (ecc) at Carnegie Mellon University
- * Changed realloc() to copy min(old size, new size) bytes.
- * Bug found by Mike Kupfer at Olivetti.
- */
-/*
- * File: malloc.c
- * Author: Eric Cooper, Carnegie Mellon University
- * Date: July, 1988
- *
- * Memory allocator for use with multiple threads.
- */
-
-
-#include <assert.h>
-
-#include <cthreads.h>
-
-#define MCHECK
-
-/*
- * Structure of memory block header.
- * When free, next points to next block on free list.
- * When allocated, fl points to free list.
- * Size of header is 4 bytes, so minimum usable block size is 8 bytes.
- */
-
-#define CHECK_BUSY 0x8a3c743e
-#define CHECK_FREE 0x66688b92
-
-#ifdef MCHECK
-
-typedef struct header {
- long check;
- union {
- struct header *next;
- struct free_list *fl;
- } u;
-} *header_t;
-
-#define HEADER_SIZE sizeof (struct header)
-#define HEADER_NEXT(h) ((h)->u.next)
-#define HEADER_FREE(h) ((h)->u.fl)
-#define HEADER_CHECK(h) ((h)->check)
-#define MIN_SIZE 16
-#define LOG2_MIN_SIZE 4
-
-#else /* ! MCHECK */
-
-typedef union header {
- union header *next;
- struct free_list *fl;
-} *header_t;
-
-#define HEADER_SIZE sizeof (union header)
-#define HEADER_NEXT(h) ((h)->next)
-#define HEADER_FREE(h) ((h)->fl)
-#define MIN_SIZE 8 /* minimum block size */
-#define LOG2_MIN_SIZE 3
-
-#endif /* MCHECK */
-
-typedef struct free_list {
- spin_lock_t lock; /* spin lock for mutual exclusion */
- header_t head; /* head of free list for this size */
-#ifdef DEBUG
- int in_use; /* # mallocs - # frees */
-#endif /* DEBUG */
-} *free_list_t;
-
-/*
- * Free list with index i contains blocks of size 2 ^ (i + LOG2_MIN_SIZE)
- * including header. Smallest block size is MIN_SIZE, with MIN_SIZE -
- * HEADER_SIZE bytes available to user. Size argument to malloc is a signed
- * integer for sanity checking, so largest block size is 2^31.
- */
-#define NBUCKETS 29
-
-static struct free_list malloc_free_list[NBUCKETS];
-
-/* Initialization just sets everything to zero, but might be necessary on a
- machine where spin_lock_init does otherwise, and is necessary when
- running an executable that was written by something like Emacs's unexec.
- It preserves the values of data variables like malloc_free_list, but
- does not save the vm_allocate'd space allocated by this malloc. */
-
-static void
-malloc_init (void)
-{
- int i;
- for (i = 0; i < NBUCKETS; ++i)
- {
- spin_lock_init (&malloc_free_list[i].lock);
- malloc_free_list[i].head = NULL;
-#ifdef DEBUG
- malloc_free_list[i].in_use = 0;
-#endif
- }
-
- /* This not only suppresses a `defined but not used' warning,
- but it is ABSOLUTELY NECESSARY to avoid the hyperclever
- compiler from "optimizing out" the entire function! */
- (void) &malloc_init;
-}
-
-static void
-more_memory(int size, free_list_t fl)
-{
- int amount;
- int n;
- vm_address_t where;
- header_t h;
- kern_return_t r;
-
- if (size <= vm_page_size) {
- amount = vm_page_size;
- n = vm_page_size / size;
- /* We lose vm_page_size - n*size bytes here. */
- } else {
- amount = size;
- n = 1;
- }
-
- r = vm_allocate(mach_task_self(), &where, (vm_size_t) amount, TRUE);
- assert_perror (r);
-
- h = (header_t) where;
- do {
- HEADER_NEXT (h) = fl->head;
-#ifdef MCHECK
- HEADER_CHECK (h) = CHECK_FREE;
-#endif
- fl->head = h;
- h = (header_t) ((char *) h + size);
- } while (--n != 0);
-}
-
-/* Declaration changed to standard one for GNU. */
-void *
-malloc (size_t size)
-{
- int i, n;
- free_list_t fl;
- header_t h;
-
- if ((int) size < 0) /* sanity check */
- return 0;
- size += HEADER_SIZE;
- /*
- * Find smallest power-of-two block size
- * big enough to hold requested size plus header.
- */
- i = 0;
- n = MIN_SIZE;
- while (n < size) {
- i += 1;
- n <<= 1;
- }
- ASSERT(i < NBUCKETS);
- fl = &malloc_free_list[i];
- spin_lock(&fl->lock);
- h = fl->head;
- if (h == 0) {
- /*
- * Free list is empty;
- * allocate more blocks.
- */
- more_memory(n, fl);
- h = fl->head;
- if (h == 0) {
- /*
- * Allocation failed.
- */
- spin_unlock(&fl->lock);
- return 0;
- }
- }
- /*
- * Pop block from free list.
- */
- fl->head = HEADER_NEXT (h);
-
-#ifdef MCHECK
- assert (HEADER_CHECK (h) == CHECK_FREE);
- HEADER_CHECK (h) = CHECK_BUSY;
-#endif
-
-#ifdef DEBUG
- fl->in_use += 1;
-#endif /* DEBUG */
- spin_unlock(&fl->lock);
- /*
- * Store free list pointer in block header
- * so we can figure out where it goes
- * at free() time.
- */
- HEADER_FREE (h) = fl;
- /*
- * Return pointer past the block header.
- */
- return ((char *) h) + HEADER_SIZE;
-}
-
-/* Declaration changed to standard one for GNU. */
-void
-free (void *base)
-{
- header_t h;
- free_list_t fl;
- int i;
-
- if (base == 0)
- return;
- /*
- * Find free list for block.
- */
- h = (header_t) (base - HEADER_SIZE);
-
-#ifdef MCHECK
- assert (HEADER_CHECK (h) == CHECK_BUSY);
-#endif
-
- fl = HEADER_FREE (h);
- i = fl - malloc_free_list;
- /*
- * Sanity checks.
- */
- if (i < 0 || i >= NBUCKETS) {
- ASSERT(0 <= i && i < NBUCKETS);
- return;
- }
- if (fl != &malloc_free_list[i]) {
- ASSERT(fl == &malloc_free_list[i]);
- return;
- }
- /*
- * Push block on free list.
- */
- spin_lock(&fl->lock);
- HEADER_NEXT (h) = fl->head;
-#ifdef MCHECK
- HEADER_CHECK (h) = CHECK_FREE;
-#endif
- fl->head = h;
-#ifdef DEBUG
- fl->in_use -= 1;
-#endif /* DEBUG */
- spin_unlock(&fl->lock);
- return;
-}
-
-/* Declaration changed to standard one for GNU. */
-void *
-realloc (void *old_base, size_t new_size)
-{
- header_t h;
- free_list_t fl;
- int i;
- unsigned int old_size;
- char *new_base;
-
- if (old_base == 0)
- return malloc (new_size);
-
- /*
- * Find size of old block.
- */
- h = (header_t) (old_base - HEADER_SIZE);
-#ifdef MCHECK
- assert (HEADER_CHECK (h) == CHECK_BUSY);
-#endif
- fl = HEADER_FREE (h);
- i = fl - malloc_free_list;
- /*
- * Sanity checks.
- */
- if (i < 0 || i >= NBUCKETS) {
- ASSERT(0 <= i && i < NBUCKETS);
- return 0;
- }
- if (fl != &malloc_free_list[i]) {
- ASSERT(fl == &malloc_free_list[i]);
- return 0;
- }
- /*
- * Free list with index i contains blocks of size
- * 2 ^ (i + * LOG2_MIN_SIZE) including header.
- */
- old_size = (1 << (i + LOG2_MIN_SIZE)) - HEADER_SIZE;
-
- if (new_size <= old_size
- && new_size > (((old_size + HEADER_SIZE) >> 1) - HEADER_SIZE))
- /* The new size still fits in the same block, and wouldn't fit in
- the next smaller block! */
- return old_base;
-
- /*
- * Allocate new block, copy old bytes, and free old block.
- */
- new_base = malloc(new_size);
- if (new_base)
- memcpy (new_base, old_base,
- (int) (old_size < new_size ? old_size : new_size));
-
- if (new_base || new_size == 0)
- /* Free OLD_BASE, but only if the malloc didn't fail. */
- free (old_base);
-
- return new_base;
-}
-
-#ifdef DEBUG
-void
-print_malloc_free_list (void)
-{
- int i, size;
- free_list_t fl;
- int n;
- header_t h;
- int total_used = 0;
- int total_free = 0;
-
- fprintf(stderr, " Size In Use Free Total\n");
- for (i = 0, size = MIN_SIZE, fl = malloc_free_list;
- i < NBUCKETS;
- i += 1, size <<= 1, fl += 1) {
- spin_lock(&fl->lock);
- if (fl->in_use != 0 || fl->head != 0) {
- total_used += fl->in_use * size;
- for (n = 0, h = fl->head; h != 0; h = HEADER_NEXT (h), n += 1)
- ;
- total_free += n * size;
- fprintf(stderr, "%10d %10d %10d %10d\n",
- size, fl->in_use, n, fl->in_use + n);
- }
- spin_unlock(&fl->lock);
- }
- fprintf(stderr, " all sizes %10d %10d %10d\n",
- total_used, total_free, total_used + total_free);
-}
-#endif /* DEBUG */
-
-void
-_hurd_malloc_fork_prepare(void)
-/*
- * Prepare the malloc module for a fork by insuring that no thread is in a
- * malloc critical section.
- */
-{
- int i;
-
- for (i = 0; i < NBUCKETS; i++) {
- spin_lock(&malloc_free_list[i].lock);
- }
-}
-
-void
-_hurd_malloc_fork_parent(void)
-/*
- * Called in the parent process after a fork() to resume normal operation.
- */
-{
- int i;
-
- for (i = NBUCKETS-1; i >= 0; i--) {
- spin_unlock(&malloc_free_list[i].lock);
- }
-}
-
-void
-_hurd_malloc_fork_child(void)
-/*
- * Called in the child process after a fork() to resume normal operation.
- */
-{
- int i;
-
- for (i = NBUCKETS-1; i >= 0; i--) {
- spin_unlock(&malloc_free_list[i].lock);
- }
-}
-
-
-text_set_element (_hurd_preinit_hook, malloc_init);
diff --git a/hurd/hurdmalloc.h b/hurd/hurdmalloc.h
deleted file mode 100644
index 3520ffacd8..0000000000
--- a/hurd/hurdmalloc.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* XXX this file is a temporary hack.
-
- All hurd-internal code which uses malloc et al includes this file so it
- will use the internal malloc routines _hurd_{malloc,realloc,free}
- instead. The "hurd-internal" functions are the cthreads version,
- which uses vm_allocate and is thread-safe. The normal user version
- of malloc et al is the unixoid one using sbrk.
-
- */
-
-extern void *_hurd_malloc (size_t);
-extern void *_hurd_realloc (void *, size_t);
-extern void _hurd_free (void *);
-
-extern void _hurd_malloc_fork_prepare (void);
-extern void _hurd_malloc_fork_parent (void);
-extern void _hurd_malloc_fork_child (void);
-
-#define malloc _hurd_malloc
-#define realloc _hurd_realloc
-#define free _hurd_free
diff --git a/hurd/hurdmsg.c b/hurd/hurdmsg.c
deleted file mode 100644
index 4249ba104a..0000000000
--- a/hurd/hurdmsg.c
+++ /dev/null
@@ -1,419 +0,0 @@
-/* Copyright (C) 1992-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/msg_server.h>
-#include <hurd/fd.h>
-#include <unistd.h>
-#include <limits.h>
-#include <string.h>
-#include <argz.h>
-
-
-#define AUTHCHECK \
- if (auth != mach_task_self () && ! __USEPORT (AUTH, port == auth)) \
- return EPERM
-
-
-/* Snarfing and frobbing the init ports. */
-
-kern_return_t
- _S_msg_get_init_port (mach_port_t msgport, mach_port_t auth, int which,
- mach_port_t *result, mach_msg_type_name_t *result_type)
-{
- AUTHCHECK;
- *result_type = MACH_MSG_TYPE_MOVE_SEND;
- /* This function adds a new user reference for the *RESULT it gives back.
- Our reply message uses a move-send right that consumes this reference. */
- return _hurd_ports_get (which, result);
-}
-
-kern_return_t
-_S_msg_set_init_port (mach_port_t msgport, mach_port_t auth,
- int which, mach_port_t port)
-{
- error_t err;
-
- AUTHCHECK;
-
- err = _hurd_ports_set (which, port);
- if (err == 0)
- __mach_port_deallocate (__mach_task_self (), port);
-
- return 0;
-}
-
-kern_return_t
-_S_msg_get_init_ports (mach_port_t msgport, mach_port_t auth,
- mach_port_t **ports,
- mach_msg_type_name_t *ports_type,
- mach_msg_type_number_t *nports)
-{
- mach_msg_type_number_t i;
- error_t err;
-
- AUTHCHECK;
-
- if (err = __vm_allocate (__mach_task_self (), (vm_address_t *) ports,
- _hurd_nports * sizeof (mach_port_t), 1))
- return err;
- *nports = _hurd_nports;
-
- for (i = 0; i < _hurd_nports; ++i)
- /* This function adds a new user ref for the *RESULT it gives back.
- Our reply message uses move-send rights that consumes this ref. */
- if (err = _hurd_ports_get (i, &(*ports)[i]))
- {
- /* Died part way through. Deallocate the ports already fetched. */
- while (i-- > 0)
- __mach_port_deallocate (__mach_task_self (), (*ports)[i]);
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) *ports,
- *nports * sizeof (mach_port_t));
- return err;
- }
-
- *ports_type = MACH_MSG_TYPE_MOVE_SEND;
- return 0;
-}
-
-kern_return_t
-_S_msg_set_init_ports (mach_port_t msgport, mach_port_t auth,
- mach_port_t *ports, mach_msg_type_number_t nports)
-{
- mach_msg_type_number_t i;
- error_t err;
-
- AUTHCHECK;
-
- for (i = 0; i < _hurd_nports; ++i)
- {
- if (err = _hurd_ports_set (i, ports[i]))
- return err;
- else
- __mach_port_deallocate (__mach_task_self (), ports[i]);
- }
-
- return 0;
-}
-
-/* Snarfing and frobbing the init ints. */
-
-static kern_return_t
-get_int (int which, int *value)
-{
- switch (which)
- {
- case INIT_UMASK:
- *value = _hurd_umask;
- return 0;
- case INIT_SIGMASK:
- {
- struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
- __spin_lock (&ss->lock);
- *value = ss->blocked;
- __spin_unlock (&ss->lock);
- return 0;
- }
- case INIT_SIGPENDING:
- {
- struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
- __spin_lock (&ss->lock);
- *value = ss->pending;
- __spin_unlock (&ss->lock);
- return 0;
- }
- case INIT_SIGIGN:
- {
- struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
- sigset_t ign;
- int sig;
- __spin_lock (&ss->lock);
- __sigemptyset (&ign);
- for (sig = 1; sig < NSIG; ++sig)
- if (ss->actions[sig].sa_handler == SIG_IGN)
- __sigaddset (&ign, sig);
- __spin_unlock (&ss->lock);
- *value = ign;
- return 0;
- }
- default:
- return EINVAL;
- }
-}
-
-kern_return_t
-_S_msg_get_init_int (mach_port_t msgport, mach_port_t auth,
- int which, int *value)
-{
- AUTHCHECK;
-
- return get_int (which, value);
-}
-
-kern_return_t
-_S_msg_get_init_ints (mach_port_t msgport, mach_port_t auth,
- int **values, mach_msg_type_number_t *nvalues)
-{
- error_t err;
- mach_msg_type_number_t i;
-
- AUTHCHECK;
-
- if (err = __vm_allocate (__mach_task_self (), (vm_address_t *) values,
- INIT_INT_MAX * sizeof (int), 1))
- return err;
- *nvalues = INIT_INT_MAX;
-
- for (i = 0; i < INIT_INT_MAX; ++i)
- switch (err = get_int (i, &(*values)[i]))
- {
- case 0: /* Success. */
- break;
- case EINVAL: /* Unknown index. */
- (*values)[i] = 0;
- break;
- default: /* Lossage. */
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) *values, INIT_INT_MAX * sizeof (int));
- return err;
- }
-
- return 0;
-}
-
-
-static kern_return_t
-set_int (int which, int value)
-{
- switch (which)
- {
- case INIT_UMASK:
- _hurd_umask = value;
- return 0;
-
- /* These are pretty odd things to do. But you asked for it. */
- case INIT_SIGMASK:
- {
- struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
- __spin_lock (&ss->lock);
- ss->blocked = value;
- __spin_unlock (&ss->lock);
- return 0;
- }
- case INIT_SIGPENDING:
- {
- struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
- __spin_lock (&ss->lock);
- ss->pending = value;
- __spin_unlock (&ss->lock);
- return 0;
- }
- case INIT_SIGIGN:
- {
- struct hurd_sigstate *ss = _hurd_thread_sigstate (_hurd_sigthread);
- int sig;
- const sigset_t ign = value;
- __spin_lock (&ss->lock);
- for (sig = 1; sig < NSIG; ++sig)
- {
- if (__sigismember (&ign, sig))
- ss->actions[sig].sa_handler = SIG_IGN;
- else if (ss->actions[sig].sa_handler == SIG_IGN)
- ss->actions[sig].sa_handler = SIG_DFL;
- }
- __spin_unlock (&ss->lock);
- return 0;
-
- case INIT_TRACEMASK:
- _hurdsig_traced = value;
- return 0;
- }
- default:
- return EINVAL;
- }
-}
-
-kern_return_t
-_S_msg_set_init_int (mach_port_t msgport, mach_port_t auth,
- int which, int value)
-{
- AUTHCHECK;
-
- return set_int (which, value);
-}
-
-kern_return_t
-_S_msg_set_init_ints (mach_port_t msgport, mach_port_t auth,
- int *values, mach_msg_type_number_t nvalues)
-{
- error_t err;
- mach_msg_type_number_t i;
-
- AUTHCHECK;
-
- for (i = 0; i < INIT_INT_MAX; ++i)
- switch (err = set_int (i, values[i]))
- {
- case 0: /* Success. */
- break;
- case EINVAL: /* Unknown index. */
- break;
- default: /* Lossage. */
- return err;
- }
-
- return 0;
-}
-
-
-kern_return_t
-_S_msg_get_fd (mach_port_t msgport, mach_port_t auth, int which,
- mach_port_t *result, mach_msg_type_name_t *result_type)
-{
- AUTHCHECK;
-
- /* This creates a new user reference for the send right.
- Our reply message will move that reference to the caller. */
- *result = __getdport (which);
- if (*result == MACH_PORT_NULL)
- return errno;
- *result_type = MACH_MSG_TYPE_MOVE_SEND;
-
- return 0;
-}
-
-kern_return_t
-_S_msg_set_fd (mach_port_t msgport, mach_port_t auth,
- int which, mach_port_t port)
-{
- AUTHCHECK;
-
- /* We consume the reference if successful. */
- return HURD_FD_USE (which, (_hurd_port2fd (descriptor, port, 0), 0));
-}
-
-/* Snarfing and frobbing environment variables. */
-
-kern_return_t
-_S_msg_get_env_variable (mach_port_t msgport,
- char *variable,
- char **data, mach_msg_type_number_t *datalen)
-{
- error_t err;
- mach_msg_type_number_t valuelen;
- const char *value = getenv (variable);
-
- if (value == NULL)
- return ENOENT;
-
- valuelen = strlen (value);
- if (valuelen > *datalen)
- {
- if (err = __vm_allocate (__mach_task_self (),
- (vm_address_t *) data, valuelen, 1))
- return err;
- }
-
- memcpy (*data, value, valuelen);
- *datalen = valuelen;
-
- return 0;
-}
-
-
-kern_return_t
-_S_msg_set_env_variable (mach_port_t msgport, mach_port_t auth,
- char *variable,
- char *value,
- int replace)
-{
- AUTHCHECK;
-
- if (setenv (variable, value, replace)) /* XXX name space */
- return errno;
- return 0;
-}
-
-kern_return_t
-_S_msg_get_environment (mach_port_t msgport,
- char **data, mach_msg_type_number_t *datalen)
-{
- /* Pack the environment into an array with nulls separating elements. */
- if (__environ != NULL)
- {
- char *ap, **p;
- size_t envlen = 0;
-
- for (p = __environ; *p != NULL; ++p)
- envlen += strlen (*p) + 1;
-
- if (envlen > *datalen)
- {
- if (__vm_allocate (__mach_task_self (),
- (vm_address_t *) data, envlen, 1))
- return ENOMEM;
- }
-
- ap = *data;
- for (p = __environ; *p != NULL; ++p)
- ap = __memccpy (ap, *p, '\0', ULONG_MAX);
-
- *datalen = envlen;
- }
- else
- *datalen = 0;
-
- return 0;
-}
-
-kern_return_t
-_S_msg_set_environment (mach_port_t msgport, mach_port_t auth,
- char *data, mach_msg_type_number_t datalen)
-{
- int _hurd_split_args (char *, mach_msg_type_number_t, char **);
- int envc;
- char **envp;
-
- AUTHCHECK;
-
- envc = __argz_count (data, datalen);
- envp = malloc ((envc + 1) * sizeof (char *));
- if (envp == NULL)
- return errno;
- __argz_extract (data, datalen, envp);
- __environ = envp; /* XXX cooperate with loadenv et al */
- return 0;
-}
-
-
-/* XXX */
-
-kern_return_t
-_S_msg_get_dtable (mach_port_t process,
- mach_port_t refport,
- portarray_t *dtable,
- mach_msg_type_name_t *dtablePoly,
- mach_msg_type_number_t *dtableCnt)
-{ return EOPNOTSUPP; }
-
-kern_return_t
-_S_msg_set_dtable (mach_port_t process,
- mach_port_t refport,
- portarray_t dtable,
- mach_msg_type_number_t dtableCnt)
-{ return EOPNOTSUPP; }
diff --git a/hurd/hurdpid.c b/hurd/hurdpid.c
deleted file mode 100644
index 114077d0cc..0000000000
--- a/hurd/hurdpid.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-pid_t _hurd_pid, _hurd_ppid, _hurd_pgrp;
-int _hurd_orphaned;
-
-static void
-init_pids (void)
-{
- __USEPORT (PROC,
- ({
- __proc_getpids (port, &_hurd_pid, &_hurd_ppid, &_hurd_orphaned);
- __proc_getpgrp (port, _hurd_pid, &_hurd_pgrp);
- }));
-
- (void) &init_pids; /* Avoid "defined but not used" warning. */
-}
-
-text_set_element (_hurd_proc_subinit, init_pids);
-
-#include <hurd/msg_server.h>
-#include "set-hooks.h"
-#include <cthreads.h>
-
-DEFINE_HOOK (_hurd_pgrp_changed_hook, (pid_t));
-
-/* These let user threads synchronize with an operation which changes ids. */
-unsigned int _hurd_pids_changed_stamp;
-struct condition _hurd_pids_changed_sync;
-
-kern_return_t
-_S_msg_proc_newids (mach_port_t me,
- task_t task,
- pid_t ppid, pid_t pgrp, int orphaned)
-{
- int pgrp_changed;
-
- if (task != __mach_task_self ())
- return EPERM;
-
- __mach_port_deallocate (__mach_task_self (), task);
-
- pgrp_changed = pgrp != _hurd_pgrp;
- _hurd_ppid = ppid;
- _hurd_pgrp = pgrp;
- _hurd_orphaned = orphaned;
-
- if (pgrp_changed)
- /* Run things that want notification of a pgrp change. */
- RUN_HOOK (_hurd_pgrp_changed_hook, (pgrp));
-
- /* Notify any waiting user threads that the id change as been completed. */
- ++_hurd_pids_changed_stamp;
-
- return 0;
-}
diff --git a/hurd/hurdports.c b/hurd/hurdports.c
deleted file mode 100644
index 1cf918d944..0000000000
--- a/hurd/hurdports.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/port.h>
-
-
-static inline mach_port_t
-get (const int idx)
-{
- mach_port_t result;
- error_t err = _hurd_ports_get (idx, &result);
-
- if (err)
- return __hurd_fail (err), MACH_PORT_NULL;
- return result;
-}
-#define GET(type, what, idx) \
- type get##what (void) { return get (INIT_PORT_##idx); }
-
-static inline int
-set (const int idx, mach_port_t new)
-{
- error_t err = _hurd_ports_set (idx, new);
- return err ? __hurd_fail (err) : 0;
-}
-#define SET(type, what, idx) \
- int set##what (type new) { return set (INIT_PORT_##idx, new); }
-
-#define GETSET(type, what, idx) \
- GET (type, what, idx) SET (type, what, idx)
-
-GETSET (process_t, proc, PROC)
-GETSET (mach_port_t, cttyid, CTTYID)
-GETSET (file_t, cwdir, CWDIR)
-GETSET (file_t, crdir, CRDIR)
-GETSET (auth_t, auth, AUTH)
diff --git a/hurd/hurdprio.c b/hurd/hurdprio.c
deleted file mode 100644
index 5ea46b633c..0000000000
--- a/hurd/hurdprio.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Support code for dealing with priorities in the Hurd.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/resource.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-error_t
-_hurd_priority_which_map (enum __priority_which which, int who,
- error_t (*function) (pid_t, struct procinfo *),
- int pi_flags)
-{
- mach_msg_type_number_t npids = 64, i;
- pid_t pidbuf[npids], *pids = pidbuf;
- error_t err;
- struct procinfo *pip;
- int pibuf[sizeof *pip + 5 * sizeof (pip->threadinfos[0])], *pi = pibuf;
- mach_msg_type_number_t pisize = sizeof (pibuf) / sizeof (int);
-
- switch (which)
- {
- default:
- return EINVAL;
-
- case PRIO_PROCESS:
- err = (*function) (who ?: getpid (), 0); /* XXX special-case self? */
- break;
-
- case PRIO_PGRP:
- err = __USEPORT (PROC, __proc_getpgrppids (port, who, &pids, &npids));
- for (i = 0; !err && i < npids; ++i)
- err = (*function) (pids[i], 0);
- break;
-
- case PRIO_USER:
- if (who == 0)
- who = geteuid ();
- err = __USEPORT (PROC, __proc_getallpids (port, &pids, &npids));
- for (i = 0; !err && i < npids; ++i)
- {
- /* Get procinfo to check the owner. */
- int *oldpi = pi;
- mach_msg_type_number_t oldpisize = pisize;
- char *tw = 0;
- size_t twsz = 0;
- err = __USEPORT (PROC, __proc_getprocinfo (port, pids[i],
- &pi_flags,
- &pi, &pisize,
- &tw, &twsz));
- if (!err)
- {
- if (twsz) /* Gratuitous. */
- __munmap (tw, twsz);
- if (pi != oldpi && oldpi != pibuf)
- /* Old buffer from last call was not reused; free it. */
- __munmap (oldpi, oldpisize * sizeof pi[0]);
-
- pip = (struct procinfo *) pi;
- if (pip->owner == (uid_t) who)
- err = (*function) (pids[i], pip);
- }
- }
- break;
- }
-
- if (pids != pidbuf)
- __munmap (pids, npids * sizeof pids[0]);
- if (pi != pibuf)
- __munmap (pi, pisize * sizeof pi[0]);
-
- return err;
-}
diff --git a/hurd/hurdrlimit.c b/hurd/hurdrlimit.c
deleted file mode 100644
index 6efb8e51c6..0000000000
--- a/hurd/hurdrlimit.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Resource limits.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <cthreads.h>
-#include <hurd/resource.h>
-
-/* This must be given an initializer, or the a.out linking rules will
- not include the entire file when this symbol is referenced. */
-struct rlimit _hurd_rlimits[RLIM_NLIMITS] = { { 0, }, };
-
-/* This must be initialized data for the same reason as above, but this is
- intentionally initialized to a bogus value to emphasize the point that
- mutex_init is still required below just in case of unexec. */
-struct mutex _hurd_rlimit_lock = { SPIN_LOCK_INITIALIZER, };
-
-static void
-init_rlimit (void)
-{
- int i;
-
- __mutex_init (&_hurd_rlimit_lock);
-
- for (i = 0; i < RLIM_NLIMITS; ++i)
- {
- if (_hurd_rlimits[i].rlim_max == 0)
- _hurd_rlimits[i].rlim_max = RLIM_INFINITY;
- if (_hurd_rlimits[i].rlim_cur == 0)
-#define I(lim, val) case RLIMIT_##lim: _hurd_rlimits[i].rlim_cur = (val); break
- switch (i)
- {
- I (NOFILE, 1024); /* Linux 2.2.12 uses this initial value. */
-
- default:
- _hurd_rlimits[i].rlim_cur = _hurd_rlimits[i].rlim_max;
- break;
- }
-#undef I
- }
-
- (void) &init_rlimit;
-}
-text_set_element (_hurd_preinit_hook, init_rlimit);
diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c
deleted file mode 100644
index 8dc7c76995..0000000000
--- a/hurd/hurdselect.c
+++ /dev/null
@@ -1,491 +0,0 @@
-/* Guts of both `select' and `poll' for Hurd.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sys/types.h>
-#include <sys/poll.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <stdint.h>
-
-/* All user select types. */
-#define SELECT_ALL (SELECT_READ | SELECT_WRITE | SELECT_URG)
-
-/* Used to record that a particular select rpc returned. Must be distinct
- from SELECT_ALL (which better not have the high bit set). */
-#define SELECT_RETURNED ((SELECT_ALL << 1) & ~SELECT_ALL)
-
-/* Check the first NFDS descriptors either in POLLFDS (if nonnnull) or in
- each of READFDS, WRITEFDS, EXCEPTFDS that is nonnull. If TIMEOUT is not
- NULL, time out after waiting the interval specified therein. Returns
- the number of ready descriptors, or -1 for errors. */
-int
-_hurd_select (int nfds,
- struct pollfd *pollfds,
- fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
- const struct timespec *timeout, const sigset_t *sigmask)
-{
- int i;
- mach_port_t portset;
- int got;
- error_t err;
- fd_set rfds, wfds, xfds;
- int firstfd, lastfd;
- mach_msg_timeout_t to = 0;
- struct
- {
- struct hurd_userlink ulink;
- struct hurd_fd *cell;
- mach_port_t io_port;
- int type;
- mach_port_t reply_port;
- } d[nfds];
- sigset_t oset;
-
- union typeword /* Use this to avoid unkosher casts. */
- {
- mach_msg_type_t type;
- uint32_t word;
- };
- assert (sizeof (union typeword) == sizeof (mach_msg_type_t));
- assert (sizeof (uint32_t) == sizeof (mach_msg_type_t));
-
- if (nfds < 0 || (pollfds == NULL && nfds > FD_SETSIZE))
- {
- errno = EINVAL;
- return -1;
- }
-
- if (timeout != NULL)
- {
- if (timeout->tv_sec < 0 || timeout->tv_nsec < 0)
- {
- errno = EINVAL;
- return -1;
- }
-
- to = (timeout->tv_sec * 1000 +
- (timeout->tv_nsec + 999999) / 1000000);
- }
-
- if (sigmask && __sigprocmask (SIG_SETMASK, sigmask, &oset))
- return -1;
-
- if (pollfds)
- {
- /* Collect interesting descriptors from the user's `pollfd' array.
- We do a first pass that reads the user's array before taking
- any locks. The second pass then only touches our own stack,
- and gets the port references. */
-
- for (i = 0; i < nfds; ++i)
- if (pollfds[i].fd >= 0)
- {
- int type = 0;
- if (pollfds[i].events & POLLIN)
- type |= SELECT_READ;
- if (pollfds[i].events & POLLOUT)
- type |= SELECT_WRITE;
- if (pollfds[i].events & POLLPRI)
- type |= SELECT_URG;
-
- d[i].io_port = pollfds[i].fd;
- d[i].type = type;
- }
- else
- d[i].type = 0;
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_dtable_lock);
-
- for (i = 0; i < nfds; ++i)
- if (d[i].type != 0)
- {
- const int fd = (int) d[i].io_port;
-
- if (fd < _hurd_dtablesize)
- {
- d[i].cell = _hurd_dtable[fd];
- d[i].io_port = _hurd_port_get (&d[i].cell->port, &d[i].ulink);
- if (d[i].io_port != MACH_PORT_NULL)
- continue;
- }
-
- /* If one descriptor is bogus, we fail completely. */
- while (i-- > 0)
- if (d[i].type != 0)
- _hurd_port_free (&d[i].cell->port,
- &d[i].ulink, d[i].io_port);
- break;
- }
-
- __mutex_unlock (&_hurd_dtable_lock);
- HURD_CRITICAL_END;
-
- if (i < nfds)
- {
- if (sigmask)
- __sigprocmask (SIG_SETMASK, &oset, NULL);
- errno = EBADF;
- return -1;
- }
-
- lastfd = i - 1;
- firstfd = i == 0 ? lastfd : 0;
- }
- else
- {
- /* Collect interested descriptors from the user's fd_set arguments.
- Use local copies so we can't crash from user bogosity. */
-
- if (readfds == NULL)
- FD_ZERO (&rfds);
- else
- rfds = *readfds;
- if (writefds == NULL)
- FD_ZERO (&wfds);
- else
- wfds = *writefds;
- if (exceptfds == NULL)
- FD_ZERO (&xfds);
- else
- xfds = *exceptfds;
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_dtable_lock);
-
- if (nfds > _hurd_dtablesize)
- nfds = _hurd_dtablesize;
-
- /* Collect the ports for interesting FDs. */
- firstfd = lastfd = -1;
- for (i = 0; i < nfds; ++i)
- {
- int type = 0;
- if (readfds != NULL && FD_ISSET (i, &rfds))
- type |= SELECT_READ;
- if (writefds != NULL && FD_ISSET (i, &wfds))
- type |= SELECT_WRITE;
- if (exceptfds != NULL && FD_ISSET (i, &xfds))
- type |= SELECT_URG;
- d[i].type = type;
- if (type)
- {
- d[i].cell = _hurd_dtable[i];
- d[i].io_port = _hurd_port_get (&d[i].cell->port, &d[i].ulink);
- if (d[i].io_port == MACH_PORT_NULL)
- {
- /* If one descriptor is bogus, we fail completely. */
- while (i-- > 0)
- if (d[i].type != 0)
- _hurd_port_free (&d[i].cell->port, &d[i].ulink,
- d[i].io_port);
- break;
- }
- lastfd = i;
- if (firstfd == -1)
- firstfd = i;
- }
- }
-
- __mutex_unlock (&_hurd_dtable_lock);
- HURD_CRITICAL_END;
-
- if (i < nfds)
- {
- if (sigmask)
- __sigprocmask (SIG_SETMASK, &oset, NULL);
- errno = EBADF;
- return -1;
- }
- }
-
-
- err = 0;
- got = 0;
-
- /* Send them all io_select request messages. */
-
- if (firstfd == -1)
- /* But not if there were no ports to deal with at all.
- We are just a pure timeout. */
- portset = __mach_reply_port ();
- else
- {
- portset = MACH_PORT_NULL;
-
- for (i = firstfd; i <= lastfd; ++i)
- if (d[i].type)
- {
- int type = d[i].type;
- d[i].reply_port = __mach_reply_port ();
- err = __io_select (d[i].io_port, d[i].reply_port,
- /* Poll only if there's a single descriptor. */
- (firstfd == lastfd) ? to : 0,
- &type);
- switch (err)
- {
- case MACH_RCV_TIMED_OUT:
- /* No immediate response. This is normal. */
- err = 0;
- if (firstfd == lastfd)
- /* When there's a single descriptor, we don't need a
- portset, so just pretend we have one, but really
- use the single reply port. */
- portset = d[i].reply_port;
- else if (got == 0)
- /* We've got multiple reply ports, so we need a port set to
- multiplex them. */
- {
- /* We will wait again for a reply later. */
- if (portset == MACH_PORT_NULL)
- /* Create the portset to receive all the replies on. */
- err = __mach_port_allocate (__mach_task_self (),
- MACH_PORT_RIGHT_PORT_SET,
- &portset);
- if (! err)
- /* Put this reply port in the port set. */
- __mach_port_move_member (__mach_task_self (),
- d[i].reply_port, portset);
- }
- break;
-
- default:
- /* No other error should happen. Callers of select
- don't expect to see errors, so we simulate
- readiness of the erring object and the next call
- hopefully will get the error again. */
- type = SELECT_ALL;
- /* FALLTHROUGH */
-
- case 0:
- /* We got an answer. */
- if ((type & SELECT_ALL) == 0)
- /* Bogus answer; treat like an error, as a fake positive. */
- type = SELECT_ALL;
-
- /* This port is already ready already. */
- d[i].type &= type;
- d[i].type |= SELECT_RETURNED;
- ++got;
- break;
- }
- _hurd_port_free (&d[i].cell->port, &d[i].ulink, d[i].io_port);
- }
- }
-
- /* Now wait for reply messages. */
- if (!err && got == 0)
- {
- /* Now wait for io_select_reply messages on PORT,
- timing out as appropriate. */
-
- union
- {
- mach_msg_header_t head;
-#ifdef MACH_MSG_TRAILER_MINIMUM_SIZE
- struct
- {
- mach_msg_header_t head;
- NDR_record_t ndr;
- error_t err;
- } error;
- struct
- {
- mach_msg_header_t head;
- NDR_record_t ndr;
- error_t err;
- int result;
- mach_msg_trailer_t trailer;
- } success;
-#else
- struct
- {
- mach_msg_header_t head;
- union typeword err_type;
- error_t err;
- } error;
- struct
- {
- mach_msg_header_t head;
- union typeword err_type;
- error_t err;
- union typeword result_type;
- int result;
- } success;
-#endif
- } msg;
- mach_msg_option_t options = (timeout == NULL ? 0 : MACH_RCV_TIMEOUT);
- error_t msgerr;
- while ((msgerr = __mach_msg (&msg.head,
- MACH_RCV_MSG | MACH_RCV_INTERRUPT | options,
- 0, sizeof msg, portset, to,
- MACH_PORT_NULL)) == MACH_MSG_SUCCESS)
- {
- /* We got a message. Decode it. */
-#define IO_SELECT_REPLY_MSGID (21012 + 100) /* XXX */
-#ifdef MACH_MSG_TYPE_BIT
- const union typeword inttype =
- { type:
- { MACH_MSG_TYPE_INTEGER_T, sizeof (integer_t) * 8, 1, 1, 0, 0 }
- };
-#endif
- if (msg.head.msgh_id == IO_SELECT_REPLY_MSGID &&
- msg.head.msgh_size >= sizeof msg.error &&
- !(msg.head.msgh_bits & MACH_MSGH_BITS_COMPLEX) &&
-#ifdef MACH_MSG_TYPE_BIT
- msg.error.err_type.word == inttype.word
-#endif
- )
- {
- /* This is a properly formatted message so far.
- See if it is a success or a failure. */
- if (msg.error.err == EINTR &&
- msg.head.msgh_size == sizeof msg.error)
- {
- /* EINTR response; poll for further responses
- and then return quickly. */
- err = EINTR;
- goto poll;
- }
- if (msg.error.err ||
- msg.head.msgh_size != sizeof msg.success ||
-#ifdef MACH_MSG_TYPE_BIT
- msg.success.result_type.word != inttype.word ||
-#endif
- (msg.success.result & SELECT_ALL) == 0)
- {
- /* Error or bogus reply. Simulate readiness. */
- __mach_msg_destroy (&msg.head);
- msg.success.result = SELECT_ALL;
- }
-
- /* Look up the respondent's reply port and record its
- readiness. */
- {
- int had = got;
- if (firstfd != -1)
- for (i = firstfd; i <= lastfd; ++i)
- if (d[i].type
- && d[i].reply_port == msg.head.msgh_local_port)
- {
- d[i].type &= msg.success.result;
- d[i].type |= SELECT_RETURNED;
- ++got;
- }
- assert (got > had);
- }
- }
-
- if (msg.head.msgh_remote_port != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (),
- msg.head.msgh_remote_port);
-
- if (got)
- poll:
- {
- /* Poll for another message. */
- to = 0;
- options |= MACH_RCV_TIMEOUT;
- }
- }
-
- if (msgerr == MACH_RCV_INTERRUPTED)
- /* Interruption on our side (e.g. signal reception). */
- err = EINTR;
-
- if (got)
- /* At least one descriptor is known to be ready now, so we will
- return success. */
- err = 0;
- }
-
- if (firstfd != -1)
- for (i = firstfd; i <= lastfd; ++i)
- if (d[i].type)
- __mach_port_destroy (__mach_task_self (), d[i].reply_port);
- if (firstfd == -1 || (firstfd != lastfd && portset != MACH_PORT_NULL))
- /* Destroy PORTSET, but only if it's not actually the reply port for a
- single descriptor (in which case it's destroyed in the previous loop;
- not doing it here is just a bit more efficient). */
- __mach_port_destroy (__mach_task_self (), portset);
-
- if (err)
- {
- if (sigmask)
- __sigprocmask (SIG_SETMASK, &oset, NULL);
- return __hurd_fail (err);
- }
-
- if (pollfds)
- /* Fill in the `revents' members of the user's array. */
- for (i = 0; i < nfds; ++i)
- {
- int type = d[i].type;
- int_fast16_t revents = 0;
-
- if (type & SELECT_RETURNED)
- {
- if (type & SELECT_READ)
- revents |= POLLIN;
- if (type & SELECT_WRITE)
- revents |= POLLOUT;
- if (type & SELECT_URG)
- revents |= POLLPRI;
- }
-
- pollfds[i].revents = revents;
- }
- else
- {
- /* Below we recalculate GOT to include an increment for each operation
- allowed on each fd. */
- got = 0;
-
- /* Set the user bitarrays. We only ever have to clear bits, as all
- desired ones are initially set. */
- if (firstfd != -1)
- for (i = firstfd; i <= lastfd; ++i)
- {
- int type = d[i].type;
-
- if ((type & SELECT_RETURNED) == 0)
- type = 0;
-
- if (type & SELECT_READ)
- got++;
- else if (readfds)
- FD_CLR (i, readfds);
- if (type & SELECT_WRITE)
- got++;
- else if (writefds)
- FD_CLR (i, writefds);
- if (type & SELECT_URG)
- got++;
- else if (exceptfds)
- FD_CLR (i, exceptfds);
- }
- }
-
- if (sigmask && __sigprocmask (SIG_SETMASK, &oset, NULL))
- return -1;
-
- return got;
-}
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
deleted file mode 100644
index ec6a6995e6..0000000000
--- a/hurd/hurdsig.c
+++ /dev/null
@@ -1,1405 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <cthreads.h> /* For `struct mutex'. */
-#include <mach.h>
-#include <mach/thread_switch.h>
-
-#include <hurd.h>
-#include <hurd/id.h>
-#include <hurd/signal.h>
-
-#include "hurdfault.h"
-#include "hurdmalloc.h" /* XXX */
-#include "../locale/localeinfo.h"
-
-const char *_hurdsig_getenv (const char *);
-
-struct mutex _hurd_siglock;
-int _hurd_stopped;
-
-/* Port that receives signals and other miscellaneous messages. */
-mach_port_t _hurd_msgport;
-
-/* Thread listening on it. */
-thread_t _hurd_msgport_thread;
-
-/* Thread which receives task-global signals. */
-thread_t _hurd_sigthread;
-
-/* These are set up by _hurdsig_init. */
-unsigned long int __hurd_sigthread_stack_base;
-unsigned long int __hurd_sigthread_stack_end;
-unsigned long int *__hurd_sigthread_variables;
-
-/* Linked-list of per-thread signal state. */
-struct hurd_sigstate *_hurd_sigstates;
-
-/* Timeout for RPC's after interrupt_operation. */
-mach_msg_timeout_t _hurd_interrupted_rpc_timeout = 3000;
-
-static void
-default_sigaction (struct sigaction actions[NSIG])
-{
- int signo;
-
- __sigemptyset (&actions[0].sa_mask);
- actions[0].sa_flags = SA_RESTART;
- actions[0].sa_handler = SIG_DFL;
-
- for (signo = 1; signo < NSIG; ++signo)
- actions[signo] = actions[0];
-}
-
-struct hurd_sigstate *
-_hurd_thread_sigstate (thread_t thread)
-{
- struct hurd_sigstate *ss;
- __mutex_lock (&_hurd_siglock);
- for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
- if (ss->thread == thread)
- break;
- if (ss == NULL)
- {
- ss = malloc (sizeof (*ss));
- if (ss == NULL)
- __libc_fatal ("hurd: Can't allocate thread sigstate\n");
- ss->thread = thread;
- __spin_lock_init (&ss->lock);
-
- /* Initialize default state. */
- __sigemptyset (&ss->blocked);
- __sigemptyset (&ss->pending);
- memset (&ss->sigaltstack, 0, sizeof (ss->sigaltstack));
- ss->preemptors = NULL;
- ss->suspended = MACH_PORT_NULL;
- ss->intr_port = MACH_PORT_NULL;
- ss->context = NULL;
-
- /* Initialize the sigaction vector from the default signal receiving
- thread's state, and its from the system defaults. */
- if (thread == _hurd_sigthread)
- default_sigaction (ss->actions);
- else
- {
- struct hurd_sigstate *s;
- for (s = _hurd_sigstates; s != NULL; s = s->next)
- if (s->thread == _hurd_sigthread)
- break;
- if (s)
- {
- __spin_lock (&s->lock);
- memcpy (ss->actions, s->actions, sizeof (s->actions));
- __spin_unlock (&s->lock);
- }
- else
- default_sigaction (ss->actions);
- }
-
- ss->next = _hurd_sigstates;
- _hurd_sigstates = ss;
- }
- __mutex_unlock (&_hurd_siglock);
- return ss;
-}
-
-/* Signal delivery itself is on this page. */
-
-#include <hurd/fd.h>
-#include <hurd/crash.h>
-#include <hurd/resource.h>
-#include <hurd/paths.h>
-#include <setjmp.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <thread_state.h>
-#include <hurd/msg_server.h>
-#include <hurd/msg_reply.h> /* For __msg_sig_post_reply. */
-#include <hurd/interrupt.h>
-#include <assert.h>
-#include <unistd.h>
-
-
-/* Call the crash dump server to mummify us before we die.
- Returns nonzero if a core file was written. */
-static int
-write_corefile (int signo, const struct hurd_signal_detail *detail)
-{
- error_t err;
- mach_port_t coreserver;
- file_t file, coredir;
- const char *name;
-
- /* Don't bother locking since we just read the one word. */
- rlim_t corelimit = _hurd_rlimits[RLIMIT_CORE].rlim_cur;
-
- if (corelimit == 0)
- /* No core dumping, thank you very much. Note that this makes
- `ulimit -c 0' prevent crash-suspension too, which is probably
- what the user wanted. */
- return 0;
-
- /* XXX RLIMIT_CORE:
- When we have a protocol to make the server return an error
- for RLIMIT_FSIZE, then tell the corefile fs server the RLIMIT_CORE
- value in place of the RLIMIT_FSIZE value. */
-
- /* First get a port to the core dumping server. */
- coreserver = MACH_PORT_NULL;
- name = _hurdsig_getenv ("CRASHSERVER");
- if (name != NULL)
- coreserver = __file_name_lookup (name, 0, 0);
- if (coreserver == MACH_PORT_NULL)
- coreserver = __file_name_lookup (_SERVERS_CRASH, 0, 0);
- if (coreserver == MACH_PORT_NULL)
- return 0;
-
- /* Get a port to the directory where the new core file will reside. */
- file = MACH_PORT_NULL;
- name = _hurdsig_getenv ("COREFILE");
- if (name == NULL)
- name = "core";
- coredir = __file_name_split (name, (char **) &name);
- if (coredir != MACH_PORT_NULL)
- /* Create the new file, but don't link it into the directory yet. */
- __dir_mkfile (coredir, O_WRONLY|O_CREAT,
- 0600 & ~_hurd_umask, /* XXX ? */
- &file);
-
- /* Call the core dumping server to write the core file. */
- err = __crash_dump_task (coreserver,
- __mach_task_self (),
- file,
- signo, detail->code, detail->error,
- detail->exc, detail->exc_code, detail->exc_subcode,
- _hurd_ports[INIT_PORT_CTTYID].port,
- MACH_MSG_TYPE_COPY_SEND);
- __mach_port_deallocate (__mach_task_self (), coreserver);
-
- if (! err && file != MACH_PORT_NULL)
- /* The core dump into FILE succeeded, so now link it into the
- directory. */
- err = __dir_link (coredir, file, name, 1);
- __mach_port_deallocate (__mach_task_self (), file);
- __mach_port_deallocate (__mach_task_self (), coredir);
- return !err && file != MACH_PORT_NULL;
-}
-
-
-/* The lowest-numbered thread state flavor value is 1,
- so we use bit 0 in machine_thread_all_state.set to
- record whether we have done thread_abort. */
-#define THREAD_ABORTED 1
-
-/* SS->thread is suspended. Abort the thread and get its basic state. */
-static void
-abort_thread (struct hurd_sigstate *ss, struct machine_thread_all_state *state,
- void (*reply) (void))
-{
- if (!(state->set & THREAD_ABORTED))
- {
- error_t err = __thread_abort (ss->thread);
- assert_perror (err);
- /* Clear all thread state flavor set bits, because thread_abort may
- have changed the state. */
- state->set = THREAD_ABORTED;
- }
-
- if (reply)
- (*reply) ();
-
- machine_get_basic_state (ss->thread, state);
-}
-
-/* Find the location of the MiG reply port cell in use by the thread whose
- state is described by THREAD_STATE. If SIGTHREAD is nonzero, make sure
- that this location can be set without faulting, or else return NULL. */
-
-static mach_port_t *
-interrupted_reply_port_location (struct machine_thread_all_state *thread_state,
- int sigthread)
-{
- mach_port_t *portloc = (mach_port_t *) __hurd_threadvar_location_from_sp
- (_HURD_THREADVAR_MIG_REPLY, (void *) thread_state->basic.SP);
-
- if (sigthread && _hurdsig_catch_memory_fault (portloc))
- /* Faulted trying to read the stack. */
- return NULL;
-
- /* Fault now if this pointer is bogus. */
- *(volatile mach_port_t *) portloc = *portloc;
-
- if (sigthread)
- _hurdsig_end_catch_fault ();
-
- return portloc;
-}
-
-#include <hurd/sigpreempt.h>
-#include <intr-msg.h>
-
-/* Timeout on interrupt_operation calls. */
-mach_msg_timeout_t _hurdsig_interrupt_timeout = 1000;
-
-/* SS->thread is suspended.
-
- Abort any interruptible RPC operation the thread is doing.
-
- This uses only the constant member SS->thread and the unlocked, atomically
- set member SS->intr_port, so no locking is needed.
-
- If successfully sent an interrupt_operation and therefore the thread should
- wait for its pending RPC to return (possibly EINTR) before taking the
- incoming signal, returns the reply port to be received on. Otherwise
- returns MACH_PORT_NULL.
-
- SIGNO is used to find the applicable SA_RESTART bit. If SIGNO is zero,
- the RPC fails with EINTR instead of restarting (thread_cancel).
-
- *STATE_CHANGE is set nonzero if STATE->basic was modified and should
- be applied back to the thread if it might ever run again, else zero. */
-
-mach_port_t
-_hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread,
- struct machine_thread_all_state *state, int *state_change,
- void (*reply) (void))
-{
- extern const void _hurd_intr_rpc_msg_in_trap;
- mach_port_t rcv_port = MACH_PORT_NULL;
- mach_port_t intr_port;
-
- *state_change = 0;
-
- intr_port = ss->intr_port;
- if (intr_port == MACH_PORT_NULL)
- /* No interruption needs done. */
- return MACH_PORT_NULL;
-
- /* Abort the thread's kernel context, so any pending message send or
- receive completes immediately or aborts. */
- abort_thread (ss, state, reply);
-
- if (state->basic.PC < (natural_t) &_hurd_intr_rpc_msg_in_trap)
- {
- /* The thread is about to do the RPC, but hasn't yet entered
- mach_msg. Mutate the thread's state so it knows not to try
- the RPC. */
- INTR_MSG_BACK_OUT (&state->basic);
- MACHINE_THREAD_STATE_SET_PC (&state->basic,
- &_hurd_intr_rpc_msg_in_trap);
- state->basic.SYSRETURN = MACH_SEND_INTERRUPTED;
- *state_change = 1;
- }
- else if (state->basic.PC == (natural_t) &_hurd_intr_rpc_msg_in_trap &&
- /* The thread was blocked in the system call. After thread_abort,
- the return value register indicates what state the RPC was in
- when interrupted. */
- state->basic.SYSRETURN == MACH_RCV_INTERRUPTED)
- {
- /* The RPC request message was sent and the thread was waiting for
- the reply message; now the message receive has been aborted, so
- the mach_msg call will return MACH_RCV_INTERRUPTED. We must tell
- the server to interrupt the pending operation. The thread must
- wait for the reply message before running the signal handler (to
- guarantee that the operation has finished being interrupted), so
- our nonzero return tells the trampoline code to finish the message
- receive operation before running the handler. */
-
- mach_port_t *reply = interrupted_reply_port_location (state,
- sigthread);
- error_t err = __interrupt_operation (intr_port, _hurdsig_interrupt_timeout);
-
- if (err)
- {
- if (reply)
- {
- /* The interrupt didn't work.
- Destroy the receive right the thread is blocked on. */
- __mach_port_destroy (__mach_task_self (), *reply);
- *reply = MACH_PORT_NULL;
- }
-
- /* The system call return value register now contains
- MACH_RCV_INTERRUPTED; when mach_msg resumes, it will retry the
- call. Since we have just destroyed the receive right, the
- retry will fail with MACH_RCV_INVALID_NAME. Instead, just
- change the return value here to EINTR so mach_msg will not
- retry and the EINTR error code will propagate up. */
- state->basic.SYSRETURN = EINTR;
- *state_change = 1;
- }
- else if (reply)
- rcv_port = *reply;
-
- /* All threads whose RPCs were interrupted by the interrupt_operation
- call above will retry their RPCs unless we clear SS->intr_port.
- So we clear it for the thread taking a signal when SA_RESTART is
- clear, so that its call returns EINTR. */
- if (! signo || !(ss->actions[signo].sa_flags & SA_RESTART))
- ss->intr_port = MACH_PORT_NULL;
- }
-
- return rcv_port;
-}
-
-
-/* Abort the RPCs being run by all threads but this one;
- all other threads should be suspended. If LIVE is nonzero, those
- threads may run again, so they should be adjusted as necessary to be
- happy when resumed. STATE is clobbered as a scratch area; its initial
- contents are ignored, and its contents on return are not useful. */
-
-static void
-abort_all_rpcs (int signo, struct machine_thread_all_state *state, int live)
-{
- /* We can just loop over the sigstates. Any thread doing something
- interruptible must have one. We needn't bother locking because all
- other threads are stopped. */
-
- struct hurd_sigstate *ss;
- size_t nthreads;
- mach_port_t *reply_ports;
-
- /* First loop over the sigstates to count them.
- We need to know how big a vector we will need for REPLY_PORTS. */
- nthreads = 0;
- for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
- ++nthreads;
-
- reply_ports = alloca (nthreads * sizeof *reply_ports);
-
- nthreads = 0;
- for (ss = _hurd_sigstates; ss != NULL; ss = ss->next, ++nthreads)
- if (ss->thread == _hurd_msgport_thread)
- reply_ports[nthreads] = MACH_PORT_NULL;
- else
- {
- int state_changed;
- state->set = 0; /* Reset scratch area. */
-
- /* Abort any operation in progress with interrupt_operation.
- Record the reply port the thread is waiting on.
- We will wait for all the replies below. */
- reply_ports[nthreads] = _hurdsig_abort_rpcs (ss, signo, 1,
- state, &state_changed,
- NULL);
- if (live)
- {
- if (reply_ports[nthreads] != MACH_PORT_NULL)
- {
- /* We will wait for the reply to this RPC below, so the
- thread must issue a new RPC rather than waiting for the
- reply to the one it sent. */
- state->basic.SYSRETURN = EINTR;
- state_changed = 1;
- }
- if (state_changed)
- /* Aborting the RPC needed to change this thread's state,
- and it might ever run again. So write back its state. */
- __thread_set_state (ss->thread, MACHINE_THREAD_STATE_FLAVOR,
- (natural_t *) &state->basic,
- MACHINE_THREAD_STATE_COUNT);
- }
- }
-
- /* Wait for replies from all the successfully interrupted RPCs. */
- while (nthreads-- > 0)
- if (reply_ports[nthreads] != MACH_PORT_NULL)
- {
- error_t err;
- mach_msg_header_t head;
- err = __mach_msg (&head, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, sizeof head,
- reply_ports[nthreads],
- _hurd_interrupted_rpc_timeout, MACH_PORT_NULL);
- switch (err)
- {
- case MACH_RCV_TIMED_OUT:
- case MACH_RCV_TOO_LARGE:
- break;
-
- default:
- assert_perror (err);
- }
- }
-}
-
-struct hurd_signal_preemptor *_hurdsig_preemptors = 0;
-sigset_t _hurdsig_preempted_set;
-
-/* XXX temporary to deal with spelling fix */
-weak_alias (_hurdsig_preemptors, _hurdsig_preempters)
-
-/* Mask of stop signals. */
-#define STOPSIGS (sigmask (SIGTTIN) | sigmask (SIGTTOU) | \
- sigmask (SIGSTOP) | sigmask (SIGTSTP))
-
-/* Deliver a signal. SS is not locked. */
-void
-_hurd_internal_post_signal (struct hurd_sigstate *ss,
- int signo, struct hurd_signal_detail *detail,
- mach_port_t reply_port,
- mach_msg_type_name_t reply_port_type,
- int untraced)
-{
- error_t err;
- struct machine_thread_all_state thread_state;
- enum { stop, ignore, core, term, handle } act;
- sighandler_t handler;
- sigset_t pending;
- int ss_suspended;
-
- /* Reply to this sig_post message. */
- __typeof (__msg_sig_post_reply) *reply_rpc
- = (untraced ? __msg_sig_post_untraced_reply : __msg_sig_post_reply);
- void reply (void)
- {
- error_t err;
- if (reply_port == MACH_PORT_NULL)
- return;
- err = (*reply_rpc) (reply_port, reply_port_type, 0);
- reply_port = MACH_PORT_NULL;
- if (err != MACH_SEND_INVALID_DEST) /* Ignore dead reply port. */
- assert_perror (err);
- }
-
- /* Mark the signal as pending. */
- void mark_pending (void)
- {
- __sigaddset (&ss->pending, signo);
- /* Save the details to be given to the handler when SIGNO is
- unblocked. */
- ss->pending_data[signo] = *detail;
- }
-
- /* Suspend the process with SIGNO. */
- void suspend (void)
- {
- /* Stop all other threads and mark ourselves stopped. */
- __USEPORT (PROC,
- ({
- /* Hold the siglock while stopping other threads to be
- sure it is not held by another thread afterwards. */
- __mutex_lock (&_hurd_siglock);
- __proc_dostop (port, _hurd_msgport_thread);
- __mutex_unlock (&_hurd_siglock);
- abort_all_rpcs (signo, &thread_state, 1);
- reply ();
- __proc_mark_stop (port, signo, detail->code);
- }));
- _hurd_stopped = 1;
- }
- /* Resume the process after a suspension. */
- void resume (void)
- {
- /* Resume the process from being stopped. */
- thread_t *threads;
- mach_msg_type_number_t nthreads, i;
- error_t err;
-
- if (! _hurd_stopped)
- return;
-
- /* Tell the proc server we are continuing. */
- __USEPORT (PROC, __proc_mark_cont (port));
- /* Fetch ports to all our threads and resume them. */
- err = __task_threads (__mach_task_self (), &threads, &nthreads);
- assert_perror (err);
- for (i = 0; i < nthreads; ++i)
- {
- if (threads[i] != _hurd_msgport_thread &&
- (act != handle || threads[i] != ss->thread))
- {
- err = __thread_resume (threads[i]);
- assert_perror (err);
- }
- err = __mach_port_deallocate (__mach_task_self (),
- threads[i]);
- assert_perror (err);
- }
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) threads,
- nthreads * sizeof *threads);
- _hurd_stopped = 0;
- if (act == handle)
- /* The thread that will run the handler is already suspended. */
- ss_suspended = 1;
- }
-
- if (signo == 0)
- {
- if (untraced)
- /* This is PTRACE_CONTINUE. */
- resume ();
-
- /* This call is just to check for pending signals. */
- __spin_lock (&ss->lock);
- goto check_pending_signals;
- }
-
- post_signal:
-
- thread_state.set = 0; /* We know nothing. */
-
- __spin_lock (&ss->lock);
-
- /* Check for a preempted signal. Preempted signals can arrive during
- critical sections. */
- {
- inline sighandler_t try_preemptor (struct hurd_signal_preemptor *pe)
- { /* PE cannot be null. */
- do
- {
- if (HURD_PREEMPT_SIGNAL_P (pe, signo, detail->code))
- {
- if (pe->preemptor)
- {
- sighandler_t handler = (*pe->preemptor) (pe, ss,
- &signo, detail);
- if (handler != SIG_ERR)
- return handler;
- }
- else
- return pe->handler;
- }
- pe = pe->next;
- } while (pe != 0);
- return SIG_ERR;
- }
-
- handler = ss->preemptors ? try_preemptor (ss->preemptors) : SIG_ERR;
-
- /* If no thread-specific preemptor, check for a global one. */
- if (handler == SIG_ERR && __sigismember (&_hurdsig_preempted_set, signo))
- {
- __mutex_lock (&_hurd_siglock);
- handler = try_preemptor (_hurdsig_preemptors);
- __mutex_unlock (&_hurd_siglock);
- }
- }
-
- ss_suspended = 0;
-
- if (handler == SIG_IGN)
- /* Ignore the signal altogether. */
- act = ignore;
- else if (handler != SIG_ERR)
- /* Run the preemption-provided handler. */
- act = handle;
- else
- {
- /* No preemption. Do normal handling. */
-
- if (!untraced && __sigismember (&_hurdsig_traced, signo))
- {
- /* We are being traced. Stop to tell the debugger of the signal. */
- if (_hurd_stopped)
- /* Already stopped. Mark the signal as pending;
- when resumed, we will notice it and stop again. */
- mark_pending ();
- else
- suspend ();
- __spin_unlock (&ss->lock);
- reply ();
- return;
- }
-
- handler = ss->actions[signo].sa_handler;
-
- if (handler == SIG_DFL)
- /* Figure out the default action for this signal. */
- switch (signo)
- {
- case 0:
- /* A sig_post msg with SIGNO==0 is sent to
- tell us to check for pending signals. */
- act = ignore;
- break;
-
- case SIGTTIN:
- case SIGTTOU:
- case SIGSTOP:
- case SIGTSTP:
- act = stop;
- break;
-
- case SIGCONT:
- case SIGIO:
- case SIGURG:
- case SIGCHLD:
- case SIGWINCH:
- act = ignore;
- break;
-
- case SIGQUIT:
- case SIGILL:
- case SIGTRAP:
- case SIGIOT:
- case SIGEMT:
- case SIGFPE:
- case SIGBUS:
- case SIGSEGV:
- case SIGSYS:
- act = core;
- break;
-
- case SIGINFO:
- if (_hurd_pgrp == _hurd_pid)
- {
- /* We are the process group leader. Since there is no
- user-specified handler for SIGINFO, we use a default one
- which prints something interesting. We use the normal
- handler mechanism instead of just doing it here to avoid
- the signal thread faulting or blocking in this
- potentially hairy operation. */
- act = handle;
- handler = _hurd_siginfo_handler;
- }
- else
- act = ignore;
- break;
-
- default:
- act = term;
- break;
- }
- else if (handler == SIG_IGN)
- act = ignore;
- else
- act = handle;
-
- if (__sigmask (signo) & STOPSIGS)
- /* Stop signals clear a pending SIGCONT even if they
- are handled or ignored (but not if preempted). */
- __sigdelset (&ss->pending, SIGCONT);
- else
- {
- if (signo == SIGCONT)
- /* Even if handled or ignored (but not preempted), SIGCONT clears
- stop signals and resumes the process. */
- ss->pending &= ~STOPSIGS;
-
- if (_hurd_stopped && act != stop && (untraced || signo == SIGCONT))
- resume ();
- }
- }
-
- if (_hurd_orphaned && act == stop &&
- (__sigmask (signo) & (__sigmask (SIGTTIN) | __sigmask (SIGTTOU) |
- __sigmask (SIGTSTP))))
- {
- /* If we would ordinarily stop for a job control signal, but we are
- orphaned so noone would ever notice and continue us again, we just
- quietly die, alone and in the dark. */
- detail->code = signo;
- signo = SIGKILL;
- act = term;
- }
-
- /* Handle receipt of a blocked signal, or any signal while stopped. */
- if (act != ignore && /* Signals ignored now are forgotten now. */
- __sigismember (&ss->blocked, signo) ||
- (signo != SIGKILL && _hurd_stopped))
- {
- mark_pending ();
- act = ignore;
- }
-
- /* Perform the chosen action for the signal. */
- switch (act)
- {
- case stop:
- if (_hurd_stopped)
- {
- /* We are already stopped, but receiving an untraced stop
- signal. Instead of resuming and suspending again, just
- notify the proc server of the new stop signal. */
- error_t err = __USEPORT (PROC, __proc_mark_stop
- (port, signo, detail->code));
- assert_perror (err);
- }
- else
- /* Suspend the process. */
- suspend ();
- break;
-
- case ignore:
- if (detail->exc)
- /* Blocking or ignoring a machine exception is fatal.
- Otherwise we could just spin on the faulting instruction. */
- goto fatal;
-
- /* Nobody cares about this signal. If there was a call to resume
- above in SIGCONT processing and we've left a thread suspended,
- now's the time to set it going. */
- if (ss_suspended)
- {
- err = __thread_resume (ss->thread);
- assert_perror (err);
- ss_suspended = 0;
- }
- break;
-
- sigbomb:
- /* We got a fault setting up the stack frame for the handler.
- Nothing to do but die; BSD gets SIGILL in this case. */
- detail->code = signo; /* XXX ? */
- signo = SIGILL;
-
- fatal:
- act = core;
- /* FALLTHROUGH */
-
- case term: /* Time to die. */
- case core: /* And leave a rotting corpse. */
- /* Have the proc server stop all other threads in our task. */
- err = __USEPORT (PROC, __proc_dostop (port, _hurd_msgport_thread));
- assert_perror (err);
- /* No more user instructions will be executed.
- The signal can now be considered delivered. */
- reply ();
- /* Abort all server operations now in progress. */
- abort_all_rpcs (signo, &thread_state, 0);
-
- {
- int status = W_EXITCODE (0, signo);
- /* Do a core dump if desired. Only set the wait status bit saying we
- in fact dumped core if the operation was actually successful. */
- if (act == core && write_corefile (signo, detail))
- status |= WCOREFLAG;
- /* Tell proc how we died and then stick the saber in the gut. */
- _hurd_exit (status);
- /* NOTREACHED */
- }
-
- case handle:
- /* Call a handler for this signal. */
- {
- struct sigcontext *scp, ocontext;
- int wait_for_reply, state_changed;
-
- /* Stop the thread and abort its pending RPC operations. */
- if (! ss_suspended)
- {
- err = __thread_suspend (ss->thread);
- assert_perror (err);
- }
-
- /* Abort the thread's kernel context, so any pending message send
- or receive completes immediately or aborts. If an interruptible
- RPC is in progress, abort_rpcs will do this. But we must always
- do it before fetching the thread's state, because
- thread_get_state is never kosher before thread_abort. */
- abort_thread (ss, &thread_state, NULL);
-
- if (ss->context)
- {
- /* We have a previous sigcontext that sigreturn was about
- to restore when another signal arrived. */
-
- mach_port_t *loc;
-
- if (_hurdsig_catch_memory_fault (ss->context))
- {
- /* We faulted reading the thread's stack. Forget that
- context and pretend it wasn't there. It almost
- certainly crash if this handler returns, but that's it's
- problem. */
- ss->context = NULL;
- }
- else
- {
- /* Copy the context from the thread's stack before
- we start diddling the stack to set up the handler. */
- ocontext = *ss->context;
- ss->context = &ocontext;
- }
- _hurdsig_end_catch_fault ();
-
- if (! machine_get_basic_state (ss->thread, &thread_state))
- goto sigbomb;
- loc = interrupted_reply_port_location (&thread_state, 1);
- if (loc && *loc != MACH_PORT_NULL)
- /* This is the reply port for the context which called
- sigreturn. Since we are abandoning that context entirely
- and restoring SS->context instead, destroy this port. */
- __mach_port_destroy (__mach_task_self (), *loc);
-
- /* The thread was in sigreturn, not in any interruptible RPC. */
- wait_for_reply = 0;
-
- assert (! __spin_lock_locked (&ss->critical_section_lock));
- }
- else
- {
- int crit = __spin_lock_locked (&ss->critical_section_lock);
-
- wait_for_reply
- = (_hurdsig_abort_rpcs (ss,
- /* In a critical section, any RPC
- should be cancelled instead of
- restarted, regardless of
- SA_RESTART, so the entire
- "atomic" operation can be aborted
- as a unit. */
- crit ? 0 : signo, 1,
- &thread_state, &state_changed,
- &reply)
- != MACH_PORT_NULL);
-
- if (crit)
- {
- /* The thread is in a critical section. Mark the signal as
- pending. When it finishes the critical section, it will
- check for pending signals. */
- mark_pending ();
- if (state_changed)
- /* Some cases of interrupting an RPC must change the
- thread state to back out the call. Normally this
- change is rolled into the warping to the handler and
- sigreturn, but we are not running the handler now
- because the thread is in a critical section. Instead,
- mutate the thread right away for the RPC interruption
- and resume it; the RPC will return early so the
- critical section can end soon. */
- __thread_set_state (ss->thread, MACHINE_THREAD_STATE_FLAVOR,
- (natural_t *) &thread_state.basic,
- MACHINE_THREAD_STATE_COUNT);
- /* */
- ss->intr_port = MACH_PORT_NULL;
- __thread_resume (ss->thread);
- break;
- }
- }
-
- /* Call the machine-dependent function to set the thread up
- to run the signal handler, and preserve its old context. */
- scp = _hurd_setup_sighandler (ss, handler, signo, detail,
- wait_for_reply, &thread_state);
- if (scp == NULL)
- goto sigbomb;
-
- /* Set the machine-independent parts of the signal context. */
-
- {
- /* Fetch the thread variable for the MiG reply port,
- and set it to MACH_PORT_NULL. */
- mach_port_t *loc = interrupted_reply_port_location (&thread_state,
- 1);
- if (loc)
- {
- scp->sc_reply_port = *loc;
- *loc = MACH_PORT_NULL;
- }
- else
- scp->sc_reply_port = MACH_PORT_NULL;
-
- /* Save the intr_port in use by the interrupted code,
- and clear the cell before running the trampoline. */
- scp->sc_intr_port = ss->intr_port;
- ss->intr_port = MACH_PORT_NULL;
-
- if (ss->context)
- {
- /* After the handler runs we will restore to the state in
- SS->context, not the state of the thread now. So restore
- that context's reply port and intr port. */
-
- scp->sc_reply_port = ss->context->sc_reply_port;
- scp->sc_intr_port = ss->context->sc_intr_port;
-
- ss->context = NULL;
- }
- }
-
- /* Backdoor extra argument to signal handler. */
- scp->sc_error = detail->error;
-
- /* Block requested signals while running the handler. */
- scp->sc_mask = ss->blocked;
- __sigorset (&ss->blocked, &ss->blocked, &ss->actions[signo].sa_mask);
-
- /* Also block SIGNO unless we're asked not to. */
- if (! (ss->actions[signo].sa_flags & (SA_RESETHAND | SA_NODEFER)))
- __sigaddset (&ss->blocked, signo);
-
- /* Reset to SIG_DFL if requested. SIGILL and SIGTRAP cannot
- be automatically reset when delivered; the system silently
- enforces this restriction. */
- if (ss->actions[signo].sa_flags & SA_RESETHAND
- && signo != SIGILL && signo != SIGTRAP)
- ss->actions[signo].sa_handler = SIG_DFL;
-
- /* Start the thread running the handler (or possibly waiting for an
- RPC reply before running the handler). */
- err = __thread_set_state (ss->thread, MACHINE_THREAD_STATE_FLAVOR,
- (natural_t *) &thread_state.basic,
- MACHINE_THREAD_STATE_COUNT);
- assert_perror (err);
- err = __thread_resume (ss->thread);
- assert_perror (err);
- thread_state.set = 0; /* Everything we know is now wrong. */
- break;
- }
- }
-
- /* The signal has either been ignored or is now being handled. We can
- consider it delivered and reply to the killer. */
- reply ();
-
- /* We get here unless the signal was fatal. We still hold SS->lock.
- Check for pending signals, and loop to post them. */
- {
- /* Return nonzero if SS has any signals pending we should worry about.
- We don't worry about any pending signals if we are stopped, nor if
- SS is in a critical section. We are guaranteed to get a sig_post
- message before any of them become deliverable: either the SIGCONT
- signal, or a sig_post with SIGNO==0 as an explicit poll when the
- thread finishes its critical section. */
- inline int signals_pending (void)
- {
- if (_hurd_stopped || __spin_lock_locked (&ss->critical_section_lock))
- return 0;
- return pending = ss->pending & ~ss->blocked;
- }
-
- check_pending_signals:
- untraced = 0;
-
- if (signals_pending ())
- {
- for (signo = 1; signo < NSIG; ++signo)
- if (__sigismember (&pending, signo))
- {
- deliver_pending:
- __sigdelset (&ss->pending, signo);
- *detail = ss->pending_data[signo];
- __spin_unlock (&ss->lock);
- goto post_signal;
- }
- }
-
- /* No pending signals left undelivered for this thread.
- If we were sent signal 0, we need to check for pending
- signals for all threads. */
- if (signo == 0)
- {
- __spin_unlock (&ss->lock);
- __mutex_lock (&_hurd_siglock);
- for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
- {
- __spin_lock (&ss->lock);
- for (signo = 1; signo < NSIG; ++signo)
- if (__sigismember (&ss->pending, signo)
- && (!__sigismember (&ss->blocked, signo)
- /* We "deliver" immediately pending blocked signals whose
- action might be to ignore, so that if ignored they are
- dropped right away. */
- || ss->actions[signo].sa_handler == SIG_IGN
- || ss->actions[signo].sa_handler == SIG_DFL))
- {
- mutex_unlock (&_hurd_siglock);
- goto deliver_pending;
- }
- __spin_unlock (&ss->lock);
- }
- __mutex_unlock (&_hurd_siglock);
- }
- else
- {
- /* No more signals pending; SS->lock is still locked.
- Wake up any sigsuspend call that is blocking SS->thread. */
- if (ss->suspended != MACH_PORT_NULL)
- {
- /* There is a sigsuspend waiting. Tell it to wake up. */
- error_t err;
- mach_msg_header_t msg;
- msg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, 0);
- msg.msgh_remote_port = ss->suspended;
- msg.msgh_local_port = MACH_PORT_NULL;
- /* These values do not matter. */
- msg.msgh_id = 8675309; /* Jenny, Jenny. */
- ss->suspended = MACH_PORT_NULL;
- err = __mach_msg (&msg, MACH_SEND_MSG, sizeof msg, 0,
- MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE,
- MACH_PORT_NULL);
- assert_perror (err);
- }
- __spin_unlock (&ss->lock);
- }
- }
-
- /* All pending signals delivered to all threads.
- Now we can send the reply message even for signal 0. */
- reply ();
-}
-
-/* Decide whether REFPORT enables the sender to send us a SIGNO signal.
- Returns zero if so, otherwise the error code to return to the sender. */
-
-static error_t
-signal_allowed (int signo, mach_port_t refport)
-{
- if (signo < 0 || signo >= NSIG)
- return EINVAL;
-
- if (refport == __mach_task_self ())
- /* Can send any signal. */
- goto win;
-
- /* Avoid needing to check for this below. */
- if (refport == MACH_PORT_NULL)
- return EPERM;
-
- switch (signo)
- {
- case SIGINT:
- case SIGQUIT:
- case SIGTSTP:
- case SIGHUP:
- case SIGINFO:
- case SIGTTIN:
- case SIGTTOU:
- case SIGWINCH:
- /* Job control signals can be sent by the controlling terminal. */
- if (__USEPORT (CTTYID, port == refport))
- goto win;
- break;
-
- case SIGCONT:
- {
- /* A continue signal can be sent by anyone in the session. */
- mach_port_t sessport;
- if (! __USEPORT (PROC, __proc_getsidport (port, &sessport)))
- {
- __mach_port_deallocate (__mach_task_self (), sessport);
- if (refport == sessport)
- goto win;
- }
- }
- break;
-
- case SIGIO:
- case SIGURG:
- {
- /* Any io object a file descriptor refers to might send us
- one of these signals using its async ID port for REFPORT.
-
- This is pretty wide open; it is not unlikely that some random
- process can at least open for reading something we have open,
- get its async ID port, and send us a spurious SIGIO or SIGURG
- signal. But BSD is actually wider open than that!--you can set
- the owner of an io object to any process or process group
- whatsoever and send them gratuitous signals.
-
- Someday we could implement some reasonable scheme for
- authorizing SIGIO and SIGURG signals properly. */
-
- int d;
- int lucky = 0; /* True if we find a match for REFPORT. */
- __mutex_lock (&_hurd_dtable_lock);
- for (d = 0; !lucky && (unsigned) d < (unsigned) _hurd_dtablesize; ++d)
- {
- struct hurd_userlink ulink;
- io_t port;
- mach_port_t asyncid;
- if (_hurd_dtable[d] == NULL)
- continue;
- port = _hurd_port_get (&_hurd_dtable[d]->port, &ulink);
- if (! __io_get_icky_async_id (port, &asyncid))
- {
- if (refport == asyncid)
- /* Break out of the loop on the next iteration. */
- lucky = 1;
- __mach_port_deallocate (__mach_task_self (), asyncid);
- }
- _hurd_port_free (&_hurd_dtable[d]->port, &ulink, port);
- }
- __mutex_unlock (&_hurd_dtable_lock);
- /* If we found a lucky winner, we've set D to -1 in the loop. */
- if (lucky)
- goto win;
- }
- }
-
- /* If this signal is legit, we have done `goto win' by now.
- When we return the error, mig deallocates REFPORT. */
- return EPERM;
-
- win:
- /* Deallocate the REFPORT send right; we are done with it. */
- __mach_port_deallocate (__mach_task_self (), refport);
-
- return 0;
-}
-
-/* Implement the sig_post RPC from <hurd/msg.defs>;
- sent when someone wants us to get a signal. */
-kern_return_t
-_S_msg_sig_post (mach_port_t me,
- mach_port_t reply_port, mach_msg_type_name_t reply_port_type,
- int signo, natural_t sigcode,
- mach_port_t refport)
-{
- error_t err;
- struct hurd_signal_detail d;
-
- if (err = signal_allowed (signo, refport))
- return err;
-
- d.code = sigcode;
- d.exc = 0;
-
- /* Post the signal to the designated signal-receiving thread. This will
- reply when the signal can be considered delivered. */
- _hurd_internal_post_signal (_hurd_thread_sigstate (_hurd_sigthread),
- signo, &d, reply_port, reply_port_type,
- 0); /* Stop if traced. */
-
- return MIG_NO_REPLY; /* Already replied. */
-}
-
-/* Implement the sig_post_untraced RPC from <hurd/msg.defs>;
- sent when the debugger wants us to really get a signal
- even if we are traced. */
-kern_return_t
-_S_msg_sig_post_untraced (mach_port_t me,
- mach_port_t reply_port,
- mach_msg_type_name_t reply_port_type,
- int signo, natural_t sigcode,
- mach_port_t refport)
-{
- error_t err;
- struct hurd_signal_detail d;
-
- if (err = signal_allowed (signo, refport))
- return err;
-
- d.code = sigcode;
- d.exc = 0;
-
- /* Post the signal to the designated signal-receiving thread. This will
- reply when the signal can be considered delivered. */
- _hurd_internal_post_signal (_hurd_thread_sigstate (_hurd_sigthread),
- signo, &d, reply_port, reply_port_type,
- 1); /* Untraced flag. */
-
- return MIG_NO_REPLY; /* Already replied. */
-}
-
-extern void __mig_init (void *);
-
-#include <mach/task_special_ports.h>
-
-/* Initialize the message port and _hurd_sigthread and start the signal
- thread. */
-
-void
-_hurdsig_init (const int *intarray, size_t intarraysize)
-{
- error_t err;
- vm_size_t stacksize;
- struct hurd_sigstate *ss;
-
- __mutex_init (&_hurd_siglock);
-
- err = __mach_port_allocate (__mach_task_self (),
- MACH_PORT_RIGHT_RECEIVE,
- &_hurd_msgport);
- assert_perror (err);
-
- /* Make a send right to the signal port. */
- err = __mach_port_insert_right (__mach_task_self (),
- _hurd_msgport,
- _hurd_msgport,
- MACH_MSG_TYPE_MAKE_SEND);
- assert_perror (err);
-
- /* Initialize the main thread's signal state. */
- ss = _hurd_self_sigstate ();
-
- /* Copy inherited values from our parent (or pre-exec process state)
- into the signal settings of the main thread. */
- if (intarraysize > INIT_SIGMASK)
- ss->blocked = intarray[INIT_SIGMASK];
- if (intarraysize > INIT_SIGPENDING)
- ss->pending = intarray[INIT_SIGPENDING];
- if (intarraysize > INIT_SIGIGN && intarray[INIT_SIGIGN] != 0)
- {
- int signo;
- for (signo = 1; signo < NSIG; ++signo)
- if (intarray[INIT_SIGIGN] & __sigmask(signo))
- ss->actions[signo].sa_handler = SIG_IGN;
- }
-
- /* Set the default thread to receive task-global signals
- to this one, the main (first) user thread. */
- _hurd_sigthread = ss->thread;
-
- /* Start the signal thread listening on the message port. */
-
- if (__hurd_threadvar_stack_mask == 0)
- {
- err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
- assert_perror (err);
-
- stacksize = __vm_page_size * 8; /* Small stack for signal thread. */
- err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
- _hurd_msgport_receive,
- (vm_address_t *) &__hurd_sigthread_stack_base,
- &stacksize);
- assert_perror (err);
-
- __hurd_sigthread_stack_end = __hurd_sigthread_stack_base + stacksize;
- __hurd_sigthread_variables =
- malloc (__hurd_threadvar_max * sizeof (unsigned long int));
- if (__hurd_sigthread_variables == NULL)
- __libc_fatal ("hurd: Can't allocate threadvars for signal thread\n");
- memset (__hurd_sigthread_variables, 0,
- __hurd_threadvar_max * sizeof (unsigned long int));
- __hurd_sigthread_variables[_HURD_THREADVAR_LOCALE]
- = (unsigned long int) &_nl_global_locale;
-
- /* Reinitialize the MiG support routines so they will use a per-thread
- variable for the cached reply port. */
- __mig_init ((void *) __hurd_sigthread_stack_base);
-
- err = __thread_resume (_hurd_msgport_thread);
- assert_perror (err);
- }
- else
- {
- /* When cthreads is being used, we need to make the signal thread a
- proper cthread. Otherwise it cannot use mutex_lock et al, which
- will be the cthreads versions. Various of the message port RPC
- handlers need to take locks, so we need to be able to call into
- cthreads code and meet its assumptions about how our thread and
- its stack are arranged. Since cthreads puts it there anyway,
- we'll let the signal thread's per-thread variables be found as for
- any normal cthread, and just leave the magic __hurd_sigthread_*
- values all zero so they'll be ignored. */
-#pragma weak cthread_fork
-#pragma weak cthread_detach
- cthread_detach (cthread_fork ((cthread_fn_t) &_hurd_msgport_receive, 0));
-
- /* XXX We need the thread port for the signal thread further on
- in this thread (see hurdfault.c:_hurdsigfault_init).
- Therefore we block until _hurd_msgport_thread is initialized
- by the newly created thread. This really shouldn't be
- necessary; we should be able to fetch the thread port for a
- cthread from here. */
- while (_hurd_msgport_thread == 0)
- __swtch_pri (0);
- }
-
- /* Receive exceptions on the signal port. */
-#ifdef TASK_EXCEPTION_PORT
- __task_set_special_port (__mach_task_self (),
- TASK_EXCEPTION_PORT, _hurd_msgport);
-#elif defined (EXC_MASK_ALL)
- __task_set_exception_ports (__mach_task_self (),
- EXC_MASK_ALL & ~(EXC_MASK_SYSCALL
- | EXC_MASK_MACH_SYSCALL
- | EXC_MASK_RPC_ALERT),
- _hurd_msgport,
- EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
-#else
-# error task_set_exception_port?
-#endif
-
- /* Sanity check. Any pending, unblocked signals should have been
- taken by our predecessor incarnation (i.e. parent or pre-exec state)
- before packing up our init ints. This assert is last (not above)
- so that signal handling is all set up to handle the abort. */
- assert ((ss->pending &~ ss->blocked) == 0);
-}
- /* XXXX */
-/* Reauthenticate with the proc server. */
-
-static void
-reauth_proc (mach_port_t new)
-{
- mach_port_t ref, ignore;
-
- ref = __mach_reply_port ();
- if (! HURD_PORT_USE (&_hurd_ports[INIT_PORT_PROC],
- __proc_reauthenticate (port, ref,
- MACH_MSG_TYPE_MAKE_SEND) ||
- __auth_user_authenticate (new, ref,
- MACH_MSG_TYPE_MAKE_SEND,
- &ignore))
- && ignore != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (), ignore);
- __mach_port_destroy (__mach_task_self (), ref);
-
- /* Set the owner of the process here too. */
- mutex_lock (&_hurd_id.lock);
- if (!_hurd_check_ids ())
- HURD_PORT_USE (&_hurd_ports[INIT_PORT_PROC],
- __proc_setowner (port,
- (_hurd_id.gen.nuids
- ? _hurd_id.gen.uids[0] : 0),
- !_hurd_id.gen.nuids));
- mutex_unlock (&_hurd_id.lock);
-
- (void) &reauth_proc; /* Silence compiler warning. */
-}
-text_set_element (_hurd_reauth_hook, reauth_proc);
-
-/* Like `getenv', but safe for the signal thread to run.
- If the environment is trashed, this will just return NULL. */
-
-const char *
-_hurdsig_getenv (const char *variable)
-{
- if (__libc_enable_secure)
- return NULL;
-
- if (_hurdsig_catch_memory_fault (__environ))
- /* We bombed in getenv. */
- return NULL;
- else
- {
- const size_t len = strlen (variable);
- char *value = NULL;
- char *volatile *ep = __environ;
- while (*ep)
- {
- const char *p = *ep;
- _hurdsig_fault_preemptor.first = (long int) p;
- _hurdsig_fault_preemptor.last = VM_MAX_ADDRESS;
- if (! strncmp (p, variable, len) && p[len] == '=')
- {
- size_t valuelen;
- p += len + 1;
- valuelen = strlen (p);
- _hurdsig_fault_preemptor.last = (long int) (p + valuelen);
- value = malloc (++valuelen);
- if (value)
- memcpy (value, p, valuelen);
- break;
- }
- _hurdsig_fault_preemptor.first = (long int) ++ep;
- _hurdsig_fault_preemptor.last = (long int) (ep + 1);
- }
- _hurdsig_end_catch_fault ();
- return value;
- }
-}
diff --git a/hurd/hurdsock.c b/hurd/hurdsock.c
deleted file mode 100644
index de4158def8..0000000000
--- a/hurd/hurdsock.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/* _hurd_socket_server - Find the server for a socket domain.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <sys/socket.h>
-#include <stdlib.h>
-#include <string.h>
-#include <hurd/paths.h>
-#include <stdio.h>
-#include <_itoa.h>
-#include <cthreads.h> /* For `struct mutex'. */
-#include "hurdmalloc.h" /* XXX */
-
-static struct mutex lock;
-
-static file_t *servers;
-static int max_domain = -1;
-
-/* Return a port to the socket server for DOMAIN.
- Socket servers translate nodes in the directory _SERVERS_SOCKET
- (canonically /servers/socket). These naming point nodes are named
- by the simplest decimal representation of the socket domain number,
- for example "/servers/socket/3".
-
- Socket servers are assumed not to change very often.
- The library keeps all the server socket ports it has ever looked up,
- and does not look them up in /servers/socket more than once. */
-
-socket_t
-_hurd_socket_server (int domain, int dead)
-{
- socket_t server;
-
- if (domain < 0)
- {
- errno = EAFNOSUPPORT;
- return MACH_PORT_NULL;
- }
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&lock);
-
- if (domain > max_domain)
- {
- error_t save = errno;
- file_t *new = realloc (servers, (domain + 1) * sizeof (file_t));
- if (new != NULL)
- {
- do
- new[++max_domain] = MACH_PORT_NULL;
- while (max_domain < domain);
- servers = new;
- }
- else
- /* No space to cache the port; we will just fetch it anew below. */
- errno = save;
- }
-
- if (dead && domain <= max_domain)
- {
- /* The user says the port we returned earlier (now in SERVERS[DOMAIN])
- was dead. Clear the cache and fetch a new one below. */
- __mach_port_deallocate (__mach_task_self (), servers[domain]);
- servers[domain] = MACH_PORT_NULL;
- }
-
- if (domain > max_domain || servers[domain] == MACH_PORT_NULL)
- {
- char name[sizeof (_SERVERS_SOCKET) + 100];
- char *np = &name[sizeof (name)];
- *--np = '\0';
- np = _itoa (domain, np, 10, 0);
- *--np = '/';
- np -= sizeof (_SERVERS_SOCKET) - 1;
- memcpy (np, _SERVERS_SOCKET, sizeof (_SERVERS_SOCKET) - 1);
- server = __file_name_lookup (np, 0, 0);
- if (domain <= max_domain)
- servers[domain] = server;
- }
- else
- server = servers[domain];
-
- if (server == MACH_PORT_NULL && errno == ENOENT)
- /* If the server node is absent, we don't support that protocol. */
- errno = EAFNOSUPPORT;
-
- __mutex_unlock (&lock);
- HURD_CRITICAL_END;
-
- return server;
-}
-
-static void
-init (void)
-{
- int i;
-
- __mutex_init (&lock);
-
- for (i = 0; i < max_domain; ++i)
- servers[i] = MACH_PORT_NULL;
-
- (void) &init; /* Avoid "defined but not used" warning. */
-}
-text_set_element (_hurd_preinit_hook, init);
diff --git a/hurd/hurdsocket.h b/hurd/hurdsocket.h
deleted file mode 100644
index de2111b751..0000000000
--- a/hurd/hurdsocket.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Hurd-specific socket functions
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURD_HURDSOCKET_H
-#define _HURD_HURDSOCKET_H
-
-#include <string.h>
-
-/* Returns a duplicate of ADDR->sun_path with LEN limitation. This
- should to be used whenever reading a unix socket address, to cope with
- sun_path possibly not including a trailing \0. */
-#define _hurd_sun_path_dupa(addr, len) \
- strndupa ((addr)->sun_path, (len) - offsetof (struct sockaddr_un, sun_path))
-
-#endif /* hurdsocket.h */
diff --git a/hurd/hurdstartup.c b/hurd/hurdstartup.c
deleted file mode 100644
index d057ce1b18..0000000000
--- a/hurd/hurdstartup.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/* Initial program startup for running under the GNU Hurd.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <hurd.h>
-#include <hurd/exec_startup.h>
-#include <sysdep.h>
-#include <hurd/threadvar.h>
-#include <unistd.h>
-#include <elf.h>
-#include <set-hooks.h>
-#include "hurdstartup.h"
-#include <argz.h>
-
-mach_port_t *_hurd_init_dtable;
-mach_msg_type_number_t _hurd_init_dtablesize;
-
-extern void __mach_init (void);
-
-/* Entry point. This is the first thing in the text segment.
-
- The exec server started the initial thread in our task with this spot the
- PC, and a stack that is presumably big enough. We do basic Mach
- initialization so mig-generated stubs work, and then do an exec_startup
- RPC on our bootstrap port, to which the exec server responds with the
- information passed in the exec call, as well as our original bootstrap
- port, and the base address and size of the preallocated stack.
-
- If using cthreads, we are given a new stack by cthreads initialization and
- deallocate the stack set up by the exec server. On the new stack we call
- `start1' (above) to do the rest of the startup work. Since the stack may
- disappear out from under us in a machine-dependent way, we use a pile of
- static variables to communicate the information from exec_startup to start1.
- This is unfortunate but preferable to machine-dependent frobnication to copy
- the state from the old stack to the new one. */
-
-
-void
-_hurd_startup (void **argptr, void (*main) (intptr_t *data))
-{
- error_t err;
- mach_port_t in_bootstrap;
- char *args, *env;
- mach_msg_type_number_t argslen, envlen;
- struct hurd_startup_data data;
- char **argv, **envp;
- int argc, envc;
- intptr_t *argcptr;
- vm_address_t addr;
-
- /* Attempt to map page zero redzoned before we receive any RPC
- data that might get allocated there. We can ignore errors. */
- addr = 0;
- __vm_map (__mach_task_self (),
- &addr, __vm_page_size, 0, 0, MACH_PORT_NULL, 0, 1,
- VM_PROT_NONE, VM_PROT_NONE, VM_INHERIT_COPY);
-
- if (err = __task_get_special_port (__mach_task_self (), TASK_BOOTSTRAP_PORT,
- &in_bootstrap))
- LOSE;
-
- if (in_bootstrap != MACH_PORT_NULL)
- {
- /* Call the exec server on our bootstrap port and
- get all our standard information from it. */
-
- argslen = envlen = 0;
- data.dtablesize = data.portarraysize = data.intarraysize = 0;
-
- err = __exec_startup_get_info (in_bootstrap,
- &data.user_entry,
- &data.phdr, &data.phdrsz,
- &data.stack_base, &data.stack_size,
- &data.flags,
- &args, &argslen,
- &env, &envlen,
- &data.dtable, &data.dtablesize,
- &data.portarray, &data.portarraysize,
- &data.intarray, &data.intarraysize);
- __mach_port_deallocate (__mach_task_self (), in_bootstrap);
- }
-
- if (err || in_bootstrap == MACH_PORT_NULL || (data.flags & EXEC_STACK_ARGS))
- {
- /* Either we have no bootstrap port, or the RPC to the exec server
- failed, or whoever started us up passed the flag saying args are
- on the stack. Try to snarf the args in the canonical Mach way.
- Hopefully either they will be on the stack as expected, or the
- stack will be zeros so we don't crash. */
-
- argcptr = (intptr_t *) argptr;
- argc = argcptr[0];
- argv = (char **) &argcptr[1];
- envp = &argv[argc + 1];
- envc = 0;
- while (envp[envc])
- ++envc;
- }
- else
- {
- /* Turn the block of null-separated strings we were passed for the
- arguments and environment into vectors of pointers to strings. */
-
- /* Count up the arguments so we can allocate ARGV. */
- argc = __argz_count (args, argslen);
- /* Count up the environment variables so we can allocate ENVP. */
- envc = __argz_count (env, envlen);
-
- /* There were some arguments. Allocate space for the vectors of
- pointers and fill them in. We allocate the space for the
- environment pointers immediately after the argv pointers because
- the ELF ABI will expect it. */
- argcptr = __alloca (sizeof (intptr_t) +
- (argc + 1 + envc + 1) * sizeof (char *) +
- sizeof (struct hurd_startup_data));
- *argcptr = argc;
- argv = (void *) (argcptr + 1);
- __argz_extract (args, argslen, argv);
-
- /* There was some environment. */
- envp = &argv[argc + 1];
- __argz_extract (env, envlen, envp);
- }
-
- if (err || in_bootstrap == MACH_PORT_NULL)
- {
- /* Either we have no bootstrap port, or the RPC to the exec server
- failed. Set all our other variables to have empty information. */
-
- data.flags = 0;
- args = env = NULL;
- argslen = envlen = 0;
- data.dtable = NULL;
- data.dtablesize = 0;
- data.portarray = NULL;
- data.portarraysize = 0;
- data.intarray = NULL;
- data.intarraysize = 0;
- }
- else if ((void *) &envp[envc + 1] == argv[0])
- {
- /* The arguments arrived on the stack from the kernel, but our
- protocol requires some space after them for a `struct
- hurd_startup_data'. Move them. */
- struct
- {
- intptr_t count;
- char *argv[argc + 1];
- char *envp[envc + 1];
- struct hurd_startup_data data;
- } *args = alloca (sizeof *args);
- if ((void *) &args[1] == (void *) argcptr)
- args = alloca (-((char *) &args->data - (char *) args));
- memmove (args, argcptr, (char *) &args->data - (char *) args);
- argcptr = (void *) args;
- argv = args->argv;
- envp = args->envp;
- }
-
- {
- struct hurd_startup_data *d = (void *) &envp[envc + 1];
-
- if ((void *) d != argv[0])
- {
- *d = data;
- _hurd_init_dtable = d->dtable;
- _hurd_init_dtablesize = d->dtablesize;
- }
-
- (*main) (argcptr);
- }
-
- /* Should never get here. */
- LOSE;
- abort ();
-}
diff --git a/hurd/hurdstartup.h b/hurd/hurdstartup.h
deleted file mode 100644
index f0d82d96a5..0000000000
--- a/hurd/hurdstartup.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Data from initial program startup for running under the GNU Hurd.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#ifndef _HURDSTARTUP_H
-#define _HURDSTARTUP_H 1
-
-# include <stdint.h>
-
-/* Interesting data saved from the exec_startup reply.
- The DATA argument to *MAIN (see below) points to:
-
- int argc;
- char *argv[argc];
- char *argv_terminator = NULL;
- char *envp[?];
- char *envp_terminator = NULL;
- struct hurd_startup_data data;
-
-*/
-
-struct hurd_startup_data
- {
- int flags;
- mach_port_t *dtable;
- mach_msg_type_number_t dtablesize;
- mach_port_t *portarray;
- mach_msg_type_number_t portarraysize;
- int *intarray;
- mach_msg_type_number_t intarraysize;
- vm_address_t stack_base;
- vm_size_t stack_size;
- vm_address_t phdr;
- vm_size_t phdrsz;
- vm_address_t user_entry;
- };
-
-
-/* Initialize Mach RPCs; do initial handshake with the exec server (or
- extract the arguments from the stack in the case of the bootstrap task);
- finally, call *MAIN with the information gleaned. That function is not
- expected to return. ARGPTR should be the address of the first argument
- of the entry point function that is called with the stack exactly as the
- exec server or kernel sets it. */
-
-extern void _hurd_startup (void **argptr, void (*main) (intptr_t *data));
-
-
-#endif /* hurdstartup.h */
diff --git a/hurd/intern-fd.c b/hurd/intern-fd.c
deleted file mode 100644
index 7e49028659..0000000000
--- a/hurd/intern-fd.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/fd.h>
-
-/* Allocate a new file descriptor and install PORT in it. FLAGS are as for
- `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful.
-
- If the descriptor table is full, set errno, and return -1.
- If DEALLOC is nonzero, deallocate PORT first. */
-int
-_hurd_intern_fd (io_t port, int flags, int dealloc)
-{
- int fd;
- struct hurd_fd *d;
-
- HURD_CRITICAL_BEGIN;
- d = _hurd_alloc_fd (&fd, 0);
- if (d != NULL)
- {
- _hurd_port2fd (d, port, flags);
- __spin_unlock (&d->port.lock);
- }
- HURD_CRITICAL_END;
-
- if (d == NULL)
- {
- if (dealloc)
- __mach_port_deallocate (__mach_task_self (), port);
- return -1;
- }
-
- return fd;
-}
diff --git a/hurd/intr-msg.c b/hurd/intr-msg.c
deleted file mode 100644
index 636bd7b68d..0000000000
--- a/hurd/intr-msg.c
+++ /dev/null
@@ -1,424 +0,0 @@
-/* Replacement for mach_msg used in interruptible Hurd RPCs.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <mach.h>
-#include <mach/mig_errors.h>
-#include <mach/mig_support.h>
-#include <hurd/signal.h>
-#include <assert.h>
-
-#include "intr-msg.h"
-
-#ifdef NDR_CHAR_ASCII /* OSF Mach flavors have different names. */
-# define mig_reply_header_t mig_reply_error_t
-#endif
-
-error_t
-_hurd_intr_rpc_mach_msg (mach_msg_header_t *msg,
- mach_msg_option_t option,
- mach_msg_size_t send_size,
- mach_msg_size_t rcv_size,
- mach_port_t rcv_name,
- mach_msg_timeout_t timeout,
- mach_port_t notify)
-{
- error_t err;
- struct hurd_sigstate *ss;
- const mach_msg_option_t user_option = option;
- const mach_msg_timeout_t user_timeout = timeout;
-
- struct clobber
- {
-#ifdef NDR_CHAR_ASCII
- NDR_record_t ndr;
-#else
- mach_msg_type_t type;
-#endif
- error_t err;
- };
- union msg
- {
- mach_msg_header_t header;
- mig_reply_header_t reply;
- struct
- {
- mach_msg_header_t header;
-#ifdef NDR_CHAR_ASCII
- NDR_record_t ndr;
-#else
- int type;
-#endif
- int code;
- } check;
- struct
- {
- mach_msg_header_t header;
- struct clobber data;
- } request;
- };
- union msg *const m = (void *) msg;
- mach_msg_bits_t msgh_bits;
- mach_port_t remote_port;
- mach_msg_id_t msgid;
- struct clobber save_data;
-
- if ((option & (MACH_SEND_MSG|MACH_RCV_MSG)) != (MACH_SEND_MSG|MACH_RCV_MSG)
- || _hurd_msgport_thread == MACH_PORT_NULL)
- {
- /* Either this is not an RPC (i.e., only a send or only a receive),
- so it can't be interruptible; or, the signal thread is not set up
- yet, so we cannot do the normal signal magic. Do a normal,
- uninterruptible mach_msg call instead. */
- return __mach_msg (&m->header, option, send_size, rcv_size, rcv_name,
- timeout, notify);
- }
-
- ss = _hurd_self_sigstate ();
-
- /* Save state that gets clobbered by an EINTR reply message.
- We will need to restore it if we want to retry the RPC. */
- msgh_bits = m->header.msgh_bits;
- remote_port = m->header.msgh_remote_port;
- msgid = m->header.msgh_id;
- assert (rcv_size >= sizeof m->request);
- save_data = m->request.data;
-
- /* Tell the signal thread that we are doing an interruptible RPC on
- this port. If we get a signal and should return EINTR, the signal
- thread will set this variable to MACH_PORT_NULL. The RPC might
- return EINTR when some other thread gets a signal, in which case we
- want to restart our call. */
- ss->intr_port = m->header.msgh_remote_port;
-
- /* A signal may arrive here, after intr_port is set, but before the
- mach_msg system call. The signal handler might do an interruptible
- RPC, and clobber intr_port; then it would not be set properly when we
- actually did send the RPC, and a later signal wouldn't interrupt that
- RPC. So, _hurd_setup_sighandler saves intr_port in the sigcontext,
- and sigreturn restores it. */
-
- message:
-
- /* XXX
- At all points here (once SS->intr_port is set), the signal thread
- thinks we are "about to enter the syscall", and might mutate our
- return-value register. This is bogus.
- */
-
- if (ss->cancel)
- {
- /* We have been cancelled. Don't do an RPC at all. */
- ss->intr_port = MACH_PORT_NULL;
- ss->cancel = 0;
- return EINTR;
- }
-
- /* Note that the signal trampoline code might modify our OPTION! */
- err = INTR_MSG_TRAP (msg, option, send_size,
- rcv_size, rcv_name, timeout, notify);
-
- switch (err)
- {
- case MACH_RCV_TIMED_OUT:
- if (user_option & MACH_RCV_TIMEOUT)
- /* The real user RPC timed out. */
- break;
- else
- /* The operation was supposedly interrupted, but still has
- not returned. Declare it interrupted. */
- goto interrupted;
-
- case MACH_SEND_INTERRUPTED: /* RPC didn't get out. */
- if (!(option & MACH_SEND_MSG))
- {
- /* Oh yes, it did! Since we were not doing a message send,
- this return code cannot have come from the kernel!
- Instead, it was the signal thread mutating our state to tell
- us not to enter this RPC. However, we are already in the receive!
- Since the signal thread thought we weren't in the RPC yet,
- it didn't do an interrupt_operation.
- XXX */
- goto retry_receive;
- }
- /* FALLTHROUGH */
-
- /* These are the other codes that mean a pseudo-receive modified
- the message buffer and we might need to clean up the port rights. */
- case MACH_SEND_TIMED_OUT:
- case MACH_SEND_INVALID_NOTIFY:
-#ifdef MACH_SEND_NO_NOTIFY
- case MACH_SEND_NO_NOTIFY:
-#endif
-#ifdef MACH_SEND_NOTIFY_IN_PROGRESS
- case MACH_SEND_NOTIFY_IN_PROGRESS:
-#endif
- if (MACH_MSGH_BITS_REMOTE (msg->msgh_bits) == MACH_MSG_TYPE_MOVE_SEND)
- {
- __mach_port_deallocate (__mach_task_self (), msg->msgh_remote_port);
- msg->msgh_bits
- = (MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND,
- MACH_MSGH_BITS_LOCAL (msg->msgh_bits))
- | MACH_MSGH_BITS_OTHER (msg->msgh_bits));
- }
- if (msg->msgh_bits & MACH_MSGH_BITS_COMPLEX)
- {
-#ifndef MACH_MSG_PORT_DESCRIPTOR
- /* Check for MOVE_SEND rights in the message. These hold refs
- that we need to release in case the message is in fact never
- re-sent later. Since it might in fact be re-sent, we turn
- these into COPY_SEND's after deallocating the extra user ref;
- the caller is responsible for still holding a ref to go with
- the original COPY_SEND right, so the resend copies it again. */
-
- mach_msg_type_long_t *ty = (void *) (msg + 1);
- while ((void *) ty < (void *) msg + msg->msgh_size)
- {
- mach_msg_type_name_t name;
- mach_msg_type_size_t size;
- mach_msg_type_number_t number;
-
- inline void clean_ports (mach_port_t *ports, int dealloc)
- {
- mach_msg_type_number_t i;
- switch (name)
- {
- case MACH_MSG_TYPE_MOVE_SEND:
- for (i = 0; i < number; i++)
- __mach_port_deallocate (__mach_task_self (), *ports++);
- if (ty->msgtl_header.msgt_longform)
- ty->msgtl_name = MACH_MSG_TYPE_COPY_SEND;
- else
- ty->msgtl_header.msgt_name = MACH_MSG_TYPE_COPY_SEND;
- break;
- case MACH_MSG_TYPE_COPY_SEND:
- case MACH_MSG_TYPE_MOVE_RECEIVE:
- break;
- default:
- if (MACH_MSG_TYPE_PORT_ANY (name))
- assert (! "unexpected port type in interruptible RPC");
- }
- if (dealloc)
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) ports,
- number * sizeof (mach_port_t));
- }
-
- if (ty->msgtl_header.msgt_longform)
- {
- name = ty->msgtl_name;
- size = ty->msgtl_size;
- number = ty->msgtl_number;
- ty = (void *) ty + sizeof (mach_msg_type_long_t);
- }
- else
- {
- name = ty->msgtl_header.msgt_name;
- size = ty->msgtl_header.msgt_size;
- number = ty->msgtl_header.msgt_number;
- ty = (void *) ty + sizeof (mach_msg_type_t);
- }
-
- if (ty->msgtl_header.msgt_inline)
- {
- clean_ports ((void *) ty, 0);
- /* calculate length of data in bytes, rounding up */
- ty = (void *) ty + (((((number * size) + 7) >> 3)
- + sizeof (mach_msg_type_t) - 1)
- &~ (sizeof (mach_msg_type_t) - 1));
- }
- else
- {
- clean_ports (*(void **) ty,
- ty->msgtl_header.msgt_deallocate);
- ty = (void *) ty + sizeof (void *);
- }
- }
-#else /* Untyped Mach IPC flavor. */
- mach_msg_body_t *body = (void *) (msg + 1);
- mach_msg_descriptor_t *desc = (void *) (body + 1);
- mach_msg_descriptor_t *desc_end = desc + body->msgh_descriptor_count;
- for (; desc < desc_end; ++desc)
- switch (desc->type.type)
- {
- case MACH_MSG_PORT_DESCRIPTOR:
- switch (desc->port.disposition)
- {
- case MACH_MSG_TYPE_MOVE_SEND:
- __mach_port_deallocate (mach_task_self (),
- desc->port.name);
- desc->port.disposition = MACH_MSG_TYPE_COPY_SEND;
- break;
- case MACH_MSG_TYPE_COPY_SEND:
- case MACH_MSG_TYPE_MOVE_RECEIVE:
- break;
- default:
- assert (! "unexpected port type in interruptible RPC");
- }
- break;
- case MACH_MSG_OOL_DESCRIPTOR:
- if (desc->out_of_line.deallocate)
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) desc->out_of_line.address,
- desc->out_of_line.size);
- break;
- case MACH_MSG_OOL_PORTS_DESCRIPTOR:
- switch (desc->ool_ports.disposition)
- {
- case MACH_MSG_TYPE_MOVE_SEND:
- {
- mach_msg_size_t i;
- const mach_port_t *ports = desc->ool_ports.address;
- for (i = 0; i < desc->ool_ports.count; ++i)
- __mach_port_deallocate (__mach_task_self (), ports[i]);
- desc->ool_ports.disposition = MACH_MSG_TYPE_COPY_SEND;
- break;
- }
- case MACH_MSG_TYPE_COPY_SEND:
- case MACH_MSG_TYPE_MOVE_RECEIVE:
- break;
- default:
- assert (! "unexpected port type in interruptible RPC");
- }
- if (desc->ool_ports.deallocate)
- __vm_deallocate (__mach_task_self (),
- (vm_address_t) desc->ool_ports.address,
- desc->ool_ports.count
- * sizeof (mach_port_t));
- break;
- default:
- assert (! "unexpected descriptor type in interruptible RPC");
- }
-#endif
- }
- break;
-
- case EINTR:
- /* Either the process was stopped and continued,
- or the server doesn't support interrupt_operation. */
- if (ss->intr_port != MACH_PORT_NULL)
- /* If this signal was for us and it should interrupt calls, the
- signal thread will have cleared SS->intr_port.
- Since it's not cleared, the signal was for another thread,
- or SA_RESTART is set. Restart the interrupted call. */
- {
- /* Make sure we have a valid reply port. The one we were using
- may have been destroyed by interruption. */
- m->header.msgh_local_port = rcv_name = __mig_get_reply_port ();
- m->header.msgh_bits = msgh_bits;
- option = user_option;
- timeout = user_timeout;
- goto message;
- }
- /* FALLTHROUGH */
-
- case MACH_RCV_PORT_DIED:
- /* Server didn't respond to interrupt_operation,
- so the signal thread destroyed the reply port. */
- /* FALLTHROUGH */
-
- interrupted:
- err = EINTR;
-
- /* The EINTR return indicates cancellation, so clear the flag. */
- ss->cancel = 0;
- break;
-
- case MACH_RCV_INTERRUPTED: /* RPC sent; no reply. */
- option &= ~MACH_SEND_MSG; /* Don't send again. */
- retry_receive:
- if (ss->intr_port == MACH_PORT_NULL)
- {
- /* This signal or cancellation was for us. We need to wait for
- the reply, but not hang forever. */
- option |= MACH_RCV_TIMEOUT;
- /* Never decrease the user's timeout. */
- if (!(user_option & MACH_RCV_TIMEOUT)
- || timeout > _hurd_interrupted_rpc_timeout)
- timeout = _hurd_interrupted_rpc_timeout;
- }
- else
- {
- option = user_option;
- timeout = user_timeout;
- }
- goto message; /* Retry the receive. */
-
- case MACH_MSG_SUCCESS:
- {
- /* We got a reply. Was it EINTR? */
-#ifdef MACH_MSG_TYPE_BIT
- const union
- {
- mach_msg_type_t t;
- int i;
- } check =
- { t: { MACH_MSG_TYPE_INTEGER_T, sizeof (integer_t) * 8,
- 1, TRUE, FALSE, FALSE, 0 } };
-#endif
-
- if (m->reply.RetCode == EINTR &&
- m->header.msgh_size == sizeof m->reply &&
-#ifdef MACH_MSG_TYPE_BIT
- m->check.type == check.i &&
-#endif
- !(m->header.msgh_bits & MACH_MSGH_BITS_COMPLEX))
- {
- /* It is indeed EINTR. Is the interrupt for us? */
- if (ss->intr_port != MACH_PORT_NULL)
- {
- /* Nope; repeat the RPC.
- XXX Resources moved? */
-
- assert (m->header.msgh_id == msgid + 100);
-
- /* We know we have a valid reply port, because we just
- received the EINTR reply on it. Restore it and the
- other fields in the message header needed for send,
- since the header now reflects receipt of the reply. */
- m->header.msgh_local_port = rcv_name;
- m->header.msgh_remote_port = remote_port;
- m->header.msgh_id = msgid;
- m->header.msgh_bits = msgh_bits;
- /* Restore the two words clobbered by the reply data. */
- m->request.data = save_data;
-
- /* Restore the original mach_msg options.
- OPTION may have had MACH_RCV_TIMEOUT added,
- and/or MACH_SEND_MSG removed. */
- option = user_option;
- timeout = user_timeout;
-
- /* Now we are ready to repeat the original message send. */
- goto message;
- }
- else
- /* The EINTR return indicates cancellation,
- so clear the flag. */
- ss->cancel = 0;
- }
- }
- break;
-
- default: /* Quiet -Wswitch-enum. */
- break;
- }
-
- ss->intr_port = MACH_PORT_NULL;
-
- return err;
-}
diff --git a/hurd/intr-rpc.defs b/hurd/intr-rpc.defs
deleted file mode 100644
index 4acbcc8847..0000000000
--- a/hurd/intr-rpc.defs
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Special MiG definitions for interruptible RPC stubs.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/* Cause user stubs for interruptible RPCs to import a special header to
- modify their behavior. */
-
-#define INTR_INTERFACE uimport "intr-rpc.h";
diff --git a/hurd/intr-rpc.h b/hurd/intr-rpc.h
deleted file mode 100644
index 208e42c2ee..0000000000
--- a/hurd/intr-rpc.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Special MiG definitions for interruptible RPC stubs.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/* This file is imported by the MiG-generated user stubs for interruptible
- RPCs. We modify them to use our own function in place of mach_msg. */
-
-#include <hurd/signal.h>
-
-#define __mach_msg _hurd_intr_rpc_mach_msg
diff --git a/hurd/longjmp-ts.c b/hurd/longjmp-ts.c
deleted file mode 100644
index 0fea819a23..0000000000
--- a/hurd/longjmp-ts.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Perform a `longjmp' on a Mach thread_state. Stub version.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <setjmp.h>
-#include <mach/thread_status.h>
-
-/* Set up STATE to do the equivalent of `longjmp (ENV, VAL);'. */
-
-void
-_hurd_longjmp_thread_state (void *state, jmp_buf env, int val)
-{
- /* Set all the registers in *STATE to the values described by ENV and
- RETVAL. After this, setting that thread's state to STATE should be
- just like calling `longjmp (ENV, RETVAL)'. */
- #error "Need to write sysdeps/mach/hurd/MACHINE/longjmp-ctx.c"
-}
diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c
deleted file mode 100644
index b5d605665d..0000000000
--- a/hurd/lookup-at.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Lookup helper function for Hurd implementation of *at functions.
- Copyright (C) 2006-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/lookup.h>
-#include <hurd/fd.h>
-#include <string.h>
-#include <fcntl.h>
-
-file_t
-__file_name_lookup_at (int fd, int at_flags,
- const char *file_name, int flags, mode_t mode)
-{
- error_t err;
- file_t result;
-
- if ((at_flags & AT_SYMLINK_FOLLOW) && (at_flags & AT_SYMLINK_NOFOLLOW))
- return (__hurd_fail (EINVAL), MACH_PORT_NULL);
-
- flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0;
- at_flags &= ~AT_SYMLINK_NOFOLLOW;
- if (at_flags & AT_SYMLINK_FOLLOW)
- flags &= ~O_NOLINK;
- at_flags &= ~AT_SYMLINK_FOLLOW;
- if (at_flags != 0)
- return (__hurd_fail (EINVAL), MACH_PORT_NULL);
-
- if (fd == AT_FDCWD || file_name[0] == '/')
- return __file_name_lookup (file_name, flags, mode);
-
- file_t startdir;
- error_t use_init_port (int which, error_t (*operate) (mach_port_t))
- {
- return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
- _hurd_ports_use (which, operate));
- }
-
- err = HURD_DPORT_USE (fd, (startdir = port,
- __hurd_file_name_lookup (&use_init_port,
- &__getdport, NULL,
- file_name,
- flags,
- mode & ~_hurd_umask,
- &result)));
-
- return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
-}
-
-file_t
-__file_name_split_at (int fd, const char *file_name, char **name)
-{
- error_t err;
- file_t result;
-
- if (fd == AT_FDCWD || file_name[0] == '/')
- return __file_name_split (file_name, name);
-
- err = __hurd_file_name_split (&_hurd_ports_use, &__getdport, 0,
- file_name, &result, name);
-
- file_t startdir;
- error_t use_init_port (int which, error_t (*operate) (mach_port_t))
- {
- return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
- _hurd_ports_use (which, operate));
- }
-
- err = HURD_DPORT_USE (fd, (startdir = port,
- __hurd_file_name_split (&use_init_port,
- &__getdport, 0,
- file_name,
- &result, name)));
-
- return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
-}
-
-file_t
-__directory_name_split_at (int fd, const char *directory_name, char **name)
-{
- error_t err;
- file_t result;
-
- if (fd == AT_FDCWD || directory_name[0] == '/')
- return __directory_name_split (directory_name, name);
-
- file_t startdir;
- error_t use_init_port (int which, error_t (*operate) (mach_port_t))
- {
- return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
- _hurd_ports_use (which, operate));
- }
-
- err = HURD_DPORT_USE (fd, (startdir = port,
- __hurd_directory_name_split (&use_init_port,
- &__getdport, 0,
- directory_name,
- &result, name)));
-
- return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
-}
diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
deleted file mode 100644
index 2d88b98e4f..0000000000
--- a/hurd/lookup-retry.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/* hairy bits of Hurd file name lookup
- Copyright (C) 1992-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/lookup.h>
-#include <hurd/term.h>
-#include <hurd/paths.h>
-#include <limits.h>
-#include <fcntl.h>
-#include <string.h>
-#include <_itoa.h>
-#include <eloop-threshold.h>
-
-/* Translate the error from dir_lookup into the error the user sees. */
-static inline error_t
-lookup_error (error_t error)
-{
- switch (error)
- {
- case EOPNOTSUPP:
- case MIG_BAD_ID:
- /* These indicate that the server does not understand dir_lookup
- at all. If it were a directory, it would, by definition. */
- return ENOTDIR;
- default:
- return error;
- }
-}
-
-error_t
-__hurd_file_name_lookup_retry (error_t (*use_init_port)
- (int which, error_t (*operate) (file_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name,
- int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- enum retry_type doretry,
- char retryname[1024],
- int flags, mode_t mode,
- file_t *result)
-{
- error_t err;
- char *file_name;
- int nloops;
-
- error_t lookup_op (file_t startdir)
- {
- if (file_name[0] == '/' && file_name[1] != '\0')
- {
- while (file_name[1] == '/')
- /* Remove double leading slash. */
- file_name++;
- if (file_name[1] != '\0')
- /* Remove leading slash when we have more than the slash. */
- file_name++;
- }
-
- return lookup_error ((*lookup) (startdir, file_name, flags, mode,
- &doretry, retryname, result));
- }
- error_t reauthenticate (file_t unauth)
- {
- error_t err;
- mach_port_t ref = __mach_reply_port ();
- error_t reauth (auth_t auth)
- {
- return __auth_user_authenticate (auth, ref,
- MACH_MSG_TYPE_MAKE_SEND,
- result);
- }
- err = __io_reauthenticate (unauth, ref, MACH_MSG_TYPE_MAKE_SEND);
- if (! err)
- err = (*use_init_port) (INIT_PORT_AUTH, &reauth);
- __mach_port_destroy (__mach_task_self (), ref);
- __mach_port_deallocate (__mach_task_self (), unauth);
- return err;
- }
-
- if (! lookup)
- lookup = __dir_lookup;
-
- nloops = 0;
- err = 0;
- do
- {
- file_t startdir = MACH_PORT_NULL;
- int dirport = INIT_PORT_CWDIR;
-
- switch (doretry)
- {
- case FS_RETRY_REAUTH:
- if (err = reauthenticate (*result))
- return err;
- /* Fall through. */
-
- case FS_RETRY_NORMAL:
- if (nloops++ >= __eloop_threshold ())
- {
- __mach_port_deallocate (__mach_task_self (), *result);
- return ELOOP;
- }
-
- /* An empty RETRYNAME indicates we have the final port. */
- if (retryname[0] == '\0' &&
- /* If reauth'd, we must do one more retry on "" to give the new
- translator a chance to make a new port for us. */
- doretry == FS_RETRY_NORMAL)
- {
- if (flags & O_NOFOLLOW)
- {
- /* In Linux, O_NOFOLLOW means to reject symlinks. If we
- did an O_NOLINK lookup above and io_stat here to check
- for S_IFLNK, a translator like firmlink could easily
- spoof this check by not showing S_IFLNK, but in fact
- redirecting the lookup to some other name
- (i.e. opening the very same holes a symlink would).
-
- Instead we do an O_NOTRANS lookup above, and stat the
- underlying node: if it has a translator set, and its
- owner is not root (st_uid 0) then we reject it.
- Since the motivation for this feature is security, and
- that security presumes we trust the containing
- directory, this check approximates the security of
- refusing symlinks while accepting mount points.
- Note that we actually permit something Linux doesn't:
- we follow root-owned symlinks; if that is deemed
- undesireable, we can add a final check for that
- one exception to our general translator-based rule. */
- struct stat64 st;
- err = __io_stat (*result, &st);
- if (!err
- && (st.st_mode & (S_IPTRANS|S_IATRANS)))
- {
- if (st.st_uid != 0)
- err = ENOENT;
- else if (st.st_mode & S_IPTRANS)
- {
- char buf[1024];
- char *trans = buf;
- size_t translen = sizeof buf;
- err = __file_get_translator (*result,
- &trans, &translen);
- if (!err
- && translen > sizeof _HURD_SYMLINK
- && !memcmp (trans,
- _HURD_SYMLINK, sizeof _HURD_SYMLINK))
- err = ENOENT;
- }
- }
- }
-
- /* We got a successful translation. Now apply any open-time
- action flags we were passed. */
-
- if (!err && (flags & O_TRUNC)) /* Asked to truncate the file. */
- err = __file_set_size (*result, 0);
-
- if (err)
- __mach_port_deallocate (__mach_task_self (), *result);
- return err;
- }
-
- startdir = *result;
- file_name = retryname;
- break;
-
- case FS_RETRY_MAGICAL:
- switch (retryname[0])
- {
- case '/':
- dirport = INIT_PORT_CRDIR;
- if (*result != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (), *result);
- if (nloops++ >= __eloop_threshold ())
- return ELOOP;
- file_name = &retryname[1];
- break;
-
- case 'f':
- if (retryname[1] == 'd' && retryname[2] == '/')
- {
- int fd;
- char *end;
- int save = errno;
- errno = 0;
- fd = (int) __strtoul_internal (&retryname[3], &end, 10, 0);
- if (end == NULL || errno || /* Malformed number. */
- /* Check for excess text after the number. A slash
- is valid; it ends the component. Anything else
- does not name a numeric file descriptor. */
- (*end != '/' && *end != '\0'))
- {
- errno = save;
- return ENOENT;
- }
- if (! get_dtable_port)
- err = EGRATUITOUS;
- else
- {
- *result = (*get_dtable_port) (fd);
- if (*result == MACH_PORT_NULL)
- {
- /* If the name was a proper number, but the file
- descriptor does not exist, we return EBADF instead
- of ENOENT. */
- err = errno;
- errno = save;
- }
- }
- errno = save;
- if (err)
- return err;
- if (*end == '\0')
- return 0;
- else
- {
- /* Do a normal retry on the remaining components. */
- startdir = *result;
- file_name = end + 1; /* Skip the slash. */
- break;
- }
- }
- else
- goto bad_magic;
- break;
-
- case 'm':
- if (retryname[1] == 'a' && retryname[2] == 'c' &&
- retryname[3] == 'h' && retryname[4] == 't' &&
- retryname[5] == 'y' && retryname[6] == 'p' &&
- retryname[7] == 'e')
- {
- error_t err;
- struct host_basic_info hostinfo;
- mach_msg_type_number_t hostinfocnt = HOST_BASIC_INFO_COUNT;
- char *p;
- /* XXX want client's host */
- if (err = __host_info (__mach_host_self (), HOST_BASIC_INFO,
- (integer_t *) &hostinfo,
- &hostinfocnt))
- return err;
- if (hostinfocnt != HOST_BASIC_INFO_COUNT)
- return EGRATUITOUS;
- p = _itoa (hostinfo.cpu_subtype, &retryname[8], 10, 0);
- *--p = '/';
- p = _itoa (hostinfo.cpu_type, &retryname[8], 10, 0);
- if (p < retryname)
- abort (); /* XXX write this right if this ever happens */
- if (p > retryname)
- strcpy (retryname, p);
- startdir = *result;
- }
- else
- goto bad_magic;
- break;
-
- case 't':
- if (retryname[1] == 't' && retryname[2] == 'y')
- switch (retryname[3])
- {
- error_t opentty (file_t *result)
- {
- error_t err;
- error_t ctty_open (file_t port)
- {
- if (port == MACH_PORT_NULL)
- return ENXIO; /* No controlling terminal. */
- return __termctty_open_terminal (port,
- flags,
- result);
- }
- err = (*use_init_port) (INIT_PORT_CTTYID, &ctty_open);
- if (! err)
- err = reauthenticate (*result);
- return err;
- }
-
- case '\0':
- return opentty (result);
- case '/':
- if (err = opentty (&startdir))
- return err;
- strcpy (retryname, &retryname[4]);
- break;
- default:
- goto bad_magic;
- }
- else
- goto bad_magic;
- break;
-
- default:
- bad_magic:
- return EGRATUITOUS;
- }
- break;
-
- default:
- return EGRATUITOUS;
- }
-
- if (startdir != MACH_PORT_NULL)
- {
- err = lookup_op (startdir);
- __mach_port_deallocate (__mach_task_self (), startdir);
- startdir = MACH_PORT_NULL;
- }
- else
- err = (*use_init_port) (dirport, &lookup_op);
- } while (! err);
-
- return err;
-}
-weak_alias (__hurd_file_name_lookup_retry, hurd_file_name_lookup_retry)
diff --git a/hurd/msgportdemux.c b/hurd/msgportdemux.c
deleted file mode 100644
index 05f7117014..0000000000
--- a/hurd/msgportdemux.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Demux messages sent on the signal port.
- Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-#include <stddef.h>
-
-struct demux
- {
- struct demux *next;
- boolean_t (*demux) (mach_msg_header_t *inp,
- mach_msg_header_t *outp);
- };
-
-struct demux *_hurd_msgport_demuxers = NULL;
-
-extern boolean_t __msg_server (mach_msg_header_t *inp,
- mach_msg_header_t *outp);
-
-static boolean_t
-msgport_server (mach_msg_header_t *inp,
- mach_msg_header_t *outp)
-{
- extern boolean_t _S_msg_server (mach_msg_header_t *inp,
- mach_msg_header_t *outp);
- extern boolean_t _S_exc_server (mach_msg_header_t *inp,
- mach_msg_header_t *outp);
- struct demux *d;
-
- for (d = _hurd_msgport_demuxers; d != NULL; d = d->next)
- if ((*d->demux) (inp, outp))
- return 1;
-
- return (_S_exc_server (inp, outp) ||
- _S_msg_server (inp, outp));
-}
-
-/* This is the code that the signal thread runs. */
-void
-_hurd_msgport_receive (void)
-{
- /* Get our own sigstate cached so we never again have to take a lock to
- fetch it. There is much code in hurdsig.c that operates with some
- sigstate lock held, which will deadlock with _hurd_thread_sigstate.
-
- Furthermore, in the cthreads case this is the convenient spot
- to initialize _hurd_msgport_thread (see hurdsig.c:_hurdsig_init). */
-
- _hurd_msgport_thread = _hurd_self_sigstate ()->thread;
-
- while (1)
- (void) __mach_msg_server (msgport_server, __vm_page_size, _hurd_msgport);
-}
diff --git a/hurd/new-fd.c b/hurd/new-fd.c
deleted file mode 100644
index 9ea95bbf38..0000000000
--- a/hurd/new-fd.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/fd.h>
-#include <stdlib.h>
-#include "hurdmalloc.h" /* XXX */
-
-/* Allocate a new file descriptor structure
- and initialize it with PORT and CTTY. */
-
-struct hurd_fd *
-_hurd_new_fd (io_t port, io_t ctty)
-{
- struct hurd_fd *d = malloc (sizeof (struct hurd_fd));
-
- if (d != NULL)
- {
- /* Initialize the port cells. */
- _hurd_port_init (&d->port, port);
- _hurd_port_init (&d->ctty, ctty);
-
- /* And the fcntl flags. */
- d->flags = 0;
- }
-
- return d;
-}
diff --git a/hurd/openport.c b/hurd/openport.c
deleted file mode 100644
index da889f7225..0000000000
--- a/hurd/openport.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/fd.h>
-
-/* User entry point for interning a port as a new FD.
- Just like _hurd_intern_fd, but don't dealloc PORT on error. */
-
-int
-openport (io_t port, int flags)
-{
- return _hurd_intern_fd (port, flags, 0);
-}
diff --git a/hurd/path-lookup.c b/hurd/path-lookup.c
deleted file mode 100644
index f2061b0bff..0000000000
--- a/hurd/path-lookup.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Filename lookup using a search path
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Miles Bader <miles@gnu.ai.mit.edu>
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <string.h>
-#include <hurd.h>
-#include <hurd/lookup.h>
-
-/* If FILE_NAME contains a '/', or PATH is NULL, call FUN with FILE_NAME, and
- return the result (if PREFIXED_NAME is non-NULL, setting *PREFIXED_NAME to
- NULL). Otherwise, call FUN repeatedly with FILE_NAME prefixed with each
- successive `:' separated element of PATH, returning whenever FUN returns
- 0 (if PREFIXED_NAME is non-NULL, setting *PREFIXED_NAME to the resulting
- prefixed path). If FUN never returns 0, return the first non-ENOENT
- return value, or ENOENT if there is none. */
-error_t
-file_name_path_scan (const char *file_name, const char *path,
- error_t (*fun)(const char *name),
- char **prefixed_name)
-{
- if (path == NULL || strchr (file_name, '/'))
- {
- if (prefixed_name)
- *prefixed_name = 0;
- return (*fun)(file_name);
- }
- else
- {
- error_t real_err = 0;
- size_t file_name_len = strlen (file_name);
-
- for (;;)
- {
- error_t err;
- const char *next = strchr (path, ':') ?: path + strlen (path);
- size_t pfx_len = next - path;
- char pfxed_name[pfx_len + 2 + file_name_len + 1];
-
- if (pfx_len == 0)
- pfxed_name[pfx_len++] = '.';
- else
- memcpy (pfxed_name, path, pfx_len);
- if (pfxed_name[pfx_len - 1] != '/')
- pfxed_name[pfx_len++] = '/';
- memcpy (pfxed_name + pfx_len, file_name, file_name_len + 1);
-
- err = (*fun)(pfxed_name);
- if (err == 0)
- {
- if (prefixed_name)
- *prefixed_name = strdup (pfxed_name);
- return 0;
- }
- if (!real_err && err != ENOENT)
- real_err = err;
-
- if (*next == '\0')
- return real_err ?: ENOENT;
- else
- path = next + 1;
- }
- }
-}
-
-/* Lookup FILE_NAME and return the node opened with FLAGS & MODE in result
- (see hurd_file_name_lookup for details), but a simple filename (without
- any directory prefixes) will be consecutively prefixed with the pathnames
- in the `:' separated list PATH until one succeeds in a successful lookup.
- If none succeed, then the first error that wasn't ENOENT is returned, or
- ENOENT if no other errors were returned. If PREFIXED_NAME is non-NULL,
- then if RESULT is looked up directly, *PREFIXED_NAME is set to NULL, and
- if it is looked up using a prefix from PATH, *PREFIXED_NAME is set to
- malloced storage containing the prefixed name. */
-error_t
-hurd_file_name_path_lookup (error_t (*use_init_port)
- (int which, error_t (*operate) (mach_port_t)),
- file_t (*get_dtable_port) (int fd),
- error_t (*lookup)
- (file_t dir, char *name, int flags, mode_t mode,
- retry_type *do_retry, string_t retry_name,
- mach_port_t *result),
- const char *file_name, const char *path,
- int flags, mode_t mode,
- file_t *result, char **prefixed_name)
-{
- error_t scan_lookup (const char *name)
- {
- return
- __hurd_file_name_lookup (use_init_port, get_dtable_port, lookup,
- name, flags, mode, result);
- }
- return file_name_path_scan (file_name, path, scan_lookup, prefixed_name);
-}
-
-file_t
-file_name_path_lookup (const char *file_name, const char *path,
- int flags, mode_t mode, char **prefixed_name)
-{
- error_t err;
- file_t result;
-
- err = hurd_file_name_path_lookup (&_hurd_ports_use, &__getdport, 0,
- file_name, path, flags, mode,
- &result, prefixed_name);
-
- return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
-}
diff --git a/hurd/pid2task.c b/hurd/pid2task.c
deleted file mode 100644
index 5fd2de53c0..0000000000
--- a/hurd/pid2task.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-task_t
-__pid2task (pid_t pid)
-{
- error_t err;
- task_t task;
-
- err = __USEPORT (PROC, __proc_pid2task (port, pid, &task));
-
- return err ? (__hurd_fail (err), MACH_PORT_NULL) : task;
-}
-
-weak_alias (__pid2task, pid2task)
diff --git a/hurd/port-cleanup.c b/hurd/port-cleanup.c
deleted file mode 100644
index 6dbd117980..0000000000
--- a/hurd/port-cleanup.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Cleanup function for `struct hurd_port' users who longjmp.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <mach.h>
-#include <hurd/port.h>
-
-/* The last user of the send right CLEANUP_DATA is now doing
- `longjmp (ENV, VAL)', and this will unwind the frame of
- that last user. Deallocate the right he will never get back to using. */
-
-void
-_hurd_port_cleanup (void *cleanup_data, jmp_buf env, int val)
-{
- __mach_port_deallocate (__mach_task_self (), (mach_port_t) cleanup_data);
-}
diff --git a/hurd/port2fd.c b/hurd/port2fd.c
deleted file mode 100644
index 83e7b9c47e..0000000000
--- a/hurd/port2fd.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/signal.h>
-#include <hurd/term.h>
-#include <fcntl.h>
-
-/* Store PORT in file descriptor D, doing appropriate ctty magic.
- FLAGS are as for `open'; only O_IGNORE_CTTY and O_CLOEXEC are meaningful.
- D should be locked, and will not be unlocked. */
-
-void
-_hurd_port2fd (struct hurd_fd *d, io_t dport, int flags)
-{
- mach_port_t cttyid;
- io_t ctty = MACH_PORT_NULL;
-
- if (!(flags & O_IGNORE_CTTY))
- __USEPORT (CTTYID,
- ({
- if (port != MACH_PORT_NULL && /* Do we have a ctty? */
- ! __term_getctty (dport, &cttyid)) /* Could this be it? */
- {
- __mach_port_deallocate (__mach_task_self (), cttyid);
- /* This port is capable of being a controlling tty.
- Is it ours? */
- if (cttyid == port)
- __term_open_ctty (dport, _hurd_pid, _hurd_pgrp, &ctty);
- /* XXX if this port is our ctty, but we are not doing
- ctty style i/o because term_become_ctty barfed,
- what to do? */
- }
- 0;
- }));
-
- /* Install PORT in the descriptor cell, leaving it locked. */
- {
- mach_port_t old
- = _hurd_userlink_clear (&d->port.users) ? d->port.port : MACH_PORT_NULL;
- d->port.port = dport;
- d->flags = (flags & O_CLOEXEC) ? FD_CLOEXEC : 0;
- if (old != MACH_PORT_NULL)
- __mach_port_deallocate (__mach_task_self (), old);
- }
-
- _hurd_port_set (&d->ctty, ctty);
-}
diff --git a/hurd/ports-get.c b/hurd/ports-get.c
deleted file mode 100644
index 0735ac59b1..0000000000
--- a/hurd/ports-get.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-static error_t
-getbootstrap (mach_port_t *result)
-{
- return __task_get_special_port (__mach_task_self (),
- TASK_BOOTSTRAP_PORT,
- result);
-}
-
-error_t (*_hurd_ports_getters[INIT_PORT_MAX]) (mach_port_t *result) =
- {
- [INIT_PORT_BOOTSTRAP] = getbootstrap,
- };
-
-error_t
-_hurd_ports_get (unsigned int which, mach_port_t *result)
-{
- if (which >= _hurd_nports)
- return EINVAL;
- if (which >= INIT_PORT_MAX || _hurd_ports_getters[which] == NULL)
- return HURD_PORT_USE (&_hurd_ports[which],
- (*result = port) == MACH_PORT_NULL ? 0
- : __mach_port_mod_refs (__mach_task_self (),
- port, MACH_PORT_RIGHT_SEND,
- +1));
- return (*_hurd_ports_getters[which]) (result);
-}
diff --git a/hurd/ports-set.c b/hurd/ports-set.c
deleted file mode 100644
index 30d47a4281..0000000000
--- a/hurd/ports-set.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-static error_t
-setbootstrap (mach_port_t newport)
-{
- return __task_set_special_port (__mach_task_self (),
- TASK_BOOTSTRAP_PORT,
- newport);
-}
-
-extern error_t _hurd_setauth (auth_t);
-extern error_t _hurd_setproc (process_t);
-extern error_t _hurd_setcttyid (mach_port_t);
-
-error_t (*_hurd_ports_setters[INIT_PORT_MAX]) (mach_port_t newport) =
- {
- [INIT_PORT_BOOTSTRAP] = setbootstrap,
- [INIT_PORT_AUTH] = _hurd_setauth,
- [INIT_PORT_PROC] = _hurd_setproc,
- [INIT_PORT_CTTYID] = _hurd_setcttyid,
- };
-
-
-error_t
-_hurd_ports_set (unsigned int which, mach_port_t newport)
-{
- error_t err;
- if (which >= _hurd_nports)
- return EINVAL;
- if (err = __mach_port_mod_refs (__mach_task_self (), newport,
- MACH_PORT_RIGHT_SEND, 1))
- return err;
- if (which >= INIT_PORT_MAX || _hurd_ports_setters[which] == NULL)
- {
- _hurd_port_set (&_hurd_ports[which], newport);
- return 0;
- }
- return (*_hurd_ports_setters[which]) (newport);
-}
diff --git a/hurd/preempt-sig.c b/hurd/preempt-sig.c
deleted file mode 100644
index 81c4e905b4..0000000000
--- a/hurd/preempt-sig.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/sigpreempt.h>
-#include <hurd/signal.h>
-#include <assert.h>
-
-void
-hurd_preempt_signals (struct hurd_signal_preemptor *preemptor)
-{
- __mutex_lock (&_hurd_siglock);
- preemptor->next = _hurdsig_preemptors;
- _hurdsig_preemptors = preemptor;
- _hurdsig_preempted_set |= preemptor->signals;
- __mutex_unlock (&_hurd_siglock);
-}
-
-void
-hurd_unpreempt_signals (struct hurd_signal_preemptor *preemptor)
-{
- struct hurd_signal_preemptor **p;
- sigset_t preempted = 0;
-
- __mutex_lock (&_hurd_siglock);
-
- p = &_hurdsig_preemptors;
- while (*p)
- if (*p == preemptor)
- {
- /* Found it; take it off the chain. */
- *p = (*p)->next;
- if ((preemptor->signals & preempted) != preemptor->signals)
- {
- /* This might have been the only preemptor for some
- of those signals, so we must collect the full mask
- from the others. */
- struct hurd_signal_preemptor *pp;
- for (pp = *p; pp; pp = pp->next)
- preempted |= pp->signals;
- _hurdsig_preempted_set = preempted;
- }
- __mutex_unlock (&_hurd_siglock);
- return;
- }
- else
- {
- preempted |= (*p)->signals;
- p = &(*p)->next;
- }
-
- __mutex_unlock (&_hurd_siglock); /* Avoid deadlock during death rattle. */
- assert (! "removing absent preemptor");
-}
diff --git a/hurd/privports.c b/hurd/privports.c
deleted file mode 100644
index 90467883a6..0000000000
--- a/hurd/privports.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-/* The program might set these if it is the initial task
- bootstrapped by the microkernel. */
-
-mach_port_t _hurd_host_priv, _hurd_device_master;
-
-
-kern_return_t
-__get_privileged_ports (mach_port_t *host_priv_ptr,
- device_t *device_master_ptr)
-{
- if ((host_priv_ptr && _hurd_host_priv == MACH_PORT_NULL)
- || (device_master_ptr && _hurd_device_master == MACH_PORT_NULL))
- {
- error_t err;
-
- if (_hurd_ports)
- /* We have gotten some initial ports, so perhaps
- we have a proc server to talk to. */
- err = __USEPORT (PROC, __proc_getprivports (port,
- &_hurd_host_priv,
- &_hurd_device_master));
- else
- return MACH_SEND_INVALID_DEST;
-
- if (err)
- return err;
- }
-
- if (host_priv_ptr)
- {
- error_t err = _hurd_host_priv == MACH_PORT_NULL ? 0
- : __mach_port_mod_refs (mach_task_self (),
- _hurd_host_priv, MACH_PORT_RIGHT_SEND, +1);
- if (err)
- return err;
- *host_priv_ptr = _hurd_host_priv;
- }
-
- if (device_master_ptr)
- {
- error_t err = _hurd_device_master == MACH_PORT_NULL ? 0
- : __mach_port_mod_refs (mach_task_self (),
- _hurd_device_master, MACH_PORT_RIGHT_SEND, +1);
- if (err)
- return err;
- *device_master_ptr = _hurd_device_master;
- }
-
- return KERN_SUCCESS;
-}
-weak_alias (__get_privileged_ports, get_privileged_ports)
diff --git a/hurd/report-wait.c b/hurd/report-wait.c
deleted file mode 100644
index 92e8aba71c..0000000000
--- a/hurd/report-wait.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* Report on what a thread in our task is waiting for.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/signal.h>
-#include <hurd/fd.h>
-#include <string.h>
-#include <assert.h>
-#include <hurd/msg_server.h>
-#include <thread_state.h>
-#include <intr-msg.h>
-
-static char *
-describe_number (string_t description, const char *flavor, long int i)
-{
- unsigned long int j;
- char *p = flavor == NULL ? description : __stpcpy (description, flavor);
- char *end;
-
- /* Handle sign. */
- if (i < 0)
- {
- i = -i;
- *p++ = '-';
- }
-
- /* Allocate space for the number at the end of DESCRIPTION. */
- for (j = i; j >= 10; j /= 10)
- p++;
- end = p + 1;
- *end = '\0';
-
- do
- {
- *p-- = '0' + i % 10;
- i /= 10;
- } while (i != 0);
-
- return end;
-}
-
-static char *
-describe_port (string_t description, mach_port_t port)
-{
- int i;
-
- if (port == MACH_PORT_NULL)
- return __stpcpy (description, "(null)");
- if (port == MACH_PORT_DEAD)
- return __stpcpy (description, "(dead)");
-
- if (port == __mach_task_self ())
- return __stpcpy (description, "task-self");
-
- for (i = 0; i < _hurd_nports; ++i)
- if (port == _hurd_ports[i].port)
- return describe_number (description, "init#", i);
-
- if (_hurd_init_dtable)
- {
- for (i = 0; i < _hurd_init_dtablesize; ++i)
- if (port == _hurd_init_dtable[i])
- return describe_number (description, "fd#", i);
- }
- else if (_hurd_dtable)
- {
- for (i = 0; i < _hurd_dtablesize; ++i)
- if (_hurd_dtable[i] == NULL)
- continue;
- else if (port == _hurd_dtable[i]->port.port)
- return describe_number (description, "fd#", i);
- else if (port == _hurd_dtable[i]->ctty.port)
- return describe_number (description, "bgfd#", i);
- }
-
- return describe_number (description, "port#", port);
-}
-
-
-/* We want _HURD_ITIMER_THREAD, but don't want to link in the itimer code
- unnecessarily. */
-#if 0 /* libc.so.0.0 needs this defined, so make it a weak alias for now. */
-extern thread_t _hurd_itimer_thread; /* XXX */
-weak_extern (_hurd_itimer_thread)
-#else
-static thread_t default_hurd_itimer_thread;
-weak_alias (default_hurd_itimer_thread, _hurd_itimer_thread)
-#endif
-
-kern_return_t
-_S_msg_report_wait (mach_port_t msgport, thread_t thread,
- string_t description, mach_msg_id_t *msgid)
-{
- *msgid = 0;
-
- if (thread == _hurd_msgport_thread)
- /* Cute. */
- strcpy (description, "msgport");
- else if (&_hurd_itimer_thread && thread == _hurd_itimer_thread)
- strcpy (description, "itimer");
- else
- {
- /* Make sure this is really one of our threads. */
-
- struct hurd_sigstate *ss;
-
- __mutex_lock (&_hurd_siglock);
- for (ss = _hurd_sigstates; ss != NULL; ss = ss->next)
- if (ss->thread == thread)
- break;
- __mutex_unlock (&_hurd_siglock);
- if (ss == NULL)
- /* To hell with you. */
- return EINVAL;
-
- if (ss->suspended != MACH_PORT_NULL)
- strcpy (description, "sigsuspend");
- else
- {
- /* Examine the thread's state to see if it is blocked in an RPC. */
-
- struct machine_thread_state state;
- mach_msg_type_number_t count = MACHINE_THREAD_STATE_COUNT;
- error_t err;
-
- err = __thread_get_state (thread, MACHINE_THREAD_STATE_FLAVOR,
- (natural_t *) &state, &count);
- if (err)
- return err;
- assert (count == MACHINE_THREAD_STATE_COUNT);
- if (SYSCALL_EXAMINE (&state, msgid))
- {
- mach_port_t send_port, rcv_port;
- mach_msg_option_t option;
- mach_msg_timeout_t timeout;
-
- /* Blocked in a system call. */
- if (*msgid == -25
- /* mach_msg system call. Examine its parameters. */
- && MSG_EXAMINE (&state, msgid, &send_port, &rcv_port,
- &option, &timeout) == 0)
- {
- char *p;
- if (send_port != MACH_PORT_NULL && *msgid != 0)
- {
- /* For the normal case of RPCs, we consider the
- destination port to be the interesting thing
- whether we are in fact sending or receiving at the
- moment. That tells us who we are waiting for the
- reply from. */
- if (send_port == ss->intr_port)
- {
- /* This is a Hurd interruptible RPC.
- Mark it by surrounding the port description
- string with [...] brackets. */
- description[0] = '[';
- p = describe_port (description + 1, send_port);
- *p++ = ']';
- *p = '\0';
- }
- else
- (void) describe_port (description, send_port);
- }
- else if (rcv_port != MACH_PORT_NULL)
- {
- /* This system call had no send port, but had a
- receive port. The msgid we extracted is then just
- some garbage or perhaps the msgid of the last
- message this thread received, but it's not a
- helpful thing to return. */
- strcpy (describe_port (description, rcv_port), ":rcv");
- *msgid = 0;
- }
- else if ((option & (MACH_RCV_MSG|MACH_RCV_TIMEOUT))
- == (MACH_RCV_MSG|MACH_RCV_TIMEOUT))
- {
- /* A receive with no valid port can be used for a
- pure timeout. Report the timeout value (counted
- in milliseconds); note this is the original total
- time, not the time remaining. */
- strcpy (describe_number (description, 0, timeout), "ms");
- *msgid = 0;
- }
- else
- {
- strcpy (description, "mach_msg");
- *msgid = 0;
- }
- }
- else /* Some other system call. */
- {
- (void) describe_number (description, "syscall#", *msgid);
- *msgid = 0;
- }
- }
- else
- description[0] = '\0';
- }
- }
-
- __mach_port_deallocate (__mach_task_self (), thread);
- return 0;
-}
-
-kern_return_t
-_S_msg_describe_ports (mach_port_t msgport, mach_port_t refport,
- mach_port_t *ports, mach_msg_type_number_t nports,
- char **desc, mach_msg_type_number_t *desclen)
-{
- char *p, *end;
-
- if (__USEPORT (AUTH, msgport != port))
- return EPERM;
-
- end = *desc + *desclen;
- p = *desc;
- while (nports-- > 0)
- {
- char this[200];
- describe_port (this, *ports++);
- p = __stpncpy (p, this, end - p);
- if (p == end && p[-1] != '\0')
- return ENOMEM;
- }
-
- *desclen = p - *desc;
- return 0;
-}
diff --git a/hurd/set-host.c b/hurd/set-host.c
deleted file mode 100644
index e302d71fb7..0000000000
--- a/hurd/set-host.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Set a host configuration item kept as the whole contents of a file.
- Copyright (C) 1996-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <fcntl.h>
-#include <hurd.h>
-#include "hurdhost.h"
-
-ssize_t
-_hurd_set_host_config (const char *item, const char *value, size_t valuelen)
-{
- error_t err;
- mach_msg_type_number_t nwrote;
- file_t new, dir;
- char *name;
-
- dir = __file_name_split (item, &name);
- if (dir == MACH_PORT_NULL)
- return -1;
-
- /* Create a new node. */
- err = __dir_mkfile (dir, O_WRONLY, 0644, &new);
- if (! err)
- {
- /* Write the contents. */
- err = __io_write (new, value, valuelen, 0, &nwrote);
- if (! err)
- /* Atomically link the new node onto the name. */
- err = __dir_link (dir, new, name, 0);
- __mach_port_deallocate (__mach_task_self (), new);
- }
- __mach_port_deallocate (__mach_task_self (), dir);
-
- return err ? __hurd_fail (err) : nwrote;
-}
diff --git a/hurd/setauth.c b/hurd/setauth.c
deleted file mode 100644
index 77bf7ee741..0000000000
--- a/hurd/setauth.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/port.h>
-#include <hurd/id.h>
-#include "set-hooks.h"
-
-/* Things in the library which want to be run when the auth port changes. */
-DEFINE_HOOK (_hurd_reauth_hook, (auth_t new_auth));
-
-#include <cthreads.h>
-static struct mutex reauth_lock = MUTEX_INITIALIZER;
-
-
-/* Set the auth port to NEW, and reauthenticate
- everything used by the library. */
-error_t
-_hurd_setauth (auth_t new)
-{
- error_t err;
- unsigned int d;
- mach_port_t newport, ref;
-
- /* Give the new send right a user reference.
- This is a good way to check that it is valid. */
- if (err = __mach_port_mod_refs (__mach_task_self (), new,
- MACH_PORT_RIGHT_SEND, 1))
- return err;
-
- HURD_CRITICAL_BEGIN;
-
- /* We lock against another thread doing setauth. Anyone who sets
- _hurd_ports[INIT_PORT_AUTH] some other way is asking to lose. */
- __mutex_lock (&reauth_lock);
-
- /* Install the new port in the cell. */
- __mutex_lock (&_hurd_id.lock);
- _hurd_port_set (&_hurd_ports[INIT_PORT_AUTH], new);
- _hurd_id.valid = 0;
- if (_hurd_id.rid_auth)
- {
- __mach_port_deallocate (__mach_task_self (), _hurd_id.rid_auth);
- _hurd_id.rid_auth = MACH_PORT_NULL;
- }
- __mutex_unlock (&_hurd_id.lock);
-
- if (_hurd_init_dtable != NULL)
- /* We just have the simple table we got at startup.
- Otherwise, a reauth_hook in dtable.c takes care of this. */
- for (d = 0; d < _hurd_init_dtablesize; ++d)
- if (_hurd_init_dtable[d] != MACH_PORT_NULL)
- {
- mach_port_t new;
- ref = __mach_reply_port ();
- if (! __io_reauthenticate (_hurd_init_dtable[d],
- ref, MACH_MSG_TYPE_MAKE_SEND) &&
- ! HURD_PORT_USE (&_hurd_ports[INIT_PORT_AUTH],
- __auth_user_authenticate
- (port,
- ref, MACH_MSG_TYPE_MAKE_SEND,
- &new)))
- {
- __mach_port_deallocate (__mach_task_self (),
- _hurd_init_dtable[d]);
- _hurd_init_dtable[d] = new;
- }
- __mach_port_destroy (__mach_task_self (), ref);
- }
-
- ref = __mach_reply_port ();
- if (__USEPORT (CRDIR,
- ! __io_reauthenticate (port,
- ref, MACH_MSG_TYPE_MAKE_SEND) &&
- ! __auth_user_authenticate (new,
- ref, MACH_MSG_TYPE_MAKE_SEND,
- &newport)))
- _hurd_port_set (&_hurd_ports[INIT_PORT_CRDIR], newport);
- __mach_port_destroy (__mach_task_self (), ref);
-
- ref = __mach_reply_port ();
- if (__USEPORT (CWDIR,
- ! __io_reauthenticate (port,
- ref, MACH_MSG_TYPE_MAKE_SEND) &&
- ! __auth_user_authenticate (new,
- ref, MACH_MSG_TYPE_MAKE_SEND,
- &newport)))
- _hurd_port_set (&_hurd_ports[INIT_PORT_CWDIR], newport);
- __mach_port_destroy (__mach_task_self (), ref);
-
- /* Run things which want to do reauthorization stuff. */
- RUN_HOOK (_hurd_reauth_hook, (new));
-
- __mutex_unlock (&reauth_lock);
-
- HURD_CRITICAL_END;
-
- return 0;
-}
-
-int
-__setauth (auth_t new)
-{
- error_t err = _hurd_setauth (new);
- return err ? __hurd_fail (err) : 0;
-}
-
-weak_alias (__setauth, setauth)
diff --git a/hurd/seteuids.c b/hurd/seteuids.c
deleted file mode 100644
index edefdf9c12..0000000000
--- a/hurd/seteuids.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Copyright (C) 1993-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/id.h>
-
-/* Set the uid set for the current user to UIDS (N of them). */
-int
-seteuids (int n, const uid_t *uids)
-{
- error_t err;
- auth_t newauth;
- int i;
- gid_t new[n];
-
- /* Fault before taking locks. */
- for (i = 0; i < n; ++i)
- new[i] = uids[i];
-
- HURD_CRITICAL_BEGIN;
- __mutex_lock (&_hurd_id.lock);
- err = _hurd_check_ids ();
- if (! err)
- {
- /* Get a new auth port using those IDs. */
- err = __USEPORT (AUTH,
- __auth_makeauth (port, NULL, 0, 0,
- new, n,
- _hurd_id.aux.uids, _hurd_id.aux.nuids,
- _hurd_id.gen.gids, _hurd_id.gen.ngids,
- _hurd_id.aux.gids, _hurd_id.aux.ngids,
- &newauth));
- }
- __mutex_unlock (&_hurd_id.lock);
- HURD_CRITICAL_END;
-
- if (err)
- return __hurd_fail (err);
-
- /* Install the new auth port and reauthenticate everything. */
- err = __setauth (newauth);
- __mach_port_deallocate (__mach_task_self (), newauth);
- return err;
-}
diff --git a/hurd/siginfo.c b/hurd/siginfo.c
deleted file mode 100644
index 1db042e4d8..0000000000
--- a/hurd/siginfo.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/signal.h>
-#include <stdio.h>
-
-void
-_hurd_siginfo_handler (int signo)
-{
- /* XXX */
- puts ("got a SIGINFO");
-}
diff --git a/hurd/sigunwind.c b/hurd/sigunwind.c
deleted file mode 100644
index 8025599665..0000000000
--- a/hurd/sigunwind.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* longjmp cleanup function for unwinding past signal handlers.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <thread_state.h>
-#include <jmpbuf-unwind.h>
-#include <assert.h>
-#include <stdint.h>
-
-
-/* _hurd_setup_sighandler puts a link on the `active resources' chain so that
- _longjmp_unwind will call this function with the `struct sigcontext *'
- describing the context interrupted by the signal, when `longjmp' is jumping
- to an environment that unwinds past the interrupted frame. */
-
-void
-_hurdsig_longjmp_from_handler (void *data, jmp_buf env, int val)
-{
- struct sigcontext *scp = data;
- struct hurd_sigstate *ss = _hurd_self_sigstate ();
- int onstack;
- inline void cleanup (void)
- {
- /* Destroy the MiG reply port used by the signal handler, and restore
- the reply port in use by the thread when interrupted. */
- mach_port_t *reply_port =
- (mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
- if (*reply_port)
- {
- mach_port_t port = *reply_port;
- /* Assigning MACH_PORT_DEAD here tells libc's mig_get_reply_port
- not to get another reply port, but avoids mig_dealloc_reply_port
- trying to deallocate it after the receive fails (which it will,
- because the reply port will be bogus, regardless). */
- *reply_port = MACH_PORT_DEAD;
- __mach_port_destroy (__mach_task_self (), port);
- }
- if (scp->sc_reply_port)
- __mach_port_destroy (__mach_task_self (), scp->sc_reply_port);
- }
-
- __spin_lock (&ss->lock);
- /* We should only ever be called from _longjmp_unwind (in jmp-unwind.c),
- which calls us inside a critical section. */
- assert (__spin_lock_locked (&ss->critical_section_lock));
- /* Are we on the alternate signal stack now? */
- onstack = (ss->sigaltstack.ss_flags & SS_ONSTACK);
- __spin_unlock (&ss->lock);
-
- if (onstack && ! scp->sc_onstack)
- {
- /* We are unwinding off the signal stack. We must use sigreturn to
- do it robustly. Mutate the sigcontext so that when sigreturn
- resumes from that context, it will be as if `__longjmp (ENV, VAL)'
- were done. */
-
- struct hurd_userlink *link;
-
- inline uintptr_t demangle_ptr (uintptr_t x)
- {
-# ifdef PTR_DEMANGLE
- PTR_DEMANGLE (x);
-# endif
- return x;
- }
-
- /* Continue _longjmp_unwind's job of running the unwind
- forms for frames being unwound, since we will not
- return to its loop like this one, which called us. */
- for (link = ss->active_resources;
- link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link, demangle_ptr);
- link = link->thread.next)
- if (_hurd_userlink_unlink (link))
- {
- if (link->cleanup == &_hurdsig_longjmp_from_handler)
- {
- /* We are unwinding past another signal handler invocation.
- Just finish the cleanup for this (inner) one, and then
- swap SCP to restore to the outer context. */
- cleanup ();
- scp = link->cleanup_data;
- }
- else
- (*link->cleanup) (link->cleanup_data, env, val);
- }
-
-#define sc_machine_thread_state paste(sc_,machine_thread_state)
-#define paste(a,b) paste1(a,b)
-#define paste1(a,b) a##b
-
- /* There are no more unwind forms to be run!
- Now we can just have the sigreturn do the longjmp for us. */
- _hurd_longjmp_thread_state
- ((struct machine_thread_state *) &scp->sc_machine_thread_state,
- env, val);
-
- /* Restore to the same current signal mask. If sigsetjmp saved the
- mask, longjmp has already restored it as desired; if not, we
- should leave it as it is. */
- scp->sc_mask = ss->blocked;
-
- /* sigreturn expects the link added by _hurd_setup_sighandler
- to still be there, but _longjmp_unwind removed it just before
- calling us. Put it back now so sigreturn can find it. */
- link = (void *) &scp[1];
- assert (! link->resource.next && ! link->resource.prevp);
- assert (link->thread.next == ss->active_resources);
- assert (link->thread.prevp == &ss->active_resources);
- if (link->thread.next)
- link->thread.next->thread.prevp = &link->thread.next;
- ss->active_resources = link;
-
- /* We must momentarily exit the critical section so that sigreturn
- does not get upset with us. But we don't want signal handlers
- running right now, because we are presently in the bogus state of
- having run all the unwind forms back to ENV's frame, but our SP is
- still inside those unwound frames. */
- __spin_lock (&ss->lock);
- __spin_unlock (&ss->critical_section_lock);
- ss->blocked = ~(sigset_t) 0 & ~_SIG_CANT_MASK;
- __spin_unlock (&ss->lock);
-
- /* Restore to the modified signal context that now
- performs `longjmp (ENV, VAL)'. */
- __sigreturn (scp);
- assert (! "sigreturn returned!");
- }
-
- /* We are not unwinding off the alternate signal stack. So nothing
- really funny is going on here. We can just clean up this handler
- frame and let _longjmp_unwind continue unwinding. */
- cleanup ();
- ss->intr_port = scp->sc_intr_port;
-}
diff --git a/hurd/task2pid.c b/hurd/task2pid.c
deleted file mode 100644
index 86c5c659f8..0000000000
--- a/hurd/task2pid.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-
-pid_t
-__task2pid (task_t task)
-{
- error_t err;
- pid_t pid;
- err = __USEPORT (PROC, __proc_task2pid (port, task, &pid));
- return err ? (pid_t) __hurd_fail (err) : pid;
-}
-
-weak_alias (__task2pid, task2pid)
diff --git a/hurd/thread-cancel.c b/hurd/thread-cancel.c
deleted file mode 100644
index 722b6adc74..0000000000
--- a/hurd/thread-cancel.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Thread cancellation support.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/signal.h>
-#include <hurd/interrupt.h>
-#include <assert.h>
-#include <thread_state.h>
-
-
-/* See hurdsig.c. */
-extern mach_port_t _hurdsig_abort_rpcs (struct hurd_sigstate *ss,
- int signo, int sigthread,
- struct machine_thread_all_state *,
- int *state_change,
- mach_port_t *reply_port,
- mach_msg_type_name_t reply_port_type,
- int untraced);
-
-error_t
-hurd_thread_cancel (thread_t thread)
-{
- struct hurd_sigstate *ss = _hurd_thread_sigstate (thread);
- struct machine_thread_all_state state;
- int state_change;
- error_t err;
-
- if (! ss)
- return EINVAL;
- if (ss == _hurd_self_sigstate ())
- {
- /* We are cancelling ourselves, so it is easy to succeed
- quickly. Since this function is not a cancellation point, we
- just leave the flag set pending the next cancellation point
- (hurd_check_cancel or RPC) and return success. */
- ss->cancel = 1;
- return 0;
- }
-
- assert (! __spin_lock_locked (&ss->critical_section_lock));
- __spin_lock (&ss->critical_section_lock);
- __spin_lock (&ss->lock);
- err = __thread_suspend (thread);
- __spin_unlock (&ss->lock);
-
- if (! err)
- {
- /* Set the flag telling the thread its operation is being cancelled. */
- ss->cancel = 1;
-
- /* Interrupt any interruptible RPC now in progress. */
- state.set = 0;
- _hurdsig_abort_rpcs (ss, 0, 0, &state, &state_change, NULL, 0, 0);
- if (state_change)
- err = __thread_set_state (thread, MACHINE_THREAD_STATE_FLAVOR,
- (natural_t *) &state.basic,
- MACHINE_THREAD_STATE_COUNT);
-
- if (ss->cancel_hook)
- /* The code being cancelled has a special wakeup function.
- Calling this should make the thread wake up and check the
- cancellation flag. */
- (*ss->cancel_hook) ();
-
- __thread_resume (thread);
- }
-
- _hurd_critical_section_unlock (ss);
- return err;
-}
-
-
-int
-hurd_check_cancel (void)
-{
- struct hurd_sigstate *ss = _hurd_self_sigstate ();
- int cancel;
-
- __spin_lock (&ss->lock);
- assert (! __spin_lock_locked (&ss->critical_section_lock));
- cancel = ss->cancel;
- ss->cancel = 0;
- __spin_unlock (&ss->lock);
-
- return cancel;
-}
diff --git a/hurd/thread-self.c b/hurd/thread-self.c
deleted file mode 100644
index 3532caff91..0000000000
--- a/hurd/thread-self.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Cheap function to get current thread from sigstate without a syscall.
- Copyright (C) 1995-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd/signal.h>
-
-thread_t
-hurd_thread_self (void)
-{
- return _hurd_self_sigstate ()->thread;
-}
diff --git a/hurd/trampoline.c b/hurd/trampoline.c
deleted file mode 100644
index e506fd8c96..0000000000
--- a/hurd/trampoline.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Set thread_state for sighandler, and sigcontext to recover. Stub version.
- Copyright (C) 1994-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <mach/thread_status.h>
-
-/* Set up STATE to run a signal handler in the thread it describes.
- This should save the original state in a `struct sigcontext' on the
- thread's stack (or possibly a signal stack described by SIGALTSTACK,
- if the SA_ONSTACK bit is set in FLAGS), and return the address of
- that structure. */
-
-struct sigcontext *
-_hurd_setup_sighandler (int flags,
- __sighandler_t handler,
- stack_t *sigaltstack,
- int signo, int sigcode,
- void *state)
-{
-#error "Need to write sysdeps/mach/hurd/MACHINE/trampoline.c"
-}
diff --git a/hurd/vpprintf.c b/hurd/vpprintf.c
deleted file mode 100644
index 82cdadd5c7..0000000000
--- a/hurd/vpprintf.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <hurd.h>
-
-#include <libioP.h>
-
-static ssize_t
-do_write (void *cookie, const char *buf, size_t n)
-{
- error_t error = __io_write ((io_t) cookie, buf, n, -1,
- (mach_msg_type_number_t *) &n);
- if (error)
- return __hurd_fail (error);
- return n;
-}
-
-/* Write formatted output to PORT, a Mach port supporting the i/o protocol,
- according to the format string FORMAT, using the argument list in ARG. */
-int
-vpprintf (io_t port, const char *format, va_list arg)
-{
- int done;
-
- struct locked_FILE
- {
- struct _IO_cookie_file cfile;
-#ifdef _IO_MTSAFE_IO
- _IO_lock_t lock;
-#endif
- } temp_f;
-#ifdef _IO_MTSAFE_IO
- temp_f.cfile.__fp.file._lock = &temp_f.lock;
-#endif
-
- _IO_cookie_init (&temp_f.cfile, _IO_NO_READS,
- (void *) port, (cookie_io_functions_t) { write: do_write });
-
- done = _IO_vfprintf (&temp_f.cfile.__fp.file, format, arg);
-
- return done;
-}
diff --git a/hurd/xattr.c b/hurd/xattr.c
deleted file mode 100644
index 7deef291b4..0000000000
--- a/hurd/xattr.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/* Support for *xattr interfaces on GNU/Hurd.
- Copyright (C) 2006-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <hurd.h>
-#include <hurd/xattr.h>
-#include <string.h>
-#include <sys/mman.h>
-
-/* Right now we support only a fixed set of xattr names for Hurd features.
- There are no RPC interfaces for free-form xattr names and values.
-
- Name Value encoding
- ---- ----- --------
- gnu.author empty if st_author==st_uid
- uid_t giving st_author value
- gnu.translator empty if no passive translator
- translator and arguments: "/hurd/foo\0arg1\0arg2\0"
-*/
-
-error_t
-_hurd_xattr_get (io_t port, const char *name, void *value, size_t *size)
-{
- if (strncmp (name, "gnu.", 4))
- return EOPNOTSUPP;
- name += 4;
-
- if (!strcmp (name, "author"))
- {
- struct stat64 st;
- error_t err = __io_stat (port, &st);
- if (err)
- return err;
- if (st.st_author == st.st_uid)
- *size = 0;
- else if (value)
- {
- if (*size < sizeof st.st_author)
- return ERANGE;
- memcpy (value, &st.st_author, sizeof st.st_author);
- }
- *size = sizeof st.st_author;
- return 0;
- }
-
- if (!strcmp (name, "translator"))
- {
- char *buf = value;
- size_t bufsz = value ? *size : 0;
- error_t err = __file_get_translator (port, &buf, &bufsz);
- if (err)
- return err;
- if (value != NULL && *size < bufsz)
- {
- if (buf != value)
- munmap (buf, bufsz);
- return -ERANGE;
- }
- if (buf != value && bufsz > 0)
- {
- if (value != NULL)
- memcpy (value, buf, bufsz);
- munmap (buf, bufsz);
- }
- *size = bufsz;
- return 0;
- }
-
- return EOPNOTSUPP;
-}
-
-error_t
-_hurd_xattr_set (io_t port, const char *name, const void *value, size_t size,
- int flags)
-{
- if (strncmp (name, "gnu.", 4))
- return EOPNOTSUPP;
- name += 4;
-
- if (!strcmp (name, "author"))
- switch (size)
- {
- default:
- return EINVAL;
- case 0: /* "Clear" author by setting to st_uid. */
- {
- struct stat64 st;
- error_t err = __io_stat (port, &st);
- if (err)
- return err;
- if (st.st_author == st.st_uid)
- {
- /* Nothing to do. */
- if (flags & XATTR_REPLACE)
- return ENODATA;
- return 0;
- }
- if (flags & XATTR_CREATE)
- return EEXIST;
- return __file_chauthor (port, st.st_uid);
- }
- case sizeof (uid_t): /* Set the author. */
- {
- uid_t id;
- memcpy (&id, value, sizeof id);
- if (flags & (XATTR_CREATE|XATTR_REPLACE))
- {
- struct stat64 st;
- error_t err = __io_stat (port, &st);
- if (err)
- return err;
- if (st.st_author == st.st_uid)
- {
- if (flags & XATTR_REPLACE)
- return ENODATA;
- }
- else if (flags & XATTR_CREATE)
- return EEXIST;
- if (st.st_author == id)
- /* Nothing to do. */
- return 0;
- }
- return __file_chauthor (port, id);
- }
- }
-
- if (!strcmp (name, "translator"))
- {
- if (flags & XATTR_REPLACE)
- {
- /* Must make sure it's already there. */
- char *buf = NULL;
- size_t bufsz = 0;
- error_t err = __file_get_translator (port, &buf, &bufsz);
- if (err)
- return err;
- if (bufsz > 0)
- {
- munmap (buf, bufsz);
- return ENODATA;
- }
- }
- return __file_set_translator (port,
- FS_TRANS_SET | ((flags & XATTR_CREATE)
- ? FS_TRANS_EXCL : 0), 0, 0,
- value, size,
- MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND);
- }
-
- return EOPNOTSUPP;
-}
-
-error_t
-_hurd_xattr_remove (io_t port, const char *name)
-{
- return _hurd_xattr_set (port, name, NULL, 0, XATTR_REPLACE);
-}
-
-error_t
-_hurd_xattr_list (io_t port, void *buffer, size_t *size)
-{
- size_t total = 0;
- char *bufp = buffer;
- inline void add (const char *name, size_t len)
- {
- total += len;
- if (bufp != NULL && total <= *size)
- bufp = __mempcpy (bufp, name, len);
- }
-#define add(s) add (s, sizeof s)
-
- struct stat64 st;
- error_t err = __io_stat (port, &st);
- if (err)
- return err;
-
- if (st.st_author != st.st_uid)
- add ("gnu.author");
- if (st.st_mode & S_IPTRANS)
- add ("gnu.translator");
-
- if (buffer != NULL && total > *size)
- return ERANGE;
- *size = total;
- return 0;
-}