1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
2000-01-18  Andreas Jaeger  <aj@suse.de>

	* sysdeps/unix/sysv/linux/i386/lxstat.c: New file, handles 32bit UIDs.
	* sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/xstat.c (__xstat): Move
	_STAT_VER_KERNEL handling up; don't save errno.
	* sysdeps/unix/sysv/linux/arm/fxstat.c: New file.
	* sysdeps/unix/sysv/linux/arm/lxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/arm/xstat.c: Likewise.
	* sysdeps/unix/sysv/linux/m68k/fxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/m68k/lxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/m68k/xstat.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c: Likewise.

	Reported by Bruno Haible.
This commit is contained in:
Ulrich Drepper
2000-01-19 03:54:00 +00:00
parent 63e04088bf
commit e3a7ff8749
14 changed files with 232 additions and 25 deletions

View File

@ -1,9 +1,26 @@
2000-01-18 Andreas Jaeger <aj@suse.de>
* sysdeps/unix/sysv/linux/i386/lxstat.c: New file, handles 32bit UIDs.
* sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise.
* sysdeps/unix/sysv/linux/i386/xstat.c (__xstat): Move
_STAT_VER_KERNEL handling up; don't save errno.
* sysdeps/unix/sysv/linux/arm/fxstat.c: New file.
* sysdeps/unix/sysv/linux/arm/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/arm/xstat.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/fxstat.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/xstat.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c: Likewise.
2000-01-18 Ulrich Drepper <drepper@cygnus.com> 2000-01-18 Ulrich Drepper <drepper@cygnus.com>
* iconv/loop.c (COUNT_CONVERTED): Remove macro, comment, and all uses. * iconv/loop.c (COUNT_CONVERTED): Remove macro, comment, and all uses.
Remove done variable and all uses. Remove done variable and all uses.
* iconv/skeleton.c: Update comment for *written modification. * iconv/skeleton.c: Update comment for *written modification.
* iconv/gconv_int.h (__gconv): Update comment. * iconv/gconv_int.h (__gconv): Update comment.
Reported by Bruno Haible.
2000-01-18 Bruno Haible <haible@ilog.fr> 2000-01-18 Bruno Haible <haible@ilog.fr>

View File

