* string/strxfrm_l.c (STRXFRM): Fix exit conditions of two loops.
This commit is contained in:
Ulrich Drepper 2005-10-15 20:51:49 +00:00
parent b7cd532556
commit bc3a45cef8
3 changed files with 64 additions and 8 deletions

View File

@ -1,5 +1,8 @@
2005-10-15 Ulrich Drepper <drepper@redhat.com>
[BZ #968]
* string/strxfrm_l.c (STRXFRM): Fix exit conditions of two loops.
* sysdeps/unix/fdopendir.c (fdopendir): Make sure descriptor
allows reading.

View File

@ -196,11 +196,17 @@ files in a directory, perhaps as part of a menu.
@cindex directory stream
The @code{opendir} function opens a @dfn{directory stream} whose
elements are directory entries. You use the @code{readdir} function on
the directory stream to retrieve these entries, represented as
@w{@code{struct dirent}} objects. The name of the file for each entry is
stored in the @code{d_name} member of this structure. There are obvious
parallels here to the stream facilities for ordinary files, described in
elements are directory entries. Alternatively @code{fdopendir} can be
used which can have advantages if the program needs to have more
control over the way the directory is opened for reading. This
allows, for instance, to pass the @code{O_NOATIME} flag to
@code{open}.
You use the @code{readdir} function on the directory stream to
retrieve these entries, represented as @w{@code{struct dirent}}
objects. The name of the file for each entry is stored in the
@code{d_name} member of this structure. There are obvious parallels
here to the stream facilities for ordinary files, described in
@ref{I/O on Streams}.
@menu
@ -349,6 +355,9 @@ The process has too many files open.
The entire system, or perhaps the file system which contains the
directory, cannot support any additional open files at the moment.
(This problem cannot happen on the GNU system.)
@item ENOMEM
Not enough memory available.
@end table
The @code{DIR} type is typically implemented using a file descriptor,
@ -357,6 +366,48 @@ and the @code{opendir} function in terms of the @code{open} function.
file descriptors are closed on @code{exec} (@pxref{Executing a File}).
@end deftypefun
The directory which is opened for reading by @code{opendir} is
identified by the name. In some situations this is not sufficient.
Or the way @code{opendir} implicitly creates a file descriptor for the
directory is not the way a program might want it. In these cases an
alternative interface can be used.
@comment dirent.h
@comment GNU
@deftypefun {DIR *} fdopendir (int @var{fd})
The @code{fdopendir} function works just like @code{opendir} but
instead of taking a file name and opening a file descriptor for the
directory the caller is required to provide a file descriptor. This
file descriptor is then used in subsequent uses of the returned
directory stream object.
The caller must make sure the file descriptor is associated with a
directory and it allows reading.
If the @code{fdopendir} call returns successfully the file descriptor
is now under the control of the system. It can be used in the same
way the descriptor implicitly created by @code{opendir} can be used
but the program must not close the descriptor.
In case the function is unsuccessful it returns a null pointer and the
file descriptor remains to be usable by the program. The following
@code{errno} error conditions are defined for this function:
@table @code
@item EBADF
The file descriptor is not valid.
@item ENOTDIR
The file descriptor is not associated with a directory.
@item EINVAL
The descriptor does not allow reading the directory content.
@item ENOMEM
Not enough memory available.
@end table
@end deftypefun
In some situations it can be desirable to get hold of the file
descriptor which is created by the @code{opendir} call. For instance,
to switch the current working directory to the directory just read the

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995,96,97,2002, 2004 Free Software Foundation, Inc.
/* Copyright (C) 1995,96,97,2002, 2004, 2005 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@gnu.org>, 1995.
@ -210,8 +210,9 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
/* Handle the pushed elements now. */
size_t backw;
for (backw = idxcnt - 1; backw >= backw_stop; --backw)
for (backw = idxcnt; backw > backw_stop; )
{
--backw;
len = weights[idxarr[backw]++];
if (needed + len < n)
@ -293,8 +294,9 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
/* Handle the pushed elements now. */
size_t backw;
for (backw = idxcnt - 1; backw >= backw_stop; --backw)
for (backw = idxcnt; backw > backw_stop; )
{
--backw;
len = weights[idxarr[backw]++];
if (len != 0)
{