summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog49
-rw-r--r--bits/select.h4
-rw-r--r--hesiod/hesiod.c35
-rw-r--r--libio/fileops.c3
-rw-r--r--libio/libioP.h8
-rw-r--r--manual/string.texi57
-rw-r--r--string/Makefile5
-rw-r--r--sysdeps/generic/bits/select.h4
-rw-r--r--sysdeps/i386/bits/select.h4
-rw-r--r--sysdeps/stub/atomicity.h2
-rw-r--r--sysdeps/unix/sysv/linux/ptrace.c6
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h42
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S2
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list3
-rw-r--r--sysdeps/unix/sysv/linux/sys/ptrace.h2
15 files changed, 190 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog
index 26deea6b3d..4dca6d8b91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,52 @@
+1997-09-16 23:48  Ulrich Drepper  <drepper@cygnus.com>
+
+	* libio/fileops.c: Define __set_errno if necessary.
+	* libio/libioP.h: Don't use __BEGIN_DECLS/__END_DECLS, expand macros.
+
+1997-09-16 22:03  Ulrich Drepper  <drepper@cygnus.com>
+
+	* string/Makefile (headers): Instead bits/string2.h.
+	Reported by David S. Miller <davem@jenolan.rutgers.edu>.
+
+1997-09-16 13:31  David S. Miller  <davem@tanya.rutgers.edu>
+
+	* sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h: New file.
+
+1997-09-16 17:42  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/generic/bits/select.h (__FD_ZERO): Declare __arr variable
+	as of type __fdset *.
+	* sysdeps/i386/bits/select.h: Likewise.
+	Reported by David S. Miller <davem@jenolan.rutgers.edu>.
+
+1997-09-16 04:32  Ulrich Drepper  <drepper@cygnus.com>
+
+	* hesiod/hesiod.c: Don't use and define cistrcmp.  We have
+	strcasecmp.
+	(hesiod_init): Use of HES_DOMAIN need not be protected by
+	__secure_getenv.
+	(hesiod_to_bind): Avoid using strcat and extra strlen calls, use
+	stpcpy.
+
+	* string/Makefile (noinl-tester-ENV): New variable to make
+	strerror test pass.
+	(CFLAGS-noinl-tester): Make sure we test the correct functions.
+
+	* sysdeps/stub/atomicity.h: Fix typo.
+	Zack Weinberg <zack@rabi.phys.columbia.edu> told me this twice.
+
+	* manual/string.texi: Document strnlen and mempcpy.
+	Tell a bit more about the locale dependence of strcasecmp and
+	strncasecmp.
+
+	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Remove ptrace.
+	* sysdeps/unix/sysv/linux/sys/ptrace.h (ptrace): Change return
+	value type to long int.
+	* sysdeps/unix/sysv/linux/ptrace.c: Likewise.  Adopt local variable
+	types.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S: Fix typo.
+	Patches by David S. Miller <davem@jenolan.rutgers.edu>.
+
 1997-09-16 02:14  Ulrich Drepper  <drepper@cygnus.com>
 
 	Implementation of Hesiod NSS module by Mark Kettenis.
diff --git a/bits/select.h b/bits/select.h
index 8487e21bb3..0da0acbee8 100644
--- a/bits/select.h
+++ b/bits/select.h
@@ -17,7 +17,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #ifndef _SYS_SELECT_H
-#error "Never use <bits/select.h> directly; include <sys/select.h> instead."
+# error "Never use <bits/select.h> directly; include <sys/select.h> instead."
 #endif
 
 
@@ -26,7 +26,7 @@
 #define __FD_ZERO(set) \
   do {									      \
     unsigned int __i;							      \
-    __fd_mask *__arr = (set);						      \
+    __fd_set *__arr = (set);						      \
     for (__i = 0; __i < sizeof (__fd_set) / sizeof (__fd_mask); ++__i)	      \
       __arr->fds_bits[__i] = '\0';					      \
   } while (0)
diff --git a/hesiod/hesiod.c b/hesiod/hesiod.c
index 8e95dfb393..076b6e7dbc 100644
--- a/hesiod/hesiod.c
+++ b/hesiod/hesiod.c
@@ -67,7 +67,11 @@ static const char rcsid[] = "$Id$";
 static int read_config_file(struct hesiod_p *ctx, const char *filename);
 static char **get_txt_records(struct hesiod_p *ctx, int class,
 			      const char *name);
+#ifdef _LIBC
+# define cistrcmp(s1, s2) strcasecmp (s1, s2)
+#else
 static int cistrcmp(const char *s1, const char *s2);
+#endif
 
 /* This function is called to initialize a hesiod_p. */
 int hesiod_init(void **context)
