diff --git a/ChangeLog b/ChangeLog index 8cf6fa2e6b..561f3ed5fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +1998-07-14 19:39 Ulrich Drepper + + * stdio-common/vfscanf.c (ungetc): Use _IO_sputbackc, not _IO_ungetc. + [_USE_IN_LIBIO] (encode_error): Free cancelation handler. + (conv_error): Likewise. + (input_error): Likewise. + (memory_error): Likewise. + +1998-07-12 Mark Kettenis + + * sysdeps/mach/hurd/dl-sysdep.c: Bring in sync with generic + implementation. Include . Replace references to symbol + _start with macro ENTRY_POINT. + (__libc_uid): Remove. + (__libc_multiple_libcs): New variable. + (__libc_stack_end): New variable. + (_dl_hwcap_mask): New variable. + (_dl_important_hwcaps): New function. + (_dl_show_auxv): Mark internal. + 1998-07-14 Mark Kettenis * mach/Makefile: Create target directory before generating diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index fb309c7ab9..ef0634d459 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,7 @@ +1998-07-14 19:38 Ulrich Drepper + + * sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_end. + 1998-07-11 Andreas Jaeger * Examples/ex6.c: Include for usleep. diff --git a/linuxthreads/sysdeps/pthread/bits/libc-lock.h b/linuxthreads/sysdeps/pthread/bits/libc-lock.h index 7d336bed52..db9a4718d3 100644 --- a/linuxthreads/sysdeps/pthread/bits/libc-lock.h +++ b/linuxthreads/sysdeps/pthread/bits/libc-lock.h @@ -131,6 +131,12 @@ typedef pthread_key_t __libc_key_t; } \ } +/* Sometimes we have to exit the block in the middle. */ +#define __libc_cleanup_end(DOIT) \ + if (_avail) { \ + _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ + } + /* Create thread-specific key. */ #define __libc_key_create(KEY, DESTRUCTOR) \ (__pthread_key_create != NULL ? __pthread_key_create (KEY, DESTRUCTOR) : 1) diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index c1ff2690b7..bd167b9a5b 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -55,30 +55,35 @@ # undef va_list # define va_list _IO_va_list -# define ungetc(c, s) ((void) ((int) c != EOF && --read_in), \ - _IO_ungetc (c, s)) +# define ungetc(c, s) ((void) ((int) c == EOF \ + || (--read_in, \ + _IO_sputbackc (s, (unsigned char) c)))) # define inchar() (c == EOF ? EOF \ : ((c = _IO_getc_unlocked (s)), \ (void) (c != EOF && ++read_in), c)) # define encode_error() do { \ if (errp != NULL) *errp |= 4; \ _IO_funlockfile (s); \ + __libc_cleanup_end (0); \ __set_errno (EILSEQ); \ return done; \ } while (0) # define conv_error() do { \ if (errp != NULL) *errp |= 2; \ _IO_funlockfile (s); \ + __libc_cleanup_end (0); \ return done; \ } while (0) # define input_error() do { \ _IO_funlockfile (s); \ if (errp != NULL) *errp |= 1; \ + __libc_cleanup_end (0); \ return done ?: EOF; \ } while (0) # define memory_error() do { \ _IO_funlockfile (s); \ __set_errno (ENOMEM); \ + __libc_cleanup_end (0); \ return EOF; \ } while (0) # define ARGCHECK(s, format) \ diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c index c380256a33..71ccdfb500 100644 --- a/sysdeps/mach/hurd/dl-sysdep.c +++ b/sysdeps/mach/hurd/dl-sysdep.c @@ -37,16 +37,24 @@ #include #include -#include "dl-machine.h" +#include +#include +#include extern void __mach_init (void); extern int _dl_argc; extern char **_dl_argv; extern char **_environ; +extern void ENTRY_POINT (void); -uid_t __libc_uid; int __libc_enable_secure; +int __libc_multiple_libcs; /* Defining this here avoids the inclusion + of init-first. */ +/* This variable containts the lowest stack address ever used. */ +void *__libc_stack_end; +unsigned long int _dl_hwcap_mask = HWCAP_IMPORTANT; + struct hurd_startup_data *_dl_hurd_data; @@ -86,8 +94,6 @@ _dl_sysdep_start (void **start_argptr, void (*dl_main) (const Elf32_Phdr *phdr, Elf32_Word phent, Elf32_Addr *user_entry)) { - extern void _start (); - void go (int *argdata) { extern unsigned int _dl_skip_args; /* rtld.c */ @@ -103,21 +109,20 @@ _dl_sysdep_start (void **start_argptr, { static struct hurd_startup_data nodata; _dl_hurd_data = &nodata; - nodata.user_entry = (vm_address_t) &_start; + nodata.user_entry = (vm_address_t) &ENTRY_POINT; } else _dl_hurd_data = (void *) p; - __libc_uid = __getuid (); __libc_enable_secure = _dl_hurd_data->flags & EXEC_SECURE; if (_dl_hurd_data->flags & EXEC_STACK_ARGS && _dl_hurd_data->user_entry == 0) - _dl_hurd_data->user_entry = (vm_address_t) &_start; + _dl_hurd_data->user_entry = (vm_address_t) &ENTRY_POINT; unfmh(); /* XXX */ - if (_dl_hurd_data->user_entry == (vm_address_t) &_start) + if (_dl_hurd_data->user_entry == (vm_address_t) &ENTRY_POINT) /* We were invoked as a command, not as the program interpreter. The generic ld.so code supports this: it will parse the args as "ld.so PROGRAM [ARGS...]". For booting the Hurd, we @@ -576,11 +581,33 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, void +internal_function _dl_show_auxv (void) { /* There is nothing to print. Hurd has no auxiliary vector. */ } + +/* Return an array of useful/necessary hardware capability names. */ +const struct r_strlenpair * +internal_function +_dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, + size_t *max_capstrlen) +{ + struct r_strlenpair *result; + + /* Return an empty array. Hurd has no hardware capabilities. */ + result = (struct r_strlenpair *) malloc (sizeof (*result)); + if (result == NULL) + _dl_signal_error (ENOMEM, NULL, "cannot create capability list"); + + result[0].str = (char *) result; /* Does not really matter. */ + result[0].len = 0; + + *sz = 1; + return result; +} + void weak_function _dl_sysdep_fatal (const char *msg, ...) {