+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.
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
#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)
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)
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)
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, '@');
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);
}
/* 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);
while(*p != ' ' && *p != '\t' && *p != '=')
p++;
*p++ = 0;
-
+
while(isspace(*p) || *p == '=')
p++;
data = p;
}
return 0;
-}
+}
/* Given a DNS class and a DNS name, do a lookup for TXT records, and
* return a list of them.
return list;
}
+#ifndef _LIBC
static int cistrcmp(const char *s1, const char *s2)
{
while (*s1 && tolower(*s1) == tolower(*s2))
}
return tolower(*s1) - tolower(*s2);
}
+#endif
#ifndef errno
extern int errno;
#endif
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
#ifdef _LIBC
#include "iolibio.h"
-__BEGIN_DECLS
+#ifdef __cplusplus
+extern "C" {
+#endif
#define _IO_seek_set 0
#define _IO_seek_cur 1
# define _IO_pos_0 ((_IO_fpos_t) 0)
#endif
-__END_DECLS
+#ifdef __cplusplus
+}
+#endif
#ifdef _IO_MTSAFE_IO
/* check following! */
@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
@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
@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
@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
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 \
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
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
#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)
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
# 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)
-/* 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.
#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;
--- /dev/null
+/* 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 */
END(longjmp)
strong_alias(longjmp, __longjmp)
-eak_alias(longjmp, _longjmp)
+weak_alias(longjmp, _longjmp)
weak_alias(longjmp, siglongjmp)
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
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