@@ -85,7 +89,7 @@ int hesiod_init(void **context)
       if (read_config_file(ctx, configname) >= 0)
 	{
 	  /* The default rhs can be overridden by an environment variable. */
-	  p = __secure_getenv("HES_DOMAIN");
+	  p = getenv("HES_DOMAIN");
 	  if (p)
 	    {
 	      if (ctx->rhs)
@@ -133,11 +137,11 @@ void hesiod_end(void *context)
 char *hesiod_to_bind(void *context, const char *name, const char *type)
 {
   struct hesiod_p *ctx = (struct hesiod_p *) context;
-  char bindname[MAXDNAME], *p, *ret, **rhs_list = NULL;
+  char bindname[MAXDNAME], *p, *endp, *ret, **rhs_list = NULL;
   const char *rhs;
-  int len;
-	
-  strcpy(bindname, name);
+  size_t len;
+
+  endp = stpcpy(bindname, name);
 
   /* Find the right right hand side to use, possibly truncating bindname. */
   p = strchr(bindname, '@');
@@ -161,7 +165,7 @@ char *hesiod_to_bind(void *context, const char *name, const char *type)
       rhs = ctx->rhs;
 
   /* See if we have enough room. */
-  len = strlen(bindname) + 1 + strlen(type);
+  len = (endp - bindname) + 1 + strlen(type);
   if (ctx->lhs)
     len += strlen(ctx->lhs) + ((ctx->lhs[0] != '.') ? 1 : 0);
   len += strlen(rhs) + ((rhs[0] != '.') ? 1 : 0);
@@ -174,24 +178,23 @@ char *hesiod_to_bind(void *context, const char *name, const char *type)
     }
 
   /* Put together the rest of the domain. */
-  strcat(bindname, ".");
-  strcat(bindname, type);
+  endp = __stpcpy (__stpcpy (endp, "."), type);
   if (ctx->lhs)
     {
       if (ctx->lhs[0] != '.')
-	strcat(bindname, ".");
-      strcat(bindname, ctx->lhs);
+	endp = __stpcpy (endp, ".");
+      endp = __stpcpy (endp, ctx->lhs);
     }
   if (rhs[0] != '.')
-    strcat(bindname, ".");
-  strcat(bindname, rhs);
+    endp = __stpcpy (endp, ".");
+  endp = __stpcpy (endp, rhs);
 
   /* rhs_list is no longer needed, since we're done with rhs. */
   if (rhs_list)
     hesiod_free_list(context, rhs_list);
 
   /* Make a copy of the result and return it to the caller. */
-  ret = malloc(strlen(bindname) + 1);
+  ret = malloc((endp - bindname) + 1);
   if (!ret)
     {
       __set_errno (ENOMEM);
@@ -277,7 +280,7 @@ static int read_config_file(struct hesiod_p *ctx, const char *filename)
       while(*p != ' ' && *p != '\t' && *p != '=')
 	p++;
       *p++ = 0;
-		
+
       while(isspace(*p) || *p == '=')
 	p++;
       data = p;
@@ -325,7 +328,7 @@ static int read_config_file(struct hesiod_p *ctx, const char *filename)
     }
 
   return 0;
-}	
+}
 
 /* Given a DNS class and a DNS name, do a lookup for TXT records, and
  * return a list of them.
@@ -459,6 +462,7 @@ static char **get_txt_records(struct hesiod_p *ctx, int qclass,
   return list;
 }
 
+#ifndef _LIBC
 static int cistrcmp(const char *s1, const char *s2)
 {
   while (*s1 && tolower(*s1) == tolower(*s2))
@@ -468,3 +472,4 @@ static int cistrcmp(const char *s1, const char *s2)
     }
   return tolower(*s1) - tolower(*s2);
 }
+#endif
diff --git a/libio/fileops.c b/libio/fileops.c
index 001794d05a..22feb74fdd 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -37,6 +37,9 @@
 #ifndef errno
 extern int errno;
 #endif
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
 
 
 #ifdef _LIBC
diff --git a/libio/libioP.h b/libio/libioP.h
index 1880e0bbde..66acb93bf4 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -28,7 +28,9 @@
 
 #include "iolibio.h"
 
-__BEGIN_DECLS
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 #define _IO_seek_set 0
 #define _IO_seek_cur 1
@@ -477,7 +479,9 @@ extern int _IO_vscanf __P ((const char *, _IO_va_list));
 # define _IO_pos_0 ((_IO_fpos_t) 0)
 #endif
 
-__END_DECLS
+#ifdef __cplusplus
+}
+#endif
 
 #ifdef _IO_MTSAFE_IO
 /* check following! */
diff --git a/manual/string.texi b/manual/string.texi
index 48aaaf0965..d6c09b8df9 100644
--- a/manual/string.texi
+++ b/manual/string.texi
@@ -168,6 +168,26 @@ strlen (string)
 @end smallexample
 @end deftypefun
 
