mirror of
git://sourceware.org/git/glibc.git
synced 2025-01-30 12:31:53 +08:00
Update.
1998-11-05 1998 H.J. Lu <hjl@gnu.org> * libio/iofgets.c (_IO_fgets): Don't report error if something was read in and errno is set to EAGAIN. * libio/iofgets_u.c (fgets_unlocked): Likewise. 1998-11-05 Philip Blundell <philb@gnu.org> * sysdeps/unix/sysv/linux/net/if_packet.h: Don't include kernel header; it defines too much. Provide a local definition of struct sockaddr_pkt and a comment advising against its use. 1998-11-06 1998 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> * extra-lib.mk: Avoid empty include list. 1998-11-04 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> * extra-lib.mk: Add support for $(lib)-shared-only-routines. * elf/Makefile (libdl-routines): Add dlopenold only if doing versioning. (libdl-shared-only-routines): New variable. 1998-11-06 Paul Eggert <eggert@twinsun.com> Don't invoke localtime_r or gmtime_r unless it's the GNU C library's localtime_r and gmtime_r; there are too many buggy implementations of localtime_r and gmtime_r out there, and it's not worth keeping track of all the different bugs. * time/mktime.c (__EXTENSIONS__): Remove. (<unistd.h>): No need to include. * time/strftime.c: Likewise. * time/mktime.c (_POSIX_THREAD_SAFE_FUNCTIONS, HAVE_LOCALTIME_R): Remove. (my_mktime_localtime_r): Renamed from localtime_r; all uses changed. Base it on localtime unless _LIBC. * time/strftime.c (my_strftime_gmtime_r): Renamed from gmtime_r; all uses changed. (my_strftime_localtime_r): Renamed from localtime_r; all uses changed. Base them on localtime/gmtime if not _LIBC. 1998-11-07 Ulrich Drepper <drepper@cygnus.com> * sysdeps/generic/isastream.c: Always return 0 unless it is an invalid file descriptor. This makes this function actually usable. Proposed by Mark Kettenis <kettenis@phys.uva.nl>.
This commit is contained in:
parent
d76bd17ff9
commit
05f732b361
52
ChangeLog
52
ChangeLog
@ -1,3 +1,55 @@
|
|||||||
|
1998-11-05 1998 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* libio/iofgets.c (_IO_fgets): Don't report error
|
||||||
|
if something was read in and errno is set to
|
||||||
|
EAGAIN.
|
||||||
|
* libio/iofgets_u.c (fgets_unlocked): Likewise.
|
||||||
|
|
||||||
|
1998-11-05 Philip Blundell <philb@gnu.org>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/net/if_packet.h: Don't include kernel
|
||||||
|
header; it defines too much. Provide a local definition of struct
|
||||||
|
sockaddr_pkt and a comment advising against its use.
|
||||||
|
|
||||||
|
1998-11-06 1998 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
|
||||||
|
|
||||||
|
* extra-lib.mk: Avoid empty include list.
|
||||||
|
|
||||||
|
1998-11-04 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
|
||||||
|
|
||||||
|
* extra-lib.mk: Add support for $(lib)-shared-only-routines.
|
||||||
|
|
||||||
|
* elf/Makefile (libdl-routines): Add dlopenold only if doing
|
||||||
|
versioning.
|
||||||
|
(libdl-shared-only-routines): New variable.
|
||||||
|
|
||||||
|
1998-11-06 Paul Eggert <eggert@twinsun.com>
|
||||||
|
|
||||||
|
Don't invoke localtime_r or gmtime_r unless it's the GNU C
|
||||||
|
library's localtime_r and gmtime_r; there are too many buggy
|
||||||
|
implementations of localtime_r and gmtime_r out there, and
|
||||||
|
it's not worth keeping track of all the different bugs.
|
||||||
|
|
||||||
|
* time/mktime.c (__EXTENSIONS__): Remove.
|
||||||
|
(<unistd.h>): No need to include.
|
||||||
|
* time/strftime.c: Likewise.
|
||||||
|
|
||||||
|
* time/mktime.c (_POSIX_THREAD_SAFE_FUNCTIONS, HAVE_LOCALTIME_R):
|
||||||
|
Remove.
|
||||||
|
(my_mktime_localtime_r): Renamed from localtime_r; all uses changed.
|
||||||
|
Base it on localtime unless _LIBC.
|
||||||
|
|
||||||
|
* time/strftime.c (my_strftime_gmtime_r): Renamed from gmtime_r;
|
||||||
|
all uses changed.
|
||||||
|
(my_strftime_localtime_r): Renamed from localtime_r; all uses changed.
|
||||||
|
Base them on localtime/gmtime if not _LIBC.
|
||||||
|
|
||||||
|
1998-11-07 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/generic/isastream.c: Always return 0 unless it is an invalid
|
||||||
|
file descriptor. This makes this function actually usable.
|
||||||
|
Proposed by Mark Kettenis <kettenis@phys.uva.nl>.
|
||||||
|
|
||||||
1998-11-05 Ulrich Drepper <drepper@cygnus.com>
|
1998-11-05 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* math/math.h: Unconditionally include bits/mathdef.h. Declare
|
* math/math.h: Unconditionally include bits/mathdef.h. Declare
|
||||||
|
11
FAQ
11
FAQ
@ -122,6 +122,7 @@ please let me know.
|
|||||||
happen with db-1, gdbm, or ndbm.
|
happen with db-1, gdbm, or ndbm.
|
||||||
3.14. The pow() inline function I get when including <math.h> is broken.
|
3.14. The pow() inline function I get when including <math.h> is broken.
|
||||||
I get segmentation faults when I run the program.
|
I get segmentation faults when I run the program.
|
||||||
|
3.15. The sys/sem.h file lacks the definition of `union semun'.
|
||||||
|
|
||||||
4. Miscellaneous
|
4. Miscellaneous
|
||||||
|
|
||||||
@ -751,7 +752,7 @@ ypbind. ypbind 3.3 and older versions don't always remove these files, so
|
|||||||
glibc will continue to use them. Other BSD versions seem to work correctly.
|
glibc will continue to use them. Other BSD versions seem to work correctly.
|
||||||
Until ypbind 3.4 is released, you can find a patch at
|
Until ypbind 3.4 is released, you can find a patch at
|
||||||
|
|
||||||
ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc3.diff.gz
|
ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc4.diff.gz
|
||||||
|
|
||||||
|
|
||||||
2.13. Under Linux/Alpha, I always get "do_ypcall: clnt_call:
|
2.13. Under Linux/Alpha, I always get "do_ypcall: clnt_call:
|
||||||
@ -1237,6 +1238,14 @@ If you have to use this compiler you must define __NO_MATH_INLINES before
|
|||||||
including <math.h> to prevent the inline functions from being used. egcs 1.1
|
including <math.h> to prevent the inline functions from being used. egcs 1.1
|
||||||
fixes the problem. I don't know about gcc 2.8 and 2.8.1.
|
fixes the problem. I don't know about gcc 2.8 and 2.8.1.
|
||||||
|
|
||||||
|
|
||||||
|
3.15. The sys/sem.h file lacks the definition of `union semun'.
|
||||||
|
|
||||||
|
{UD} Nope. This union has to be provided by the user program. Former glibc
|
||||||
|
versions defined this but it was an error since it does not make much sense
|
||||||
|
when thinking about it. The standards describing the System V IPC functions
|
||||||
|
define it this way and therefore programs must be adopted.
|
||||||
|
|
||||||
|
|
||||||
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||||
|
|
||||||
|
9
FAQ.in
9
FAQ.in
@ -599,7 +599,7 @@ ypbind. ypbind 3.3 and older versions don't always remove these files, so
|
|||||||
glibc will continue to use them. Other BSD versions seem to work correctly.
|
glibc will continue to use them. Other BSD versions seem to work correctly.
|
||||||
Until ypbind 3.4 is released, you can find a patch at
|
Until ypbind 3.4 is released, you can find a patch at
|
||||||
|
|
||||||
ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc3.diff.gz
|
ftp://ftp.kernel.org/pub/linux/utils/net/NIS/ypbind-3.3-glibc4.diff.gz
|
||||||
|
|
||||||
?? Under Linux/Alpha, I always get "do_ypcall: clnt_call:
|
?? Under Linux/Alpha, I always get "do_ypcall: clnt_call:
|
||||||
RPC: Unable to receive; errno = Connection refused" when using NIS.
|
RPC: Unable to receive; errno = Connection refused" when using NIS.
|
||||||
@ -1063,6 +1063,13 @@ If you have to use this compiler you must define __NO_MATH_INLINES before
|
|||||||
including <math.h> to prevent the inline functions from being used. egcs 1.1
|
including <math.h> to prevent the inline functions from being used. egcs 1.1
|
||||||
fixes the problem. I don't know about gcc 2.8 and 2.8.1.
|
fixes the problem. I don't know about gcc 2.8 and 2.8.1.
|
||||||
|
|
||||||
|
?? The sys/sem.h file lacks the definition of `union semun'.
|
||||||
|
|
||||||
|
{UD} Nope. This union has to be provided by the user program. Former glibc
|
||||||
|
versions defined this but it was an error since it does not make much sense
|
||||||
|
when thinking about it. The standards describing the System V IPC functions
|
||||||
|
define it this way and therefore programs must be adopted.
|
||||||
|
|
||||||
|
|
||||||
? Miscellaneous
|
? Miscellaneous
|
||||||
|
|
||||||
|
13
elf/Makefile
13
elf/Makefile
@ -40,17 +40,18 @@ distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
|
|||||||
genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \
|
genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \
|
||||||
dl-librecon.h interp.c sln.c dl-origin.h
|
dl-librecon.h interp.c sln.c dl-origin.h
|
||||||
|
|
||||||
|
include ../Makeconfig
|
||||||
|
|
||||||
extra-libs = libdl
|
extra-libs = libdl
|
||||||
extra-libs-others = $(extra-libs)
|
extra-libs-others = $(extra-libs)
|
||||||
libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr dlopenold
|
libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr
|
||||||
|
ifeq ($(versioning),yes)
|
||||||
|
libdl-routines += dlopenold
|
||||||
|
libdl-shared-only-routines := dlopenold
|
||||||
|
endif
|
||||||
|
|
||||||
before-compile = $(objpfx)trusted-dirs.h
|
before-compile = $(objpfx)trusted-dirs.h
|
||||||
|
|
||||||
|
|
||||||
all: # Make this the default target; it will be defined in Rules.
|
|
||||||
|
|
||||||
include ../Makeconfig
|
|
||||||
|
|
||||||
ifeq ($(versioning),yes)
|
ifeq ($(versioning),yes)
|
||||||
ld-map = $(common-objpfx)libc.map
|
ld-map = $(common-objpfx)libc.map
|
||||||
endif
|
endif
|
||||||
|
26
extra-lib.mk
26
extra-lib.mk
@ -19,8 +19,13 @@ extra-objs := $(extra-objs)
|
|||||||
|
|
||||||
# Add each flavor of library to the lists of things to build and install.
|
# Add each flavor of library to the lists of things to build and install.
|
||||||
install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o)))
|
install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o)))
|
||||||
extra-objs += $(foreach o,$(object-suffixes-$(lib)),\
|
extra-objs += $(foreach o,$(object-suffixes-$(lib):.os=),\
|
||||||
$(patsubst %,%$o,$($(lib)-routines)))
|
$(patsubst %,%$o,$(filter-out \
|
||||||
|
$($(lib)-shared-only-routines),\
|
||||||
|
$($(lib)-routines))))
|
||||||
|
ifneq (,$(filter .os,$(object-suffixes-$(lib))))
|
||||||
|
extra-objs += $($(lib)-routines:=.os)
|
||||||
|
endif
|
||||||
alltypes-$(lib) := $(foreach o,$(object-suffixes-$(lib)),\
|
alltypes-$(lib) := $(foreach o,$(object-suffixes-$(lib)),\
|
||||||
$(objpfx)$(patsubst %,$(libtype$o),\
|
$(objpfx)$(patsubst %,$(libtype$o),\
|
||||||
$(lib:lib%=%)))
|
$(lib:lib%=%)))
|
||||||
@ -42,12 +47,23 @@ endif
|
|||||||
|
|
||||||
|
|
||||||
# Use o-iterator.mk to generate a rule for each flavor of library.
|
# Use o-iterator.mk to generate a rule for each flavor of library.
|
||||||
|
ifneq (,$(filter-out .os,$(object-suffices-$(lib))))
|
||||||
define o-iterator-doit
|
define o-iterator-doit
|
||||||
$(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \
|
$(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \
|
||||||
$($(lib)-routines:%=$(objpfx)%$o); $$(build-extra-lib)
|
$(patsubst %,$(objpfx)%$o,\
|
||||||
|
$(filter-out $($(lib)-shared-only-routines),\
|
||||||
|
$($(lib)-routines))); \
|
||||||
|
$$(build-extra-lib)
|
||||||
endef
|
endef
|
||||||
object-suffixes-left = $(object-suffixes-$(lib))
|
object-suffixes-left = $(object-suffixes-$(lib):.os=)
|
||||||
include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-$(lib)))
|
include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-$(lib):.os=))
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(filter .os,$(object-suffixes-$(lib))))
|
||||||
|
$(objpfx)$(patsubst %,$(libtype.os),$(lib:lib%=%)): \
|
||||||
|
$($(lib)-routines:%=$(objpfx)%.os)
|
||||||
|
$(build-extra-lib)
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(versioning),yes)
|
ifeq ($(versioning),yes)
|
||||||
# Add the version script to the dependencies of the shared library.
|
# Add the version script to the dependencies of the shared library.
|
||||||
|
@ -64,13 +64,14 @@ _IO_link_in (fp)
|
|||||||
|
|
||||||
/* Return minimum _pos markers
|
/* Return minimum _pos markers
|
||||||
Assumes the current get area is the main get area. */
|
Assumes the current get area is the main get area. */
|
||||||
static _IO_size_t _IO_least_marker __P ((_IO_FILE *fp));
|
static _IO_ssize_t _IO_least_marker __P ((_IO_FILE *fp, char *end_p));
|
||||||
|
|
||||||
static _IO_size_t
|
static _IO_ssize_t
|
||||||
_IO_least_marker (fp)
|
_IO_least_marker (fp, end_p)
|
||||||
_IO_FILE *fp;
|
_IO_FILE *fp;
|
||||||
|
char *end_p;
|
||||||
{
|
{
|
||||||
_IO_ssize_t least_so_far = fp->_IO_read_end - fp->_IO_read_base;
|
_IO_ssize_t least_so_far = end_p - fp->_IO_read_base;
|
||||||
struct _IO_marker *mark;
|
struct _IO_marker *mark;
|
||||||
for (mark = fp->_markers; mark != NULL; mark = mark->_next)
|
for (mark = fp->_markers; mark != NULL; mark = mark->_next)
|
||||||
if (mark->_pos < least_so_far)
|
if (mark->_pos < least_so_far)
|
||||||
@ -94,10 +95,8 @@ _IO_switch_to_main_get_area (fp)
|
|||||||
tmp = fp->_IO_read_base;
|
tmp = fp->_IO_read_base;
|
||||||
fp->_IO_read_base = fp->_IO_save_base;
|
fp->_IO_read_base = fp->_IO_save_base;
|
||||||
fp->_IO_save_base = tmp;
|
fp->_IO_save_base = tmp;
|
||||||
/* Swap _IO_read_ptr and _IO_save_ptr. */
|
/* Set _IO_read_ptr. */
|
||||||
tmp = fp->_IO_read_ptr;
|
fp->_IO_read_ptr = fp->_IO_read_base;
|
||||||
fp->_IO_read_ptr = fp->_IO_save_ptr;
|
|
||||||
fp->_IO_save_ptr = tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Switch current get area from main get area to (end of) backup area. */
|
/* Switch current get area from main get area to (end of) backup area. */
|
||||||
@ -112,12 +111,11 @@ _IO_switch_to_backup_area (fp)
|
|||||||
tmp = fp->_IO_read_end;
|
tmp = fp->_IO_read_end;
|
||||||
fp->_IO_read_end = fp->_IO_save_end;
|
fp->_IO_read_end = fp->_IO_save_end;
|
||||||
fp->_IO_save_end = tmp;
|
fp->_IO_save_end = tmp;
|
||||||
/* Swap _gbase and _IO_save_base. */
|
/* Swap _IO_read_base and _IO_save_base. */
|
||||||
tmp = fp->_IO_read_base;
|
tmp = fp->_IO_read_base;
|
||||||
fp->_IO_read_base = fp->_IO_save_base;
|
fp->_IO_read_base = fp->_IO_save_base;
|
||||||
fp->_IO_save_base = tmp;
|
fp->_IO_save_base = tmp;
|
||||||
/* read _IO_read_ptr. */
|
/* Set _IO_read_ptr. */
|
||||||
fp->_IO_save_ptr = fp->_IO_read_ptr;
|
|
||||||
fp->_IO_read_ptr = fp->_IO_read_end;
|
fp->_IO_read_ptr = fp->_IO_read_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,26 +181,28 @@ __overflow (f, ch)
|
|||||||
return _IO_OVERFLOW (f, ch);
|
return _IO_OVERFLOW (f, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int save_for_backup __P ((_IO_FILE *fp))
|
static int save_for_backup __P ((_IO_FILE *fp, char *end_p))
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
internal_function
|
internal_function
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
internal_function
|
internal_function
|
||||||
#endif
|
#endif
|
||||||
save_for_backup (fp)
|
save_for_backup (fp, end_p)
|
||||||
_IO_FILE *fp;
|
_IO_FILE *fp;
|
||||||
|
char *end_p;
|
||||||
{
|
{
|
||||||
/* Append [_IO_read_base.._IO_read_end] to backup area. */
|
/* Append [_IO_read_base..end_p] to backup area. */
|
||||||
int least_mark = _IO_least_marker (fp);
|
_IO_ssize_t least_mark = _IO_least_marker (fp, end_p);
|
||||||
/* needed_size is how much space we need in the backup area. */
|
/* needed_size is how much space we need in the backup area. */
|
||||||
int needed_size = (fp->_IO_read_end - fp->_IO_read_base) - least_mark;
|
_IO_size_t needed_size = (end_p - fp->_IO_read_base) - least_mark;
|
||||||
int current_Bsize = fp->_IO_save_end - fp->_IO_save_base;
|
/* FIXME: Dubious arithmetic if pointers are NULL */
|
||||||
int avail; /* Extra space available for future expansion. */
|
_IO_size_t current_Bsize = fp->_IO_save_end - fp->_IO_save_base;
|
||||||
int delta;
|
_IO_size_t avail; /* Extra space available for future expansion. */
|
||||||
|
_IO_ssize_t delta;
|
||||||
struct _IO_marker *mark;
|
struct _IO_marker *mark;
|
||||||
if (needed_size > current_Bsize)
|
if (needed_size > current_Bsize)
|
||||||
{
|
{
|
||||||
@ -218,14 +218,14 @@ save_for_backup (fp)
|
|||||||
fp->_IO_save_end + least_mark,
|
fp->_IO_save_end + least_mark,
|
||||||
-least_mark),
|
-least_mark),
|
||||||
fp->_IO_read_base,
|
fp->_IO_read_base,
|
||||||
fp->_IO_read_end - fp->_IO_read_base);
|
end_p - fp->_IO_read_base);
|
||||||
#else
|
#else
|
||||||
memcpy (new_buffer + avail,
|
memcpy (new_buffer + avail,
|
||||||
fp->_IO_save_end + least_mark,
|
fp->_IO_save_end + least_mark,
|
||||||
-least_mark);
|
-least_mark);
|
||||||
memcpy (new_buffer + avail - least_mark,
|
memcpy (new_buffer + avail - least_mark,
|
||||||
fp->_IO_read_base,
|
fp->_IO_read_base,
|
||||||
fp->_IO_read_end - fp->_IO_read_base);
|
end_p - fp->_IO_read_base);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -247,17 +247,16 @@ save_for_backup (fp)
|
|||||||
-least_mark);
|
-least_mark);
|
||||||
memcpy (fp->_IO_save_base + avail - least_mark,
|
memcpy (fp->_IO_save_base + avail - least_mark,
|
||||||
fp->_IO_read_base,
|
fp->_IO_read_base,
|
||||||
fp->_IO_read_end - fp->_IO_read_base);
|
end_p - fp->_IO_read_base);
|
||||||
}
|
}
|
||||||
else if (needed_size > 0)
|
else if (needed_size > 0)
|
||||||
memcpy (fp->_IO_save_base + avail,
|
memcpy (fp->_IO_save_base + avail,
|
||||||
fp->_IO_read_base + least_mark,
|
fp->_IO_read_base + least_mark,
|
||||||
needed_size);
|
needed_size);
|
||||||
}
|
}
|
||||||
/* FIXME: Dubious arithmetic if pointers are NULL */
|
|
||||||
fp->_IO_backup_base = fp->_IO_save_base + avail;
|
fp->_IO_backup_base = fp->_IO_save_base + avail;
|
||||||
/* Adjust all the streammarkers. */
|
/* Adjust all the streammarkers. */
|
||||||
delta = fp->_IO_read_end - fp->_IO_read_base;
|
delta = end_p - fp->_IO_read_base;
|
||||||
for (mark = fp->_markers; mark != NULL; mark = mark->_next)
|
for (mark = fp->_markers; mark != NULL; mark = mark->_next)
|
||||||
mark->_pos -= delta;
|
mark->_pos -= delta;
|
||||||
return 0;
|
return 0;
|
||||||
@ -280,7 +279,7 @@ __underflow (fp)
|
|||||||
}
|
}
|
||||||
if (_IO_have_markers (fp))
|
if (_IO_have_markers (fp))
|
||||||
{
|
{
|
||||||
if (save_for_backup (fp))
|
if (save_for_backup (fp, fp->_IO_read_end))
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
else if (_IO_have_backup (fp))
|
else if (_IO_have_backup (fp))
|
||||||
@ -305,7 +304,7 @@ __uflow (fp)
|
|||||||
}
|
}
|
||||||
if (_IO_have_markers (fp))
|
if (_IO_have_markers (fp))
|
||||||
{
|
{
|
||||||
if (save_for_backup (fp))
|
if (save_for_backup (fp, fp->_IO_read_end))
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
else if (_IO_have_backup (fp))
|
else if (_IO_have_backup (fp))
|
||||||
@ -817,10 +816,7 @@ _IO_seekmark (fp, mark, delta)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!_IO_in_backup (fp))
|
if (!_IO_in_backup (fp))
|
||||||
{
|
_IO_switch_to_backup_area (fp);
|
||||||
fp->_IO_read_ptr = fp->_IO_read_base;
|
|
||||||
_IO_switch_to_backup_area (fp);
|
|
||||||
}
|
|
||||||
fp->_IO_read_ptr = fp->_IO_read_end + mark->_pos;
|
fp->_IO_read_ptr = fp->_IO_read_end + mark->_pos;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -880,20 +876,28 @@ _IO_default_pbackfail (fp, c)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
|
/* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
|
||||||
if (_IO_have_backup (fp) && !_IO_in_backup (fp))
|
if (!_IO_in_backup (fp))
|
||||||
_IO_switch_to_backup_area (fp);
|
|
||||||
|
|
||||||
if (!_IO_have_backup (fp))
|
|
||||||
{
|
{
|
||||||
/* No backup buffer: allocate one. */
|
/* We need to keep the invariant that the main get area
|
||||||
/* Use nshort buffer, if unused? (probably not) FIXME */
|
logically follows the backup area. */
|
||||||
int backup_size = 128;
|
if (fp->_IO_read_ptr > fp->_IO_read_base && _IO_have_backup (fp))
|
||||||
char *bbuf = (char *) malloc (backup_size);
|
{
|
||||||
if (bbuf == NULL)
|
if (save_for_backup (fp, fp->_IO_read_ptr))
|
||||||
return EOF;
|
return EOF;
|
||||||
fp->_IO_save_base = bbuf;
|
}
|
||||||
fp->_IO_save_end = fp->_IO_save_base + backup_size;
|
else if (!_IO_have_backup (fp))
|
||||||
fp->_IO_backup_base = fp->_IO_save_end;
|
{
|
||||||
|
/* No backup buffer: allocate one. */
|
||||||
|
/* Use nshort buffer, if unused? (probably not) FIXME */
|
||||||
|
int backup_size = 128;
|
||||||
|
char *bbuf = (char *) malloc (backup_size);
|
||||||
|
if (bbuf == NULL)
|
||||||
|
return EOF;
|
||||||
|
fp->_IO_save_base = bbuf;
|
||||||
|
fp->_IO_save_end = fp->_IO_save_base + backup_size;
|
||||||
|
fp->_IO_backup_base = fp->_IO_save_end;
|
||||||
|
}
|
||||||
|
fp->_IO_read_base = fp->_IO_read_ptr;
|
||||||
_IO_switch_to_backup_area (fp);
|
_IO_switch_to_backup_area (fp);
|
||||||
}
|
}
|
||||||
else if (fp->_IO_read_ptr <= fp->_IO_read_base)
|
else if (fp->_IO_read_ptr <= fp->_IO_read_base)
|
||||||
|
@ -46,7 +46,10 @@ _IO_fgets (buf, n, fp)
|
|||||||
old_error = fp->_IO_file_flags & _IO_ERR_SEEN;
|
old_error = fp->_IO_file_flags & _IO_ERR_SEEN;
|
||||||
fp->_IO_file_flags &= ~_IO_ERR_SEEN;
|
fp->_IO_file_flags &= ~_IO_ERR_SEEN;
|
||||||
count = _IO_getline (fp, buf, n - 1, '\n', 1);
|
count = _IO_getline (fp, buf, n - 1, '\n', 1);
|
||||||
if (count == 0 || (fp->_IO_file_flags & _IO_ERR_SEEN))
|
/* If we read in some bytes and errno is EAGAIN, that error will
|
||||||
|
be reported for next read. */
|
||||||
|
if (count == 0 || ((fp->_IO_file_flags & _IO_ERR_SEEN)
|
||||||
|
&& errno != EAGAIN))
|
||||||
result = NULL;
|
result = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -44,7 +44,10 @@ fgets_unlocked (buf, n, fp)
|
|||||||
old_error = fp->_IO_file_flags & _IO_ERR_SEEN;
|
old_error = fp->_IO_file_flags & _IO_ERR_SEEN;
|
||||||
fp->_IO_file_flags &= ~_IO_ERR_SEEN;
|
fp->_IO_file_flags &= ~_IO_ERR_SEEN;
|
||||||
count = _IO_getline (fp, buf, n - 1, '\n', 1);
|
count = _IO_getline (fp, buf, n - 1, '\n', 1);
|
||||||
if (count == 0 || (fp->_IO_file_flags & _IO_ERR_SEEN))
|
/* If we read in some bytes and errno is EAGAIN, that error will
|
||||||
|
be reported for next read. */
|
||||||
|
if (count == 0 || ((fp->_IO_file_flags & _IO_ERR_SEEN)
|
||||||
|
&& errno != EAGAIN))
|
||||||
result = NULL;
|
result = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -231,9 +231,8 @@ struct _IO_FILE_complete
|
|||||||
#endif
|
#endif
|
||||||
#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001
|
#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001
|
||||||
_IO_off64_t _offset;
|
_IO_off64_t _offset;
|
||||||
char *_IO_save_ptr;
|
|
||||||
/* Make sure we don't get into trouble again. */
|
/* Make sure we don't get into trouble again. */
|
||||||
char _unused2[16 * sizeof (int) - sizeof (char *)];
|
int _unused2[16];
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1149,12 +1149,10 @@ Floating Type Macros
|
|||||||
|
|
||||||
Installation
|
Installation
|
||||||
|
|
||||||
* Tools for Installation:: We recommend using these tools to build.
|
* Configuring and compiling:: How to compile and test GNU libc.
|
||||||
* Supported Configurations:: What systems the GNU C library runs on.
|
* Tools for Compilation:: You'll need these first.
|
||||||
* Tips for Installation:: Useful hints for the installation.
|
* Supported Configurations:: What it runs on, what it doesn't.
|
||||||
* Reporting Bugs:: How to report bugs (if you want to
|
* Reporting Bugs:: So they'll get fixed.
|
||||||
get them fixed) and other troubles
|
|
||||||
you may have with the GNU C library.
|
|
||||||
|
|
||||||
Maintenance
|
Maintenance
|
||||||
|
|
||||||
|
@ -17,16 +17,19 @@
|
|||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <stropts.h>
|
#include <stropts.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
isastream (fildes)
|
isastream (fildes)
|
||||||
int fildes;
|
int fildes;
|
||||||
{
|
{
|
||||||
__set_errno (ENOSYS);
|
/* In general we do not have a STREAMS implementation and therefore
|
||||||
return -1;
|
return 0. But for invalid file descriptors we have to return an
|
||||||
|
error. */
|
||||||
|
if (__fcntl (fildes, F_GETFD) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* No STREAM. */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
stub_warning (isastream)
|
|
||||||
#include <stub-tag.h>
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Definitions for use with Linux SOCK_PACKET sockets.
|
/* Definitions for use with Linux SOCK_PACKET sockets.
|
||||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,7 +20,18 @@
|
|||||||
#ifndef __IF_PACKET_H
|
#ifndef __IF_PACKET_H
|
||||||
#define __IF_PACKET_H
|
#define __IF_PACKET_H
|
||||||
|
|
||||||
/* For now we can just use the kernel definitions. */
|
#include <features.h>
|
||||||
#include <linux/if_packet.h>
|
#include <bits/sockaddr.h>
|
||||||
|
|
||||||
|
/* This is the SOCK_PACKET address structure as used in Linux 2.0.
|
||||||
|
From Linux 2.1 the AF_PACKET interface is preferred and you should
|
||||||
|
consider using it in place of this one. */
|
||||||
|
|
||||||
|
struct sockaddr_pkt
|
||||||
|
{
|
||||||
|
__SOCKADDR_COMMON (spkt_);
|
||||||
|
unsigned char spkt_device[14];
|
||||||
|
unsigned short spkt_protocol;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -25,18 +25,8 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some systems require that one of these symbols be defined in
|
|
||||||
order to declare localtime_r properly. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# define __EXTENSIONS__ 1
|
|
||||||
#endif
|
|
||||||
#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
|
|
||||||
# define _POSIX_THREAD_SAFE_FUNCTIONS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define HAVE_LIMITS_H 1
|
# define HAVE_LIMITS_H 1
|
||||||
# define HAVE_LOCALTIME_R 1
|
|
||||||
# define STDC_HEADERS 1
|
# define STDC_HEADERS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -47,12 +37,6 @@
|
|||||||
# define LEAP_SECONDS_POSSIBLE 1
|
# define LEAP_SECONDS_POSSIBLE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some systems require <unistd.h> to be included before <time.h>
|
|
||||||
for localtime_r to be declared properly. */
|
|
||||||
#if HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/types.h> /* Some systems define `time_t' here. */
|
#include <sys/types.h> /* Some systems define `time_t' here. */
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@ -132,35 +116,23 @@ time_t __mktime_internal __P ((struct tm *,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define localtime_r __localtime_r
|
# define my_mktime_localtime_r __localtime_r
|
||||||
#else
|
#else
|
||||||
# if HAVE_LOCALTIME_R == defined localtime_r
|
/* If we're a mktime substitute in a GNU program, then prefer
|
||||||
/* Provide our own substitute for a missing or possibly broken localtime_r. */
|
localtime to localtime_r, since many localtime_r implementations
|
||||||
|
are buggy. */
|
||||||
static struct tm *my_mktime_localtime_r __P ((const time_t *, struct tm *));
|
static struct tm *my_mktime_localtime_r __P ((const time_t *, struct tm *));
|
||||||
static struct tm *
|
static struct tm *
|
||||||
my_mktime_localtime_r (t, tp)
|
my_mktime_localtime_r (t, tp)
|
||||||
const time_t *t;
|
const time_t *t;
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
{
|
{
|
||||||
# ifdef localtime_r
|
|
||||||
/* Digital Unix 4.0A and 4.0D have a macro localtime_r with the
|
|
||||||
standard meaning, along with an unwanted, nonstandard function
|
|
||||||
localtime_r. The placeholder function my_mktime_localtime_r
|
|
||||||
invokes the macro; use that instead of the system's bogus
|
|
||||||
localtime_r. */
|
|
||||||
return localtime_r (t, tp);
|
|
||||||
# undef localtime_r
|
|
||||||
# else /* ! defined (localtime_r) */
|
|
||||||
/* Approximate localtime_r as best we can in its absence. */
|
|
||||||
struct tm *l = localtime (t);
|
struct tm *l = localtime (t);
|
||||||
if (! l)
|
if (! l)
|
||||||
return 0;
|
return 0;
|
||||||
*tp = *l;
|
*tp = *l;
|
||||||
return tp;
|
return tp;
|
||||||
# endif /* ! defined localtime_r */
|
|
||||||
}
|
}
|
||||||
# define localtime_r my_mktime_localtime_r
|
|
||||||
# endif /* HAVE_LOCALTIME_R == defined localtime_r */
|
|
||||||
#endif /* ! _LIBC */
|
#endif /* ! _LIBC */
|
||||||
|
|
||||||
|
|
||||||
@ -215,7 +187,7 @@ mktime (tp)
|
|||||||
__tzset ();
|
__tzset ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return __mktime_internal (tp, localtime_r, &localtime_offset);
|
return __mktime_internal (tp, my_mktime_localtime_r, &localtime_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use CONVERT to convert *T to a broken down time in *TP.
|
/* Use CONVERT to convert *T to a broken down time in *TP.
|
||||||
@ -565,6 +537,6 @@ main (argc, argv)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Local Variables:
|
Local Variables:
|
||||||
compile-command: "gcc -DDEBUG -D__EXTENSIONS__ -DHAVE_LIMITS_H -DHAVE_LOCALTIME_R -DSTDC_HEADERS -Wall -W -O -g mktime.c -o mktime"
|
compile-command: "gcc -DDEBUG -DHAVE_LIMITS_H -DSTDC_HEADERS -Wall -W -O -g mktime.c -o mktime"
|
||||||
End:
|
End:
|
||||||
*/
|
*/
|
||||||
|
@ -20,11 +20,6 @@
|
|||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some hosts need this in order to declare localtime_r properly. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# define __EXTENSIONS__ 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define HAVE_LIMITS_H 1
|
# define HAVE_LIMITS_H 1
|
||||||
# define HAVE_MBLEN 1
|
# define HAVE_MBLEN 1
|
||||||
@ -46,12 +41,6 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/types.h> /* Some systems define `time_t' here. */
|
#include <sys/types.h> /* Some systems define `time_t' here. */
|
||||||
|
|
||||||
/* Some systems require <unistd.h> to be included before <time.h>
|
|
||||||
for localtime_r to be declared properly. */
|
|
||||||
#if HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TIME_WITH_SYS_TIME
|
#ifdef TIME_WITH_SYS_TIME
|
||||||
# include <sys/time.h>
|
# include <sys/time.h>
|
||||||
# include <time.h>
|
# include <time.h>
|
||||||
@ -153,19 +142,20 @@ extern char *tzname[];
|
|||||||
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
# define gmtime_r __gmtime_r
|
# define my_strftime_gmtime_r __gmtime_r
|
||||||
# define localtime_r __localtime_r
|
# define my_strftime_localtime_r __localtime_r
|
||||||
# define tzname __tzname
|
# define tzname __tzname
|
||||||
# define tzset __tzset
|
# define tzset __tzset
|
||||||
#else
|
#else
|
||||||
# if ! HAVE_LOCALTIME_R
|
|
||||||
# if ! HAVE_TM_GMTOFF
|
/* If we're a strftime substitute in a GNU program, then prefer gmtime
|
||||||
/* Approximate gmtime_r as best we can in its absence. */
|
to gmtime_r, since many gmtime_r implementations are buggy.
|
||||||
# undef gmtime_r
|
Similarly for localtime_r. */
|
||||||
# define gmtime_r my_gmtime_r
|
|
||||||
static struct tm *gmtime_r __P ((const time_t *, struct tm *));
|
# if ! HAVE_TM_GMTOFF
|
||||||
|
static struct tm *my_strftime_gmtime_r __P ((const time_t *, struct tm *));
|
||||||
static struct tm *
|
static struct tm *
|
||||||
gmtime_r (t, tp)
|
my_strftime_gmtime_r (t, tp)
|
||||||
const time_t *t;
|
const time_t *t;
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
{
|
{
|
||||||
@ -175,14 +165,11 @@ gmtime_r (t, tp)
|
|||||||
*tp = *l;
|
*tp = *l;
|
||||||
return tp;
|
return tp;
|
||||||
}
|
}
|
||||||
# endif /* ! HAVE_TM_GMTOFF */
|
# endif /* ! HAVE_TM_GMTOFF */
|
||||||
|
|
||||||
/* Approximate localtime_r as best we can in its absence. */
|
static struct tm *my_strftime_localtime_r __P ((const time_t *, struct tm *));
|
||||||
# undef localtime_r
|
|
||||||
# define localtime_r my_ftime_localtime_r
|
|
||||||
static struct tm *localtime_r __P ((const time_t *, struct tm *));
|
|
||||||
static struct tm *
|
static struct tm *
|
||||||
localtime_r (t, tp)
|
my_strftime_localtime_r (t, tp)
|
||||||
const time_t *t;
|
const time_t *t;
|
||||||
struct tm *tp;
|
struct tm *tp;
|
||||||
{
|
{
|
||||||
@ -192,7 +179,6 @@ localtime_r (t, tp)
|
|||||||
*tp = *l;
|
*tp = *l;
|
||||||
return tp;
|
return tp;
|
||||||
}
|
}
|
||||||
# endif /* ! HAVE_LOCALTIME_R */
|
|
||||||
#endif /* ! defined _LIBC */
|
#endif /* ! defined _LIBC */
|
||||||
|
|
||||||
|
|
||||||
@ -1203,7 +1189,7 @@ my_strftime (s, maxsize, format, tp ut_argument)
|
|||||||
occurred. */
|
occurred. */
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
if (! localtime_r (<, &tm)
|
if (! my_strftime_localtime_r (<, &tm)
|
||||||
|| ((ltm.tm_sec ^ tm.tm_sec)
|
|| ((ltm.tm_sec ^ tm.tm_sec)
|
||||||
| (ltm.tm_min ^ tm.tm_min)
|
| (ltm.tm_min ^ tm.tm_min)
|
||||||
| (ltm.tm_hour ^ tm.tm_hour)
|
| (ltm.tm_hour ^ tm.tm_hour)
|
||||||
@ -1213,7 +1199,7 @@ my_strftime (s, maxsize, format, tp ut_argument)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! gmtime_r (<, >m))
|
if (! my_strftime_gmtime_r (<, >m))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
diff = tm_diff (<m, >m);
|
diff = tm_diff (<m, >m);
|
||||||
|
Loading…
Reference in New Issue
Block a user