diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/ftime.c | 13 | ||||
-rw-r--r-- | sysdeps/generic/setfpucw.c | 5 | ||||
-rw-r--r-- | sysdeps/i386/fpu_control.h | 4 | ||||
-rw-r--r-- | sysdeps/m68k/dl-machine.h | 2 | ||||
-rw-r--r-- | sysdeps/posix/gettimeofday.c | 21 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/init-first.c | 31 |
6 files changed, 48 insertions, 28 deletions
diff --git a/sysdeps/generic/ftime.c b/sysdeps/generic/ftime.c index 76e9276483..600e959245 100644 --- a/sysdeps/generic/ftime.c +++ b/sysdeps/generic/ftime.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994 Free Software Foundation, Inc. +/* Copyright (C) 1994, 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 @@ -25,19 +25,18 @@ ftime (timebuf) struct timeb *timebuf; { int save = errno; - struct tm *tp; + struct tm tp; errno = 0; if (time (&timebuf->time) == (time_t) -1 && errno != 0) return -1; timebuf->millitm = 0; - - tp = localtime (&timebuf->time); - if (tp == NULL) + + if (__localtime_r (&timebuf->time, &tp) == NULL) return -1; - timebuf->timezone = tp->tm_gmtoff / 60; - timebuf->dstflag = tp->tm_isdst; + timebuf->timezone = tp.tm_gmtoff / 60; + timebuf->dstflag = tp.tm_isdst; errno = save; return 0; diff --git a/sysdeps/generic/setfpucw.c b/sysdeps/generic/setfpucw.c index 7b09a68b55..5654c942b0 100644 --- a/sysdeps/generic/setfpucw.c +++ b/sysdeps/generic/setfpucw.c @@ -29,5 +29,8 @@ __setfpucw (fpu_control_t set) /* Preserve the reserved bits, and set the rest as the user specified (or the default, if the user gave zero). */ - _FPU_SETCW ((cw & _FPU_RESERVED) | (set & ~_FPU_RESERVED)); + cw &= _FPU_RESERVED; + cw |= set & ~_FPU_RESERVED; + + _FPU_SETCW (cw); } diff --git a/sysdeps/i386/fpu_control.h b/sysdeps/i386/fpu_control.h index 706dea3d6d..7944b1a5ee 100644 --- a/sysdeps/i386/fpu_control.h +++ b/sysdeps/i386/fpu_control.h @@ -89,8 +89,8 @@ Boston, MA 02111-1307, USA. */ typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__))); /* Macros for accessing the hardware control word. */ -#define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (cw)) -#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (cw)) +#define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw)) +#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw)) /* Default control word set at startup. */ extern fpu_control_t __fpu_control; diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h index f36b9ce2f4..8b9872c15a 100644 --- a/sysdeps/m68k/dl-machine.h +++ b/sysdeps/m68k/dl-machine.h @@ -175,7 +175,7 @@ _dl_start_user: | Loop to call _dl_init_next for the next initializer. jra 0b 1: | Clear the startup flag. - move.l #0, _dl_starting_up@GOT(%a5) + clr.l _dl_starting_up@GOT(%a5) | Pass our finalizer function to the user in %a1. move.l _dl_fini@GOT(%a5), %a1 | Initialize %fp with the stack pointer. diff --git a/sysdeps/posix/gettimeofday.c b/sysdeps/posix/gettimeofday.c index a4bb38a41c..c3b8108258 100644 --- a/sysdeps/posix/gettimeofday.c +++ b/sysdeps/posix/gettimeofday.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1994, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 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 @@ -16,7 +16,6 @@ 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 <ansidecl.h> #include <errno.h> #include <time.h> #include <sys/time.h> @@ -32,8 +31,9 @@ Cambridge, MA 02139, USA. */ putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled. Returns 0 on success, -1 on errors. */ int -DEFUN(__gettimeofday, (tv, tz), - struct timeval *tv AND struct timezone *tz) +__gettimeofday (tv, tz) + struct timeval *tv; + struct timezone *tz; { if (tv == NULL) { @@ -46,16 +46,17 @@ DEFUN(__gettimeofday, (tv, tz), if (tz != NULL) { - CONST time_t timer = tv->tv_sec; - CONST struct tm *tm; + const time_t timer = tv->tv_sec; + struct tm tm; + const struct tm *tmp; - CONST long int save_timezone = __timezone; - CONST long int save_daylight = __daylight; + const long int save_timezone = __timezone; + const long int save_daylight = __daylight; char *save_tzname[2]; save_tzname[0] = __tzname[0]; save_tzname[1] = __tzname[1]; - tm = localtime (&timer); + tmp = localtime (&timer, &tm); tz->tz_minuteswest = __timezone / 60; tz->tz_dsttime = __daylight; @@ -65,7 +66,7 @@ DEFUN(__gettimeofday, (tv, tz), __tzname[0] = save_tzname[0]; __tzname[1] = save_tzname[1]; - if (tm == NULL) + if (tmp == NULL) return -1; } diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c index feff028a28..ae163bcd49 100644 --- a/sysdeps/unix/sysv/linux/init-first.c +++ b/sysdeps/unix/sysv/linux/init-first.c @@ -36,21 +36,30 @@ weak_extern (_dl_starting_up) used in the process. Safe assumption if initializer never runs. */ int __libc_multiple_libcs = 1; +/* Remember the command line argument and enviroment contents for + later calls of initializers for dynamic libraries. */ +int __libc_argc; +char **__libc_argv; +char **__libc_envp; + + static void init (void *data) { extern int __personality (int); - int argc = *(long *)data; - char **argv = (char **)data + 1; - char **envp = &argv[argc + 1]; - - __libc_multiple_libcs = &_dl_starting_up && ! _dl_starting_up; + /* We must not call `personality' twice. */ if (!__libc_multiple_libcs) { + /* The argument we got points to the values describing the + command line argument etc. */ + __libc_argc = *(int *)data; + __libc_argv = (char **)data + 1; + __libc_envp = &__libc_argv[__libc_argc + 1]; + /* The `personality' system call takes one argument that chooses the "personality", i.e. the set of system calls and such. We must make this call first thing to disable emulation of some @@ -61,9 +70,17 @@ init (void *data) /* Set the FPU control word to the proper default value. */ __setfpucw (__fpu_control); } + else + { + /* The argument we got points to the values describing the + command line argument etc. */ + __libc_argc = *((int *)data)++; + __libc_argv = *((char ***)data)++; + __libc_envp = *(char ***)data; + } - __environ = envp; - __libc_init (argc, argv, envp); + __environ = __libc_envp; + __libc_init (__libc_argc, __libc_argv, __libc_envp); #ifdef PIC __libc_global_ctors (); |