about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog17
-rw-r--r--manual/charset.texi20
-rw-r--r--sysdeps/unix/sysv/linux/arm/fxstat.c1
-rw-r--r--sysdeps/unix/sysv/linux/arm/lxstat.c2
-rw-r--r--sysdeps/unix/sysv/linux/arm/xstat.c1
-rw-r--r--sysdeps/unix/sysv/linux/i386/fxstat.c93
-rw-r--r--sysdeps/unix/sysv/linux/i386/lxstat.c94
-rw-r--r--sysdeps/unix/sysv/linux/i386/xstat.c19
-rw-r--r--sysdeps/unix/sysv/linux/m68k/fxstat.c1
-rw-r--r--sysdeps/unix/sysv/linux/m68k/lxstat.c2
-rw-r--r--sysdeps/unix/sysv/linux/m68k/xstat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c1
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c1
14 files changed, 231 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 15512993ca..b5d53a5d85 100644
--- 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>
 
diff --git a/manual/charset.texi b/manual/charset.texi
index 76b189f5fc..81456f2ee0 100644
--- a/manual/charset.texi
+++ b/manual/charset.texi
@@ -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
index 0000000000..4f219f0b9d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/fxstat.c
@@ -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
index 0000000000..2371cd9719
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/lxstat.c
@@ -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
index 0000000000..e9869f5508
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/arm/xstat.c
@@ -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
index 0000000000..192325e6b0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fxstat.c
@@ -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
index 0000000000..fa5b463362
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/lxstat.c
@@ -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
diff --git a/sysdeps/unix/sysv/linux/i386/xstat.c b/sysdeps/unix/sysv/linux/i386/xstat.c
index 2e6eb3ee0a..c879960a58 100644
--- a/sysdeps/unix/sysv/linux/i386/xstat.c
+++ b/sysdeps/unix/sysv/linux/i386/xstat.c
@@ -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
index 0000000000..4f219f0b9d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/fxstat.c
@@ -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
index 0000000000..2371cd9719
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/lxstat.c
@@ -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
index 0000000000..e9869f5508
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/m68k/xstat.c
@@ -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
index 0000000000..4f219f0b9d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/fxstat.c
@@ -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
index 0000000000..2371cd9719
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/lxstat.c
@@ -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
index 0000000000..e9869f5508
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/xstat.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/linux/i386/xstat.c>