]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 19 Jan 2000 03:54:00 +0000 (03:54 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 19 Jan 2000 03:54:00 +0000 (03:54 +0000)
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.

14 files changed:
ChangeLog
manual/charset.texi
sysdeps/unix/sysv/linux/arm/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/arm/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/arm/xstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/i386/xstat.c
sysdeps/unix/sysv/linux/m68k/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/m68k/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/m68k/xstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c [new file with mode: 0644]

index 15512993ca4cfce786c0c6767fc2f65203a5fb00..b5d53a5d85939d9dee3b5b2a69cf17692b325da7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        * iconv/loop.c (COUNT_CONVERTED): Remove macro, comment, and all uses.
        Remove done variable and all uses.
        * iconv/skeleton.c: Update comment for *written modification.
        * iconv/gconv_int.h (__gconv): Update comment.
+       Reported by Bruno Haible.
 
 2000-01-18  Bruno Haible  <haible@ilog.fr>
 
index 76b189f5fcbe28c4efe64b1997a134ab7c881b7d..81456f2ee0c34dedd3755692d9aca525d49a2722 100644 (file)
@@ -1750,10 +1750,10 @@ desirable solution.  Therefore future versions will provide better ones
 but they are not yet finished.
 
 If all input from the input buffer is successfully converted and stored
-in the output buffer the function returns the number of conversions
-performed.  In all other cases the return value is @code{(size_t) -1}
-and @code{errno} is set appropriately.  In this case the value pointed
-to by @var{inbytesleft} is nonzero.
+in the output buffer the function returns the number of non-reversible
+conversions performed.  In all other cases the return value is
+@code{(size_t) -1} and @code{errno} is set appropriately.  In this case
+the value pointed to by @var{inbytesleft} is nonzero.
 
 @table @code
 @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
 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
-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
 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
 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
 conversion functions deeper down the stream stop prematurely not all
 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 *outptr;
 
-      /* @r{This variable is used to count the number of characters}
-         @r{we actually converted.}  */
-      size_t converted = 0;
-
       do
         @{
           /* @r{Remember the start value for this round.}  */
@@ -2819,8 +2815,8 @@ gconv (struct __gconv_step *step, struct __gconv_step_data *data,
                  @r{available.}  */
               data->__outbuf = outbuf;
 
-             /* @r{Remember how many characters we converted.}  */
-             *written += converted;
+             /* @r{If any non-reversible conversions were performed,}
+                @r{add the number to @code{*written}.}  */
 
              break;
            @}
diff --git a/sysdeps/unix/sysv/linux/arm/fxstat.c b/sysdeps/unix/sysv/linux/arm/fxstat.c
new file mode 100644 (file)
index 0000000..4f219f0
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/sysdeps/unix/sysv/linux/arm/lxstat.c b/sysdeps/unix/sysv/linux/arm/lxstat.c
new file mode 100644 (file)
index 0000000..2371cd9
--- /dev/null
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --git a/sysdeps/unix/sysv/linux/arm/xstat.c b/sysdeps/unix/sysv/linux/arm/xstat.c
new file mode 100644 (file)
index 0000000..e9869f5
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>
diff --git a/sysdeps/unix/sysv/linux/i386/fxstat.c b/sysdeps/unix/sysv/linux/i386/fxstat.c
new file mode 100644 (file)
index 0000000..192325e
--- /dev/null
@@ -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
diff --git a/sysdeps/unix/sysv/linux/i386/lxstat.c b/sysdeps/unix/sysv/linux/i386/lxstat.c
new file mode 100644 (file)
index 0000000..fa5b463
--- /dev/null
@@ -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
index 2e6eb3ee0a251a7c9fc1c8a34625cd461cd50d12..c879960a58b0f134d2e570a03bd7bb37f29118b8 100644 (file)
@@ -46,39 +46,34 @@ extern int __have_no_stat64;
 int
 __xstat (int vers, const char *name, struct stat *buf)
 {
-#if __ASSUME_STAT64_SYSCALL > 0
   struct kernel_stat kbuf;
   int result;
 
+  if (vers == _STAT_VER_KERNEL)
+    {
+      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
-  struct kernel_stat kbuf;
-  int result;
-
-  if (vers == _STAT_VER_KERNEL)
-    {
-      return INLINE_SYSCALL (stat, 2, name, (struct kernel_stat *) buf);
-    }
 # 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;
-      
-      int saved_errno = errno;
+
       result = INLINE_SYSCALL (stat64, 2, name, &buf64);
 
       if (result == 0)
        result = xstat32_conv (vers, &buf64, buf);
-      
+
       if (result != -1 || errno != ENOSYS)
        return result;
 
-      __set_errno (saved_errno);
       __have_no_stat64 = 1;
     }
 # endif  
diff --git a/sysdeps/unix/sysv/linux/m68k/fxstat.c b/sysdeps/unix/sysv/linux/m68k/fxstat.c
new file mode 100644 (file)
index 0000000..4f219f0
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/sysdeps/unix/sysv/linux/m68k/lxstat.c b/sysdeps/unix/sysv/linux/m68k/lxstat.c
new file mode 100644 (file)
index 0000000..2371cd9
--- /dev/null
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --git a/sysdeps/unix/sysv/linux/m68k/xstat.c b/sysdeps/unix/sysv/linux/m68k/xstat.c
new file mode 100644 (file)
index 0000000..e9869f5
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c b/sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c
new file mode 100644 (file)
index 0000000..4f219f0
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/fxstat.c>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c b/sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c
new file mode 100644 (file)
index 0000000..2371cd9
--- /dev/null
@@ -0,0 +1,2 @@
+#include <sysdeps/unix/sysv/linux/i386/lxstat.c>
+
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c b/sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c
new file mode 100644 (file)
index 0000000..e9869f5
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>