From 4547c1a410fbc3ab5592a68bac1661135d91983f Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 16 Sep 1997 21:51:15 +0000 Subject: Update. 1997-09-16 23:48 Ulrich Drepper * 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 * string/Makefile (headers): Instead bits/string2.h. Reported by David S. Miller . 1997-09-16 13:31 David S. Miller * sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h: New file. 1997-09-16 17:42 Ulrich Drepper * 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 . 1997-09-16 04:32 Ulrich Drepper * 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 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 . --- ChangeLog | 49 +++++++++++++++++++ bits/select.h | 4 +- hesiod/hesiod.c | 35 +++++++------ libio/fileops.c | 3 ++ libio/libioP.h | 8 ++- manual/string.texi | 57 ++++++++++++++++++++-- string/Makefile | 5 +- sysdeps/generic/bits/select.h | 4 +- sysdeps/i386/bits/select.h | 4 +- sysdeps/stub/atomicity.h | 2 +- sysdeps/unix/sysv/linux/ptrace.c | 6 +-- .../unix/sysv/linux/sparc/sparc64/bits/statfs.h | 42 ++++++++++++++++ sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S | 2 +- .../unix/sysv/linux/sparc/sparc64/syscalls.list | 3 -- sysdeps/unix/sysv/linux/sys/ptrace.h | 2 +- 15 files changed, 190 insertions(+), 36 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h 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 + + * 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 + + * string/Makefile (headers): Instead bits/string2.h. + Reported by David S. Miller . + +1997-09-16 13:31 David S. Miller + + * sysdeps/unix/sysv/linux/sparc/sparc64/bits/statfs.h: New file. + +1997-09-16 17:42 Ulrich Drepper + + * 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 . + +1997-09-16 04:32 Ulrich Drepper + + * 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 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 . + 1997-09-16 02:14 Ulrich Drepper 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 directly; include instead." +# error "Never use directly; include 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 @@ -223,6 +243,33 @@ memcpy (new, old, arraysize * sizeof (struct foo)); @end smallexample @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}) @@ -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 directly; include instead." +# error "Never use directly; include 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 directly; include instead." +# error "Never use directly; include 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 #include -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 instead. + */ + +#ifndef _BITS_STATFS_H +#define _BITS_STATFS_H + +#include /* 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 -- cgit v1.2.3