glibc/hurd/hurdinit.c
Roland McGrath 8f0c527e13 Sat May 4 05:44:25 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* hurd/hurd-raise.c (_hurd_raise_signal): Pass sigcode in msg_sig_post
	rpc.

	* hurd/hurdmsg.c (_S_msg_set_environment): Use argz.h functions
	instead of _hurd_split_args.
	(_S_msg_*_exec_flags): Functions removed.
	(_S_msg_startup_dosync): Stub removed.

Sat May  4 02:11:55 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* sysdeps/mach/hurd/ptrace.c: Set _hurdsig_traced instead of
	EXEC_TRACED bit in _hurd_exec_flags.
	Pass sigcode arg in msg_sig_post_untraced rpc.

	* sysdeps/mach/hurd/access.c: Don't pass io port in
	auth_user_authenticate rpc.

	* posix/sched.h: Fix typos.

	* sysdeps/mach/hurd/fork.c: Use new critical section lock.
	Clear _hurdsig_traced instead of EXEC_TRACED.

	* sysdeps/stub/nanosleep.c (nanosleep): Fix typo.

	* wcsmbs/wcstol.c: Find strtol.c in ../stdlib.
	* wcsmbs/wcstof.c: Find strtod.c in ../stdlib.
	* wcsmbs/wcstod.c: Likewise.
	* wcsmbs/wcstold.c: Likewise.

	* wcsmbs/wcwidth.h: Find cname-lookup.h in ../wctype.

	* string/envz.c (envz_entry): Use const.
	(envz_get, envz_remove): Likewise.
	(envz_entry): Return char *, not const char *.

	* string/envz.h: Fix decl.

	* string/argz-create.c: Use const in prototype.
	* string/argz-next.c: Likewise.

	* sysdeps/mach/hurd/sigprocmask.c: Pass sigcode arg to msg_sig_post.
	* sysdeps/mach/hurd/i386/sigreturn.c: Likewise.
	* sysdeps/mach/hurd/sigsuspend.c: Likewise.
	* sysdeps/mach/hurd/kill.c: Likewise.

	* hurd/hurdexec.c (_hurd_exec): Use new critical section lock.
	* hurd/catch-exc.c (_S_catch_exception_raise): Likewise.
	* hurd/sigunwind.c (_hurdsig_longjmp_from_handler): Likewise.
	* hurd/thread-cancel.c (hurd_thread_cancel, hurd_check_cancel):
	Likewise.
	* sysdeps/mach/hurd/jmp-unwind.c (_longjmp_unwind): Likewise.
	* sysdeps/mach/hurd/sigaction.c: Likewise.

	* sysdeps/mach/hurd/errnos.awk: Don't use ARGV in comment; it can
	change meaninglessly.

	* hurd/hurd/signal.h (struct hurd_sigstate): Replace critical section
 	flag with a spin lock.
	(_hurd_critical_section_lock): Use spin_try_lock on that to see if we
 	get it.  No need to take SS->lock at all.
	(_hurd_critical_section_unlock): Unlock SS->critical_section_lock
	instead of clearing the old flag member.
	* hurd/hurdsig.c (_hurd_internal_post_signal): Use spin_lock_locked to
	test the critical section state.

	* hurd/hurdinit.c (_hurd_init): Set _hurdsig_traced from the intarray.

	* hurd/hurdkill.c (_hurd_sig_post): Pass 0 sigcode in msg_sig_post.

	* hurd/hurdsig.c (_hurd_internal_post_signal): Test _hurdsig_traced
 	instead of testing (_hurd_exec_flags & EXEC_TRACED).
	(_S_msg_sig_post): Take sigcode arg and pass it through.
	(_S_msg_sig_post_untraced): Likewise.
	(reauth_proc): Don't pass proc port in auth_user_authenticate.

	* hurd/setauth.c (_hurd_setauth): Don't pass object ports in
	auth_user_authenticate RPCs, just the one-off rendezvous port.
	* hurd/dtable.c (reauth_dtable): Likewise.
	* hurd/hurdlookup.c (__hurd_file_name_lookup_retry): Likewise.

	* hurd/hurdexec.c (_hurd_exec): Pass 0 flags to file_exec.
	Pass sigcode arg to msg_sig_post.

	* string/argz.h (argz_create): Use const in prototype.

	* hurd/hurdinit.c (_hurd_proc_init): Test _hurdsig_traced instead of
	testing (_hurd_exec_flags & EXEC_TRACED).
	Pass sigcode arg to msg_sig_post.

	* hurd/hurd.h: Declare _hurdsig_traced.

	* string/argz.h (__argz_next): Cast ENTRY before returning it.

	* hurd/hurd/signal.h (_hurd_critical_section_unlock): Pass sigcode arg
	to msg_sig_post.

	* hurd/path-lookup.c: New file.
	* hurd/Makefile (routines): Add path-lookup.
	* hurd/hurd/lookup.h: Declare file_name_path_scan,
	hurd_file_name_path_lookup.
	* hurd/hurd.h: Declare file_name_path_lookup.

	* sysdeps/mach/hurd/select.c: The io_select rpc no longer has a TAG_ID
	argument.  Instead, use a separate reply port for each RPC and put them
	all in a port set to wait for slow replies.
1996-05-04 09:46:57 +00:00

228 lines
7.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright (C) 1992, 1993, 1994, 1995, 1996 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#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;
error_t
_hurd_ports_use (int which, error_t (*operate) (mach_port_t))
{
return HURD_PORT_USE (&_hurd_ports[which], (*operate) (port));
}
void _hurd_proc_init (char **argv);
DEFINE_HOOK (_hurd_subinit, (void));
/* 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]);
/* Tell the proc server we exist, if it does. */
if (portarray[INIT_PORT_PROC] != MACH_PORT_NULL)
_hurd_proc_init (argv);
if (intarraysize > INIT_UMASK)
_hurd_umask = intarray[INIT_UMASK] & 0777;
else
_hurd_umask = CMASK;
if (intarraysize > INIT_TRACEMASK)
_hurdsig_traced = intarray[INIT_TRACEMASK];
/* 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_proc_init (char **argv)
{
mach_port_t oldmsg;
struct hurd_userlink ulink;
process_t procserver;
/* Initialize the signal code; Mach exceptions will become signals. */
_hurdsig_init ();
/* 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, ());
if (_hurdsig_traced)
/* 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 ());
}
/* 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,
/* We don't know the ARGV location. */
(vm_address_t) 0,
_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;
}
#ifndef PIC
/* Map the page at address zero with no access allowed, so
dereferencing NULL will fault and no "anywhere" allocations
(e.g. the out of line memory containing the argument strings)
can be assigned address zero, which C says is not a valid pointer.
When dynamically linked, this will be done by the dynamic linker
before we run. */
static void map0 (void) __attribute__ ((unused));
text_set_element (_hurd_preinit_hook, map0);
static void
map0 (void)
{
vm_address_t 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);
}
#endif