+1998-07-14 19:39 Ulrich Drepper <drepper@cygnus.com>
+
+ * 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 <kettenis@phys.uva.nl>
+
+ * sysdeps/mach/hurd/dl-sysdep.c: Bring in sync with generic
+ implementation. Include <entry.h>. 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 <kettenis@phys.uva.nl>
* mach/Makefile: Create target directory before generating
+1998-07-14 19:38 Ulrich Drepper <drepper@cygnus.com>
+
+ * sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_end.
+
1998-07-11 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* Examples/ex6.c: Include <unistd.h> for usleep.
} \
}
+/* 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)
# 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) \
#include <ctype.h>
#include <sys/stat.h>
-#include "dl-machine.h"
+#include <entry.h>
+#include <dl-machine.h>
+#include <dl-procinfo.h>
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;
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 */
{
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
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, ...)
{