diff options
70 files changed, 1891 insertions, 410 deletions
@@ -22,6 +22,216 @@ Tue Jan 7 09:48:15 1997 Andreas Jaeger <aj@arthur.pfalz.de> * signal/sigempty.c (sigemptyset): Correct typo: Empty set should have all bits zero. +Sun Jan 19 04:38:20 1997 Ulrich Drepper <drepper@cygnus.com> + + * config.make.in (have-ksh, KSH): New variables. Will be filled + in by configure. + * configure.in: Add test for ksh like shell (prefer bash). + * time/Makefile (tests): Depend on install-test-data. + (distribute): Add simplebackw. + (generated-dirs): New variable. + [$(have-ksh)==yes] (install-others): Add iso3166.tab and zone.tab. + (install-bin): Add tzselect. + (install-test-data): Install the zoneinfo files which are needed + for the test case in the build directory. + (test-tz-ENV): New variable. Call test-tz program using data in + build directory. + * time/simpleback: New file. + * time/test-tz.c: Pretty print. + * time/tzfile.c: Use value of environment variable TZDIR as directory + to look for zone info files. + don't let search for DST data destroy already found values. + * time/tzselect.ksh: Use @KSH@ and @TZDIR@ to be substituted when + installing. + * time/tzset.c (__tzset_internal): Avoid freeing string twice. + Set DST zone name to normal zone name if no information is provided. + + * time/mktime.c (mktime): Call __tzset_internal to use current + value of TZ. + + * Makerules (common-clean): Remove $(generated-dirs) inclusing content. + + * glibcbug.in: Fix several bugs. Reported by several people. + + * elf/Makefile: Correct dependecies for $(objpfx)ldd. + + * inet/netinet/ip.h: Define IPTOS_LOWCOST and IPTOS_MINCOST. + + * locale/C-time.c: Update copyright. + * locale/localeinfo.h: Likewise. + * sysdeps/unix/bsd/bsd4.4/direntry.h: Likewise. + + * locale/programs/ld-time.c (time_finish): Correct message string. + * locale/programs/linereader.c (lr_token): Use correctly `number' + not `digit' in message string. + + * stdlib/strtol.c [UNSIGNED]: Don't punt immediately when `-' is + seen. Instead return ULONG_MAX and set ERANGE. + * stdlib/tst-strtol.c: Correct test to reflect above change. + +Sun Jan 19 03:22:30 1997 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/unix/sysv/linux/sys/mtio.h: Don't use <linux/mtio.h>. + We must not use <linux/posix_types.h>. + + * sysdeps/unix/sysv/linux/sys/ipc_buf.h: Don't use __kernel_* types + since we must not use <linux/posix_types.h>. + * sysdeps/unix/sysv/linux/sys/procfs.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h: New file. Similar + to sysdeps/unix/sysv/linux/sys/ipc_buf.h, but use alpha relavent + types. + * sysdeps/unix/sysv/linux/alpha/sys/procfs.h: New file. Similar + to sysdeps/unix/sysv/linux/sys/procfs.h, but use alpha relavent + types. + +Sun Jan 19 01:48:20 1997 H.J. Lu <hjl@gnu.ai.mit.edu> + + * sysdeps/libm-i387/e_exp.S: Correct computation of fractional + part. + * sysdeps/libm-i387/e_expf.S: Likewise. + * sysdeps/libm-i387/e_expl.S: Likewise. + * sysdeps/libm-i387/s_expm1.S: Correct computation of fractional + part. Take care of additional value left on stack by fscale. + * sysdeps/libm-i387/s_expm1f.S: Likewise. + * sysdeps/libm-i387/s_expm1l.S: Likewise. + +Fri Jan 17 17:45:32 1997 Ulrich Drepper <drepper@cygnus.com> + + * posix/getopt.c: Change all direct usages of `gettext' to `_'. + + * sysdeps/generic/sysd-stdio.c (__stdio_reopen): Add missing + parameter. + Reported by Harmanjit Singh <harman@netearth.iitd.ernet.in>. + +Thu Jan 16 23:39:25 1997 Ulrich Drepper <drepper@cygnus.com> + + * stdio-common/Makefile (tests): Add scanf11. + * stdio-common/scanf11.c: New file. + * stdio-common/vfscanf.c (__vfscanf): Increment `done' when %n + was processed and value is not suppressed. + * stdio-common/bug10.c: Correct test to expect %n increment the + return value of scanf. + * stdio-common/scanf1.c: Likewise. + * stdio-common/scanf3.c: Likewise. + * stdio-common/scanf10.c: Likewise. + * stdio-common/tstdiomisc.c: Likewise. + + * time/strptime.c: Add lots of conditional compiling to enable use + outside glibc. When used in glibc, make sure C locale format + strings will always be recognized. + +Sat Jan 11 18:53:47 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/unix/sysv/linux/sys/sysmacros.h (major, minor, makedev): + Fix definitions so that they work with __kernel_dev_t. + +Sat Jan 11 14:24:10 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/unix/sysv/linux/kernel_sigaction.h, + sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h, + sysdeps/unix/sysv/linux/sigaction.c: New files. + * sysdeps/unix/sysv/linux/syscalls.list: Add s_sigaction. + +Sun Jan 12 15:22:33 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * libc-symbols.h (link_warning): Make sure that the .gnu.warning + section is not allocated. + Update and reformat copyright. + +Sun Jan 12 12:19:28 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * elf/Makefile ($(objpfx)ldd): Fix depedency list. + +Sat Jan 11 15:11:26 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls): Fix + command so that it works in subdirectories. + +Wed Jan 8 22:07:58 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * sysdeps/unix/sysv/linux/i386/syscalls.list: Add s_getgroups and + s_setgroups. + * sysdeps/unix/sysv/linux/m68k/syscalls.list: Likewise. + * sysdeps/unix/sysv/linux/i386/getgroups.c, + sysdeps/unix/sysv/linux/i386/setgroups.c, + sysdeps/unix/sysv/linux/m68k/getgroups.c, + sysdeps/unix/sysv/linux/m68k/setgroups.c: New files. + +Wed Jan 8 19:42:59 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makefile (config.status): Delete bogus rule. + ($(objpfx)glibcbug): Renamed from plain `glibcbug', depend on + config.status in build directory, fix command to change to build + directory. + * Makeconfig ($(common-objpfx)config.status): Depend on version.h. + +Thu Jan 9 08:47:54 1997 Andreas Jaeger <aj@arthur.pfalz.de> + + * glibcbug.in (while): We test for four and not five conditions, + set MAIL_AGENT instead of RMAIL, filter spaces and tabs. + +Thu Jan 16 22:00:27 1997 Ulrich Drepper <drepper@cygnus.com> + + * misc/syslog.c: Don't define cancel_handler if _LIBC_REENTRANT + is not defined. Reported by Andreas Jaeger. + +Thu Jan 9 08:47:54 1997 Andreas Jaeger <aj@arthur.pfalz.de> + + * new-malloc/malloc.c (__MALLOC_P): define call to pthread + initializer only if NO_THREADS is not defined. + +Wed Jan 8 21:28:58 1997 Andreas Jaeger <aj@arthur.pfalz.de> + + * resolv/nss_dns/dns-host.c: Clean-up: delete unnecessary includes + and variables. + +Thu Jan 16 21:50:27 1997 Ulrich Drepper <drepper@cygnus.com> + + * inet/arpa/inet.h: Include <netinet/in.h> to get struct in_addr + defined. + +Tue Jan 7 17:29:59 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makerules (LDLIBS-c.so): New variable. + +Tue Jan 7 19:22:00 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> + + * Makefile ($(includedir)/gnu/lib-names.h): Define the library + names as strings, not as sequence of tokens that may fall apart. + +Fri Jan 10 14:08:41 1997 Roland McGrath <roland@fmh.frob.com> + + * time/tzfile.c (__tzfile_read): Check for bogus type and zone name + indices in data file and punt, so a bogus file can't crash us. + +Thu Jan 16 20:29:15 1997 Ulrich Drepper <drepper@cygnus.com> + + * values.h [__USE_MISC]: Define BITSPERBYTE. + +Fri Jan 17 14:16:28 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> + + * stdio/vdprintf.c: Moved file to ... + * sysdeps/posix/vdprintf.c: Here. De-ansideclificate. + * sysdeps/stub/vdprintf.c: New file. + * sysdeps/mach/hurd/vdprintf.c: New file. + +Thu Jan 9 15:59:35 1997 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu> + + * sysdeps/mach/hurd/posix_opt.h: New file. + + * sysdeps/mach/hurd/sigwait.c (sigwait): Don't affect signal mask. + + * sysdeps/unix/bsd/tcsendbrk.c (tcsendbreak): Finish + deansideclification. + + * sysdeps/mach/libc-lock.h: Add kludges to pretend to implement + recursive locks. + +Tue Jan 7 09:48:15 1997 Andreas Jaeger <aj@arthur.pfalz.de> + + * signal/sigempty.c (sigemptyset): Correct typo: Empty set should + have all bits zero. + Tue Jan 7 23:44:39 1997 Ulrich Drepper <drepper@cygnus.com> * inet/gethstbynm.c: Include additional headers for additional @@ -260,7 +260,7 @@ incompatibilities: * swapon(): the interface of this function didn't changed, but the prototype is in a separate header file <sys/swap.h>. For the additional - argument of of swapon() you should use the SWAP_* constants from + argument of swapon() you should use the SWAP_* constants from <linux/swap.h>, which get defined when <sys/swap.h> is included. * errno: If a program uses variable "errno", then it _must_ include header @@ -298,6 +298,13 @@ incompatibilities: a separate library libresolv. If you find some symbols starting with `res_*' undefined simply add -lresolv to your call of the linker. +* the `signal' function's behaviour corresponds to the BSD semantic and + not the SysV semantic as it was in libc-5. The interface on all GNU + systems shall be the same and BSD is the semantic of choice. To use + the SysV behaviour simply use `sysv_signal'. The major difference is + that the SysV implementation sets the SA_ONESHOT flag and so the handler + gets removed after the first call. + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ [Q10] ``Why does getlogin() always return NULL on my Linux box?'' @@ -365,10 +372,10 @@ catalog files to the XPG4 form: [Q13] ``How do I configure GNU libc so that the essential libraries like libc.so go into /lib and the other into /usr/lib?'' -[A13] {UD} Like all other GNU packages GNU libc is configured to use a -base directory and install all files relative to this. If you intend -to really use GNU libc on your system this base directory is /usr. I.e., -you run +[A13] {UD,AJ} Like all other GNU packages GNU libc is configured to +use a base directory and install all files relative to this. If you +intend to really use GNU libc on your system this base directory is +/usr. I.e., you run configure --prefix=/usr <other_options> Some systems like Linux have a filesystem standard which makes a @@ -378,10 +385,10 @@ located on the same disk partition as /. The /usr subtree might be found on another partition/disk. To install the essential libraries which come with GNU libc in /lib -one must explicitly tell this. Autoconf has no option for this so you -have to use the file where all user supplied additional information -should go in: `configparms' (see the `INSTALL' file). For Linux the -`configparms' file should contain: +one must explicitly tell this (except on Linux, see below). Autoconf +has no option for this so you have to use the file where all user +supplied additional information should go in: `configparms' (see the +`INSTALL' file). Therefore the `configparms' file should contain: slibdir=/lib sysconfdir=/etc @@ -390,6 +397,10 @@ The first line specifies the directory for the essential libraries, the second line the directory for file which are by tradition placed in a directory named /etc. +No rule without an exception: If you configure for Linux with +--prefix=/usr, then slibdir and sysconfdir will automatically be +defined as stated above. + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ [Q14] ``When linking with the new libc I get unresolved symbols @@ -534,7 +545,7 @@ a different name: ld-linux.so.2. So you have to replace by %{!dynamic-linker:-dynamic-linker=/home/gnu/lib/ld.so.1} -in the above example specs file ti make it work for other systems. +in the above example specs file to make it work for other systems. Future versions of GCC will automatically provide the correct specs. @@ -606,6 +617,7 @@ Answers were given by: {DMT} David Mosberger-Tang, <davidm@AZStarNet.com> {RM} Roland McGrath, <roland@gnu.ai.mit.edu> {HJL} H.J. Lu, <hjl@gnu.ai.mit.edu> +{AJ} Andreas Jaeger, <aj@arthur.pfalz.de> Local Variables: mode:text @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. +# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 @@ -96,7 +96,7 @@ $(common-objpfx)config.make: $(common-objpfx)config.status $(..)config.h.in # Find all the sysdeps configure fragments, to make sure we re-run # configure when any of them changes. -$(common-objpfx)config.status: $(..)configure \ +$(common-objpfx)config.status: $(..)version.h $(..)configure \ $(foreach dir,$(full-config-sysdirs),\ $(wildcard \ $(dir)/Implies) \ @@ -38,7 +38,6 @@ endef configure: configure.in aclocal.m4; $(autoconf-it) %/configure: %/configure.in aclocal.m4; $(autoconf-it) -config.status: configure version.h; $(SHELL) ./config.status --recheck include Makeconfig @@ -198,7 +197,7 @@ $(includedir)/gnu/lib-names.h: $(common-objpfx)soversions.mk for l in $$libs; do \ upname=`echo $$l | sed 's/[.]so.*//' | \ tr '[:lower:]-' '[:upper:]_'`; \ - echo "#define $${upname}_SO $$l"; \ + echo "#define $${upname}_SO \"$$l\""; \ done;) | sort; \ echo; \ echo '#endif /* gnu/lib-names.h */';) > $(objpfx)lib-names.h @@ -210,8 +209,8 @@ endif # The `glibcbug' script contains the version number and it shall be rebuild # whenever this changes or the `glibcbug.in' file. -glibcbug: glibcbug.in config.status - CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status +$(objpfx)glibcbug: $(common-objpfx)config.status glibcbug.in + cd $(<D); CONFIG_FILES=$(@F) CONFIG_HEADERS= $(SHELL) $(<F) # This makes the Info or DVI file of the documentation from the Texinfo source. .PHONY: info dvi @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. +# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 @@ -344,6 +344,8 @@ endef # Also omits crti.o and crtn.o, which we do not want # since we define our own `.init' section specially. LDFLAGS-c.so = -nostdlib -nostartfiles +# But we still want to link libc.so against -lgcc. +LDLIBS-c.so = -lgcc # Give libc.so an entry point and make it directly runnable itself. LDFLAGS-c.so += -e __libc_main # Use our own special initializer and finalizer files for libc.so. @@ -823,6 +825,7 @@ endef # Also remove the dependencies and generated source files. common-clean: common-mostlyclean -rm -f $(addprefix $(objpfx),$(generated)) $(+depfiles) + -rm -fr $(addprefix $(objpfx),$(generated-dirs)) -rm -f $(addprefix $(common-objpfx),$(common-generated)) -rm -f $(common-objpfx)distinfo-$(subdir) diff --git a/config.make.in b/config.make.in index 8211b64..a4a6676 100644 --- a/config.make.in +++ b/config.make.in @@ -23,6 +23,7 @@ have-initfini = @libc_cv_have_initfini@ have-no-whole-archive = @libc_cv_ld_no_whole_archive@ have-no-exceptions = @libc_cv_gcc_no_exceptions@ have-bash2 = @libc_cv_have_bash2@ +have-ksh = @libc_cv_have_ksh@ # Configuration options. gnu-as = @gnu_as@ @@ -49,5 +50,6 @@ INSTALL_DATA = @INSTALL_DATA@ LN_S = @LN_S@ MSGFMT = @MSGFMT@ BASH = @BASH@ +KSH = @KSH@ # More variables may be inserted below by configure. @@ -1409,8 +1409,53 @@ else fi +if test "$BASH" = no; then + # Extract the first word of "ksh", so it can be a program name with args. +set dummy ksh; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1417: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$KSH" in + /*) + ac_cv_path_KSH="$KSH" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_KSH="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_KSH" && ac_cv_path_KSH="no" + ;; +esac +fi +KSH="$ac_cv_path_KSH" +if test -n "$KSH"; then + echo "$ac_t""$KSH" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test "$KSH" = no; then + libc_cv_have_ksh=no + else + libc_cv_have_ksh=yes + fi +else + KSH="$BASH" + + libc_cv_have_ksh=yes +fi + + echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6 -echo "configure:1414: checking for signed size_t type" >&5 +echo "configure:1459: checking for signed size_t type" >&5 if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1434,12 +1479,12 @@ EOF fi echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6 -echo "configure:1438: checking for libc-friendly stddef.h" >&5 +echo "configure:1483: checking for libc-friendly stddef.h" >&5 if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1443 "configure" +#line 1488 "configure" #include "confdefs.h" #define __need_size_t #define __need_wchar_t @@ -1454,7 +1499,7 @@ size_t size; wchar_t wchar; if (&size == NULL || &wchar == NULL) abort (); ; return 0; } EOF -if { (eval echo configure:1458: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1503: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_friendly_stddef=yes else @@ -1473,7 +1518,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly." fi echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6 -echo "configure:1477: checking whether we need to use -P to assemble .S files" >&5 +echo "configure:1522: checking whether we need to use -P to assemble .S files" >&5 if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1496,7 +1541,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives." fi echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6 -echo "configure:1500: checking for assembler global-symbol directive" >&5 +echo "configure:1545: checking for assembler global-symbol directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1526,7 +1571,7 @@ EOF fi echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6 -echo "configure:1530: checking for .set assembler directive" >&5 +echo "configure:1575: checking for .set assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1561,12 +1606,12 @@ fi if test $elf != yes; then echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 -echo "configure:1565: checking for .init and .fini sections" >&5 +echo "configure:1610: checking for .init and .fini sections" >&5 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1570 "configure" +#line 1615 "configure" #include "confdefs.h" int main() { @@ -1575,7 +1620,7 @@ asm (".section .init"); asm (".text"); ; return 0; } EOF -if { (eval echo configure:1579: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_have_initfini=yes else @@ -1600,19 +1645,19 @@ if test $elf = yes; then libc_cv_asm_underscores=no else echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 -echo "configure:1604: checking for _ prefix on C symbol names" >&5 +echo "configure:1649: checking for _ prefix on C symbol names" >&5 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1609 "configure" +#line 1654 "configure" #include "confdefs.h" asm ("_glibc_foobar:"); int main() { glibc_foobar (); ; return 0; } EOF -if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* libc_cv_asm_underscores=yes else @@ -1639,7 +1684,7 @@ if test $elf = yes; then libc_cv_asm_weakext_directive=no else echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 -echo "configure:1643: checking for assembler .weak directive" >&5 +echo "configure:1688: checking for assembler .weak directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1662,7 +1707,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6 if test $libc_cv_asm_weak_directive = no; then echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 -echo "configure:1666: checking for assembler .weakext directive" >&5 +echo "configure:1711: checking for assembler .weakext directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1699,7 +1744,7 @@ EOF fi echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 -echo "configure:1703: checking for ld --no-whole-archive" >&5 +echo "configure:1748: checking for ld --no-whole-archive" >&5 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1710,7 +1755,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -Wl,--no-whole-archive - -o conftest conftest.c'; { (eval echo configure:1714: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c'; { (eval echo configure:1759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_no_whole_archive=yes else libc_cv_ld_no_whole_archive=no @@ -1721,7 +1766,7 @@ fi echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 -echo "configure:1725: checking for gcc -fno-exceptions" >&5 +echo "configure:1770: checking for gcc -fno-exceptions" >&5 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1732,7 +1777,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -fno-exceptions - -o conftest conftest.c'; { (eval echo configure:1736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c'; { (eval echo configure:1781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_gcc_no_exceptions=yes else libc_cv_gcc_no_exceptions=no @@ -1784,7 +1829,7 @@ if test "$uname" = generic; then fi echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 -echo "configure:1788: checking OS release for uname" >&5 +echo "configure:1833: checking OS release for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1806,7 +1851,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6 uname_release="$libc_cv_uname_release" echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 -echo "configure:1810: checking OS version for uname" >&5 +echo "configure:1855: checking OS version for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1828,7 +1873,7 @@ else fi echo $ac_n "checking stdio selection""... $ac_c" 1>&6 -echo "configure:1832: checking stdio selection" >&5 +echo "configure:1877: checking stdio selection" >&5 case $stdio in libio) cat >> confdefs.h <<\EOF @@ -1840,7 +1885,7 @@ esac echo "$ac_t""$stdio" 1>&6 echo $ac_n "checking malloc selection""... $ac_c" 1>&6 -echo "configure:1844: checking malloc selection" >&5 +echo "configure:1889: checking malloc selection" >&5 case $malloc in new-malloc) USE_NEW_MALLOC=-DUSE_NEW_MALLOC ;; @@ -2052,6 +2097,8 @@ s%@AR@%$AR%g s%@RANLIB@%$RANLIB%g s%@BASH@%$BASH%g s%@libc_cv_have_bash2@%$libc_cv_have_bash2%g +s%@KSH@%$KSH%g +s%@libc_cv_have_ksh@%$libc_cv_have_ksh%g s%@libc_cv_have_initfini@%$libc_cv_have_initfini%g s%@libc_cv_ld_no_whole_archive@%$libc_cv_ld_no_whole_archive%g s%@libc_cv_gcc_no_exceptions@%$libc_cv_gcc_no_exceptions%g diff --git a/configure.in b/configure.in index 4716052..7280c7a 100644 --- a/configure.in +++ b/configure.in @@ -383,6 +383,21 @@ else fi AC_SUBST(libc_cv_have_bash2) +dnl We need a ksh compatible shell for tzselect. +if test "$BASH" = no; then + AC_PATH_PROG(KSH, ksh, no) + if test "$KSH" = no; then + libc_cv_have_ksh=no + else + libc_cv_have_ksh=yes + fi +else + KSH="$BASH" + AC_SUBST(KSH) + libc_cv_have_ksh=yes +fi +AC_SUBST(libc_cv_have_ksh) + AC_CACHE_CHECK(for signed size_t type, libc_cv_signed_size_t, [dnl echo '#include <stddef.h> FOOBAR __SIZE_TYPE__ FOOBAR' > conftest.c diff --git a/elf/Makefile b/elf/Makefile index 4cb8d7e..8f98cb8 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -1,6 +1,6 @@ # Makefile for elf subdirectory of GNU C Library. -# Copyright (C) 1995, 1996 Free Software Foundation, Inc. +# Copyright (C) 1995, 1996, 1997 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 @@ -100,13 +100,15 @@ $(objpfx)libdl.so: $(objpfx)libdl_pic.a $(common-objpfx)libc.so $(objpfx)ld.so $(slibdir)/$(rtld-installed-name): $(objpfx)ld.so; $(do-install-program) ifneq ($(have-bash2),yes) -$(objpfx)ldd: ldd.sh.in Makefile +$(objpfx)ldd: ldd.sh.in $(common-objpfx)version.mk \ + $(common-objpfx)soversions.mk $(common-objpfx)config.make sed -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \ -e 's%@VERSION@%$(version)%g' < $< > $@.new chmod 555 $@.new mv -f $@.new $@ else -$(objpfx)ldd: ldd.bash.in Makefile +$(objpfx)ldd: ldd.bash.in $(common-objpfx)version.mk \ + $(common-objpfx)soversions.mk $(common-objpfx)config.make sed -e 's%@BASH@%$(BASH)%g' \ -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \ -e 's%@VERSION@%$(version)%g' \ diff --git a/glibcbug.in b/glibcbug.in index c23f32a..6473b2c 100644 --- a/glibcbug.in +++ b/glibcbug.in @@ -29,11 +29,11 @@ trap 'rm -f $TEMP $TEMP.x' 0 PASSWD="cat /etc/passwd" if [ -f /usr/lib/sendmail ] ; then - RMAIL="/usr/lib/sendmail -oi -t" + MAIL_AGENT="/usr/lib/sendmail -oi -t" elif [ -f /usr/sbin/sendmail ] ; then - RMAIL="/usr/sbin/sendmail -oi -t" + MAIL_AGENT="/usr/sbin/sendmail -oi -t" else - RMAIL=rmail + MAIL_AGENT=rmail fi # Figure out how to echo a string without a trailing newline @@ -153,8 +153,8 @@ SED_CMD=' /$PATTERN/{ s||| s|<.*>|| -s|^[ ]*|| -s|[ ]*$|| +s|^[ ]*|| +s|[ ]*$|| p q }' @@ -199,7 +199,7 @@ while :; do *) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'." esac - [ $CNT -lt 5 ] && + [ $CNT -lt 4 ] && echo "Errors were found with the problem report." while :; do @@ -239,9 +239,9 @@ sed -e " /^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;; /^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;; /^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;; -" $TEMP > $REF +" $TEMP > $TEMP.x -if $MAIL_AGENT < $REF; then +if $MAIL_AGENT $BUGGLIBC < $TEMP.x; then echo "$COMMAND: problem report sent" xs=0; exit else diff --git a/inet/arpa/inet.h b/inet/arpa/inet.h index 5619943..03021e6 100644 --- a/inet/arpa/inet.h +++ b/inet/arpa/inet.h @@ -40,6 +40,7 @@ #include <sys/cdefs.h> #include <sys/types.h> +#include <netinet/in.h> /* To define `struct in_addr'. */ __BEGIN_DECLS u_long inet_addr __P((const char *)); diff --git a/inet/netinet/ip.h b/inet/netinet/ip.h index 6624ac4..6533885 100644 --- a/inet/netinet/ip.h +++ b/inet/netinet/ip.h @@ -77,7 +77,8 @@ struct ip { #define IPTOS_LOWDELAY 0x10 #define IPTOS_THROUGHPUT 0x08 #define IPTOS_RELIABILITY 0x04 -/* IPTOS_LOWCOST 0x02 XXX */ +#define IPTOS_LOWCOST 0x02 +#define IPTOS_MINCOST IPTOS_LOWCOST /* * Definitions for IP precedence (also in ip_tos) (hopefully unused) diff --git a/libc-symbols.h b/libc-symbols.h index 370c631..b583f33 100644 --- a/libc-symbols.h +++ b/libc-symbols.h @@ -1,25 +1,25 @@ /* Support macros for making weak and strong aliases for symbols, and for using symbol sets and linker warnings with GNU ld. -Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1995, 1996, 1997 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 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. + 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. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _LIBC_SYMBOLS_H -#define _LIBC_SYMBOLS_H +#define _LIBC_SYMBOLS_H 1 /* This file's macros are included implicitly in the compilation of every file in the C library by -imacros. @@ -225,6 +225,7 @@ extern const char _libc_intl_domainname[]; #ifdef HAVE_GNU_LD #ifdef HAVE_ELF #define link_warning(symbol, msg) \ + asm(".section .gnu.warning." #symbol "; .previous"); \ static const char __evoke_link_warning_##symbol[] \ __attribute__ ((section (".gnu.warning." #symbol))) = msg; #else diff --git a/locale/C-time.c b/locale/C-time.c index dbb51f3..67254b2 100644 --- a/locale/C-time.c +++ b/locale/C-time.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -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 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. + 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., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 335e866..018220f 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -1,21 +1,21 @@ /* localeinfo.h -- declarations for internal libc locale interfaces -Copyright (C) 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. */ + Copyright (C) 1995, 1996, 1997 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _LOCALEINFO_H #define _LOCALEINFO_H 1 diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index abd21db..cc571b8 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -1,6 +1,6 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. 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 @@ -335,7 +335,7 @@ time_finish (struct localedef_t *locale) if (str == NULL || *str == '\0') { error (0, 0, _("missing era name in string %d in `era' field" - "in category `%s'"), idx + 1, "LC_TIME"); + " in category `%s'"), idx + 1, "LC_TIME"); time->era_entries[idx].name = time->era_entries[idx].format = ""; } diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c index 4759615..edb5a51 100644 --- a/locale/programs/linereader.c +++ b/locale/programs/linereader.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. -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 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. + 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., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -211,7 +211,7 @@ lr_token (struct linereader *lr, const struct charset_t *charset) lr->token.val.num += ch - '0'; } if (isalpha (ch)) - lr_error (lr, _("garbage at end of digit")); + lr_error (lr, _("garbage at end of number")); lr_ungetn (lr, 1); return &lr->token; diff --git a/malloc/malloc.c b/malloc/malloc.c index 7e71e97..50bba6b 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1,5 +1,5 @@ /* Malloc implementation for multiple threads without lock contention. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Wolfram Gloger <wmglo@dent.med.uni-muenchen.de> and Doug Lea <dl@cs.oswego.edu>, 1996. @@ -1521,7 +1521,7 @@ ptmalloc_init __MALLOC_P((void)) __malloc_hook = malloc_starter; __free_hook = free_starter; #endif -#if defined(_LIBC) +#if defined(_LIBC) && !defined (NO_THREADS) /* Initialize the pthreads interface. */ if (__pthread_initialize != NULL) __pthread_initialize(); diff --git a/misc/syslog.c b/misc/syslog.c index 6e9cdef..5521ceb 100644 --- a/misc/syslog.c +++ b/misc/syslog.c @@ -73,7 +73,9 @@ __libc_lock_define_initialized (static, syslog_lock) static void openlog_internal(const char *, int, int); static void closelog_internal(void); static void sigpipe_handler (int); +#ifdef _LIBC_REENTRANT static void cancel_handler (void *); +#endif /* * syslog, vsyslog -- @@ -310,6 +312,7 @@ closelog () __libc_cleanup_region_end (1); } +#ifdef _LIBC_REENTRANT static void cancel_handler (void *ptr) { @@ -322,6 +325,7 @@ cancel_handler (void *ptr) /* Free the lock. */ __libc_lock_unlock (syslog_lock); } +#endif /* setlogmask -- set the log mask level */ int diff --git a/posix/getopt.c b/posix/getopt.c index 1cefc10..1c79eaa 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -763,8 +763,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) if (opterr) { /* 1003.2 specifies the format of this message. */ - fprintf (stderr, - gettext ("%s: option requires an argument -- %c\n"), + fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; @@ -811,7 +810,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) if (ambig && !exact) { if (opterr) - fprintf (stderr, gettext ("%s: option `-W %s' is ambiguous\n"), + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; @@ -829,9 +828,9 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) else { if (opterr) - fprintf (stderr, - gettext ("%s: option `-W %s' doesn't allow an argument\n"), - argv[0], pfound->name); + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; @@ -845,7 +844,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) { if (opterr) fprintf (stderr, - gettext ("%s: option `%s' requires an argument\n"), + _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 8d9d517..374da83 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -84,11 +84,6 @@ #include <string.h> #include <sys/syslog.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <arpa/nameser.h> -#include <resolv.h> - #include "nsswitch.h" /* Get implementation for some internal functions. */ @@ -126,14 +121,6 @@ enum nss_status _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, char *buffer, size_t buflen, int *h_errnop) { - struct host_data - { - char *aliases[MAX_NR_ALIASES]; - unsigned char host_addr[16]; /* IPv4 or IPv6 */ - char *h_addr_ptrs[MAX_NR_ADDRS + 1]; - char linebuffer[0]; - } *host_data = (struct host_data *) buffer; - int linebuflen = buflen - offsetof (struct host_data, linebuffer); querybuf host_buffer; int size, type, n; const char *cp; diff --git a/stdio-common/Makefile b/stdio-common/Makefile index f4e49e6..e7c1cb8 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. +# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 @@ -43,7 +43,8 @@ tests := tst-printf tstscanf test_rdwr test-popen tstgetln test-fseek \ xbug errnobug \ bug1 bug2 bug3 bug4 bug5 bug6 bug7 bug8 bug9 bug10 bug11 \ tfformat tiformat tstdiomisc \ - scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10 + scanf1 scanf2 scanf3 scanf4 scanf5 scanf7 scanf8 scanf9 scanf10 \ + scanf11 include ../Rules diff --git a/stdio-common/bug10.c b/stdio-common/bug10.c index 5306471..5e8ae25 100644 --- a/stdio-common/bug10.c +++ b/stdio-common/bug10.c @@ -1,7 +1,7 @@ #include <stdio.h> int -main(int arc, char *argv) +main (int arc, char *argv) { int n, res; unsigned int val; @@ -14,7 +14,7 @@ main(int arc, char *argv) printf("Result of sscanf = %d\n", res); printf("Scanned format %%u = %u\n", val); printf("Possibly scanned format %%n = %d\n", n); - result |= res != 1 || val != 111 || n != 3; + result |= res != 2 || val != 111 || n != 3; result |= sscanf ("", " %n", &n) == EOF; diff --git a/stdio-common/scanf1.c b/stdio-common/scanf1.c index 3adf532..58c78c2 100644 --- a/stdio-common/scanf1.c +++ b/stdio-common/scanf1.c @@ -2,14 +2,14 @@ #include <stdlib.h> int -main(int argc, char *argv[]) +main (int argc, char *argv[]) { int i,n,r; n = i = r = -1; - r = sscanf("1234:567", "%d%n", &i, &n); - printf("%d %d %d\n", r, n, i); - if (r != 1 || i != 1234 || n != 4) + r = sscanf ("1234:567", "%d%n", &i, &n); + printf ("%d %d %d\n", r, n, i); + if (r != 2 || i != 1234 || n != 4) abort (); return 0; } diff --git a/stdio-common/scanf10.c b/stdio-common/scanf10.c index f896137..27a5e66 100644 --- a/stdio-common/scanf10.c +++ b/stdio-common/scanf10.c @@ -11,5 +11,5 @@ main (int argc, char *argv[]) printf ("retc=%d a=%d b=%d\n", retc, a, b); - return retc == -1 && a == 6 && b == 12 ? 0 : 1; + return retc == 2 && a == 6 && b == 12 ? 0 : 1; } diff --git a/stdio-common/scanf11.c b/stdio-common/scanf11.c new file mode 100644 index 0000000..50ef26a --- /dev/null +++ b/stdio-common/scanf11.c @@ -0,0 +1,14 @@ +/* This test comes from ISO C Corrigendum 1. */ +#include <stdio.h> + +int +main (int argc, char *argv[]) +{ + int d1, n1, n2, i; +#define NOISE 1234567 + int d2 = NOISE; + + i = sscanf ("123", "%d%n%n%d", &d1, &n1, &n2, &d2); + + return i != 3 || d1 != 123 || n1 != 3 || n2 != 3 || d2 != NOISE; +} diff --git a/stdio-common/scanf3.c b/stdio-common/scanf3.c index 33495cc..5bfa80b 100644 --- a/stdio-common/scanf3.c +++ b/stdio-common/scanf3.c @@ -13,7 +13,7 @@ main(int arc, char *argv[]) printf("Result of sscanf = %d\n", res); printf("Scanned format %%u = %u\n", val); printf("Possibly scanned format %%n = %d\n", n); - if (n != 3 || val != 111 || res != 1) + if (n != 3 || val != 111 || res != 2) abort (); val = n = -1; @@ -21,7 +21,7 @@ main(int arc, char *argv[]) printf("Result of sscanf = %d\n", res); printf("Scanned format %%u = %u\n", val); printf("Possibly scanned format %%n = %d\n", n); - if (n != 3 || val != 111 || res != 1) + if (n != 3 || val != 111 || res != 2) abort (); return 0; diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c index 8dac4f2..dbce623 100644 --- a/stdio-common/tstdiomisc.c +++ b/stdio-common/tstdiomisc.c @@ -27,7 +27,7 @@ t2 (void) SCAN ("12345", "%ld", N, 1, 12345); SCAN ("12345", "%llllld", N, 0, -1); SCAN ("12345", "%LLLLLd", N, 0, -1); - SCAN ("test ", "%*s%n", n, 0, 4); + SCAN ("test ", "%*s%n", n, 1, 4); SCAN ("test ", "%2*s%n", n, 0, -1); SCAN ("12 ", "%l2d", n, 0, -1); SCAN ("12 ", "%2ld", N, 1, 12); diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index cb6d396..ef0dbee 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 @@ -452,15 +452,18 @@ __vfscanf (FILE *s, const char *format, va_list argptr) /* Corrigendum 1 to ISO C 1990 describes the allowed flags with the 'n' conversion specifier. */ if (!(flags & SUPPRESS)) - /* Don't count the read-ahead. */ - if (flags & LONGDBL) - *ARG (long long int *) = read_in; - else if (flags & LONG) - *ARG (long int *) = read_in; - else if (flags & SHORT) - *ARG (short int *) = read_in; - else - *ARG (int *) = read_in; + { + /* Don't count the read-ahead. */ + if (flags & LONGDBL) + *ARG (long long int *) = read_in; + else if (flags & LONG) + *ARG (long int *) = read_in; + else if (flags & SHORT) + *ARG (short int *) = read_in; + else + *ARG (int *) = read_in; + ++done; + } break; case 'c': /* Match characters. */ diff --git a/stdlib/strtol.c b/stdlib/strtol.c index 5a097b4..396e2ec 100644 --- a/stdlib/strtol.c +++ b/stdlib/strtol.c @@ -1,5 +1,5 @@ /* strtol - Convert string representation of a number into an integer value. - Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc. + Copyright (C) 1991, 92, 94, 95, 96, 97 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 @@ -217,13 +217,8 @@ INTERNAL (strtol) (nptr, endptr, base, group) /* Check for a sign. */ if (*s == L_('-')) { -#if UNSIGNED - __set_errno (EINVAL); - return 0; -#else negative = 1; ++s; -#endif } else if (*s == L_('+')) { @@ -317,6 +312,8 @@ INTERNAL (strtol) (nptr, endptr, base, group) ? -((unsigned LONG int) (LONG_MIN + 1)) + 1 : (unsigned LONG int) LONG_MAX)) overflow = 1; +#else + overflow |= negative; #endif if (overflow) diff --git a/stdlib/tst-strtol.c b/stdlib/tst-strtol.c index 58878f2..1d398b4 100644 --- a/stdlib/tst-strtol.c +++ b/stdlib/tst-strtol.c @@ -37,8 +37,8 @@ static const struct ltest tests[] = { " 0", 0, 0, 0, 0 }, { "0xffffffffg", 0xffffffff, 0, 'g', 0 }, { "0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE }, - { "-0x123456789", 0, 0, 0, EINVAL }, - { "-0xfedcba98", 0, 0, 0, EINVAL }, + { "-0x123456789", 0xffffffff, 0, 0, ERANGE }, + { "-0xfedcba98", 0xffffffff, 0, 0, ERANGE }, { NULL, 0, 0, 0, 0 }, #else /* assume 64 bit long... */ @@ -65,8 +65,8 @@ static const struct ltest tests[] = { "0xffffffffg", 0xffffffff, 0, 'g', 0 }, { "0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0 }, { "0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE }, - { "-0x123456789abcdef01", 0, 0, 0, EINVAL }, - { "-0xfedcba987654321", 0, 0, 0, EINVAL }, + { "-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE }, + { "-0xfedcba987654321", 0xffffffffffffffff, 0, 0, ERANGE }, { NULL, 0, 0, 0, 0 }, #endif }; diff --git a/sysdeps/generic/sysd-stdio.c b/sysdeps/generic/sysd-stdio.c index d28dde8..363a763 100644 --- a/sysdeps/generic/sysd-stdio.c +++ b/sysdeps/generic/sysd-stdio.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 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. + 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. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <stddef.h> #include <stdio.h> @@ -163,7 +163,7 @@ __stdio_open (filename, m, cookieptr) /* Open FILENAME with the mode in M. Use the same magic cookie already in *COOKIEPTR if possible, closing the old cookie with CLOSEFN. */ int -__stdio_reopen (filename, m, cookieptr) +__stdio_reopen (filename, m, cookieptr, closefn) const char *filename; __io_mode m; void **cookieptr; diff --git a/sysdeps/libm-i387/e_exp.S b/sysdeps/libm-i387/e_exp.S index 3c9d45b..e76b9c6 100644 --- a/sysdeps/libm-i387/e_exp.S +++ b/sysdeps/libm-i387/e_exp.S @@ -24,7 +24,7 @@ ENTRY(__ieee754_exp) fmulp /* x * log2(e) */ fstl %st(1) frndint /* int(x * log2(e)) */ - fsub %st,%st(1) /* fract(x * log2(e)) */ + fsubr %st,%st(1) /* fract(x * log2(e)) */ fxch f2xm1 /* 2^(fract(x * log2(e))) - 1 */ fld1 diff --git a/sysdeps/libm-i387/e_expf.S b/sysdeps/libm-i387/e_expf.S index cd8dc7f..9a669cf 100644 --- a/sysdeps/libm-i387/e_expf.S +++ b/sysdeps/libm-i387/e_expf.S @@ -25,7 +25,7 @@ ENTRY(__ieee754_expf) fmulp /* x * log2(e) */ fstl %st(1) frndint /* int(x * log2(e)) */ - fsub %st,%st(1) /* fract(x * log2(e)) */ + fsubr %st,%st(1) /* fract(x * log2(e)) */ fxch f2xm1 /* 2^(fract(x * log2(e))) - 1 */ fld1 diff --git a/sysdeps/libm-i387/e_expl.S b/sysdeps/libm-i387/e_expl.S index e398a90..e83d306 100644 --- a/sysdeps/libm-i387/e_expl.S +++ b/sysdeps/libm-i387/e_expl.S @@ -26,7 +26,7 @@ ENTRY(__ieee754_expl) fmulp /* x * log2(e) */ fstl %st(1) frndint /* int(x * log2(e)) */ - fsub %st,%st(1) /* fract(x * log2(e)) */ + fsubr %st,%st(1) /* fract(x * log2(e)) */ fxch f2xm1 /* 2^(fract(x * log2(e))) - 1 */ fld1 diff --git a/sysdeps/libm-i387/s_expm1.S b/sysdeps/libm-i387/s_expm1.S index 2685d6e..78e8013 100644 --- a/sysdeps/libm-i387/s_expm1.S +++ b/sysdeps/libm-i387/s_expm1.S @@ -1,8 +1,9 @@ /* ix87 specific implementation of exp(x)-1. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>. + Corrections by H.J. Lu (hjl@gnu.ai.mit.edu), 1997. 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 @@ -64,15 +65,16 @@ ENTRY(__expm1) fmulp // log2(e)*x fld %st // log2(e)*x : log2(e)*x frndint // int(log2(e)*x) : log2(e)*x - fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x) + fsubr %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x) fxch // fract(log2(e)*x) : int(log2(e)*x) f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x) fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x) fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) - fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) - faddp // 2^(log2(e)*x) - fsubl MO(one) + fscale // 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fsubrp %st, %st(1) // 2^(log2(e)*x) ret 2: testl $0x200, %eax // Test sign. diff --git a/sysdeps/libm-i387/s_expm1f.S b/sysdeps/libm-i387/s_expm1f.S index 85c3c84..00f1562 100644 --- a/sysdeps/libm-i387/s_expm1f.S +++ b/sysdeps/libm-i387/s_expm1f.S @@ -1,8 +1,9 @@ /* ix87 specific implementation of exp(x)-1. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>. + Corrections by H.J. Lu (hjl@gnu.ai.mit.edu), 1997. 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 @@ -64,15 +65,16 @@ ENTRY(__expm1f) fmulp // log2(e)*x fld %st // log2(e)*x : log2(e)*x frndint // int(log2(e)*x) : log2(e)*x - fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x) + fsubr %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x) fxch // fract(log2(e)*x) : int(log2(e)*x) f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x) fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x) fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) - fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) - faddp // 2^(log2(e)*x) - fsubl MO(one) + fscale // 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fsubrp %st, %st(1) // 2^(log2(e)*x) ret 2: testl $0x200, %eax // Test sign. diff --git a/sysdeps/libm-i387/s_expm1l.S b/sysdeps/libm-i387/s_expm1l.S index 45aa753..b7e6b36 100644 --- a/sysdeps/libm-i387/s_expm1l.S +++ b/sysdeps/libm-i387/s_expm1l.S @@ -1,8 +1,9 @@ /* ix87 specific implementation of exp(x)-1. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. Based on code by John C. Bowman <bowman@ipp-garching.mpg.de>. + Corrections by H.J. Lu (hjl@gnu.ai.mit.edu), 1997. 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 @@ -64,15 +65,16 @@ ENTRY(__expm1l) fmulp // log2(e)*x fld %st // log2(e)*x : log2(e)*x frndint // int(log2(e)*x) : log2(e)*x - fsub %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x) + fsubr %st, %st(1) // int(log2(e)*x) : fract(log2(e)*x) fxch // fract(log2(e)*x) : int(log2(e)*x) f2xm1 // 2^fract(log2(e)*x)-1 : int(log2(e)*x) fscale // 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x) fxch // int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fldl MO(one) // 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) - fscale // 2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) - faddp // 2^(log2(e)*x) - fsubl MO(one) + fscale // 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) + fsubrp %st, %st(1) // 2^(log2(e)*x) ret 2: testl $0x200, %eax // Test sign. diff --git a/sysdeps/mach/hurd/posix_opt.h b/sysdeps/mach/hurd/posix_opt.h index 75a07e1..045b4b6 100644 --- a/sysdeps/mach/hurd/posix_opt.h +++ b/sysdeps/mach/hurd/posix_opt.h @@ -1,3 +1,12 @@ +/* Posix options supported by the GNU Hurd port of GNU libc. */ + +#define _POSIX_JOB_CONTROL 1 +#define _POSIX_SAVED_IDS 1 +#define _POSIX_VDISABLE ((unsigned char) -1) + +/* Different Hurd filesystems might do these differently. */ +#undef _POSIX_CHOWN_RESTRICTED +#undef _POSIX_NO_TRUNC /* Posix options supported by the GNU Hurd port of GNU libc. */ #define _POSIX_JOB_CONTROL 1 diff --git a/sysdeps/mach/hurd/vdprintf.c b/sysdeps/mach/hurd/vdprintf.c index 002f8c6..a69607e 100644 --- a/sysdeps/mach/hurd/vdprintf.c +++ b/sysdeps/mach/hurd/vdprintf.c @@ -55,3 +55,60 @@ vdprintf (int d, const char *format, va_list arg) return done; } +/* Copyright (C) 1991, 1992, 1993, 1997 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 <limits.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include <hurd/fd.h> + +/* Write formatted output to file descriptor D according to the format string + FORMAT, using the argument list in ARG. */ +int +vdprintf (int d, const char *format, va_list arg) +{ + int done; + FILE f; + struct hurd_fd *fd; + + HURD_CRITICAL_BEGIN; + fd = _hurd_fd_get (fd); + HURD_CRITICAL_END; + + if (!fd) + return 0; + + /* Create an unbuffered stream talking to D on the stack. */ + memset ((PTR) &f, 0, sizeof(f)); + f.__magic = _IOMAGIC; + f.__mode.__write = 1; + f.__cookie = fd; + f.__room_funcs = __default_room_functions; + f.__io_funcs = __default_io_functions; + f.__seen = 1; + f.__userbuf = 1; + + /* vfprintf will use a buffer on the stack for the life of the call, + and flush it when finished. */ + done = vfprintf (&f, format, arg); + + return done; +} diff --git a/sysdeps/mach/libc-lock.h b/sysdeps/mach/libc-lock.h index 53dc8ee..05eb70c 100644 --- a/sysdeps/mach/libc-lock.h +++ b/sysdeps/mach/libc-lock.h @@ -1,21 +1,21 @@ /* libc-internal interface for mutex locks. Mach cthreads version. -Copyright (C) 1996, 1997 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1996, 1997 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 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. + 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. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _LIBC_LOCK_H #define _LIBC_LOCK_H 1 @@ -87,4 +87,12 @@ typedef struct __libc_lock_opaque__ __libc_lock_t; #define __libc_lock_unlock_recursive __libc_lock_unlock #define __libc_lock_lock_recursive __libc_lock_lock +/* XXX until cthreads supports recursive locks */ +#define __libc_lock_define_initialized_recursive __libc_lock_define_initialized +#define __libc_lock_init_recursive __libc_lock_init +#define __libc_lock_fini_recursive __libc_lock_fini +#define __libc_lock_trylock_recursive __libc_lock_trylock +#define __libc_lock_unlock_recursive __libc_lock_unlock +#define __libc_lock_lock_recursive __libc_lock_lock + #endif /* libc-lock.h */ diff --git a/sysdeps/posix/vdprintf.c b/sysdeps/posix/vdprintf.c index 5147bb8..1cb0572 100644 --- a/sysdeps/posix/vdprintf.c +++ b/sysdeps/posix/vdprintf.c @@ -47,3 +47,52 @@ vdprintf (int d, const char *format, va_list arg) return done; } +/* Copyright (C) 1991, 1992, 1993, 1997 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 <limits.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> + + +/* Write formatted output to file descriptor D according to the format string + FORMAT, using the argument list in ARG. */ +int +vdprintf (int d, const char *format, va_list arg) +{ + int done; + FILE f; + + /* Create an unbuffered stream talking to D on the stack. */ + memset ((PTR) &f, 0, sizeof(f)); + f.__magic = _IOMAGIC; + f.__mode.__write = 1; + f.__cookie = (PTR) (long int) d; /* Casting to long quiets GCC on Alpha. */ + f.__room_funcs = __default_room_functions; + f.__io_funcs = __default_io_functions; + f.__seen = 1; + f.__userbuf = 1; + + /* vfprintf will use a buffer on the stack for the life of the call, + and flush it when finished. */ + done = vfprintf (&f, format, arg); + + return done; +} diff --git a/sysdeps/stub/vdprintf.c b/sysdeps/stub/vdprintf.c index 729f012..f7ae121 100644 --- a/sysdeps/stub/vdprintf.c +++ b/sysdeps/stub/vdprintf.c @@ -29,3 +29,34 @@ vdprintf (int d, const char *format, va_list arg) } stub_warning (vdprintf) +/* Copyright (C) 1997 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 <stdio.h> + +/* Write formatted output to file descriptor D according to the format string + FORMAT, using the argument list in ARG. */ +int +vdprintf (int d, const char *format, va_list arg) +{ + __set_errno (ENOSYS); + return NULL; +} + +stub_warning (vdprintf) diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile index 15993b3..1aea477 100644 --- a/sysdeps/unix/Makefile +++ b/sysdeps/unix/Makefile @@ -289,7 +289,7 @@ $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \ test -f $$dir/syscalls.list && \ { $(SHELL) $(dir $<)$(notdir $<) \ $$dir $(object-suffixes) || exit 1; }; \ - test $$dir = sysdeps/unix && break; \ + test $$dir = $(..)sysdeps/unix && break; \ done > $@T mv -f $@T $@ diff --git a/sysdeps/unix/bsd/bsd4.4/direntry.h b/sysdeps/unix/bsd/bsd4.4/direntry.h index c221d55..b9e0d72 100644 --- a/sysdeps/unix/bsd/bsd4.4/direntry.h +++ b/sysdeps/unix/bsd/bsd4.4/direntry.h @@ -1,21 +1,21 @@ /* Directory entry structure `struct dirent'. 4.4BSD version. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1996, 1997 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 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. + 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. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ struct dirent { diff --git a/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h b/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h new file mode 100644 index 0000000..900bff4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/kernel_sigaction.h @@ -0,0 +1,7 @@ +/* This is the sigaction struction from the Linux 2.1.20 kernel. */ + +struct kernel_sigaction { + __sighandler_t sa_handler; + unsigned long sa_mask; + unsigned int sa_flags; +}; diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h b/sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h new file mode 100644 index 0000000..57830da --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/sys/ipc_buf.h @@ -0,0 +1,85 @@ +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_IPC_BUF_H + +#define _SYS_IPC_BUF_H 1 +#include <features.h> + +#include <sys/types.h> + +/* Mode bits for `msgget', `semget', and `shmget'. */ +#define IPC_CREAT 01000 /* Create key if key does not exist. */ +#define IPC_EXCL 02000 /* Fail if key exists. */ +#define IPC_NOWAIT 04000 /* Return error on wait. */ + +/* Control commands for `msgctl', `semctl', and `shmctl'. */ +#define IPC_RMID 0 /* Remove identifier. */ +#define IPC_SET 1 /* Set `ipc_perm' options. */ +#define IPC_STAT 2 /* Get `ipc_perm' options. */ +#define IPC_INFO 3 /* See ipcs. */ + + +__BEGIN_DECLS + +/* Special key values. */ +#define IPC_PRIVATE ((__key_t) 0) /* Private key. */ + + +/* Data structure used to pass permission information to IPC operations. */ +struct ipc_perm + { + __key_t __key; /* Key. */ + unsigned int uid; /* Owner's user ID. */ + unsigned int gid; /* Owner's group ID. */ + unsigned int cuid; /* Creator's user ID. */ + unsigned int cgid; /* Creator's group ID. */ + unsigned int mode; /* Read/write permission. */ + unsigned short int __seq; /* Sequence number. */ + }; + + +/* Kludge to work around Linux' restriction of only up to five + arguments to a system call. */ +struct ipc_kludge + { + void *msgp; + long int msgtyp; + }; + +/* The actual system call: all functions are multiplexed by this. */ +extern int __ipc __P ((int __call, int __first, int __second, int __third, + void *__ptr)); + +/* The codes for the functions to use the multiplexer `__ipc'. */ +#define IPCOP_semop 1 +#define IPCOP_semget 2 +#define IPCOP_semctl 3 +#define IPCOP_msgsnd 11 +#define IPCOP_msgrcv 12 +#define IPCOP_msgget 13 +#define IPCOP_msgctl 14 +#define IPCOP_shmat 21 +#define IPCOP_shmdt 22 +#define IPCOP_shmget 23 +#define IPCOP_shmctl 24 + +__END_DECLS + +#endif /* _SYS_IPC_BUF_H */ diff --git a/sysdeps/unix/sysv/linux/alpha/sys/procfs.h b/sysdeps/unix/sysv/linux/alpha/sys/procfs.h new file mode 100644 index 0000000..03af029 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/sys/procfs.h @@ -0,0 +1,109 @@ +/* Copyright (C) 1996, 1997 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_PROCFS_H + +#define _SYS_PROCFS_H 1 +#include <features.h> + +/* This is somehow modelled after the file of the same name on SysVr4 + systems. It provides a definition of the core file format for ELF + used on Linux. */ + +#include <signal.h> +#include <sys/time.h> +#include <sys/types.h> +#include <asm/user.h> +#include <asm/elf.h> + +__BEGIN_DECLS + +struct elf_siginfo + { + int si_signo; /* Signal number. */ + int si_code; /* Extra code. */ + int si_errno; /* Errno. */ + }; + +typedef elf_greg_t greg_t; +typedef elf_gregset_t gregset_t; +typedef elf_fpregset_t fpregset_t; +#define NGREG ELF_NGREG + +/* Definitions to generate Intel SVR4-like core files. These mostly + have the same names as the SVR4 types with "elf_" tacked on the + front to prevent clashes with linux definitions, and the typedef + forms have been avoided. This is mostly like the SVR4 structure, + but more Linuxy, with things that Linux does not support and which + gdb doesn't really use excluded. Fields present but not used are + marked with "XXX". */ +struct elf_prstatus + { +#if 0 + long int pr_flags; /* XXX Process flags. */ + short int pr_why; /* XXX Reason for process halt. */ + short int pr_what; /* XXX More detailed reason. */ +#endif + struct elf_siginfo pr_info; /* Info associated with signal. */ + short int pr_cursig; /* Current signal. */ + unsigned long int pr_sigpend; /* Set of pending signals. */ + unsigned long int pr_sighold; /* Set of held signals. */ +#if 0 + struct sigaltstack pr_altstack; /* Alternate stack info. */ + struct sigaction pr_action; /* Signal action for current sig. */ +#endif + __pid_t pr_pid; + __pid_t pr_ppid; + __pid_t pr_pgrp; + __pid_t pr_sid; + struct timeval pr_utime; /* User time. */ + struct timeval pr_stime; /* System time. */ + struct timeval pr_cutime; /* Cumulative user time. */ + struct timeval pr_cstime; /* Cumulative system time. */ +#if 0 + long int pr_instr; /* Current instruction. */ +#endif + elf_gregset_t pr_reg; /* GP registers. */ + int pr_fpvalid; /* True if math copro being used. */ + }; + + +#define ELF_PRARGSZ (80) /* Number of chars for args */ + +struct elf_prpsinfo + { + char pr_state; /* Numeric process state. */ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + unsigned long int pr_flag; /* Flags. */ + unsigned int pr_uid; + unsigned int pr_gid; + unsigned int pr_pid, pr_ppid, pr_pgrp, pr_sid; + /* Lots missing */ + char pr_fname[16]; /* Filename of executable. */ + char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */ + }; + + +typedef struct elf_prstatus prstatus_t; +typedef struct elf_prpsinfo prpsinfo_t; + +__END_DECLS + +#endif /* sys/procfs.h */ diff --git a/sysdeps/unix/sysv/linux/i386/getgroups.c b/sysdeps/unix/sysv/linux/i386/getgroups.c new file mode 100644 index 0000000..2b8f957 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/getgroups.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1997 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <sys/types.h> +#include <unistd.h> + +#include <linux/posix_types.h> + +extern int __syscall_getgroups __P ((int, __kernel_gid_t *)); + +/* For Linux we must convert the array of groups from the format that the + kernel returns. */ +int +__getgroups (n, groups) + int n; + gid_t *groups; +{ + int i, ngids; + __kernel_gid_t kernel_groups[n]; + + ngids = __syscall_getgroups (n, kernel_groups); + if (n != 0 && ngids > 0) + for (i = 0; i < ngids; i++) + groups[i] = kernel_groups[i]; + return ngids; +} + +weak_alias (__getgroups, getgroups) diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c new file mode 100644 index 0000000..8f87119 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/setgroups.c @@ -0,0 +1,41 @@ +/* Copyright (C) 1997 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <sys/types.h> +#include <unistd.h> +#include <grp.h> + +#include <linux/posix_types.h> + +extern int __syscall_setgroups __P ((int, const __kernel_gid_t *)); + +/* Set the group set for the current user to GROUPS (N of them). For + Linux we must convert the array of groups into the format that the + kernel expects. */ +int +setgroups (n, groups) + size_t n; + const gid_t *groups; +{ + size_t i; + __kernel_gid_t kernel_groups[n]; + + for (i = 0; i < n; i++) + kernel_groups[i] = groups[i]; + return __syscall_setgroups (n, kernel_groups); +} diff --git a/sysdeps/unix/sysv/linux/i386/syscalls.list b/sysdeps/unix/sysv/linux/i386/syscalls.list index d95a120..392a257 100644 --- a/sysdeps/unix/sysv/linux/i386/syscalls.list +++ b/sysdeps/unix/sysv/linux/i386/syscalls.list @@ -1,4 +1,6 @@ # File name Caller Syscall name # args Strong name Weak names +s_getgroups getgroups getgroups 2 __syscall_getgroups s_llseek llseek _llseek 5 __sys_llseek +s_setgroups setgroups setgroups 2 __syscall_setgroups vm86 - vm86 1 __vm86 vm86 diff --git a/sysdeps/unix/sysv/linux/kernel_sigaction.h b/sysdeps/unix/sysv/linux/kernel_sigaction.h new file mode 100644 index 0000000..a058642 --- /dev/null +++ b/sysdeps/unix/sysv/linux/kernel_sigaction.h @@ -0,0 +1,10 @@ +/* This is the sigaction structure from the Linux 2.1.20 kernel. */ + +#define HAVE_SA_RESTORER + +struct kernel_sigaction { + __sighandler_t sa_handler; + unsigned long sa_mask; + unsigned long sa_flags; + void (*sa_restorer) __P ((void)); +}; diff --git a/sysdeps/unix/sysv/linux/m68k/getgroups.c b/sysdeps/unix/sysv/linux/m68k/getgroups.c new file mode 100644 index 0000000..102ea24 --- /dev/null +++ b/sysdeps/unix/sysv/linux/m68k/getgroups.c @@ -0,0 +1,2 @@ +/* We also have to rewrite the kernel gid_t to the user land type. */ +#include <sysdeps/unix/sysv/linux/i386/getgroups.c> diff --git a/sysdeps/unix/sysv/linux/m68k/setgroups.c b/sysdeps/unix/sysv/linux/m68k/setgroups.c new file mode 100644 index 0000000..0e70862 --- /dev/null +++ b/sysdeps/unix/sysv/linux/m68k/setgroups.c @@ -0,0 +1,2 @@ +/* We also have to rewrite the kernel gid_t to the user land type. */ +#include <sysdeps/unix/sysv/linux/i386/setgroups.c> diff --git a/sysdeps/unix/sysv/linux/m68k/syscalls.list b/sysdeps/unix/sysv/linux/m68k/syscalls.list index 7883d70..9a3e4d0 100644 --- a/sysdeps/unix/sysv/linux/m68k/syscalls.list +++ b/sysdeps/unix/sysv/linux/m68k/syscalls.list @@ -1,3 +1,5 @@ # File name Caller Syscall name # args Strong name Weak names +s_getgroups getgroups getgroups 2 __syscall_getgroups s_llseek llseek _llseek 5 __sys_llseek +s_setgroups setgroups setgroups 2 __syscall_setgroups diff --git a/sysdeps/unix/sysv/linux/sigaction.c b/sysdeps/unix/sysv/linux/sigaction.c new file mode 100644 index 0000000..a7b3e07 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sigaction.c @@ -0,0 +1,63 @@ +/* Copyright (C) 1997 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <signal.h> + +/* The difference here is that the sigaction structure used in the + kernel is not the same as we use in the libc. Therefore we must + translate it here. */ +#include <kernel_sigaction.h> + +extern int __syscall_sigaction (int, const struct kernel_sigaction *, + struct kernel_sigaction *); + +/* If ACT is not NULL, change the action for SIG to *ACT. + If OACT is not NULL, put the old action for SIG in *OACT. */ +int +__sigaction (sig, act, oact) + int sig; + const struct sigaction *act; + struct sigaction *oact; +{ + struct kernel_sigaction k_sigact, k_osigact; + int error; + + if (act) + { + k_sigact.sa_handler = act->sa_handler; + k_sigact.sa_mask = act->sa_mask.__val[0]; + k_sigact.sa_flags = act->sa_flags; +#ifdef HAVE_SA_RESTORER + k_sigact.sa_restorer = act->sa_restorer; +#endif + } + error = __syscall_sigaction (sig, act ? &k_sigact : 0, + oact ? &k_osigact : 0); + if (oact && error >= 0) + { + oact->sa_handler = k_osigact.sa_handler; + oact->sa_mask.__val[0] = k_osigact.sa_mask; + oact->sa_flags = k_osigact.sa_flags; +#ifdef HAVE_SA_RESTORER + oact->sa_restorer = k_osigact.sa_restorer; +#endif + } + return error; +} + +weak_alias (__sigaction, sigaction) diff --git a/sysdeps/unix/sysv/linux/sys/ipc_buf.h b/sysdeps/unix/sysv/linux/sys/ipc_buf.h index a1eba68..f5fea0d 100644 --- a/sysdeps/unix/sysv/linux/sys/ipc_buf.h +++ b/sysdeps/unix/sysv/linux/sys/ipc_buf.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -25,43 +25,43 @@ #include <sys/types.h> /* Mode bits for `msgget', `semget', and `shmget'. */ -#define IPC_CREAT 01000 /* create key if key does not exist */ -#define IPC_EXCL 02000 /* fail if key exists */ -#define IPC_NOWAIT 04000 /* return error on wait */ +#define IPC_CREAT 01000 /* Create key if key does not exist. */ +#define IPC_EXCL 02000 /* Fail if key exists. */ +#define IPC_NOWAIT 04000 /* Return error on wait. */ /* Control commands for `msgctl', `semctl', and `shmctl'. */ -#define IPC_RMID 0 /* remove identifier */ -#define IPC_SET 1 /* set `ipc_perm' options */ -#define IPC_STAT 2 /* get `ipc_perm' options */ -#define IPC_INFO 3 /* see ipcs */ +#define IPC_RMID 0 /* Remove identifier. */ +#define IPC_SET 1 /* Set `ipc_perm' options. */ +#define IPC_STAT 2 /* Get `ipc_perm' options. */ +#define IPC_INFO 3 /* See ipcs. */ __BEGIN_DECLS /* Special key values. */ -#define IPC_PRIVATE ((key_t) 0) /* private key */ +#define IPC_PRIVATE ((__key_t) 0) /* Private key. */ /* Data structure used to pass permission information to IPC operations. */ struct ipc_perm -{ - key_t __key; /* key */ - __uid_t uid; /* owner's user ID */ - __gid_t gid; /* owner's group ID */ - __uid_t cuid; /* creator's user ID */ - __gid_t cgid; /* creator's group ID */ - __mode_t mode; /* read/write permission */ - unsigned short int __seq; /* sequence number */ -}; + { + __key_t __key; /* Key. */ + unsigned short int uid; /* Owner's user ID. */ + unsigned short int gid; /* Owner's group ID. */ + unsigned short int cuid; /* Creator's user ID. */ + unsigned short int cgid; /* Creator's group ID. */ + unsigned short int mode; /* Read/write permission. */ + unsigned short int __seq; /* Sequence number. */ + }; /* Kludge to work around Linux' restriction of only up to five arguments to a system call. */ struct ipc_kludge -{ - void *msgp; - long msgtyp; -}; + { + void *msgp; + long int msgtyp; + }; /* The actual system call: all functions are multiplexed by this. */ extern int __ipc __P ((int __call, int __first, int __second, int __third, diff --git a/sysdeps/unix/sysv/linux/sys/mtio.h b/sysdeps/unix/sysv/linux/sys/mtio.h index 45db6a5..e238ef9 100644 --- a/sysdeps/unix/sysv/linux/sys/mtio.h +++ b/sysdeps/unix/sysv/linux/sys/mtio.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Structures and definitions for magnetic tape I/O control commands. + Copyright (C) 1996, 1997 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,13 +17,250 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* Written by H. Bergman <hennus@cybercomm.nl>. */ + #ifndef _SYS_MTIO_H #define _SYS_MTIO_H 1 /* Get necessary definitions from system and kernel headers. */ #include <sys/types.h> #include <sys/ioctl.h> -#include <linux/mtio.h> + + +/* Structure for MTIOCTOP - magnetic tape operation command. */ +struct mtop + { + short int mt_op; /* Operations defined below. */ + int mt_count; /* How many of them. */ + }; + +/* Magnetic Tape operations [Not all operations supported by all drivers]. */ +#define MTRESET 0 /* +reset drive in case of problems. */ +#define MTFSF 1 /* Forward space over FileMark, + * position at first record of next file. */ +#define MTBSF 2 /* Backward space FileMark (position before FM). */ +#define MTFSR 3 /* Forward space record. */ +#define MTBSR 4 /* Backward space record. */ +#define MTWEOF 5 /* Write an end-of-file record (mark). */ +#define MTREW 6 /* Rewind. */ +#define MTOFFL 7 /* Rewind and put the drive offline (eject?). */ +#define MTNOP 8 /* No op, set status only (read with MTIOCGET). */ +#define MTRETEN 9 /* Retension tape. */ +#define MTBSFM 10 /* +backward space FileMark, position at FM. */ +#define MTFSFM 11 /* +forward space FileMark, position at FM. */ +#define MTEOM 12 /* Goto end of recorded media (for appending files). + MTEOM positions after the last FM, ready for + appending another file. */ +#define MTERASE 13 /* Erase tape -- be careful! */ + +#define MTRAS1 14 /* Run self test 1 (nondestructive). */ +#define MTRAS2 15 /* Run self test 2 (destructive). */ +#define MTRAS3 16 /* Reserved for self test 3. */ + +#define MTSETBLK 20 /* Set block length (SCSI). */ +#define MTSETDENSITY 21 /* Set tape density (SCSI). */ +#define MTSEEK 22 /* Seek to block (Tandberg, etc.). */ +#define MTTELL 23 /* Tell block (Tandberg, etc.). */ +#define MTSETDRVBUFFER 24 /* Set the drive buffering according to SCSI-2. + Ordinary buffered operation with code 1. */ +#define MTFSS 25 /* Space forward over setmarks. */ +#define MTBSS 26 /* Space backward over setmarks. */ +#define MTWSM 27 /* Write setmarks. */ + +#define MTLOCK 28 /* Lock the drive door. */ +#define MTUNLOCK 29 /* Unlock the drive door. */ +#define MTLOAD 30 /* Execute the SCSI load command. */ +#define MTUNLOAD 31 /* Execute the SCSI unload command. */ +#define MTCOMPRESSION 32/* Control compression with SCSI mode page 15. */ +#define MTSETPART 33 /* Change the active tape partition. */ +#define MTMKPART 34 /* Format the tape with one or two partitions. */ + +/* structure for MTIOCGET - mag tape get status command */ + +struct mtget + { + long int mt_type; /* Type of magtape device. */ + long int mt_resid; /* Residual count: (not sure) + number of bytes ignored, or + number of files not skipped, or + number of records not skipped. */ + /* The following registers are device dependent. */ + long int mt_dsreg; /* Status register. */ + long int mt_gstat; /* Generic (device independent) status. */ + long int mt_erreg; /* Error register. */ + /* The next two fields are not always used. */ + __daddr_t mt_fileno; /* Number of current file on tape. */ + __daddr_t mt_blkno; /* Current block number. */ + }; + + + +/* Constants for mt_type. Not all of these are supported, and + these are not all of the ones that are supported. */ +#define MT_ISUNKNOWN 0x01 +#define MT_ISQIC02 0x02 /* Generic QIC-02 tape streamer. */ +#define MT_ISWT5150 0x03 /* Wangtek 5150EQ, QIC-150, QIC-02. */ +#define MT_ISARCHIVE_5945L2 0x04 /* Archive 5945L-2, QIC-24, QIC-02?. */ +#define MT_ISCMSJ500 0x05 /* CMS Jumbo 500 (QIC-02?). */ +#define MT_ISTDC3610 0x06 /* Tandberg 6310, QIC-24. */ +#define MT_ISARCHIVE_VP60I 0x07 /* Archive VP60i, QIC-02. */ +#define MT_ISARCHIVE_2150L 0x08 /* Archive Viper 2150L. */ +#define MT_ISARCHIVE_2060L 0x09 /* Archive Viper 2060L. */ +#define MT_ISARCHIVESC499 0x0A /* Archive SC-499 QIC-36 controller. */ +#define MT_ISQIC02_ALL_FEATURES 0x0F /* Generic QIC-02 with all features. */ +#define MT_ISWT5099EEN24 0x11 /* Wangtek 5099-een24, 60MB, QIC-24. */ +#define MT_ISTEAC_MT2ST 0x12 /* Teac MT-2ST 155mb drive, + Teac DC-1 card (Wangtek type). */ +#define MT_ISEVEREX_FT40A 0x32 /* Everex FT40A (QIC-40). */ +#define MT_ISDDS1 0x51 /* DDS device without partitions. */ +#define MT_ISDDS2 0x52 /* DDS device with partitions. */ +#define MT_ISSCSI1 0x71 /* Generic ANSI SCSI-1 tape unit. */ +#define MT_ISSCSI2 0x72 /* Generic ANSI SCSI-2 tape unit. */ + +/* QIC-40/80/3010/3020 ftape supported drives. + 20bit vendor ID + 0x800000 (see vendors.h in ftape distribution). */ +#define MT_ISFTAPE_UNKNOWN 0x800000 /* obsolete */ +#define MT_ISFTAPE_FLAG 0x800000 + +struct mt_tape_info + { + long int t_type; /* Device type id (mt_type). */ + char *t_name; /* Descriptive name. */ + }; + +#define MT_TAPE_INFO \ + { \ + {MT_ISUNKNOWN, "Unknown type of tape device"}, \ + {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \ + {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \ + {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \ + {MT_ISCMSJ500, "CMS Jumbo 500"}, \ + {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \ + {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \ + {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \ + {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \ + {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \ + {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \ + {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \ + {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \ + {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \ + {MT_ISSCSI1, "Generic SCSI-1 tape"}, \ + {MT_ISSCSI2, "Generic SCSI-2 tape"}, \ + {0, NULL} \ + } + + +/* Structure for MTIOCPOS - mag tape get position command. */ + +struct mtpos + { + long int mt_blkno; /* Current block number. */ + }; + + +/* Structure for MTIOCGETCONFIG/MTIOCSETCONFIG primarily intended + as an interim solution for QIC-02 until DDI is fully implemented. */ +struct mtconfiginfo + { + long int mt_type; /* Drive type. */ + long int ifc_type; /* Interface card type. */ + unsigned short int irqnr; /* IRQ number to use. */ + unsigned short int dmanr; /* DMA channel to use. */ + unsigned short int port; /* IO port base address. */ + + unsigned long int debug; /* Debugging flags. */ + + unsigned have_dens:1; + unsigned have_bsf:1; + unsigned have_fsr:1; + unsigned have_bsr:1; + unsigned have_eod:1; + unsigned have_seek:1; + unsigned have_tell:1; + unsigned have_ras1:1; + unsigned have_ras2:1; + unsigned have_ras3:1; + unsigned have_qfa:1; + + unsigned pad1:5; + char reserved[10]; + }; + + +/* Magnetic tape I/O control commands. */ +#define MTIOCTOP _IOW('m', 1, struct mtop) /* Do a mag tape op. */ +#define MTIOCGET _IOR('m', 2, struct mtget) /* Get tape status. */ +#define MTIOCPOS _IOR('m', 3, struct mtpos) /* Get tape position.*/ + +/* The next two are used by the QIC-02 driver for runtime reconfiguration. + See tpqic02.h for struct mtconfiginfo. */ +#define MTIOCGETCONFIG _IOR('m', 4, struct mtconfiginfo) /* Get tape config.*/ +#define MTIOCSETCONFIG _IOW('m', 5, struct mtconfiginfo) /* Set tape config.*/ + +/* Generic Mag Tape (device independent) status macros for examining + mt_gstat -- HP-UX compatible. + There is room for more generic status bits here, but I don't + know which of them are reserved. At least three or so should + be added to make this really useful. */ +#define GMT_EOF(x) ((x) & 0x80000000) +#define GMT_BOT(x) ((x) & 0x40000000) +#define GMT_EOT(x) ((x) & 0x20000000) +#define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */ +#define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */ +#define GMT_WR_PROT(x) ((x) & 0x04000000) +/* #define GMT_ ? ((x) & 0x02000000) */ +#define GMT_ONLINE(x) ((x) & 0x01000000) +#define GMT_D_6250(x) ((x) & 0x00800000) +#define GMT_D_1600(x) ((x) & 0x00400000) +#define GMT_D_800(x) ((x) & 0x00200000) +/* #define GMT_ ? ((x) & 0x00100000) */ +/* #define GMT_ ? ((x) & 0x00080000) */ +#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* Door open (no tape). */ +/* #define GMT_ ? ((x) & 0x00020000) */ +#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* Immediate report mode.*/ +/* 16 generic status bits unused. */ + + +/* SCSI-tape specific definitions. Bitfield shifts in the status */ +#define MT_ST_BLKSIZE_SHIFT 0 +#define MT_ST_BLKSIZE_MASK 0xffffff +#define MT_ST_DENSITY_SHIFT 24 +#define MT_ST_DENSITY_MASK 0xff000000 + +#define MT_ST_SOFTERR_SHIFT 0 +#define MT_ST_SOFTERR_MASK 0xffff + +/* Bitfields for the MTSETDRVBUFFER ioctl. */ +#define MT_ST_OPTIONS 0xf0000000 +#define MT_ST_BOOLEANS 0x10000000 +#define MT_ST_SETBOOLEANS 0x30000000 +#define MT_ST_CLEARBOOLEANS 0x40000000 +#define MT_ST_WRITE_THRESHOLD 0x20000000 +#define MT_ST_DEF_BLKSIZE 0x50000000 +#define MT_ST_DEF_OPTIONS 0x60000000 + +#define MT_ST_BUFFER_WRITES 0x1 +#define MT_ST_ASYNC_WRITES 0x2 +#define MT_ST_READ_AHEAD 0x4 +#define MT_ST_DEBUGGING 0x8 +#define MT_ST_TWO_FM 0x10 +#define MT_ST_FAST_MTEOM 0x20 +#define MT_ST_AUTO_LOCK 0x40 +#define MT_ST_DEF_WRITES 0x80 +#define MT_ST_CAN_BSR 0x100 +#define MT_ST_NO_BLKLIMS 0x200 +#define MT_ST_CAN_PARTITIONS 0x400 +#define MT_ST_SCSI2LOGICAL 0x800 + +/* The mode parameters to be controlled. Parameter chosen with bits 20-28. */ +#define MT_ST_CLEAR_DEFAULT 0xfffff +#define MT_ST_DEF_DENSITY (MT_ST_DEF_OPTIONS | 0x100000) +#define MT_ST_DEF_COMPRESSION (MT_ST_DEF_OPTIONS | 0x200000) +#define MT_ST_DEF_DRVBUFFER (MT_ST_DEF_OPTIONS | 0x300000) + +/* The offset for the arguments for the special HP changer load command. */ +#define MT_ST_HPLOADER_OFFSET 10000 + /* Specify default tape device. */ #ifndef DEFTAPE diff --git a/sysdeps/unix/sysv/linux/sys/procfs.h b/sysdeps/unix/sysv/linux/sys/procfs.h index 59f0fcd..e8d3239 100644 --- a/sysdeps/unix/sysv/linux/sys/procfs.h +++ b/sysdeps/unix/sysv/linux/sys/procfs.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 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 @@ -34,11 +34,11 @@ __BEGIN_DECLS struct elf_siginfo -{ - int si_signo; /* signal number */ - int si_code; /* extra code */ - int si_errno; /* errno */ -}; + { + int si_signo; /* Signal number. */ + int si_code; /* Extra code. */ + int si_errno; /* Errno. */ + }; typedef elf_greg_t greg_t; typedef elf_gregset_t gregset_t; @@ -53,52 +53,52 @@ typedef elf_fpregset_t fpregset_t; gdb doesn't really use excluded. Fields present but not used are marked with "XXX". */ struct elf_prstatus -{ + { #if 0 - long pr_flags; /* XXX Process flags */ - short pr_why; /* XXX Reason for process halt */ - short pr_what; /* XXX More detailed reason */ + long int pr_flags; /* XXX Process flags. */ + short int pr_why; /* XXX Reason for process halt. */ + short int pr_what; /* XXX More detailed reason. */ #endif - struct elf_siginfo pr_info; /* Info associated with signal */ - short pr_cursig; /* Current signal */ - sigset_t pr_sigpend; /* Set of pending signals */ - sigset_t pr_sighold; /* Set of held signals */ + struct elf_siginfo pr_info; /* Info associated with signal. */ + short int pr_cursig; /* Current signal. */ + unsigned long int pr_sigpend; /* Set of pending signals. */ + unsigned long int pr_sighold; /* Set of held signals. */ #if 0 - struct sigaltstack pr_altstack; /* Alternate stack info */ - struct sigaction pr_action; /* Signal action for current sig */ + struct sigaltstack pr_altstack; /* Alternate stack info. */ + struct sigaction pr_action; /* Signal action for current sig. */ #endif - pid_t pr_pid; - pid_t pr_ppid; - pid_t pr_pgrp; - pid_t pr_sid; - struct timeval pr_utime; /* User time */ - struct timeval pr_stime; /* System time */ - struct timeval pr_cutime; /* Cumulative user time */ - struct timeval pr_cstime; /* Cumulative system time */ + __pid_t pr_pid; + __pid_t pr_ppid; + __pid_t pr_pgrp; + __pid_t pr_sid; + struct timeval pr_utime; /* User time. */ + struct timeval pr_stime; /* System time. */ + struct timeval pr_cutime; /* Cumulative user time. */ + struct timeval pr_cstime; /* Cumulative system time. */ #if 0 - long pr_instr; /* Current instruction */ + long int pr_instr; /* Current instruction. */ #endif - elf_gregset_t pr_reg; /* GP registers */ - int pr_fpvalid; /* True if math copro being used. */ -}; + elf_gregset_t pr_reg; /* GP registers. */ + int pr_fpvalid; /* True if math copro being used. */ + }; #define ELF_PRARGSZ (80) /* Number of chars for args */ struct elf_prpsinfo -{ - char pr_state; /* numeric process state */ - char pr_sname; /* char for pr_state */ - char pr_zomb; /* zombie */ - char pr_nice; /* nice val */ - unsigned long pr_flag; /* flags */ - uid_t pr_uid; - gid_t pr_gid; - pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid; - /* Lots missing */ - char pr_fname[16]; /* filename of executable */ - char pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */ -}; + { + char pr_state; /* Numeric process state. */ + char pr_sname; /* Char for pr_state. */ + char pr_zomb; /* Zombie. */ + char pr_nice; /* Nice val. */ + unsigned long int pr_flag; /* Flags. */ + unsigned short int pr_uid; + unsigned short int pr_gid; + unsigned short int pr_pid, pr_ppid, pr_pgrp, pr_sid; + /* Lots missing */ + char pr_fname[16]; /* Filename of executable. */ + char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */ + }; typedef struct elf_prstatus prstatus_t; diff --git a/sysdeps/unix/sysv/linux/sys/sysmacros.h b/sysdeps/unix/sysv/linux/sys/sysmacros.h index b859dc7..85b1b85 100644 --- a/sysdeps/unix/sysv/linux/sys/sysmacros.h +++ b/sysdeps/unix/sysv/linux/sys/sysmacros.h @@ -22,8 +22,8 @@ #define _SYS_SYSMACROS_H 1 /* For compatibility we provide alternative names. */ -#define major(dev) ((dev) >> 32) -#define minor(dev) ((dev) & 0xffffffff) -#define makedev(major, minor) (((major) << 32) | (monor)) +#define major(dev) (((dev) >> 8) & 0xff) +#define minor(dev) ((dev) & 0xff) +#define makedev(major, minor) (((major) << 8) | (minor)) #endif /* _SYS_SYSMACROS_H */ diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 5367a28..20ac94a 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -35,6 +35,7 @@ s_getdents EXTRA getdents 3 __getdents s_getpriority getpriority getpriority 2 __syscall_getpriority s_ptrace ptrace ptrace 4 __syscall_ptrace s_reboot EXTRA reboot 3 __syscall_reboot +s_sigaction sigaction sigaction 3 __syscall_sigaction s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend s_sysctl sysctl _sysctl 1 __syscall__sysctl s_ustat ustat ustat 2 __syscall_ustat diff --git a/time/Makefile b/time/Makefile index 966d9f2..af03fa2 100644 --- a/time/Makefile +++ b/time/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. +# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 @@ -12,9 +12,9 @@ # 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. +# License along with the GNU C Library; see the file COPYING.LIB. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. # # Makefile for time routines @@ -36,15 +36,21 @@ routines := offtime asctime clock ctime ctime_r difftime \ others := ap zdump zic tests := test_time clocktest test-tz +# Before the test-tz test can be run we need the data to be installed. +tests: install-test-data + + tzfiles := africa antarctica asia australasia europe northamerica \ southamerica etcetera factory systemv backward \ solar87 solar88 solar89 # pacificnew doesn't compile; if it is to be used, it should be included in # northamerica. -distribute := $(distribute) $(tzfiles) leapseconds pacificnew +distribute := $(distribute) $(tzfiles) leapseconds pacificnew simplebackw install-sbin := zic zdump +generated-dirs = testdata + all: # Make this the default target; it will be defined in Rules. include ../Makeconfig # Get objpfx defined so we can use it below. @@ -72,6 +78,11 @@ install-others = $(addprefix $(zonedir)/,$(zonenames) \ $(installed-localtime-file) $(installed-posixrules-file) endif +ifeq ($(have-ksh),yes) +install-others += $(zonedir)/iso3166.tab $(zonedir)/zone.tab +install-bin += tzselect +endif + include ../Rules @@ -146,3 +157,25 @@ CFLAGS-zic.c = -Wno-strict-prototypes -DNOID $(tz-cflags) CFLAGS-ialloc.c = -Wno-strict-prototypes -DNOID CFLAGS-scheck.c = -Wno-strict-prototypes -DNOID CFLAGS-tzfile.c = $(tz-cflags) + +# We have to make sure the data for testing the tz functions is available. +.PHONY: install-test-data +install-test-data: northamerica $(objpfx)zic $(leapseconds) yearistype \ + etcetera simplebackw + -mkdir $(objpfx)testdata + $(built-program-cmd) -d $(objpfx)testdata -L $(leapseconds) \ + -y yearistype northamerica + $(built-program-cmd) -d $(objpfx)testdata -L $(leapseconds) \ + -y yearistype etcetera + $(built-program-cmd) -d $(objpfx)testdata -L $(leapseconds) \ + -y yearistype simplebackw +test-tz-ENV = TZDIR=$(objpfx)testdata + + +$(objpfx)tzselect: tzselect.ksh + sed -e 's%@KSH@%$(KSH)%g' \ + -e 's%@TZDIR@%$(zonedir)%g' < $< > $@.new + chmod 555 $@.new + mv -f $@.new $@ + +$(addprefix $(zonedir)/,iso3166.tab zone.tab): $(zonedir)/%: %; $(do-install) diff --git a/time/mktime.c b/time/mktime.c index 7fa5ccb..223872f 100644 --- a/time/mktime.c +++ b/time/mktime.c @@ -1,22 +1,21 @@ -/* Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. Contributed by Paul Eggert (eggert@twinsun.com). -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 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. -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. */ + 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* Define this to have a standalone program to test this implementation of mktime. */ @@ -86,6 +85,9 @@ Cambridge, MA 02139, USA. */ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) #endif +/* Prototype for the internal function to get information based on TZ. */ +extern void __tzset_internal __P ((int always)); + /* How many days come before each month (0-12). */ const unsigned short int __mon_yday[2][13] = { @@ -161,6 +163,11 @@ time_t mktime (tp) struct tm *tp; { +#ifdef _LIBC + /* Update internal database according to current TZ setting. */ + __tzset_internal (1); +#endif + return __mktime_internal (tp, localtime_r, &localtime_offset); } diff --git a/time/simplebackw b/time/simplebackw new file mode 100644 index 0000000..860624a --- /dev/null +++ b/time/simplebackw @@ -0,0 +1,2 @@ +Link Etc/UTC UTC +Link Etc/Universal Universal diff --git a/time/strptime.c b/time/strptime.c index bd38f96..f220313 100644 --- a/time/strptime.c +++ b/time/strptime.c @@ -1,5 +1,5 @@ -/* strptime - Convert a string representation of time to a time value. - Copyright (C) 1996 Free Software Foundation, Inc. +/* Convert a string representation of time to a time value. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -18,24 +18,71 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/* XXX This version of the implementation is not really complete. + Some of the fields cannot add information alone. But if seeing + some of them in the same format (such as year, week and weekday) + this is enough information for determining the date. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + #include <ctype.h> #include <langinfo.h> #include <limits.h> #include <string.h> #include <time.h> -#include "../locale/localeinfo.h" +#ifdef _LIBC +# include "../locale/localeinfo.h" +#endif + + +#ifndef __P +# if defined (__GNUC__) || (defined (__STDC__) && __STDC__) +# define __P(args) args +# else +# define __P(args) () +# endif /* GCC. */ +#endif /* Not __P. */ + +#if ! HAVE_LOCALTIME_R && ! defined (localtime_r) +#ifdef _LIBC +#define localtime_r __localtime_r +#else +/* Approximate localtime_r as best we can in its absence. */ +#define localtime_r my_localtime_r +static struct tm *localtime_r __P ((const time_t *, struct tm *)); +static struct tm * +localtime_r (t, tp) + const time_t *t; + struct tm *tp; +{ + struct tm *l = localtime (t); + if (! l) + return 0; + *tp = *l; + return tp; +} +#endif /* ! _LIBC */ +#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */ #define match_char(ch1, ch2) if (ch1 != ch2) return NULL -#define match_string(cs1, s2) \ +#if defined __GNUC__ && __GNUC__ >= 2 +# define match_string(cs1, s2) \ ({ size_t len = strlen (cs1); \ - int result = strncasecmp (cs1, s2, len) == 0; \ - if (result) s2 += len; \ + int result = strncasecmp ((cs1), (s2), len) == 0; \ + if (result) (s2) += len; \ result; }) +#else +/* Oh come on. Get a reasonable compiler. */ +# define match_string(cs1, s2) \ + (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) +#endif /* We intentionally do not use isdigit() for testing because this will lead to problems with the wide character version. */ -#define get_number(from, to) \ +#define get_number(from, to) \ do { \ val = 0; \ if (*rp < '0' || *rp > '9') \ @@ -47,33 +94,98 @@ if (val < from || val > to) \ return NULL; \ } while (0) -#define get_alt_number(from, to) \ +#ifdef _NL_CURRENT +# define get_alt_number(from, to) \ do { \ - const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \ - val = 0; \ - while (*alts != '\0') \ + if (*decided != raw) \ { \ - size_t len = strlen (alts); \ - if (strncasecmp (alts, rp, len) == 0) \ - break; \ - alts = strchr (alts, '\0') + 1; \ - ++val; \ + const char *alts = _NL_CURRENT (LC_TIME, ALT_DIGITS); \ + val = 0; \ + while (*alts != '\0') \ + { \ + size_t len = strlen (alts); \ + if (strncasecmp (alts, rp, len) == 0) \ + break; \ + alts = strchr (alts, '\0') + 1; \ + ++val; \ + } \ + if (*alts == '\0') \ + { \ + if (*decided == loc && val != 0) \ + return NULL; \ + } \ + else \ + { \ + *decided = loc; \ + break; \ + } \ } \ - if (*alts == '\0') \ - return NULL; \ - } while (0) -#define recursive(new_fmt) \ - do { \ - if (*new_fmt == '\0') \ - return NULL; \ - rp = strptime (rp, new_fmt, tm); \ - if (rp == NULL) \ - return NULL; \ + get_number (from, to); \ } while (0) +#else +# define get_alt_number(from, to) \ + /* We don't have the alternate representation. */ \ + get_number(from, to) +#endif +#define recursive(new_fmt) \ + (*(new_fmt) != '\0' \ + || strptime_internal (rp, (new_fmt), tm, decided) != NULL) -char * -strptime (const char *buf, const char *format, struct tm *tm) +#ifdef _LIBC +/* This is defined in locale/C-time.c in the GNU libc. */ +extern const struct locale_data _nl_C_LC_TIME; + +# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string) +# define ab_weekday_name \ + (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string) +# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string) +# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string) +# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string) +# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string) +# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string) +# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string) +# define HERE_T_FMT_AMPM \ + (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string) +# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string) +#else +static char const weekday_name[][10] = + { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }; +static char const ab_weekday_name[][4] = + { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; +static char const month_name[][10] = + { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }; +static char const ab_month_name[][4] = + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; +# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" +# define HERE_D_FMT "%m/%d/%y" +# define HERE_AM_STR "AM" +# define HERE_PM_STR "PM" +# define HERE_T_FMT_AMPM "%I:%M:%S %p" +# define HERE_T_FMT "%H:%M:%S" +#endif + +/* Status of lookup: do we use the locale data or the raw data? */ +enum locale_status { not, loc, raw }; + + +static char * +strptime_internal (buf, format, tm, decided) + const char *buf; + const char *format; + struct tm *tm; + enum locale_status *decided; { const char *rp; const char *fmt; @@ -106,6 +218,10 @@ strptime (const char *buf, const char *format, struct tm *tm) } ++fmt; +#ifndef _NL_CURRENT + /* We need this for handling the `E' modifier. */ + start_over: +#endif switch (*fmt++) { case '%': @@ -117,10 +233,34 @@ strptime (const char *buf, const char *format, struct tm *tm) /* Match day of week. */ for (cnt = 0; cnt < 7; ++cnt) { - if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp)) - break; - if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp)) - break; +#ifdef _NL_CURRENT + if (*decided !=raw) + { + if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), + ab_weekday_name[cnt])) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt), + weekday_name[cnt])) + *decided = loc; + break; + } + } +#endif + if (*decided != loc + && (match_string (ab_weekday_name[cnt], rp) + || match_string (weekday_name[cnt], rp))) + { + *decided = raw; + break; + } } if (cnt == 7) /* Does not match a weekday name. */ @@ -133,10 +273,33 @@ strptime (const char *buf, const char *format, struct tm *tm) /* Match month name. */ for (cnt = 0; cnt < 12; ++cnt) { - if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp)) - break; - if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp)) - break; +#ifdef _NL_CURRENT + if (*decided !=raw) + { + if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), + ab_month_name[cnt])) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp)) + { + if (*decided == not + && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt), + month_name[cnt])) + *decided = loc; + break; + } + } +#endif + if (match_string (ab_month_name[cnt], rp) + || match_string (month_name[cnt], rp)) + { + *decided = raw; + break; + } } if (cnt == 12) /* Does not match a month name. */ @@ -145,7 +308,26 @@ strptime (const char *buf, const char *format, struct tm *tm) break; case 'c': /* Match locale's date and time format. */ - recursive (_NL_CURRENT (LC_TIME, D_T_FMT)); +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT))) + { + if (*decided == loc) + return NULL; + } + else + { + if (*decided == not && + strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + if (!recursive (HERE_D_T_FMT)) + return NULL; break; case 'C': /* Match century number. */ @@ -158,9 +340,30 @@ strptime (const char *buf, const char *format, struct tm *tm) get_number (1, 31); tm->tm_mday = val; break; + case 'x': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, D_FMT))) + { + if (*decided == loc) + return NULL; + } + else + { + if (decided == not + && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + /* Fall through. */ case 'D': /* Match standard day format. */ - recursive ("%m/%d/%y"); + if (!recursive (HERE_D_FMT)) + return NULL; break; case 'H': /* Match hour in 24-hour clock. */ @@ -197,19 +400,57 @@ strptime (const char *buf, const char *format, struct tm *tm) break; case 'p': /* Match locale's equivalent of AM/PM. */ - if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp)) - break; - if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp)) +#ifdef _NL_CURRENT + if (*decided != raw) { - is_pm = 1; - break; + if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp)) + { + if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR)) + *decided = loc; + break; + } + if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp)) + { + if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR)) + *decided = loc; + is_pm = 1; + break; + } + *decided = raw; } - return NULL; +#endif + if (!match_string (HERE_AM_STR, rp)) + if (match_string (HERE_PM_STR, rp)) + is_pm = 1; + else + return NULL; + break; case 'r': - recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)); +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM))) + { + if (*decided == loc) + return NULL; + } + else + { + if (*decided == not && + strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM), + HERE_T_FMT_AMPM)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + if (!recursive (HERE_T_FMT_AMPM)) + return NULL; break; case 'R': - recursive ("%H:%M"); + if (!recursive ("%H:%M")) + return NULL; break; case 's': { @@ -229,7 +470,7 @@ strptime (const char *buf, const char *format, struct tm *tm) } while (*rp >= '0' && *rp <= '9'); - if (__localtime_r (&secs, tm) == NULL) + if (localtime_r (&secs, tm) == NULL) /* Error in function. */ return NULL; } @@ -238,8 +479,28 @@ strptime (const char *buf, const char *format, struct tm *tm) get_number (0, 61); tm->tm_sec = val; break; + case 'X': +#ifdef _NL_CURRENT + if (*decided != raw) + { + if (!recursive (_NL_CURRENT (LC_TIME, T_FMT))) + { + if (*decided == loc) + return NULL; + } + else + { + if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } +#endif + /* Fall through. */ case 'T': - recursive ("%H:%M:%S"); + if (!recursive (HERE_T_FMT)) + return NULL; break; case 'u': get_number (1, 7); @@ -262,19 +523,14 @@ strptime (const char *buf, const char *format, struct tm *tm) case 'V': case 'W': get_number (0, 53); - /* XXX This cannot determine any field in TM. */ + /* XXX This cannot determine any field in TM without some + information. */ break; case 'w': /* Match number of weekday. */ get_number (0, 6); tm->tm_wday = val; break; - case 'x': - recursive (_NL_CURRENT (LC_TIME, D_FMT)); - break; - case 'X': - recursive (_NL_CURRENT (LC_TIME, T_FMT)); - break; case 'y': /* Match year within century. */ get_number (0, 99); @@ -289,11 +545,35 @@ strptime (const char *buf, const char *format, struct tm *tm) /* XXX How to handle this? */ break; case 'E': +#ifdef _NL_CURRENT switch (*fmt++) { case 'c': /* Match locale's alternate date and time format. */ - recursive (_NL_CURRENT (LC_TIME, ERA_D_T_FMT)); + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, D_T_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + } + else + { + if (strcmp (fmt, HERE_D_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + /* The C locale has no era information, so use the + normal representation. */ + if (!recursive (HERE_D_T_FMT)) + return NULL; break; case 'C': case 'y': @@ -301,20 +581,70 @@ strptime (const char *buf, const char *format, struct tm *tm) /* Match name of base year in locale's alternate representation. */ /* XXX This is currently not implemented. It should - use the value _NL_CURRENT (LC_TIME, ERA) but POSIX - leaves this implementation defined and we haven't - figured out how to do it yet. */ + use the value _NL_CURRENT (LC_TIME, ERA). */ break; case 'x': - recursive (_NL_CURRENT (LC_TIME, ERA_D_FMT)); + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, D_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + } + else + { + if (strcmp (fmt, HERE_D_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + if (!recursive (HERE_D_FMT)) + return NULL; break; case 'X': - recursive (_NL_CURRENT (LC_TIME, ERA_T_FMT)); + if (*decided != raw) + { + const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT); + + if (*fmt == '\0') + fmt = _NL_CURRENT (LC_TIME, T_FMT); + + if (!recursive (fmt)) + { + if (*decided == loc) + return NULL; + } + else + { + if (strcmp (fmt, HERE_T_FMT)) + *decided = loc; + break; + } + *decided = raw; + } + if (!recursive (HERE_T_FMT)) + return NULL; break; default: return NULL; } break; +#else + /* We have no information about the era format. Just use + the normal format. */ + if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' + && *fmt != 'x' && *fmt != 'X') + /* This is an illegal format. */ + return NULL; + + goto start_over; +#endif case 'O': switch (*fmt++) { @@ -357,7 +687,8 @@ strptime (const char *buf, const char *format, struct tm *tm) case 'V': case 'W': get_alt_number (0, 53); - /* XXX This cannot determine any field in TM. */ + /* XXX This cannot determine any field in TM without + further information. */ break; case 'w': /* Match number of weekday using alternate numeric symbols. */ @@ -382,3 +713,19 @@ strptime (const char *buf, const char *format, struct tm *tm) return (char *) rp; } + + +char * +strptime (buf, format, tm) + const char *buf; + const char *format; + struct tm *tm; +{ + enum locale_status decided; +#ifdef _NL_CURRENT + decided = not; +#else + decided = raw; +#endif + return strptime_internal (buf, format, tm, &decided); +} diff --git a/time/test-tz.c b/time/test-tz.c index 2e1432c..528aa6f 100644 --- a/time/test-tz.c +++ b/time/test-tz.c @@ -17,7 +17,7 @@ struct { int -main(int argc, char ** argv) +main (int argc, char ** argv) { int errors = 0; struct tm tm; @@ -36,8 +36,7 @@ main(int argc, char ** argv) for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) { putenv (tests[i].env); - tzset (); - t = mktime(&tm); + t = mktime (&tm); if (t != tests[i].expected) { printf ("%s: flunked test %u (expected %lu, got %lu)\n", diff --git a/time/tzfile.c b/time/tzfile.c index d80789d..761ddc9 100644 --- a/time/tzfile.c +++ b/time/tzfile.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 95, 96 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 95, 96, 97 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 @@ -113,16 +113,28 @@ __tzfile_read (const char *file) if (*file != '/') { - static const char tzdir[] = TZDIR; - register const unsigned int len = strlen (file) + 1; - char *new = (char *) __alloca (sizeof (tzdir) + len); - memcpy (new, tzdir, sizeof(tzdir) - 1); - new[sizeof (tzdir) - 1] = '/'; - memcpy (&new[sizeof (tzdir)], file, len); + static const char default_tzdir[] = TZDIR; + const char *tzdir; + unsigned int len, tzdir_len; + char *new; + + tzdir = __secure_getenv ("TZDIR"); + if (tzdir == NULL || *tzdir == '\0') + { + tzdir = default_tzdir; + tzdir_len = sizeof (default_tzdir) - 1; + } + else + tzdir_len = strlen (tzdir); + len = strlen (file) + 1; + new = (char *) __alloca (tzdir_len + 1 + len); + memcpy (new, tzdir, tzdir_len); + new[tzdir_len] = '/'; + memcpy (&new[tzdir_len + 1], file, len); file = new; } - f = fopen(file, "r"); + f = fopen (file, "r"); if (f == NULL) return; @@ -171,6 +183,12 @@ __tzfile_read (const char *file) fread(type_idxs, 1, num_transitions, f) != num_transitions) goto lose; + /* Check for bogus indices in the data file, so we can hereafter + safely use type_idxs[T] as indices into `types' and never crash. */ + for (i = 0; i < num_transitions; ++i) + if (type_idxs[i] >= num_types) + goto lose; + if (BYTE_ORDER != BIG_ENDIAN || sizeof (time_t) != 4) { /* Decode the transition times, stored as 4-byte integers in @@ -189,6 +207,8 @@ __tzfile_read (const char *file) fread (&types[i].isdst, 1, 1, f) != 1 || fread (&types[i].idx, 1, 1, f) != 1) goto lose; + if (types[i].idx >= chars) /* Bogus index in data file. */ + goto lose; types[i].offset = (long int) decode (x); } @@ -335,6 +355,10 @@ __tzfile_default (char *std, char *dst, long int stdoff, long int dstoff) types[1].offset = dstoff; types[1].isdst = 1; + /* Reset the zone names to point to the user's names. */ + __tzname[0] = &zone_names[0]; + __tzname[1] = &zone_names[stdlen]; + compute_tzname_max (stdlen + dstlen); } @@ -425,7 +449,7 @@ compute_tzname_max (size_t chars) const char *start = p; while (*p != '\0') ++p; - if (p - start > __tzname_cur_max) + if ((size_t) (p - start) > __tzname_cur_max) __tzname_cur_max = p - start; } while (++p < &zone_names[chars]); } diff --git a/time/tzselect.ksh b/time/tzselect.ksh index 0f0a3bb..33bdbc7 100644 --- a/time/tzselect.ksh +++ b/time/tzselect.ksh @@ -1,4 +1,4 @@ -#! /bin/ksh +#! @KSH@ # Ask the user about the time zone, and output the resulting TZ value to stdout. # Interact with the user via stderr and stdin. @@ -11,7 +11,7 @@ # you can use either of the following free programs instead: # # Bourne-Again shell (bash) -# <URL:ftp://prep.ai.mit.edu:/pub/gnu/bash-1.14.7.tar.gz> +# <URL:ftp://prep.ai.mit.edu:/pub/gnu/bash-2.0.tar.gz> # (or any later version) # # Public domain ksh @@ -22,7 +22,7 @@ # you can use either of the following free programs instead: # # GNU awk (gawk) -# <URL:ftp://prep.ai.mit.edu:/pub/gnu/gawk-3.0.0.tar.gz> +# <URL:ftp://prep.ai.mit.edu:/pub/gnu/gawk-3.0.2.tar.gz> # (or any later version) # # mawk @@ -32,7 +32,7 @@ # Specify default values for environment variables if they are unset. : ${AWK=awk} -: ${TZDIR=$(pwd)} +: ${TZDIR=@TZDIR@} # Check for awk Posix compliance. ($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1 diff --git a/time/tzset.c b/time/tzset.c index 13360b4..8d8be34 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -108,16 +108,12 @@ __tzset_internal (always) /* Free old storage. */ if (tz_rules[0].name != NULL && *tz_rules[0].name != '\0') - { - free((void *) tz_rules[0].name); - tz_rules[0].name = NULL; - } + free((void *) tz_rules[0].name); if (tz_rules[1].name != NULL && *tz_rules[1].name != '\0' && tz_rules[1].name != tz_rules[0].name) - { - free((void *) tz_rules[1].name); - tz_rules[1].name = NULL; - } + free((void *) tz_rules[1].name); + tz_rules[0].name = NULL; + tz_rules[1].name = NULL; /* Save the value of `tz'. */ if (old_tz != NULL) @@ -234,6 +230,9 @@ __tzset_internal (always) tz += l; } } + else + /* There is no DST. */ + tz_rules[1].name = tz_rules[0].name; /* Figure out the DST offset from GMT. */ if (*tz == '-' || *tz == '+') @@ -1,5 +1,5 @@ /* Old compatibility names for <limits.h> and <float.h> constants. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997 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 @@ -21,7 +21,9 @@ <limits.h> and/or <float.h> instead of <values.h>. */ #ifndef _VALUES_H + #define _VALUES_H 1 +#include <features.h> #include <limits.h> @@ -30,7 +32,7 @@ #define CHARBITS _TYPEBITS (char) #define SHORTBITS _TYPEBITS (short int) #define INTBITS _TYPEBITS (int) -#define LONGBITS _TYPEBITS (long) +#define LONGBITS _TYPEBITS (long int) #define PTRBITS _TYPEBITS (char *) #define DOUBLEBITS _TYPEBITS (double) #define FLOATBITS _TYPEBITS (float) @@ -59,4 +61,9 @@ #define FMAXEXP FLT_MAX_EXP +#ifdef __USE_MISC +/* Some systems define this name instead of CHAR_BIT or CHARBITS. */ +#define BITSPERBYTE CHAR_BIT +#endif + #endif /* values.h */ |