glibc/hurd/hurdstartup.c

206 lines
6.8 KiB
C
Raw Normal View History

/* Initial program startup for running under the GNU Hurd.
Wed May 1 09:10:04 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> * time/strftime.c: Use canonical autoconf nugget for time.h+sys/time.h include. Mon Apr 29 02:48:26 1996 Ulrich Drepper <drepper@cygnus.com> * ctype/ctype-info.c: (__ctype_width): New variable. (__ctype_names): Initialize correctly without offset. * locale/C-collate.c, locale/C-ctype.c, locale/C-messages.c, locale/C-monetary.c, locale/C-numeric.c, locale/C-time.c: Change copyright. * locale/C-ctype.c (_nl_C_LC_CTYPE_class32): Correct endianess for initialization value. * locale/lc-ctype.c (current): Add parameter for offset. (__ctype32_b, __ctype_width): Add initialization for these variables. * locale/programs/charmap.c: Finish support for WIDTH information. (new_width): New function. * locale/programs/charset.h (width_rule): new data structure. (charset_t): Add elements for width information. * locale/programs/ld-ctype.c (locale_ctype_t): Add element for width information. (allocate_arrays): Add new argument for charset. (ctype_finish): Make sure all characters named in charset width table are known to name table. (ctype_output): Correct handling of class and map name information and write out width information. (find_idx): Prepare for being called with NULL pointer as TABLE argument. This means only allocate name entry. (allocate_arrays): Correct handling of array element -1. Because EOF == -1 the value of element 127 must *not* be mirrored here. Fill width information from charset tables. * locale/programs/localedef.c (main): Correct loop over all categories after change of order from Thu Mar 28 14:22:51 1996. Add new charset argument to call of `write_all_categories'. * locale/programs/locales.h (ctype_finish, ctype_output): New charset argument. * locale/programs/locfile.c (write_all_categories): Call `ctype_output' with additional argument charset. * posix/getconf.c (vars): Add _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO definitions. * posix/posix2_lim.h: Add definition of _POSIX2_CHARCLASS_NAME_MAX and CHARCLASS_NAME_MAX. * posix/unistd.h: Document _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO. * stdlib/grouping.h: Prepare for use in wide string functions. * stdlib/stdlib.h: Correct prototypes for __strto*_internal functions. * stdlib/strtod.c: Extend for use as `wcsto{f,d,ld}'. * stdlib/strtol.c: Extend for use as `wcsto{l,ul,q,uq}'. * string/strcoll.c: Extend for use as `wcscoll'. * string/strxfrm.c: Extend for use as `wcsxfrm'. * sysdeps/generic/confname.h: Add definition of _PC_SYNC_IO, _PC_ASYNC_IO, _PC_PRIO_IO and _SC_CHARCLASS_NAME_MAX. * sysdeps/generic/stpncpy.c: Correct return value. * sysdeps/posix/fpathconf.c: Add handling of _PC_SYNC_IO, _PC_ASYNC_IO, and _PC_PRIO_IO. * sysdeps/posix/sysconf.c: Add handling of _SC_REALTIME_SIGNALS, _SC_PRIORITY_SCHEDULING, _SC_TIMERS, _SC_ASYNCHRONOUS_IO, _SC_PRIORITIZED_IO, _SC_SYNCHRONIZED_IO, _SC_FSYNC, _SC_MAPPED_FILES, _SC_MEMLOCK, _SC_MEMLOCK_RANGE, _SC_MEMORY_PROTECTION, _SC_MESSAGE_PASSING, _SC_SEMAPHORES, _SC_SHARED_MEMORY_OBJECTS, and _SC_CHARCLASS_NAME_MAX. * sysdeps/stub/sysconf.c: Ditto. * sysdeps/unix/sysv/sysv4/sysconf.c: Ditto. * sysdeps/unix/sysv/linux/Dist: Add sys/sysctl.h. * sysdeps/unix/sysv/linux/Makefile [subdir == misc] (sysdep_routines): Add s_sysctl and sysctl. * sysdeps/unix/sysv/linux/sys/mman.h: Add declaration of mremap. * sysdeps/unix/sysv/linux/sys/socket.h: New file. Wrapper around kernel header. * sysdeps/unix/sysv/linux/sys/sysctl.h: New file. Define interface to `sysctl' function. * sysdeps/unix/sysv/linux/syscalls.list: Add mremap and _sysctl. * sysdeps/unix/sysv/linux/sysconf.c: Add handling of _SC_CHARCLASS_NAME_MAX. * sysdeps/unix/sysv/linux/sysctl.c: new file. Implement caller of _sysctl system call. * sysvipc/Makefile (routines): Add ftok. * sysvipc/ftok.c: use variable `proj_id' not `id'. Patch by David Mosberger-Tang. * wcsmbs/Makefile (routines): Add wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. * wcsmbs/wchar.h: Add declarations for wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. Declare internal interfaces for wcsto* functions. [OPTIMIZE]: Define inline functions for wcsto* functions to call internal interface functions. * wcsmbs/wcpcpy.c, wcsmbs/wcpncpy.c: New files. Implement non- standard function equivalent to stpcpy/stpncpy. * wcsmbs/wcscoll.c: Implement `wcscoll' function by using `strcoll' implementation. * wcsmbs/wcscpy.c, wcsmbs/wcsncpy.c: Use wint_t instead of wchar_t. * wcsmbs/wcstod.c: Implement `wcstod' function by using `strtod' implementation. * wcsmbs/wcstof.c: Same for `wcstof'. * wcsmbs/wcstold.c: Same for `strtold'. * wcsmbs/wcstol.c: Implement `wcstol' function by using `strtol' implementation. * wcsmbs/wcstoq.c: Same for `wcstoq'. * wcsmbs/wcstoul.c: Same for `wcstoul'. * wcsmbs/wcstouq.c: Same for `wcstouq'. * wcsmbs/wcswidth.c: Implement `wcswidth' function from X/Open CAE. * wcsmbs/wcwidth.c: Ditto for `wcwidth'. * wcsmbs/wcwidth.h: Common function for definitions of above two functions. * wcsmbs/wcsxfrm.c: Implement `wcsxfrm function by using `strxfrm implementation. * wctype/wctype.c: Remove case for `wctype_t' being 16 bit type. * wctype/wctype.h (wint_t): Protect against multiple definition. (wctype_t): Always define as `unsigned long int'. * wctype.h: New file. Wrapper around wctype/wctype.h. * hurd/hurdstartup.c (_hurd_split_args): Function removed. (_hurd_startup): Use argz functions. * hurd/hurdexec.c: Use argz functions.
1996-05-01 13:55:18 +00:00
Copyright (C) 1991, 92, 93, 94, 95, 96 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 <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 "hurdmalloc.h" /* XXX */
#include "hurdstartup.h"
Wed May 1 09:10:04 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> * time/strftime.c: Use canonical autoconf nugget for time.h+sys/time.h include. Mon Apr 29 02:48:26 1996 Ulrich Drepper <drepper@cygnus.com> * ctype/ctype-info.c: (__ctype_width): New variable. (__ctype_names): Initialize correctly without offset. * locale/C-collate.c, locale/C-ctype.c, locale/C-messages.c, locale/C-monetary.c, locale/C-numeric.c, locale/C-time.c: Change copyright. * locale/C-ctype.c (_nl_C_LC_CTYPE_class32): Correct endianess for initialization value. * locale/lc-ctype.c (current): Add parameter for offset. (__ctype32_b, __ctype_width): Add initialization for these variables. * locale/programs/charmap.c: Finish support for WIDTH information. (new_width): New function. * locale/programs/charset.h (width_rule): new data structure. (charset_t): Add elements for width information. * locale/programs/ld-ctype.c (locale_ctype_t): Add element for width information. (allocate_arrays): Add new argument for charset. (ctype_finish): Make sure all characters named in charset width table are known to name table. (ctype_output): Correct handling of class and map name information and write out width information. (find_idx): Prepare for being called with NULL pointer as TABLE argument. This means only allocate name entry. (allocate_arrays): Correct handling of array element -1. Because EOF == -1 the value of element 127 must *not* be mirrored here. Fill width information from charset tables. * locale/programs/localedef.c (main): Correct loop over all categories after change of order from Thu Mar 28 14:22:51 1996. Add new charset argument to call of `write_all_categories'. * locale/programs/locales.h (ctype_finish, ctype_output): New charset argument. * locale/programs/locfile.c (write_all_categories): Call `ctype_output' with additional argument charset. * posix/getconf.c (vars): Add _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO definitions. * posix/posix2_lim.h: Add definition of _POSIX2_CHARCLASS_NAME_MAX and CHARCLASS_NAME_MAX. * posix/unistd.h: Document _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO. * stdlib/grouping.h: Prepare for use in wide string functions. * stdlib/stdlib.h: Correct prototypes for __strto*_internal functions. * stdlib/strtod.c: Extend for use as `wcsto{f,d,ld}'. * stdlib/strtol.c: Extend for use as `wcsto{l,ul,q,uq}'. * string/strcoll.c: Extend for use as `wcscoll'. * string/strxfrm.c: Extend for use as `wcsxfrm'. * sysdeps/generic/confname.h: Add definition of _PC_SYNC_IO, _PC_ASYNC_IO, _PC_PRIO_IO and _SC_CHARCLASS_NAME_MAX. * sysdeps/generic/stpncpy.c: Correct return value. * sysdeps/posix/fpathconf.c: Add handling of _PC_SYNC_IO, _PC_ASYNC_IO, and _PC_PRIO_IO. * sysdeps/posix/sysconf.c: Add handling of _SC_REALTIME_SIGNALS, _SC_PRIORITY_SCHEDULING, _SC_TIMERS, _SC_ASYNCHRONOUS_IO, _SC_PRIORITIZED_IO, _SC_SYNCHRONIZED_IO, _SC_FSYNC, _SC_MAPPED_FILES, _SC_MEMLOCK, _SC_MEMLOCK_RANGE, _SC_MEMORY_PROTECTION, _SC_MESSAGE_PASSING, _SC_SEMAPHORES, _SC_SHARED_MEMORY_OBJECTS, and _SC_CHARCLASS_NAME_MAX. * sysdeps/stub/sysconf.c: Ditto. * sysdeps/unix/sysv/sysv4/sysconf.c: Ditto. * sysdeps/unix/sysv/linux/Dist: Add sys/sysctl.h. * sysdeps/unix/sysv/linux/Makefile [subdir == misc] (sysdep_routines): Add s_sysctl and sysctl. * sysdeps/unix/sysv/linux/sys/mman.h: Add declaration of mremap. * sysdeps/unix/sysv/linux/sys/socket.h: New file. Wrapper around kernel header. * sysdeps/unix/sysv/linux/sys/sysctl.h: New file. Define interface to `sysctl' function. * sysdeps/unix/sysv/linux/syscalls.list: Add mremap and _sysctl. * sysdeps/unix/sysv/linux/sysconf.c: Add handling of _SC_CHARCLASS_NAME_MAX. * sysdeps/unix/sysv/linux/sysctl.c: new file. Implement caller of _sysctl system call. * sysvipc/Makefile (routines): Add ftok. * sysvipc/ftok.c: use variable `proj_id' not `id'. Patch by David Mosberger-Tang. * wcsmbs/Makefile (routines): Add wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. * wcsmbs/wchar.h: Add declarations for wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. Declare internal interfaces for wcsto* functions. [OPTIMIZE]: Define inline functions for wcsto* functions to call internal interface functions. * wcsmbs/wcpcpy.c, wcsmbs/wcpncpy.c: New files. Implement non- standard function equivalent to stpcpy/stpncpy. * wcsmbs/wcscoll.c: Implement `wcscoll' function by using `strcoll' implementation. * wcsmbs/wcscpy.c, wcsmbs/wcsncpy.c: Use wint_t instead of wchar_t. * wcsmbs/wcstod.c: Implement `wcstod' function by using `strtod' implementation. * wcsmbs/wcstof.c: Same for `wcstof'. * wcsmbs/wcstold.c: Same for `strtold'. * wcsmbs/wcstol.c: Implement `wcstol' function by using `strtol' implementation. * wcsmbs/wcstoq.c: Same for `wcstoq'. * wcsmbs/wcstoul.c: Same for `wcstoul'. * wcsmbs/wcstouq.c: Same for `wcstouq'. * wcsmbs/wcswidth.c: Implement `wcswidth' function from X/Open CAE. * wcsmbs/wcwidth.c: Ditto for `wcwidth'. * wcsmbs/wcwidth.h: Common function for definitions of above two functions. * wcsmbs/wcsxfrm.c: Implement `wcsxfrm function by using `strxfrm implementation. * wctype/wctype.c: Remove case for `wctype_t' being 16 bit type. * wctype/wctype.h (wint_t): Protect against multiple definition. (wctype_t): Always define as `unsigned long int'. * wctype.h: New file. Wrapper around wctype/wctype.h. * hurd/hurdstartup.c (_hurd_split_args): Function removed. (_hurd_startup): Use argz functions. * hurd/hurdexec.c: Use argz functions.
1996-05-01 13:55:18 +00:00
#include <argz.h>
mach_port_t *_hurd_init_dtable;
mach_msg_type_number_t _hurd_init_dtablesize;
unsigned int __hurd_threadvar_max;
unsigned long int __hurd_threadvar_stack_mask;
unsigned long int __hurd_threadvar_stack_offset;
/* 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;
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) (int *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;
int *argcptr;
update from main archive 961214 Sun Dec 15 01:53:20 1996 Ulrich Drepper <drepper@cygnus.com> * Makefile (subdirs): Change crypt to md5-crypt. * crypt/Makefile, crypt/md5-crypt.c, crypt/md5.c, crypt/md5.h, crypt/md5c-test.c, crypt/md5test.c: Move to new directory md5-crypt. * sysdeps/unix/sysv/linux/configure.in: Refer to linuxthreads and crypt instead of LinuxThreads and des-crypt. * Makefile (subdirs): Add nss back. * sysdeps/unix/inet/Subdirs: Move nis to end of file to fulfill dependencies. * libio/iofclose.c: Implement fclose(NULL) as closing all streams. * stdio-common/Makefile (routines): Add fcloseall. * stdio-common/fcloseall.c: New file. * sysdeps/generic/abort.c: Make implementation POSIX.1 compatible. * sysdeps/mach/libc-lock.h: Add definition of __libc_lock_trylock. * sysdeps/stub/libc-lock.h: Define __libc_lock_trylock to always return 0. * stdio-common/printf.h: Define MIN and MAX only if not already defined. * stdio-common/vfprintf.c: Set errno to EBADF if stream does not allow writing. Required by POSIX.1. * libio/libioP.h (CHECK_FILE): Use MAYBE_SET_EINVAL instead of assignment. * interp.c: Update copyright. * libio/clearerr.c: Likewise. * libio/ioseekoff.c: Likewise. * libio/ioseekpos.c: Likewise. * stdio/fclose.c: Likewise. * stdio/fflus.c: Likewise. * libio/libio.h [!_IO_MTSAFE_IO]: Define _IO_cleanup_region_start and _IO_cleanup_region_end as empty. * libio/fgetc.c: Use _IO_cleanup_region_start and _IO_cleanup_region_end instead of __libc_cleanup_region_start and __libc_cleanup_region_end. * libio/fputc.c: Likewise. * libio/freopen.c: Likewise. * libio/fseek.c: Likewise. * libio/getc.c: Likewise. * libio/getchar.c: Likewise. * libio/iofclose.c: Likewise. * libio/iofflush.c: Likewise. * libio/iofgetpos.c: Likewise. * libio/iofgets.c: Likewise. * libio/iofputs.c: Likewise. * libio/iofread.c: Likewise. * libio/iofsetpos.c: Likewise. * libio/ioftell.c: Likewise. * libio/iofwrite.c: Likewise. * libio/iogetdelim.c: Likewise. * libio/iogets.c: Likewise. * libio/ioputs.c: Likewise. * libio/iosetbuffer.c: Likewise. * libio/iosetvbuf.c: Likewise. * libio/ioungetc.c: Likewise. * libio/iovspintf.c: Use cleanup handler to make sure no dangling locks can stay over. * libio/iovsscanf.c: Likewise. * libio/genops.c: Use _IO_lock_init_recursive and _IO_lock_fini instead of __libc_lock_init_recursive and __libc_lock_fini. * libio/filedoalloc.c: Only use __isatty when compiling GNU libc. Otherwise use isatty. * libio/fileops.c: Likewise for __open and open. * login/utmp_file.c (getutent_r_file): Use fcntl instead of flock. * nis/ypclnt.h: Add more casts to prevent warnings. * nss/Makefile (services): Remove dns. (libnss_dns, libnss_dns-inhibit-o): Remove definition. ($(objpfx)libnss_dns.so): Removed. * nss/nss_dns/dns-host.c, nss/nss_dns/dns-network.c: Moved to... * resolv/nss_dns: ...here. * resolv/Makefile (extra-libs): Add libnss_dns. (libnss_dns-routines, libnss_dns-inhibit-o): Define as in nss/Makefile. * nss/XXX-lookup.c: Call __nss_database_lookup with new argument specifying alternate name for entry in /etc/nsswitch.conf * nss/nsswitch.c: If no entry with primary name is found in /etc/nsswitch.conf try alternate name if given. * nss/nsswitch.h: Add new parameter in prototype for __nss_database_lookup. * nss/spwd-lookup.c: Provide alternative entry name to look for. This makes our NSS compatible with Solaris' nsswitch.conf files. * string/tst-strlen.c: Change all counting variables to type size_t to prevent warnings. * sysdeps/posix/fpathconf.c: Update copyright. * sysdeps/posix/pathconf.c: Don't call fpathconf to do the work. Opening the file at this path may fail if it is a FIFO or pipe. These changes make the time implementation POSIX.1 compliant. * time/localtime.c (__localtime_r): Always call __tzset not only if __tzset_run is zero. * time/strftime.c: Add definition of memset_space to help to reduce for systems which have memset. (strftime): Don't use tm_zone member of argument for zone name. Instead always use tzname[]. Call tzset() as required by POSIX.1 before any action. * time/tzset.c (tzset): Set tzname[] as required by POSIX.1. Remove global variable __tzset_run. __tzset is now called always when a dependent function is used. (__tzset): Caching happens based on the contents of the environment variable TZ. Fri Dec 13 01:06:52 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/unix/sysv/linux/paths.h: Add _PATH_KLOG. Thu Dec 12 09:16:35 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * rellns-sh: Correctly handle a relative source file name. Wed Dec 11 19:18:40 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * login/utmp_file.c (setutent_file): Seek back to beginning of the file if resetting. Thu Dec 12 16:39:12 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> * hurd/hurdinit.c (map0): Delete function. Don't do this on _hurd_preinit_hook. * hurd/hurdstartup.c (_hurd_startup): Map page zero redzone here.
1996-12-15 02:15:29 +00:00
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 = (int *) 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. */
Wed May 1 09:10:04 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> * time/strftime.c: Use canonical autoconf nugget for time.h+sys/time.h include. Mon Apr 29 02:48:26 1996 Ulrich Drepper <drepper@cygnus.com> * ctype/ctype-info.c: (__ctype_width): New variable. (__ctype_names): Initialize correctly without offset. * locale/C-collate.c, locale/C-ctype.c, locale/C-messages.c, locale/C-monetary.c, locale/C-numeric.c, locale/C-time.c: Change copyright. * locale/C-ctype.c (_nl_C_LC_CTYPE_class32): Correct endianess for initialization value. * locale/lc-ctype.c (current): Add parameter for offset. (__ctype32_b, __ctype_width): Add initialization for these variables. * locale/programs/charmap.c: Finish support for WIDTH information. (new_width): New function. * locale/programs/charset.h (width_rule): new data structure. (charset_t): Add elements for width information. * locale/programs/ld-ctype.c (locale_ctype_t): Add element for width information. (allocate_arrays): Add new argument for charset. (ctype_finish): Make sure all characters named in charset width table are known to name table. (ctype_output): Correct handling of class and map name information and write out width information. (find_idx): Prepare for being called with NULL pointer as TABLE argument. This means only allocate name entry. (allocate_arrays): Correct handling of array element -1. Because EOF == -1 the value of element 127 must *not* be mirrored here. Fill width information from charset tables. * locale/programs/localedef.c (main): Correct loop over all categories after change of order from Thu Mar 28 14:22:51 1996. Add new charset argument to call of `write_all_categories'. * locale/programs/locales.h (ctype_finish, ctype_output): New charset argument. * locale/programs/locfile.c (write_all_categories): Call `ctype_output' with additional argument charset. * posix/getconf.c (vars): Add _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO definitions. * posix/posix2_lim.h: Add definition of _POSIX2_CHARCLASS_NAME_MAX and CHARCLASS_NAME_MAX. * posix/unistd.h: Document _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO. * stdlib/grouping.h: Prepare for use in wide string functions. * stdlib/stdlib.h: Correct prototypes for __strto*_internal functions. * stdlib/strtod.c: Extend for use as `wcsto{f,d,ld}'. * stdlib/strtol.c: Extend for use as `wcsto{l,ul,q,uq}'. * string/strcoll.c: Extend for use as `wcscoll'. * string/strxfrm.c: Extend for use as `wcsxfrm'. * sysdeps/generic/confname.h: Add definition of _PC_SYNC_IO, _PC_ASYNC_IO, _PC_PRIO_IO and _SC_CHARCLASS_NAME_MAX. * sysdeps/generic/stpncpy.c: Correct return value. * sysdeps/posix/fpathconf.c: Add handling of _PC_SYNC_IO, _PC_ASYNC_IO, and _PC_PRIO_IO. * sysdeps/posix/sysconf.c: Add handling of _SC_REALTIME_SIGNALS, _SC_PRIORITY_SCHEDULING, _SC_TIMERS, _SC_ASYNCHRONOUS_IO, _SC_PRIORITIZED_IO, _SC_SYNCHRONIZED_IO, _SC_FSYNC, _SC_MAPPED_FILES, _SC_MEMLOCK, _SC_MEMLOCK_RANGE, _SC_MEMORY_PROTECTION, _SC_MESSAGE_PASSING, _SC_SEMAPHORES, _SC_SHARED_MEMORY_OBJECTS, and _SC_CHARCLASS_NAME_MAX. * sysdeps/stub/sysconf.c: Ditto. * sysdeps/unix/sysv/sysv4/sysconf.c: Ditto. * sysdeps/unix/sysv/linux/Dist: Add sys/sysctl.h. * sysdeps/unix/sysv/linux/Makefile [subdir == misc] (sysdep_routines): Add s_sysctl and sysctl. * sysdeps/unix/sysv/linux/sys/mman.h: Add declaration of mremap. * sysdeps/unix/sysv/linux/sys/socket.h: New file. Wrapper around kernel header. * sysdeps/unix/sysv/linux/sys/sysctl.h: New file. Define interface to `sysctl' function. * sysdeps/unix/sysv/linux/syscalls.list: Add mremap and _sysctl. * sysdeps/unix/sysv/linux/sysconf.c: Add handling of _SC_CHARCLASS_NAME_MAX. * sysdeps/unix/sysv/linux/sysctl.c: new file. Implement caller of _sysctl system call. * sysvipc/Makefile (routines): Add ftok. * sysvipc/ftok.c: use variable `proj_id' not `id'. Patch by David Mosberger-Tang. * wcsmbs/Makefile (routines): Add wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. * wcsmbs/wchar.h: Add declarations for wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. Declare internal interfaces for wcsto* functions. [OPTIMIZE]: Define inline functions for wcsto* functions to call internal interface functions. * wcsmbs/wcpcpy.c, wcsmbs/wcpncpy.c: New files. Implement non- standard function equivalent to stpcpy/stpncpy. * wcsmbs/wcscoll.c: Implement `wcscoll' function by using `strcoll' implementation. * wcsmbs/wcscpy.c, wcsmbs/wcsncpy.c: Use wint_t instead of wchar_t. * wcsmbs/wcstod.c: Implement `wcstod' function by using `strtod' implementation. * wcsmbs/wcstof.c: Same for `wcstof'. * wcsmbs/wcstold.c: Same for `strtold'. * wcsmbs/wcstol.c: Implement `wcstol' function by using `strtol' implementation. * wcsmbs/wcstoq.c: Same for `wcstoq'. * wcsmbs/wcstoul.c: Same for `wcstoul'. * wcsmbs/wcstouq.c: Same for `wcstouq'. * wcsmbs/wcswidth.c: Implement `wcswidth' function from X/Open CAE. * wcsmbs/wcwidth.c: Ditto for `wcwidth'. * wcsmbs/wcwidth.h: Common function for definitions of above two functions. * wcsmbs/wcsxfrm.c: Implement `wcsxfrm function by using `strxfrm implementation. * wctype/wctype.c: Remove case for `wctype_t' being 16 bit type. * wctype/wctype.h (wint_t): Protect against multiple definition. (wctype_t): Always define as `unsigned long int'. * wctype.h: New file. Wrapper around wctype/wctype.h. * hurd/hurdstartup.c (_hurd_split_args): Function removed. (_hurd_startup): Use argz functions. * hurd/hurdexec.c: Use argz functions.
1996-05-01 13:55:18 +00:00
argc = __argz_count (args, argslen);
/* Count up the environment variables so we can allocate ENVP. */
Wed May 1 09:10:04 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> * time/strftime.c: Use canonical autoconf nugget for time.h+sys/time.h include. Mon Apr 29 02:48:26 1996 Ulrich Drepper <drepper@cygnus.com> * ctype/ctype-info.c: (__ctype_width): New variable. (__ctype_names): Initialize correctly without offset. * locale/C-collate.c, locale/C-ctype.c, locale/C-messages.c, locale/C-monetary.c, locale/C-numeric.c, locale/C-time.c: Change copyright. * locale/C-ctype.c (_nl_C_LC_CTYPE_class32): Correct endianess for initialization value. * locale/lc-ctype.c (current): Add parameter for offset. (__ctype32_b, __ctype_width): Add initialization for these variables. * locale/programs/charmap.c: Finish support for WIDTH information. (new_width): New function. * locale/programs/charset.h (width_rule): new data structure. (charset_t): Add elements for width information. * locale/programs/ld-ctype.c (locale_ctype_t): Add element for width information. (allocate_arrays): Add new argument for charset. (ctype_finish): Make sure all characters named in charset width table are known to name table. (ctype_output): Correct handling of class and map name information and write out width information. (find_idx): Prepare for being called with NULL pointer as TABLE argument. This means only allocate name entry. (allocate_arrays): Correct handling of array element -1. Because EOF == -1 the value of element 127 must *not* be mirrored here. Fill width information from charset tables. * locale/programs/localedef.c (main): Correct loop over all categories after change of order from Thu Mar 28 14:22:51 1996. Add new charset argument to call of `write_all_categories'. * locale/programs/locales.h (ctype_finish, ctype_output): New charset argument. * locale/programs/locfile.c (write_all_categories): Call `ctype_output' with additional argument charset. * posix/getconf.c (vars): Add _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO definitions. * posix/posix2_lim.h: Add definition of _POSIX2_CHARCLASS_NAME_MAX and CHARCLASS_NAME_MAX. * posix/unistd.h: Document _POSIX_SYNC_IO, _POSIX_ASYNC_IO, and _POSIX_PRIO_IO. * stdlib/grouping.h: Prepare for use in wide string functions. * stdlib/stdlib.h: Correct prototypes for __strto*_internal functions. * stdlib/strtod.c: Extend for use as `wcsto{f,d,ld}'. * stdlib/strtol.c: Extend for use as `wcsto{l,ul,q,uq}'. * string/strcoll.c: Extend for use as `wcscoll'. * string/strxfrm.c: Extend for use as `wcsxfrm'. * sysdeps/generic/confname.h: Add definition of _PC_SYNC_IO, _PC_ASYNC_IO, _PC_PRIO_IO and _SC_CHARCLASS_NAME_MAX. * sysdeps/generic/stpncpy.c: Correct return value. * sysdeps/posix/fpathconf.c: Add handling of _PC_SYNC_IO, _PC_ASYNC_IO, and _PC_PRIO_IO. * sysdeps/posix/sysconf.c: Add handling of _SC_REALTIME_SIGNALS, _SC_PRIORITY_SCHEDULING, _SC_TIMERS, _SC_ASYNCHRONOUS_IO, _SC_PRIORITIZED_IO, _SC_SYNCHRONIZED_IO, _SC_FSYNC, _SC_MAPPED_FILES, _SC_MEMLOCK, _SC_MEMLOCK_RANGE, _SC_MEMORY_PROTECTION, _SC_MESSAGE_PASSING, _SC_SEMAPHORES, _SC_SHARED_MEMORY_OBJECTS, and _SC_CHARCLASS_NAME_MAX. * sysdeps/stub/sysconf.c: Ditto. * sysdeps/unix/sysv/sysv4/sysconf.c: Ditto. * sysdeps/unix/sysv/linux/Dist: Add sys/sysctl.h. * sysdeps/unix/sysv/linux/Makefile [subdir == misc] (sysdep_routines): Add s_sysctl and sysctl. * sysdeps/unix/sysv/linux/sys/mman.h: Add declaration of mremap. * sysdeps/unix/sysv/linux/sys/socket.h: New file. Wrapper around kernel header. * sysdeps/unix/sysv/linux/sys/sysctl.h: New file. Define interface to `sysctl' function. * sysdeps/unix/sysv/linux/syscalls.list: Add mremap and _sysctl. * sysdeps/unix/sysv/linux/sysconf.c: Add handling of _SC_CHARCLASS_NAME_MAX. * sysdeps/unix/sysv/linux/sysctl.c: new file. Implement caller of _sysctl system call. * sysvipc/Makefile (routines): Add ftok. * sysvipc/ftok.c: use variable `proj_id' not `id'. Patch by David Mosberger-Tang. * wcsmbs/Makefile (routines): Add wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. * wcsmbs/wchar.h: Add declarations for wcpcpy, wcpncpy, wcstol, wcstoul, wcstoq, wcstouq, wcstod, wcstold, wcstof, wcscoll, wcsxfrm, wcwidth, and wcswidth. Declare internal interfaces for wcsto* functions. [OPTIMIZE]: Define inline functions for wcsto* functions to call internal interface functions. * wcsmbs/wcpcpy.c, wcsmbs/wcpncpy.c: New files. Implement non- standard function equivalent to stpcpy/stpncpy. * wcsmbs/wcscoll.c: Implement `wcscoll' function by using `strcoll' implementation. * wcsmbs/wcscpy.c, wcsmbs/wcsncpy.c: Use wint_t instead of wchar_t. * wcsmbs/wcstod.c: Implement `wcstod' function by using `strtod' implementation. * wcsmbs/wcstof.c: Same for `wcstof'. * wcsmbs/wcstold.c: Same for `strtold'. * wcsmbs/wcstol.c: Implement `wcstol' function by using `strtol' implementation. * wcsmbs/wcstoq.c: Same for `wcstoq'. * wcsmbs/wcstoul.c: Same for `wcstoul'. * wcsmbs/wcstouq.c: Same for `wcstouq'. * wcsmbs/wcswidth.c: Implement `wcswidth' function from X/Open CAE. * wcsmbs/wcwidth.c: Ditto for `wcwidth'. * wcsmbs/wcwidth.h: Common function for definitions of above two functions. * wcsmbs/wcsxfrm.c: Implement `wcsxfrm function by using `strxfrm implementation. * wctype/wctype.c: Remove case for `wctype_t' being 16 bit type. * wctype/wctype.h (wint_t): Protect against multiple definition. (wctype_t): Always define as `unsigned long int'. * wctype.h: New file. Wrapper around wctype/wctype.h. * hurd/hurdstartup.c (_hurd_split_args): Function removed. (_hurd_startup): Use argz functions. * hurd/hurdexec.c: Use argz functions.
1996-05-01 13:55:18 +00:00
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 (int) +
(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
{
int 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 ();
}