+@comment string.h
+@comment GNU
+@deftypefun size_t strnlen (const char *@var{s}, size_t @var{maxlen})
+The @code{strnlen} function returns the length of the null-terminated
+string @var{s} is this length is smaller than @var{maxlen}.  Otherwise
+it returns @var{maxlen}.  Therefore this function is equivalent to
+@code{(strlen (@var{s}) < n ? strlen (@var{s}) : @var{maxlen})} but it
+is more efficent.
+
+@smallexample
+char string[32] = "hello, world";
+strnlen (string, 32)
+    @result{} 12
+strnlen (string, 5)
+    @result{} 5
+@end smallexample
+
+This function is a GNU extension.
+@end deftypefun
+
 @node Copying and Concatenation
 @section Copying and Concatenation
 
@@ -224,6 +244,33 @@ memcpy (new, old, arraysize * sizeof (struct foo));
 @end deftypefun
 
 @comment string.h
+@comment GNU
+@deftypefun {void *} mempcpy (void *@var{to}, const void *@var{from}, size_t @var{size})
+The @code{mempcpy} function is nearly identical to the @code{memcpy}
+function.  It copies @var{size} byts from the object beginning at
+@code{from} into the object pointed to by @var{to}.  But instead of
+returning the value of @code{to} it returns a pointer to the byte
+following the last written byte in the object beginning at @var{to}.
+I.e., the value is @code{((void *) ((char *) @var{to} + @var{size}))}.
+
+This function is useful in situations where a number of objects shall be
+copied to consecutive memory positions.
+
+@smallexample
+void *
+combine (void *o1, size_t s1, void *o2, size_t s2)
+@{
+  void *result = malloc (s1 + s2);
+  if (result != NULL)
+    mempcpy (mempcpy (result, o1, s1), o2, s2);
+  return result;
+@}
+@end smallexample
+
+This function is a GNU extension.
+@end deftypefun
+
+@comment string.h
 @comment ISO
 @deftypefun {void *} memmove (void *@var{to}, const void *@var{from}, size_t @var{size})
 @code{memmove} copies the @var{size} bytes at @var{from} into the
@@ -565,8 +612,11 @@ is an initial substring of @var{s2}, then @var{s1} is considered to be
 @comment string.h
 @comment BSD
 @deftypefun int strcasecmp (const char *@var{s1}, const char *@var{s2})
-This function is like @code{strcmp}, except that differences in case
-are ignored.
+This function is like @code{strcmp}, except that differences in case are
+ignored.  How uppercase and lowercase character are related is
+determined by the currently selected locale.  In the standard @code{"C"}
+locale the characters @"A and @"a do not match but in a locale which
+regards this characters as parts of the alphabeth they do match.
 
 @code{strcasecmp} is derived from BSD.
 @end deftypefun
@@ -575,7 +625,8 @@ are ignored.
 @comment BSD
 @deftypefun int strncasecmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n})
 This function is like @code{strncmp}, except that differences in case
-are ignored.
+are ignored.  Like for @code{strcasecmp} it is locale dependent how
+uppercase and lowercase character are related.
 
 @code{strncasecmp} is a GNU extension.
 @end deftypefun
diff --git a/string/Makefile b/string/Makefile
index dbc41be0be..b0200e5d4f 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -22,7 +22,8 @@
 subdir	:= string
 
 headers	:= string.h strings.h memory.h endian.h bits/endian.h \
-	   argz.h envz.h byteswap.h bits/byteswap.h bits/string.h
+	   argz.h envz.h byteswap.h bits/byteswap.h bits/string.h \
+	   bits/string2.h
 
 routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
 		   strverscmp strdup strndup				\
@@ -49,8 +50,10 @@ include ../Rules
 
 tester-ENV = LANGUAGE=C
 inl-tester-ENV = LANGUAGE=C
+noinl-tester-ENV = LANGUAGE=C
 CFLAGS-tester.c = -fno-builtin
 CFLAGS-inl-tester.c = -fno-builtin
+CFLAGS-noinl-tester.c = -fno-builtin
 CFLAGS-tst-strlen.c = -fno-builtin
 CFLAGS-stratcliff.c = -fno-builtin
 
diff --git a/sysdeps/generic/bits/select.h b/sysdeps/generic/bits/select.h
index 8487e21bb3..0da0acbee8 100644
--- a/sysdeps/generic/bits/select.h
+++ b/sysdeps/generic/bits/select.h
@@ -17,7 +17,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #ifndef _SYS_SELECT_H
-#error "Never use <bits/select.h> directly; include <sys/select.h> instead."
+# error "Never use <bits/select.h> directly; include <sys/select.h> instead."
 #endif
 
 