@ -1750,10 +1750,10 @@ desirable solution. Therefore future versions will provide better ones
but they are not yet finished. but they are not yet finished.
If all input from the input buffer is successfully converted and stored If all input from the input buffer is successfully converted and stored
in the output buffer the function returns the number of conversions in the output buffer the function returns the number of non-reversible
performed. In all other cases the return value is @code{(size_t) -1} conversions performed. In all other cases the return value is
and @code{errno} is set appropriately. In this case the value pointed @code{(size_t) -1} and @code{errno} is set appropriately. In this case
to by @var{inbytesleft} is nonzero. the value pointed to by @var{inbytesleft} is nonzero.
@table @code @table @code
@item EILSEQ @item EILSEQ
@ -2674,7 +2674,7 @@ last written byte. This gives the caller the information on how much
text is available in the output buffer. Beside this the variable text is available in the output buffer. Beside this the variable
pointed to by the fifth parameter, which is of type @code{size_t}, must pointed to by the fifth parameter, which is of type @code{size_t}, must
be incremented by the number of characters (@emph{not bytes}) which were be incremented by the number of characters (@emph{not bytes}) which were
written in the output buffer. Then the function can return. converted in a non-reversible way. Then the function can return.
In case the step is not the last one the later conversion functions have In case the step is not the last one the later conversion functions have
to get a chance to do their work. Therefore the appropriate conversion to get a chance to do their work. Therefore the appropriate conversion
@ -2713,7 +2713,7 @@ went wrong and we have to recover from this.
A requirement for the conversion function is that the input buffer A requirement for the conversion function is that the input buffer
pointer (the third argument) always points to the last character which pointer (the third argument) always points to the last character which
was put in the converted form in the output buffer. This is trivial was put in the converted form in the output buffer. This is trivially
true after the conversion performed in the current step. But if the true after the conversion performed in the current step. But if the
conversion functions deeper down the stream stop prematurely not all conversion functions deeper down the stream stop prematurely not all
characters from the output buffer are consumed and therefore the input characters from the output buffer are consumed and therefore the input
@ -2795,10 +2795,6 @@ gconv (struct __gconv_step *step, struct __gconv_step_data *data,
char *outend = data->__outbufend; char *outend = data->__outbufend;
char *outptr; char *outptr;
/* @r{This variable is used to count the number of characters}
@r{we actually converted.} */
size_t converted = 0;
do do
@{ @{
/* @r{Remember the start value for this round.} */ /* @r{Remember the start value for this round.} */
@ -2819,8 +2815,8 @@ gconv (struct __gconv_step *step, struct __gconv_step_data *data,
@r{available.} */ @r{available.} */
data->__outbuf = outbuf; data->__outbuf = outbuf;
/* @r{Remember how many characters we converted.} */ /* @r{If any non-reversible conversions were performed,}
*written += converted; @r{add the number to @code{*written}.} */
break; break;
@} @}

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/fxstat.c>

View File

@ -0,0 +1,2 @@
#include <sysdeps/unix/sysv/linux/i386/lxstat.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/xstat.c>

View File

@ -0,0 +1,93 @@
/* fxstat using old-style Unix fstat system call.
Copyright (C) 1991,95,96,97,98,2000 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. */
/* Ho hum, if xstat == xstat64 we must get rid of the prototype or gcc
will complain since they don't strictly match. */
#define __fxstat64 __fxstat64_disable
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <kernel_stat.h>
#include <sysdep.h>
#include <sys/syscall.h>
#include <xstatconv.c>
extern int __syscall_fstat (int, struct kernel_stat *);
#ifdef __NR_stat64
extern int __syscall_fstat64 (int, struct stat64 *);
# if __ASSUME_STAT64_SYSCALL == 0
/* The variable is shared between all wrappers around *stat64 calls. */
extern int __have_no_stat64;
# endif
#endif
/* Get information about the file FD in BUF. */
int
__fxstat (int vers, int fd, struct stat *buf)
{
struct kernel_stat kbuf;
int result;
if (vers == _STAT_VER_KERNEL)
{
return INLINE_SYSCALL (fstat, 2, fd, (struct kernel_stat *) buf);
}
#if __ASSUME_STAT64_SYSCALL > 0
result = INLINE_SYSCALL (fstat64, 2, name, &buf64);
if (result == 0)
result = xstat32_conv (vers, &buf64, buf);
return result;
#else
# if defined __NR_stat64
/* To support 32 bit UIDs, we have to use stat64. The normal stat call only returns
16 bit UIDs. */
if (! __have_no_stat64)
{
struct stat64 buf64;
result = INLINE_SYSCALL (fstat64, 2, name, &buf64);
if (result == 0)
result = xstat32_conv (vers, &buf64, buf);
if (result != -1 || errno != ENOSYS)
return result;
__have_no_stat64 = 1;
}
# endif
result = INLINE_SYSCALL (fstat, 2, fd, &kbuf);
if (result == 0)
result = xstat_conv (vers, &kbuf, buf);
return result;
#endif /* __ASSUME_STAT64_SYSCALL */
}
weak_alias (__fxstat, _fxstat);
#ifdef XSTAT_IS_XSTAT64
#undef __fxstat64
strong_alias (__fxstat, __fxstat64);
#endif

View File

@ -0,0 +1,94 @@
/* lxstat using old-style Unix lstat system call.
Copyright (C) 1991,95,96,97,98,2000 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. */
/* Ho hum, if xstat == xstat64 we must get rid of the prototype or gcc
will complain since they don't strictly match. */
#define __lxstat64 __lxstat64_disable
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <kernel_stat.h>
#include <sysdep.h>
#include <sys/syscall.h>
#include <xstatconv.c>
extern int __syscall_lstat (const char *, struct kernel_stat *);
#ifdef __NR_stat64
extern int __syscall_lstat64 (const char *, struct stat64 *);
# if __ASSUME_STAT64_SYSCALL == 0
/* The variable is shared between all wrappers around *stat64 calls. */
extern int __have_no_stat64;
# endif
#endif
/* Get information about the file NAME in BUF. */
int
__lxstat (int vers, const char *name, struct stat *buf)
{
struct kernel_stat kbuf;
int result;
if (vers == _STAT_VER_KERNEL)
{
return INLINE_SYSCALL (lstat, 2, name, (struct kernel_stat *) buf);
}
#if __ASSUME_STAT64_SYSCALL > 0
result = INLINE_SYSCALL (lstat64, 2, name, &buf64);
if (result == 0)
result = xstat32_conv (vers, &buf64, buf);
return result;
#else
# if defined __NR_stat64
/* To support 32 bit UIDs, we have to use stat64. The normal stat call only returns
16 bit UIDs. */
if (! __have_no_stat64)
{
struct stat64 buf64;
result = INLINE_SYSCALL (lstat64, 2, name, &buf64);
if (result == 0)
result = xstat32_conv (vers, &buf64, buf);
if (result != -1 || errno != ENOSYS)
return result;
__have_no_stat64 = 1;
}
# endif
result = INLINE_SYSCALL (lstat, 2, name, &kbuf);
if (result == 0)
result = xstat_conv (vers, &kbuf, buf);
return result;
#endif
}
weak_alias (__lxstat, _lxstat);
#ifdef XSTAT_IS_XSTAT64
#undef __lxstat64
strong_alias (__lxstat, __lxstat64);
#endif

View File

@ -46,15 +46,6 @@ extern int __have_no_stat64;
int int
__xstat (int vers, const char *name, struct stat *buf) __xstat (int vers, const char *name, struct stat *buf)
{ {
#if __ASSUME_STAT64_SYSCALL > 0
struct kernel_stat kbuf;
int result;
result = INLINE_SYSCALL (stat64, 2, name, &buf64);
if (result == 0)
result = xstat32_conv (vers, &buf64, buf);
return result;
#else
struct kernel_stat kbuf; struct kernel_stat kbuf;
int result; int result;
@ -62,23 +53,27 @@ __xstat (int vers, const char *name, struct stat *buf)
{ {
return INLINE_SYSCALL (stat, 2, name, (struct kernel_stat *) buf); return INLINE_SYSCALL (stat, 2, name, (struct kernel_stat *) buf);
} }
#if __ASSUME_STAT64_SYSCALL > 0
result = INLINE_SYSCALL (stat64, 2, name, &buf64);
if (result == 0)
result = xstat32_conv (vers, &buf64, buf);
return result;
#else
# if defined __NR_stat64 # if defined __NR_stat64
/* To support 32 bit UIDs, we have to use stat64. The normal stat call only returns /* To support 32 bit UIDs, we have to use stat64. The normal stat call only returns
16 bit UIDs. */ 16 bit UIDs. */
if (! __have_no_stat64) if (! __have_no_stat64)
{ {
struct stat64 buf64; struct stat64 buf64;
int saved_errno = errno;
result = INLINE_SYSCALL (stat64, 2, name, &buf64); result = INLINE_SYSCALL (stat64, 2, name, &buf64);
if (result == 0) if (result == 0)
result = xstat32_conv (vers, &buf64, buf); result = xstat32_conv (vers, &buf64, buf);
if (result != -1 || errno != ENOSYS) if (result != -1 || errno != ENOSYS)
return result; return result;
__set_errno (saved_errno);
__have_no_stat64 = 1; __have_no_stat64 = 1;
} }
# endif # endif

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/fxstat.c>

View File

@ -0,0 +1,2 @@
#include <sysdeps/unix/sysv/linux/i386/lxstat.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/xstat.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/fxstat.c>

View File

@ -0,0 +1,2 @@
#include <sysdeps/unix/sysv/linux/i386/lxstat.c>

View File

@ -0,0 +1 @@
#include <sysdeps/unix/sysv/linux/i386/xstat.c>