@@ -26,7 +26,7 @@
 #define __FD_ZERO(set) \
   do {									      \
     unsigned int __i;							      \
-    __fd_mask *__arr = (set);						      \
+    __fd_set *__arr = (set);						      \
     for (__i = 0; __i < sizeof (__fd_set) / sizeof (__fd_mask); ++__i)	      \
       __arr->fds_bits[__i] = '\0';					      \
   } while (0)
diff --git a/sysdeps/i386/bits/select.h b/sysdeps/i386/bits/select.h
index 34d2b0b27a..f2107e9ab7 100644
--- a/sysdeps/i386/bits/select.h
+++ b/sysdeps/i386/bits/select.h
@@ -17,7 +17,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #ifndef _SYS_SELECT_H
-#error "Never use <bits/select.h> directly; include <sys/select.h> instead."
+# error "Never use <bits/select.h> directly; include <sys/select.h> instead."
 #endif
 
 
@@ -58,7 +58,7 @@
 # define __FD_ZERO(set)  \
   do {									      \
     unsigned int __i;							      \
-    __fd_mask *__arr = (set);						      \
+    __fd_set *__arr = (set);						      \
     for (__i = 0; __i < sizeof (__fd_set) / sizeof (__fd_mask); ++__i)	      \
       __arr->fds_bits[__i] = 0;						      \
   } while (0)
diff --git a/sysdeps/stub/atomicity.h b/sysdeps/stub/atomicity.h
index e9edc83a8d..887ce73384 100644
--- a/sysdeps/stub/atomicity.h
+++ b/sysdeps/stub/atomicity.h
@@ -1,4 +1,4 @@
-/* Low-level functions for atomitc operations.  Stub version.
+/* Low-level functions for atomic operations.  Stub version.
    Copyright (C) 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
diff --git a/sysdeps/unix/sysv/linux/ptrace.c b/sysdeps/unix/sysv/linux/ptrace.c
index b50234d2a1..1c60931926 100644
--- a/sysdeps/unix/sysv/linux/ptrace.c
+++ b/sysdeps/unix/sysv/linux/ptrace.c
@@ -21,12 +21,12 @@
 #include <sys/ptrace.h>
 #include <stdarg.h>
 
-extern int __syscall_ptrace (int, pid_t, void *, void *);
+extern long int __syscall_ptrace (int, pid_t, void *, void *);
 
-int
+long int
 ptrace (enum __ptrace_request request, ...)
 {
-  int res, ret;
+  long int res, ret;
   va_list ap;
   pid_t pid;
   void *addr, *data;
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h
new file mode 100644
index 0000000000..9027eca2ac
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h
@@ -0,0 +1,42 @@
+/* Copyright (C) 1997 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.  */
+
+/*
+ * Never include this file directly; use <sys/statfs.h> instead.
+ */
+
+#ifndef _BITS_STATFS_H
+#define _BITS_STATFS_H
+
+#include <bits/types.h>  /* for __fsid_t */
+
+struct statfs
+  {
+    long int f_type;
+    long int f_bsize;
+    long int f_blocks;
+    long int f_bfree;
+    long int f_bavail;
+    long int f_files;
+    long int f_ffree;
+    __fsid_t f_fsid;
+    long int f_namelen;
+    long int f_spare[6];
+  };
+
+#endif	/* bits/statfs.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S
index bcc134e09c..d63762cb15 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S
@@ -44,5 +44,5 @@ ENTRY(longjmp)
 END(longjmp)
 
 strong_alias(longjmp, __longjmp)
-eak_alias(longjmp, _longjmp)
+weak_alias(longjmp, _longjmp)
 weak_alias(longjmp, siglongjmp)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
index 66ba470994..e5425e9a29 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list
@@ -21,6 +21,3 @@ sendto		-	sendto		6	__sendto	sendto
 setsockopt	-	setsockopt	5	__setsockopt	setsockopt
 shutdown	-	shutdown	2	__shutdown	shutdown
 socketpair	-	socketpair	4	__socketpair	socketpair
-
-# Another broken Linux/i386 idea layed to rest
-ptrace		-	ptrace		4	__ptrace	ptrace
diff --git a/sysdeps/unix/sysv/linux/sys/ptrace.h b/sysdeps/unix/sysv/linux/sys/ptrace.h
index eda8b8c00f..7cde2f0a86 100644
--- a/sysdeps/unix/sysv/linux/sys/ptrace.h
+++ b/sysdeps/unix/sysv/linux/sys/ptrace.h
@@ -93,7 +93,7 @@ enum __ptrace_request
    appear (those that are used for the particular request) as:
      pid_t PID, void *ADDR, int DATA, void *ADDR2
    after REQUEST.  */
-extern int ptrace __P ((enum __ptrace_request __request, ...));
+extern long int ptrace __P ((enum __ptrace_request __request, ...));
 
 __END_DECLS