1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00
1998-04-07 08:51  Ulrich Drepper  <drepper@cygnus.com>

	* iconv/gconv.c: Take care for NULL arguments.
	* iconv/gconv_dl.c: Make find_func function global.
	* iconv/gconv_int.h: Add prototype for __gconv_find_func.
	Add prototypes for ASCII conversion functions.
	* iconv/gconv_simple.c: Add ASCII conversion functions.
	* locale/C-ctype.c: Correct charset name.

	* wcsmbs/Makefile (distribute): Add wcsmbsload.h.
	(routines): Remove wmemrtowcs and wmemrtombs, add wcsnlen and
	wcsmbsload.
	* wcsmbs/btowc.c: Rewrite to use iconv functionality.
	* wcsmbs/mbrtowc.c: Likewise.
	* wcsmbs/mbsnrtowcs.c: Likewise.
	* wcsmbs/mbsrtowcs.c: Likewise.
	* wcsmbs/wcrtomb.c: Likewise.
	* wcsmbs/wcsnrtombs.c: Likewise.
	* wcsmbs/wcsrtombs.c: Likewise.
	* wcsmbs/wctob.c: Likewise.
	* wcsmbs/wchar.h: Add prototype for __wcslen, wcsnlen.  Remove
	prototypes for wmemr*.
	* wcsmbs/wcslen.c: Rename to __wcslen and make wcslen weak alias.
	* wcsmbs/wcsnlen.c: New file.
	* wcsmbs/wcsmbsload.c: New file.
	* wcsmbs/wcsmbsload.h: New file.

	* manual/filesys.texi: Mention risks of tmpnam and mktemp.

	* manual/install.texi: Describe some more critical points.

	* string/string.h: Add prototype for __strnlen.
	* string/strnlen.c: Rename to __strnlen and make strnlen weak alias.

	* sysdeps/posix/mktemp.c: Rewrite to allow many more files and
	much less predictable names.
	* sysdeps/posix/mkstemp.c: Likewise.

1998-04-05  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* manual/libc.texinfo (Top): Change "file namespace" to "local
	namespace".

	* manual/socket.texi: Change file namespace to local namespace.
	(Out-of-Band Data): Remove unneeded variable link.
	(Host Address Functions): Use uint32_t consequently and add a
	number of clarifications for IPv4/IPv6, classless addresses.
	(Internet Namespace): Added some paragraphs about IPv6.
	Based on suggestions by Francesco Potorti` <F.Potorti@cnuce.cnr.it>.

1998-04-05  Philip Blundell  <Philip.Blundell@pobox.com>

	Update for draft-ietf-ipngwg-bsd-api-new-01.txt:

	* resolv/netdb.h (getnameinfo): Use `socklen_t' not `size_t'.
	(NI_NUMERICHOST, et al.): Tidy up and add comments.
	(AI_NUMERICHOST): Define.
	(getnodebyname): New prototype.
	(AI_V4MAPPED, et al.): New constants.

	* sysdeps/unix/bsd/bsd4.4/bits/sockaddr.h (SA_LEN): New macro.<
	* sysdeps/generic/bits/sockaddr.h (SA_LEN): Likewise.
	* sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Add sa_len
	for socket.
	* sysdeps/unix/sysv/linux/sa_len.c: New file.
	* sysdeps/unix/sysv/linux/Dist: Add sa_len.c.

	* sysdeps/unix/sysv/linux/bits/socket.h: Make multiple #inclusion safe.

	* sysdeps/generic/bits/sockunion.h: New file, defining sockaddr_union.
	* sysdeps/unix/sysv/linux/bits/sockunion.h: Likewise.
	* socket/Makefile (headers): Add bits/sockunion.h.
	* socket/sys/socket.h: Include <bits/sockunion.h>
	* inet/netinet/in.h: Include <bits/sockaddr.h> rather than
	<sys/socket.h>, to avoid getting sockaddr_union defined.
	* sysdeps/generic/bits/socket.h: Allow inclusion from netinet.in.h.
	* sysdeps/unix/sysv/linux/bits/socket.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/socket.h: Likewise.

	* sysdeps/unix/sysv/linux/if_index.c: Remove use of SIOCGIFCOUNT
	(2.2.x kernels won't have it).

1998-04-06 21:21  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/mach/hurd/bits/ioctls.h: Allow inclusion from hurd/ioctl.h.
	* sysdeps/mach/hurd/dl-sysdep.c: Use __ptr_t not caddr_t.
	* iconv/gconv_conf.c: Define MAXPATHLEN if not available before.
	Patches by UCHIYAMA Yasushi <uch@nop.or.jp>.

1998-04-05  Philip Blundell  <Philip.Blundell@pobox.com>

	* manual/socket.texi (Socket Addresses): Fix a typo.
	(Interface Naming): New section.

1998-04-05 23:29  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* configure.in: Check for CC using $ac_tool_prefix, to handle
	cross-compilation.  Use AC_CHECK_TOOL to find MiG.
	* config.make.in: Add MIG to be substituted.
	* mach/Machrules: Don't define MIG variable.

	Patch by Gordon Matzigkeit <gord@profitpress.com>.

1998-04-05  Mark Kettenis  <kettenis@phys.uva.nl>

	* elf/dl-load.c (decompose_rpath): Use local_strdup instead of
	strdupa to copy rpath.

1998-04-05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* configure.in: Fix gcc version check.

	* aclocal.m4 (AC_PROG_CHECK_VER): Rewritten to make less confusing.

1998-04-05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* configure.in: Fix gcc version check.

	* aclocal.m4 (AC_PROG_CHECK_VER): Rewritten to make less
	confusing.

1998-04-05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* configure.in: Fix gcc version check.

	* aclocal.m4 (AC_PROG_CHECK_VER): Rewritten to make less
	confusing.

1998-03-31  Mark Kettenis  <kettenis@phys.uva.nl>

	* sysdeps/unix/bsd/unlockpt.c (unlockpt): Call __ptsname_r instead
	of ptsname_r.

	* stdlib/stdlib.h: Change prototype of ptsname_r to make it more
	like ttyname_r.
	* sysdeps/unix/sysv/linux/ptsname.c (__ptsname_r): Likewise.
	* sysdeps/generic/ptsname.c (__ptsname_r): Likewise.
	* sysdeps/unix/grantpt.c (grantpt): Change check of return value
	of __ptsname_r accordingly.
	* login/openpty.c (openpty): Likewise.

1998-06-04 18:47  H.J. Lu  <hjl@gnu.org>

	* libio/fileops.c (_IO_file_xsgetn): Adjust pointers.

1998-04-06 13:58  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makeconfig (libtypes): Redo H.J. Lu's change of 1998-03-27.

	* Makerules: Readd missing rule for $(objpfx)stamp.oS.

1998-04-06  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* nis/ypclnt.c: Don't give YPERR_RPC back, use the do_ypcall
	return value for better error checking.
This commit is contained in:
Ulrich Drepper
1998-04-07 09:21:28 +00:00
parent 91641c6522
commit 4bca4c1748
65 changed files with 2271 additions and 1098 deletions

156
ChangeLog
View File

@ -1,3 +1,159 @@
1998-04-07 08:51 Ulrich Drepper <drepper@cygnus.com>
* iconv/gconv.c: Take care for NULL arguments.
* iconv/gconv_dl.c: Make find_func function global.
* iconv/gconv_int.h: Add prototype for __gconv_find_func.
Add prototypes for ASCII conversion functions.
* iconv/gconv_simple.c: Add ASCII conversion functions.
* locale/C-ctype.c: Correct charset name.
* wcsmbs/Makefile (distribute): Add wcsmbsload.h.
(routines): Remove wmemrtowcs and wmemrtombs, add wcsnlen and
wcsmbsload.
* wcsmbs/btowc.c: Rewrite to use iconv functionality.
* wcsmbs/mbrtowc.c: Likewise.
* wcsmbs/mbsnrtowcs.c: Likewise.
* wcsmbs/mbsrtowcs.c: Likewise.
* wcsmbs/wcrtomb.c: Likewise.
* wcsmbs/wcsnrtombs.c: Likewise.
* wcsmbs/wcsrtombs.c: Likewise.
* wcsmbs/wctob.c: Likewise.
* wcsmbs/wchar.h: Add prototype for __wcslen, wcsnlen. Remove
prototypes for wmemr*.
* wcsmbs/wcslen.c: Rename to __wcslen and make wcslen weak alias.
* wcsmbs/wcsnlen.c: New file.
* wcsmbs/wcsmbsload.c: New file.
* wcsmbs/wcsmbsload.h: New file.
* manual/filesys.texi: Mention risks of tmpnam and mktemp.
* manual/install.texi: Describe some more critical points.
* string/string.h: Add prototype for __strnlen.
* string/strnlen.c: Rename to __strnlen and make strnlen weak alias.
* sysdeps/posix/mktemp.c: Rewrite to allow many more files and
much less predictable names.
* sysdeps/posix/mkstemp.c: Likewise.
1998-04-05 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* manual/libc.texinfo (Top): Change "file namespace" to "local
namespace".
* manual/socket.texi: Change file namespace to local namespace.
(Out-of-Band Data): Remove unneeded variable link.
(Host Address Functions): Use uint32_t consequently and add a
number of clarifications for IPv4/IPv6, classless addresses.
(Internet Namespace): Added some paragraphs about IPv6.
Based on suggestions by Francesco Potorti` <F.Potorti@cnuce.cnr.it>.
1998-04-05 Philip Blundell <Philip.Blundell@pobox.com>
Update for draft-ietf-ipngwg-bsd-api-new-01.txt:
* resolv/netdb.h (getnameinfo): Use `socklen_t' not `size_t'.
(NI_NUMERICHOST, et al.): Tidy up and add comments.
(AI_NUMERICHOST): Define.
(getnodebyname): New prototype.
(AI_V4MAPPED, et al.): New constants.
* sysdeps/unix/bsd/bsd4.4/bits/sockaddr.h (SA_LEN): New macro.<
* sysdeps/generic/bits/sockaddr.h (SA_LEN): Likewise.
* sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Add sa_len
for socket.
* sysdeps/unix/sysv/linux/sa_len.c: New file.
* sysdeps/unix/sysv/linux/Dist: Add sa_len.c.
* sysdeps/unix/sysv/linux/bits/socket.h: Make multiple #inclusion safe.
* sysdeps/generic/bits/sockunion.h: New file, defining sockaddr_union.
* sysdeps/unix/sysv/linux/bits/sockunion.h: Likewise.
* socket/Makefile (headers): Add bits/sockunion.h.
* socket/sys/socket.h: Include <bits/sockunion.h>
* inet/netinet/in.h: Include <bits/sockaddr.h> rather than
<sys/socket.h>, to avoid getting sockaddr_union defined.
* sysdeps/generic/bits/socket.h: Allow inclusion from netinet.in.h.
* sysdeps/unix/sysv/linux/bits/socket.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/socket.h: Likewise.
* sysdeps/unix/sysv/linux/if_index.c: Remove use of SIOCGIFCOUNT
(2.2.x kernels won't have it).
1998-04-06 21:21 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/mach/hurd/bits/ioctls.h: Allow inclusion from hurd/ioctl.h.
* sysdeps/mach/hurd/dl-sysdep.c: Use __ptr_t not caddr_t.
* iconv/gconv_conf.c: Define MAXPATHLEN if not available before.
Patches by UCHIYAMA Yasushi <uch@nop.or.jp>.
1998-04-05 Philip Blundell <Philip.Blundell@pobox.com>
* manual/socket.texi (Socket Addresses): Fix a typo.
(Interface Naming): New section.
1998-04-05 23:29 Zack Weinberg <zack@rabi.phys.columbia.edu>
* configure.in: Check for CC using $ac_tool_prefix, to handle
cross-compilation. Use AC_CHECK_TOOL to find MiG.
* config.make.in: Add MIG to be substituted.
* mach/Machrules: Don't define MIG variable.
Patch by Gordon Matzigkeit <gord@profitpress.com>.
1998-04-05 Mark Kettenis <kettenis@phys.uva.nl>
* elf/dl-load.c (decompose_rpath): Use local_strdup instead of
strdupa to copy rpath.
1998-04-05 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* configure.in: Fix gcc version check.
* aclocal.m4 (AC_PROG_CHECK_VER): Rewritten to make less confusing.
1998-04-05 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* configure.in: Fix gcc version check.
* aclocal.m4 (AC_PROG_CHECK_VER): Rewritten to make less
confusing.
1998-04-05 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* configure.in: Fix gcc version check.
* aclocal.m4 (AC_PROG_CHECK_VER): Rewritten to make less
confusing.
1998-03-31 Mark Kettenis <kettenis@phys.uva.nl>
* sysdeps/unix/bsd/unlockpt.c (unlockpt): Call __ptsname_r instead
of ptsname_r.
* stdlib/stdlib.h: Change prototype of ptsname_r to make it more
like ttyname_r.
* sysdeps/unix/sysv/linux/ptsname.c (__ptsname_r): Likewise.
* sysdeps/generic/ptsname.c (__ptsname_r): Likewise.
* sysdeps/unix/grantpt.c (grantpt): Change check of return value
of __ptsname_r accordingly.
* login/openpty.c (openpty): Likewise.
1998-06-04 18:47 H.J. Lu <hjl@gnu.org>
* libio/fileops.c (_IO_file_xsgetn): Adjust pointers.
1998-04-06 13:58 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makeconfig (libtypes): Redo H.J. Lu's change of 1998-03-27.
* Makerules: Readd missing rule for $(objpfx)stamp.oS.
1998-04-06 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* nis/ypclnt.c: Don't give YPERR_RPC back, use the do_ypcall
return value for better error checking.
1998-04-06 Jakub Jelinek <jj@sunsite.ms.mff.cuni.cz> 1998-04-06 Jakub Jelinek <jj@sunsite.ms.mff.cuni.cz>
* elf/dl-runtime.c (fixup, profile_fixup): The final arg to * elf/dl-runtime.c (fixup, profile_fixup): The final arg to

View File

@ -582,6 +582,13 @@ touch $@
endef endef
O%-lib = $(..)$(patsubst %,$(libtype$*),c) O%-lib = $(..)$(patsubst %,$(libtype$*),c)
ifndef static-only-routines
subdir_lib: $(objpfx)stamp.oS
$(objpfx)stamp.oS:
$(make-target-directory)
rm -f $@; > $@
endif
endif endif
# Rules to update the $(ar-symtab-name) member with ranlib, # Rules to update the $(ar-symtab-name) member with ranlib,

61
aclocal.m4 vendored
View File

@ -34,54 +34,31 @@ dnl
dnl Locate a program and check that its version is acceptable. dnl Locate a program and check that its version is acceptable.
dnl AC_PROG_CHECK_VER(var, namelist, version-switch, dnl AC_PROG_CHECK_VER(var, namelist, version-switch,
dnl [version-extract-regexp], version-glob, fatal) dnl [version-extract-regexp], version-glob [, do-if-fail])
AC_DEFUN(AC_CHECK_PROG_VER, AC_DEFUN(AC_CHECK_PROG_VER,
[# Prepare to iterate over the program-name list. [AC_CHECK_PROGS([$1], [$2])
set dummy $2; shift if test -z "[$]$1"; then
AC_MSG_CHECKING([for [$]1]) ac_verc_fail=yes
AC_CACHE_VAL(ac_cv_prog_$1, [dnl
if test -n "[$]$1"; then
ac_cv_prog_$1="[$]$1" # Let the user override the test.
else else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" # Found it, now check the version.
for ac_word; do AC_MSG_CHECKING([version of [$]$1])
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_$1="$ac_word"
break
fi
done
test -n "$ac_cv_prog_$1" && break
done
IFS="$ac_save_ifs"
fi])dnl
if test -z "$ac_cv_prog_$1"; then
AC_MSG_RESULT(no)
$1=:
ac_verc_fail=t; ifelse([$6],,,[ac_verc_fatal=$6])
else
# Found it, now check the version.
ac_word=$ac_cv_prog_$1
dnl Do this by hand to avoid "(cached) (cached)".
if test "[$]{ac_cv_prog_$1_ver+set}" != set; then
changequote(<<,>>)dnl changequote(<<,>>)dnl
ac_cv_prog_$1_ver=`$ac_word $3 2>&1 ifelse(<<$4>>,,,<<| sed -n 's/^.*$4.*$/\1/p'>>)` ac_prog_version=`<<$>>$1 $3 2>&1 ifelse(<<$4>>,,,
fi <<| sed -n 's/^.*patsubst(<<$4>>,/,\/).*$/\1/p'>>)`
if test -n "$ac_cv_prog_$1_ver"; then case $ac_prog_version in
case $ac_cv_prog_$1_ver in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
<<$5>>) ac_vers_ok=", ok"; $1=$ac_cv_prog_$1;; <<$5>>)
changequote([,])dnl changequote([,])dnl
*) ac_vers_ok=", bad"; $1=: ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
ac_verc_fail=t; ifelse([$6],,,[ac_verc_fatal=$6]);; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac esac
else AC_MSG_RESULT([$ac_prog_version])
ac_vers_ok="v. ?.??, bad"; $1=:
ac_verc_fail=t; ifelse([$6],,,[ac_verc_fatal=$6])
fi
AC_MSG_RESULT($ac_word $ac_cv_prog_$1_ver$ac_vers_ok)
fi fi
AC_SUBST($1)dnl ifelse([$6],,,
[if test $ac_verc_fail = yes; then
$6
fi])
]) ])
dnl These modifications are to allow for an empty cross compiler tree. dnl These modifications are to allow for an empty cross compiler tree.

View File

@ -1,5 +1,5 @@
/* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version. /* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -37,5 +37,8 @@ typedef unsigned short int sa_family_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int)) #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
/* Return the length of a `sockaddr' structure. */
#define SA_LEN(_x) __libc_sa_len((_x)->sa_family)
extern int __libc_sa_len __P ((sa_family_t __af));
#endif /* bits/sockaddr.h */ #endif /* bits/sockaddr.h */

View File

@ -1,5 +1,5 @@
/* System-specific socket constants and types. Generic/4.3 BSD version. /* System-specific socket constants and types. Generic/4.3 BSD version.
Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc. Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,7 +17,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#ifndef _SYS_SOCKET_H #if !defined _SYS_SOCKET_H && !defined _NETINET_IN_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead." # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif #endif

View File

@ -64,6 +64,7 @@ AR = @AR@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
AS = $(CC) -c AS = $(CC) -c
MIG = @MIG@
# Installation tools. # Installation tools.
INSTALL = @INSTALL@ INSTALL = @INSTALL@

498
configure vendored
View File

@ -1187,208 +1187,258 @@ fi
# These programs are version sensitive. # These programs are version sensitive.
# Prepare to iterate over the program-name list. echo $ac_n "checking build system type""... $ac_c" 1>&6
set dummy gcc cc; shift echo "configure:1192: checking build system type" >&5
echo $ac_n "checking for $1""... $ac_c" 1>&6
echo "configure:1194: checking for $1" >&5 build_alias=$build
case "$build_alias" in
NONE)
case $nonopt in
NONE) build_alias=$host_alias ;;
*) build_alias=$nonopt ;;
esac ;;
esac
build=`$ac_config_sub $build_alias`
build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$build" 1>&6
if test $host != $build; then
ac_tool_prefix=${host_alias}-
else
ac_tool_prefix=
fi
for ac_prog in ${ac_tool_prefix}gcc ${ac_tool_prefix}cc
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1220: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
if test -n "$CC"; then if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test. ac_cv_prog_CC="$CC" # Let the user override the test.
else else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_word; do for ac_dir in $PATH; do
for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=.
test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then
if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="$ac_prog"
ac_cv_prog_CC="$ac_word" break
break fi
fi
done
test -n "$ac_cv_prog_CC" && break
done done
IFS="$ac_save_ifs" IFS="$ac_save_ifs"
fi fi
fi fi
if test -z "$ac_cv_prog_CC"; then CC="$ac_cv_prog_CC"
echo "$ac_t""no" 1>&6 if test -n "$CC"; then
CC=: echo "$ac_t""$CC" 1>&6
ac_verc_fail=t; ac_verc_fatal=t
else else
# Found it, now check the version. echo "$ac_t""no" 1>&6
ac_word=$ac_cv_prog_CC
if test "${ac_cv_prog_CC_ver+set}" != set; then
ac_cv_prog_CC_ver=`$ac_word -v 2>&1 | sed -n 's/^.*version \([egcs0-9.-]*\).*$/\1/p'`
fi
if test -n "$ac_cv_prog_CC_ver"; then
case $ac_cv_prog_CC_ver in
egcs-2.91.*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|2.8.[1-9]*|2.9.[0-9]*) ac_vers_ok=", ok"; CC=$ac_cv_prog_CC;;
*) ac_vers_ok=", bad"; CC=:
ac_verc_fail=t; ac_verc_fatal=t;;
esac
else
ac_vers_ok="v. ?.??, bad"; CC=:
ac_verc_fail=t; ac_verc_fatal=t
fi
echo "$ac_t""$ac_word $ac_cv_prog_CC_ver$ac_vers_ok" 1>&6
fi fi
# Prepare to iterate over the program-name list. test -n "$CC" && break
set dummy make gmake; shift done
echo $ac_n "checking for $1""... $ac_c" 1>&6
echo "configure:1241: checking for $1" >&5 if test -z "$CC"; then
ac_verc_fail=yes
else
# Found it, now check the version.
echo $ac_n "checking version of $CC""... $ac_c" 1>&6
echo "configure:1253: checking version of $CC" >&5
ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcst0-9.-]*\).*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
egcs-2.91.*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|*2.8.[1-9]*|*2.9.[0-9]*)
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac
echo "$ac_t""$ac_prog_version" 1>&6
fi
if test $ac_verc_fail = yes; then
critic_missing=t
fi
for ac_prog in make gmake
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1273: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MAKE'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_MAKE'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
if test -n "$MAKE"; then if test -n "$MAKE"; then
ac_cv_prog_MAKE="$MAKE" # Let the user override the test. ac_cv_prog_MAKE="$MAKE" # Let the user override the test.
else else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_word; do for ac_dir in $PATH; do
for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=.
test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then
if test -f $ac_dir/$ac_word; then ac_cv_prog_MAKE="$ac_prog"
ac_cv_prog_MAKE="$ac_word" break
break fi
fi
done
test -n "$ac_cv_prog_MAKE" && break
done done
IFS="$ac_save_ifs" IFS="$ac_save_ifs"
fi fi
fi fi
if test -z "$ac_cv_prog_MAKE"; then MAKE="$ac_cv_prog_MAKE"
echo "$ac_t""no" 1>&6 if test -n "$MAKE"; then
MAKE=: echo "$ac_t""$MAKE" 1>&6
ac_verc_fail=t; ac_verc_fatal=t
else else
# Found it, now check the version. echo "$ac_t""no" 1>&6
ac_word=$ac_cv_prog_MAKE fi
if test "${ac_cv_prog_MAKE_ver+set}" != set; then
ac_cv_prog_MAKE_ver=`$ac_word --version 2>&1 | sed -n 's/^.*version \([0-9][0-9.]*\), by.*$/\1/p'` test -n "$MAKE" && break
fi done
if test -n "$ac_cv_prog_MAKE_ver"; then
case $ac_cv_prog_MAKE_ver in if test -z "$MAKE"; then
3.75 | 3.76.[2-9] | 3.7[789]* | 3.[89]*) ac_vers_ok=", ok"; MAKE=$ac_cv_prog_MAKE;; ac_verc_fail=yes
*) ac_vers_ok=", bad"; MAKE=: else
ac_verc_fail=t; ac_verc_fatal=t;; # Found it, now check the version.
echo $ac_n "checking version of $MAKE""... $ac_c" 1>&6
echo "configure:1306: checking version of $MAKE" >&5
ac_prog_version=`$MAKE --version 2>&1 | sed -n 's/^.*version \([0-9][0-9.]*\), by.*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
3.75 | 3.76.[1-9] | 3.7[789]* | 3.[89]*)
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac esac
else echo "$ac_t""$ac_prog_version" 1>&6
ac_vers_ok="v. ?.??, bad"; MAKE=: fi
ac_verc_fail=t; ac_verc_fatal=t if test $ac_verc_fail = yes; then
fi critic_missing=t
echo "$ac_t""$ac_word $ac_cv_prog_MAKE_ver$ac_vers_ok" 1>&6
fi fi
# Prepare to iterate over the program-name list. for ac_prog in msgfmt gmsgfmt
set dummy msgfmt gmsgfmt; shift do
echo $ac_n "checking for $1""... $ac_c" 1>&6 # Extract the first word of "$ac_prog", so it can be a program name with args.
echo "configure:1289: checking for $1" >&5 set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1327: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
if test -n "$MSGFMT"; then if test -n "$MSGFMT"; then
ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test.
else else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_word; do for ac_dir in $PATH; do
for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=.
test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then
if test -f $ac_dir/$ac_word; then ac_cv_prog_MSGFMT="$ac_prog"
ac_cv_prog_MSGFMT="$ac_word" break
break fi
fi
done
test -n "$ac_cv_prog_MSGFMT" && break
done done
IFS="$ac_save_ifs" IFS="$ac_save_ifs"
fi fi
fi fi
if test -z "$ac_cv_prog_MSGFMT"; then MSGFMT="$ac_cv_prog_MSGFMT"
echo "$ac_t""no" 1>&6 if test -n "$MSGFMT"; then
MSGFMT=: echo "$ac_t""$MSGFMT" 1>&6
ac_verc_fail=t;
else else
# Found it, now check the version. echo "$ac_t""no" 1>&6
ac_word=$ac_cv_prog_MSGFMT
if test "${ac_cv_prog_MSGFMT_ver+set}" != set; then
ac_cv_prog_MSGFMT_ver=`$ac_word --version 2>&1 | sed -n 's/^.*GNU gettext.*\([0-9][0-9]*\.[0-9]*\).*$/\1/p'`
fi
if test -n "$ac_cv_prog_MSGFMT_ver"; then
case $ac_cv_prog_MSGFMT_ver in
0.[1-9][0-9] | [1-9].*) ac_vers_ok=", ok"; MSGFMT=$ac_cv_prog_MSGFMT;;
*) ac_vers_ok=", bad"; MSGFMT=:
ac_verc_fail=t; ;;
esac
else
ac_vers_ok="v. ?.??, bad"; MSGFMT=:
ac_verc_fail=t;
fi
echo "$ac_t""$ac_word $ac_cv_prog_MSGFMT_ver$ac_vers_ok" 1>&6
fi fi
# Prepare to iterate over the program-name list. test -n "$MSGFMT" && break
set dummy makeinfo; shift done
echo $ac_n "checking for $1""... $ac_c" 1>&6
echo "configure:1336: checking for $1" >&5 if test -z "$MSGFMT"; then
ac_verc_fail=yes
else
# Found it, now check the version.
echo $ac_n "checking version of $MSGFMT""... $ac_c" 1>&6
echo "configure:1360: checking version of $MSGFMT" >&5
ac_prog_version=`$MSGFMT --version 2>&1 | sed -n 's/^.*GNU gettext.*\([0-9][0-9]*\.[0-9]*\).*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
0.[1-9][0-9] | [1-9].*)
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac
echo "$ac_t""$ac_prog_version" 1>&6
fi
if test $ac_verc_fail = yes; then
MSGFMT=: aux_missing=t
fi
for ac_prog in makeinfo
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1380: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
if test -n "$MAKEINFO"; then if test -n "$MAKEINFO"; then
ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
else else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_word; do for ac_dir in $PATH; do
for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=.
test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then
if test -f $ac_dir/$ac_word; then ac_cv_prog_MAKEINFO="$ac_prog"
ac_cv_prog_MAKEINFO="$ac_word" break
break fi
fi
done
test -n "$ac_cv_prog_MAKEINFO" && break
done done
IFS="$ac_save_ifs" IFS="$ac_save_ifs"
fi fi
fi fi
if test -z "$ac_cv_prog_MAKEINFO"; then MAKEINFO="$ac_cv_prog_MAKEINFO"
echo "$ac_t""no" 1>&6 if test -n "$MAKEINFO"; then
MAKEINFO=: echo "$ac_t""$MAKEINFO" 1>&6
ac_verc_fail=t;
else else
# Found it, now check the version. echo "$ac_t""no" 1>&6
ac_word=$ac_cv_prog_MAKEINFO fi
if test "${ac_cv_prog_MAKEINFO_ver+set}" != set; then
ac_cv_prog_MAKEINFO_ver=`$ac_word --version 2>&1 | sed -n 's/^.*GNU texinfo \([0-9][0-9.]*\).*$/\1/p'` test -n "$MAKEINFO" && break
fi done
if test -n "$ac_cv_prog_MAKEINFO_ver"; then
case $ac_cv_prog_MAKEINFO_ver in if test -z "$MAKEINFO"; then
3.1[1-9] | 3.[2-9][0-9]) ac_vers_ok=", ok"; MAKEINFO=$ac_cv_prog_MAKEINFO;; ac_verc_fail=yes
*) ac_vers_ok=", bad"; MAKEINFO=: else
ac_verc_fail=t; ;; # Found it, now check the version.
echo $ac_n "checking version of $MAKEINFO""... $ac_c" 1>&6
echo "configure:1413: checking version of $MAKEINFO" >&5
ac_prog_version=`$MAKEINFO --version 2>&1 | sed -n 's/^.*GNU texinfo \([0-9][0-9.]*\).*$/\1/p'`
case $ac_prog_version in
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
3.1[1-9] | 3.[2-9][0-9])
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
esac esac
else echo "$ac_t""$ac_prog_version" 1>&6
ac_vers_ok="v. ?.??, bad"; MAKEINFO=: fi
ac_verc_fail=t; if test $ac_verc_fail = yes; then
fi MAKEINFO=: aux_missing=t
echo "$ac_t""$ac_word $ac_cv_prog_MAKEINFO_ver$ac_vers_ok" 1>&6
fi fi
test -n "$ac_verc_fatal" && { echo "configure: error: if test -n "$critic_missing"; then
{ echo "configure: error:
*** Some critical program is missing or too old. *** Some critical program is missing or too old.
*** Check the INSTALL file for required versions." 1>&2; exit 1; } *** Check the INSTALL file for required versions." 1>&2; exit 1; }
fi
test -n "$ac_verc_fail" && echo "configure: warning: test -n "$aux_missing" && echo "configure: warning:
*** An auxiliary program is missing or too old; *** An auxiliary program is missing or too old;
*** some features will be disabled. *** some features will be disabled.
*** Check the INSTALL file for required versions." 1>&2 *** Check the INSTALL file for required versions." 1>&2
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:1392: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 echo "configure:1442: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_works'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_cc_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1401,11 +1451,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1405 "configure" #line 1455 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF EOF
if { (eval echo configure:1409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler. # If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then if (./conftest; exit) 2>/dev/null; then
@ -1430,7 +1480,7 @@ else
cross_linkable=yes cross_linkable=yes
fi fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:1434: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "configure:1484: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_cross'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_cc_cross'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1442,7 +1492,7 @@ echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:1446: checking whether we are using GNU C" >&5 echo "configure:1496: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1451,7 +1501,7 @@ else
yes; yes;
#endif #endif
EOF EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1455: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1505: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes ac_cv_prog_gcc=yes
else else
ac_cv_prog_gcc=no ac_cv_prog_gcc=no
@ -1464,7 +1514,7 @@ if test $ac_cv_prog_gcc != yes; then
fi fi
echo $ac_n "checking build system type""... $ac_c" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6
echo "configure:1468: checking build system type" >&5 echo "configure:1518: checking build system type" >&5
build_alias=$build build_alias=$build
case "$build_alias" in case "$build_alias" in
@ -1487,7 +1537,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args. # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2 set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1491: checking for $ac_word" >&5 echo "configure:1541: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1518,7 +1568,7 @@ done
fi fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:1522: checking how to run the C preprocessor" >&5 echo "configure:1572: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory. # On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then if test -n "$CPP" && test -d "$CPP"; then
CPP= CPP=
@ -1533,13 +1583,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1537 "configure" #line 1587 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1543: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1593: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -1550,13 +1600,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1554 "configure" #line 1604 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1560: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1610: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -1589,7 +1639,7 @@ LD=`$CC -print-file-name=ld`
# Determine whether we are using GNU binutils. # Determine whether we are using GNU binutils.
echo $ac_n "checking whether $AS is GNU as""... $ac_c" 1>&6 echo $ac_n "checking whether $AS is GNU as""... $ac_c" 1>&6
echo "configure:1593: checking whether $AS is GNU as" >&5 echo "configure:1643: checking whether $AS is GNU as" >&5
if eval "test \"`echo '$''{'libc_cv_prog_as_gnu'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_prog_as_gnu'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1607,7 +1657,7 @@ rm -f a.out
gnu_as=$libc_cv_prog_as_gnu gnu_as=$libc_cv_prog_as_gnu
echo $ac_n "checking whether $LD is GNU ld""... $ac_c" 1>&6 echo $ac_n "checking whether $LD is GNU ld""... $ac_c" 1>&6
echo "configure:1611: checking whether $LD is GNU ld" >&5 echo "configure:1661: checking whether $LD is GNU ld" >&5
if eval "test \"`echo '$''{'libc_cv_prog_ld_gnu'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_prog_ld_gnu'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1623,16 +1673,10 @@ fi
echo "$ac_t""$libc_cv_prog_ld_gnu" 1>&6 echo "$ac_t""$libc_cv_prog_ld_gnu" 1>&6
gnu_ld=$libc_cv_prog_ld_gnu gnu_ld=$libc_cv_prog_ld_gnu
if test $host != $build; then
ac_tool_prefix=${host_alias}-
else
ac_tool_prefix=
fi
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2 set dummy ${ac_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1636: checking for $ac_word" >&5 echo "configure:1680: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1663,7 +1707,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1667: checking for $ac_word" >&5 echo "configure:1711: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1694,7 +1738,7 @@ if test -n "$ac_tool_prefix"; then
# Extract the first word of "ranlib", so it can be a program name with args. # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2 set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1698: checking for $ac_word" >&5 echo "configure:1742: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1725,10 +1769,41 @@ else
fi fi
fi fi
# Extract the first word of "${ac_tool_prefix}mig", so it can be a program name with args.
set dummy ${ac_tool_prefix}mig; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1776: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_MIG'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$MIG"; then
ac_cv_prog_MIG="$MIG" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_MIG="${ac_tool_prefix}mig"
break
fi
done
IFS="$ac_save_ifs"
test -z "$ac_cv_prog_MIG" && ac_cv_prog_MIG="mig"
fi
fi
MIG="$ac_cv_prog_MIG"
if test -n "$MIG"; then
echo "$ac_t""$MIG" 1>&6
else
echo "$ac_t""no" 1>&6
fi
# check if ar takes S # check if ar takes S
echo $ac_n "checking for ar S""... $ac_c" 1>&6 echo $ac_n "checking for ar S""... $ac_c" 1>&6
echo "configure:1732: checking for ar S" >&5 echo "configure:1807: checking for ar S" >&5
if eval "test \"`echo '$''{'libc_cv_ar_S'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_ar_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1736,7 +1811,7 @@ else
tmplib=lib$$.a tmplib=lib$$.a
rm -f $tmpo $tmplib rm -f $tmpo $tmplib
touch $tmpo touch $tmpo
if { ac_try='${AR-ar} rcuS $tmplib $tmpo > /dev/null 2>&1'; { (eval echo configure:1740: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then if { ac_try='${AR-ar} rcuS $tmplib $tmpo > /dev/null 2>&1'; { (eval echo configure:1815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ar_S=yes libc_cv_ar_S=yes
else else
libc_cv_ar_S=no libc_cv_ar_S=no
@ -1754,7 +1829,7 @@ echo "$ac_t""$libc_cv_ar_S" 1>&6
# - two terminals occur directly after each other # - two terminals occur directly after each other
# - the path contains an element with a dot in it # - the path contains an element with a dot in it
echo $ac_n "checking LD_LIBRARY_PATH variable""... $ac_c" 1>&6 echo $ac_n "checking LD_LIBRARY_PATH variable""... $ac_c" 1>&6
echo "configure:1758: checking LD_LIBRARY_PATH variable" >&5 echo "configure:1833: checking LD_LIBRARY_PATH variable" >&5
case ${LD_LIBRARY_PATH} in case ${LD_LIBRARY_PATH} in
[:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* ) [:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
ld_library_path_setting="contains current directory" ld_library_path_setting="contains current directory"
@ -1774,7 +1849,7 @@ fi
# Extract the first word of "bash", so it can be a program name with args. # Extract the first word of "bash", so it can be a program name with args.
set dummy bash; ac_word=$2 set dummy bash; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1778: checking for $ac_word" >&5 echo "configure:1853: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1816,7 +1891,7 @@ if test "$BASH" = no; then
# Extract the first word of "ksh", so it can be a program name with args. # Extract the first word of "ksh", so it can be a program name with args.
set dummy ksh; ac_word=$2 set dummy ksh; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1820: checking for $ac_word" >&5 echo "configure:1895: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1862,7 +1937,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args. # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2 set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1866: checking for $ac_word" >&5 echo "configure:1941: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1897,7 +1972,7 @@ test -n "$PERL" || PERL="no"
echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6 echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6
echo "configure:1901: checking for signed size_t type" >&5 echo "configure:1976: checking for signed size_t type" >&5
if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1921,12 +1996,12 @@ EOF
fi fi
echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6 echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6
echo "configure:1925: checking for libc-friendly stddef.h" >&5 echo "configure:2000: checking for libc-friendly stddef.h" >&5
if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1930 "configure" #line 2005 "configure"
#include "confdefs.h" #include "confdefs.h"
#define __need_size_t #define __need_size_t
#define __need_wchar_t #define __need_wchar_t
@ -1941,7 +2016,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort (); if (&size == NULL || &wchar == NULL) abort ();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1945: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2020: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_friendly_stddef=yes libc_cv_friendly_stddef=yes
else else
@ -1960,7 +2035,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly."
fi fi
echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6 echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6
echo "configure:1964: checking whether we need to use -P to assemble .S files" >&5 echo "configure:2039: checking whether we need to use -P to assemble .S files" >&5
if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1983,7 +2058,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives."
fi fi
echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6 echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6
echo "configure:1987: checking for assembler global-symbol directive" >&5 echo "configure:2062: checking for assembler global-symbol directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2013,7 +2088,7 @@ EOF
fi fi
echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6 echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6
echo "configure:2017: checking for .set assembler directive" >&5 echo "configure:2092: checking for .set assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2047,7 +2122,7 @@ EOF
fi fi
echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6 echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6
echo "configure:2051: checking for .symver assembler directive" >&5 echo "configure:2126: checking for .symver assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2066,7 +2141,7 @@ fi
echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6 echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6
echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6 echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6
echo "configure:2070: checking for ld --version-script" >&5 echo "configure:2145: checking for ld --version-script" >&5
if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2089,7 +2164,7 @@ EOF
if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o
-nostartfiles -nostdlib -nostartfiles -nostdlib
-Wl,--version-script,conftest.map -Wl,--version-script,conftest.map
1>&5'; { (eval echo configure:2093: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; 1>&5'; { (eval echo configure:2168: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
then then
libc_cv_ld_version_script_option=yes libc_cv_ld_version_script_option=yes
else else
@ -2127,7 +2202,7 @@ if test $VERSIONING = no; then
fi fi
if test $elf = yes; then if test $elf = yes; then
echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6 echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6
echo "configure:2131: checking for .previous assembler directive" >&5 echo "configure:2206: checking for .previous assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2135,7 +2210,7 @@ else
.section foo_section .section foo_section
.previous .previous
EOF EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:2139: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:2214: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_asm_previous_directive=yes libc_cv_asm_previous_directive=yes
else else
libc_cv_asm_previous_directive=no libc_cv_asm_previous_directive=no
@ -2151,7 +2226,7 @@ EOF
else else
echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6 echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6
echo "configure:2155: checking for .popsection assembler directive" >&5 echo "configure:2230: checking for .popsection assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2159,7 +2234,7 @@ else
.pushsection foo_section .pushsection foo_section
.popsection .popsection
EOF EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:2163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:2238: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_asm_popsection_directive=yes libc_cv_asm_popsection_directive=yes
else else
libc_cv_asm_popsection_directive=no libc_cv_asm_popsection_directive=no
@ -2179,12 +2254,12 @@ fi
if test $elf != yes; then if test $elf != yes; then
echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
echo "configure:2183: checking for .init and .fini sections" >&5 echo "configure:2258: checking for .init and .fini sections" >&5
if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2188 "configure" #line 2263 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
@ -2193,7 +2268,7 @@ asm (".section .init");
asm (".text"); asm (".text");
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_have_initfini=yes libc_cv_have_initfini=yes
else else
@ -2221,19 +2296,19 @@ if test $elf = yes; then
else else
if test $ac_cv_prog_cc_works = yes; then if test $ac_cv_prog_cc_works = yes; then
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
echo "configure:2225: checking for _ prefix on C symbol names" >&5 echo "configure:2300: checking for _ prefix on C symbol names" >&5
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2230 "configure" #line 2305 "configure"
#include "confdefs.h" #include "confdefs.h"
asm ("_glibc_foobar:"); asm ("_glibc_foobar:");
int main() { int main() {
glibc_foobar (); glibc_foobar ();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:2312: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
libc_cv_asm_underscores=yes libc_cv_asm_underscores=yes
else else
@ -2248,17 +2323,17 @@ fi
echo "$ac_t""$libc_cv_asm_underscores" 1>&6 echo "$ac_t""$libc_cv_asm_underscores" 1>&6
else else
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
echo "configure:2252: checking for _ prefix on C symbol names" >&5 echo "configure:2327: checking for _ prefix on C symbol names" >&5
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2257 "configure" #line 2332 "configure"
#include "confdefs.h" #include "confdefs.h"
void underscore_test(void) { void underscore_test(void) {
return; } return; }
EOF EOF
if { (eval echo configure:2262: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2337: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if grep _underscore_test conftest* >/dev/null; then if grep _underscore_test conftest* >/dev/null; then
rm -f conftest* rm -f conftest*
libc_cv_asm_underscores=yes libc_cv_asm_underscores=yes
@ -2290,7 +2365,7 @@ if test $elf = yes; then
fi fi
echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
echo "configure:2294: checking for assembler .weak directive" >&5 echo "configure:2369: checking for assembler .weak directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2313,7 +2388,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
if test $libc_cv_asm_weak_directive = no; then if test $libc_cv_asm_weak_directive = no; then
echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
echo "configure:2317: checking for assembler .weakext directive" >&5 echo "configure:2392: checking for assembler .weakext directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2351,7 +2426,7 @@ EOF
fi fi
echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
echo "configure:2355: checking for ld --no-whole-archive" >&5 echo "configure:2430: checking for ld --no-whole-archive" >&5
if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2362,7 +2437,7 @@ __throw () {}
EOF EOF
if { ac_try='${CC-cc} $CFLAGS if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive -nostdlib -nostartfiles -Wl,--no-whole-archive
-o conftest conftest.c 1>&5'; { (eval echo configure:2366: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then -o conftest conftest.c 1>&5'; { (eval echo configure:2441: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ld_no_whole_archive=yes libc_cv_ld_no_whole_archive=yes
else else
libc_cv_ld_no_whole_archive=no libc_cv_ld_no_whole_archive=no
@ -2373,7 +2448,7 @@ fi
echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
echo "configure:2377: checking for gcc -fno-exceptions" >&5 echo "configure:2452: checking for gcc -fno-exceptions" >&5
if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2384,7 +2459,7 @@ __throw () {}
EOF EOF
if { ac_try='${CC-cc} $CFLAGS if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -fno-exceptions -nostdlib -nostartfiles -fno-exceptions
-o conftest conftest.c 1>&5'; { (eval echo configure:2388: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then -o conftest conftest.c 1>&5'; { (eval echo configure:2463: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_no_exceptions=yes libc_cv_gcc_no_exceptions=yes
else else
libc_cv_gcc_no_exceptions=no libc_cv_gcc_no_exceptions=no
@ -2396,14 +2471,14 @@ echo "$ac_t""$libc_cv_gcc_no_exceptions" 1>&6
if test "$base_machine" = alpha ; then if test "$base_machine" = alpha ; then
echo $ac_n "checking for function ..ng prefix""... $ac_c" 1>&6 echo $ac_n "checking for function ..ng prefix""... $ac_c" 1>&6
echo "configure:2400: checking for function ..ng prefix" >&5 echo "configure:2475: checking for function ..ng prefix" >&5
if eval "test \"`echo '$''{'libc_cv_gcc_alpha_ng_prefix'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_gcc_alpha_ng_prefix'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.c <<\EOF cat > conftest.c <<\EOF
foo () { } foo () { }
EOF EOF
if { ac_try='${CC-cc} -S conftest.c -o - | fgrep "\$foo..ng" > /dev/null'; { (eval echo configure:2407: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; if { ac_try='${CC-cc} -S conftest.c -o - | fgrep "\$foo..ng" > /dev/null'; { (eval echo configure:2482: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; };
then then
libc_cv_gcc_alpha_ng_prefix=yes libc_cv_gcc_alpha_ng_prefix=yes
else else
@ -2427,12 +2502,12 @@ fi
fi fi
echo $ac_n "checking for DWARF2 unwind info support""... $ac_c" 1>&6 echo $ac_n "checking for DWARF2 unwind info support""... $ac_c" 1>&6
echo "configure:2431: checking for DWARF2 unwind info support" >&5 echo "configure:2506: checking for DWARF2 unwind info support" >&5
if eval "test \"`echo '$''{'libc_cv_gcc_dwarf2_unwind_info'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_gcc_dwarf2_unwind_info'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.c <<EOF cat > conftest.c <<EOF
#line 2436 "configure" #line 2511 "configure"
static char __EH_FRAME_BEGIN__; static char __EH_FRAME_BEGIN__;
_start () _start ()
{ {
@ -2459,7 +2534,7 @@ __bzero () {}
EOF EOF
if { ac_try='${CC-cc} $CFLAGS -DCHECK__register_frame_info if { ac_try='${CC-cc} $CFLAGS -DCHECK__register_frame_info
-nostdlib -nostartfiles -nostdlib -nostartfiles
-o conftest conftest.c -lgcc >&5'; { (eval echo configure:2463: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then -o conftest conftest.c -lgcc >&5'; { (eval echo configure:2538: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_dwarf2_unwind_info=static libc_cv_gcc_dwarf2_unwind_info=static
else else
libc_cv_gcc_dwarf2_unwind_info=no libc_cv_gcc_dwarf2_unwind_info=no
@ -2467,7 +2542,7 @@ fi
if test $libc_cv_gcc_dwarf2_unwind_info = no; then if test $libc_cv_gcc_dwarf2_unwind_info = no; then
if { ac_try='${CC-cc} $CFLAGS -DCHECK__register_frame if { ac_try='${CC-cc} $CFLAGS -DCHECK__register_frame
-nostdlib -nostartfiles -nostdlib -nostartfiles
-o conftest conftest.c -lgcc >&5'; { (eval echo configure:2471: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then -o conftest conftest.c -lgcc >&5'; { (eval echo configure:2546: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_dwarf2_unwind_info=yes libc_cv_gcc_dwarf2_unwind_info=yes
else else
libc_cv_gcc_dwarf2_unwind_info=no libc_cv_gcc_dwarf2_unwind_info=no
@ -2541,7 +2616,7 @@ if test "$uname" = "sysdeps/generic"; then
fi fi
echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
echo "configure:2545: checking OS release for uname" >&5 echo "configure:2620: checking OS release for uname" >&5
if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2563,7 +2638,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
uname_release="$libc_cv_uname_release" uname_release="$libc_cv_uname_release"
echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
echo "configure:2567: checking OS version for uname" >&5 echo "configure:2642: checking OS version for uname" >&5
if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2585,7 +2660,7 @@ else
fi fi
echo $ac_n "checking stdio selection""... $ac_c" 1>&6 echo $ac_n "checking stdio selection""... $ac_c" 1>&6
echo "configure:2589: checking stdio selection" >&5 echo "configure:2664: checking stdio selection" >&5
case $stdio in case $stdio in
libio) cat >> confdefs.h <<\EOF libio) cat >> confdefs.h <<\EOF
@ -2597,7 +2672,7 @@ esac
echo "$ac_t""$stdio" 1>&6 echo "$ac_t""$stdio" 1>&6
echo $ac_n "checking ldap selection""... $ac_c" 1>&6 echo $ac_n "checking ldap selection""... $ac_c" 1>&6
echo "configure:2601: checking ldap selection" >&5 echo "configure:2676: checking ldap selection" >&5
case $add_ons in case $add_ons in
*ldap*) *ldap*)
@ -2660,7 +2735,7 @@ if test $static = no && test $shared = yes; then
fi fi
echo $ac_n "checking whether -fPIC is default""... $ac_c" 1>&6 echo $ac_n "checking whether -fPIC is default""... $ac_c" 1>&6
echo "configure:2664: checking whether -fPIC is default" >&5 echo "configure:2739: checking whether -fPIC is default" >&5
if eval "test \"`echo '$''{'pic_default'+set}'`\" = set"; then if eval "test \"`echo '$''{'pic_default'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -2839,21 +2914,22 @@ s%@sysnames@%$sysnames%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_DATA@%$INSTALL_DATA%g s%@INSTALL_DATA@%$INSTALL_DATA%g
s%@LN_S@%$LN_S%g s%@LN_S@%$LN_S%g
s%@CC@%$CC%g
s%@MAKE@%$MAKE%g
s%@MSGFMT@%$MSGFMT%g
s%@MAKEINFO@%$MAKEINFO%g
s%@cross_linkable@%$cross_linkable%g
s%@build@%$build%g s%@build@%$build%g
s%@build_alias@%$build_alias%g s%@build_alias@%$build_alias%g
s%@build_cpu@%$build_cpu%g s%@build_cpu@%$build_cpu%g
s%@build_vendor@%$build_vendor%g s%@build_vendor@%$build_vendor%g
s%@build_os@%$build_os%g s%@build_os@%$build_os%g
s%@CC@%$CC%g
s%@MAKE@%$MAKE%g
s%@MSGFMT@%$MSGFMT%g
s%@MAKEINFO@%$MAKEINFO%g
s%@cross_linkable@%$cross_linkable%g
s%@BUILD_CC@%$BUILD_CC%g s%@BUILD_CC@%$BUILD_CC%g
s%@cross_compiling@%$cross_compiling%g s%@cross_compiling@%$cross_compiling%g
s%@CPP@%$CPP%g s%@CPP@%$CPP%g
s%@AR@%$AR%g s%@AR@%$AR%g
s%@RANLIB@%$RANLIB%g s%@RANLIB@%$RANLIB%g
s%@MIG@%$MIG%g
s%@libc_cv_ar_S@%$libc_cv_ar_S%g s%@libc_cv_ar_S@%$libc_cv_ar_S%g
s%@BASH@%$BASH%g s%@BASH@%$BASH%g
s%@libc_cv_have_bash2@%$libc_cv_have_bash2%g s%@libc_cv_have_bash2@%$libc_cv_have_bash2%g

View File

@ -431,25 +431,29 @@ fi
AC_PROG_LN_S AC_PROG_LN_S
# These programs are version sensitive. # These programs are version sensitive.
AC_CHECK_PROG_VER(CC, gcc cc, -v, AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl
[version \([egcs0-9.-]*\)], AC_CHECK_PROG_VER(CC, ${ac_tool_prefix}gcc ${ac_tool_prefix}cc, -v,
[egcs-2.91.*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|2.8.[1-9]*|2.9.[0-9]*], t) [version \([egcst0-9.-]*\)],
[egcs-2.91.*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|*2.8.[1-9]*|*2.9.[0-9]*],
critic_missing=t)
AC_CHECK_PROG_VER(MAKE, make gmake, --version, AC_CHECK_PROG_VER(MAKE, make gmake, --version,
[version \([0-9][0-9.]*\), by], [version \([0-9][0-9.]*\), by],
[3.75 | 3.76.[2-9] | 3.7[789]* | 3.[89]*], t) [3.75 | 3.76.[1-9] | 3.7[789]* | 3.[89]*], critic_missing=t)
AC_CHECK_PROG_VER(MSGFMT, msgfmt gmsgfmt, --version, AC_CHECK_PROG_VER(MSGFMT, msgfmt gmsgfmt, --version,
[GNU gettext.*\([0-9][0-9]*\.[0-9]*\)], [GNU gettext.*\([0-9][0-9]*\.[0-9]*\)],
[0.[1-9][0-9] | [1-9].*]) [0.[1-9][0-9] | [1-9].*], MSGFMT=: aux_missing=t)
AC_CHECK_PROG_VER(MAKEINFO, makeinfo, --version, AC_CHECK_PROG_VER(MAKEINFO, makeinfo, --version,
[GNU texinfo \([0-9][0-9.]*\)], [GNU texinfo \([0-9][0-9.]*\)],
[3.1[1-9] | 3.[2-9][0-9]]) [3.1[1-9] | 3.[2-9][0-9]], MAKEINFO=: aux_missing=t)
test -n "$ac_verc_fatal" && AC_MSG_ERROR([ if test -n "$critic_missing"; then
AC_MSG_ERROR([
*** Some critical program is missing or too old. *** Some critical program is missing or too old.
*** Check the INSTALL file for required versions.]) *** Check the INSTALL file for required versions.])
fi
test -n "$ac_verc_fail" && AC_MSG_WARN([ test -n "$aux_missing" && AC_MSG_WARN([
*** An auxiliary program is missing or too old; *** An auxiliary program is missing or too old;
*** some features will be disabled. *** some features will be disabled.
*** Check the INSTALL file for required versions.]) *** Check the INSTALL file for required versions.])
@ -464,6 +468,7 @@ AC_PROG_CPP
LIBC_PROG_BINUTILS LIBC_PROG_BINUTILS
AC_CHECK_TOOL(AR, ar) AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(RANLIB, ranlib, :)
AC_CHECK_TOOL(MIG, mig)
# check if ar takes S # check if ar takes S
AC_CACHE_CHECK(for ar S, libc_cv_ar_S, [dnl AC_CACHE_CHECK(for ar S, libc_cv_ar_S, [dnl

View File

@ -280,7 +280,7 @@ decompose_rpath (const char *rpath, size_t additional_room,
const char *what, const char *where) const char *what, const char *where)
{ {
/* Make a copy we can work with. */ /* Make a copy we can work with. */
char *copy = strdupa (rpath); char *copy = local_strdup (rpath);
char *cp; char *cp;
struct r_search_path_elem **result; struct r_search_path_elem **result;
/* First count the number of necessary elements in the result array. */ /* First count the number of necessary elements in the result array. */

View File

@ -1,6 +1,6 @@
/* Convert characters in input buffer using conversion descriptor to /* Convert characters in input buffer using conversion descriptor to
output buffer. output buffer.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -34,19 +34,24 @@ __gconv (gconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf,
if (cd == (gconv_t) -1L) if (cd == (gconv_t) -1L)
return GCONV_ILLEGAL_DESCRIPTOR; return GCONV_ILLEGAL_DESCRIPTOR;
cd->data[last_step].outbuf = *outbuf; cd->data[last_step].outbuf = outbuf ? *outbuf : NULL;
cd->data[last_step].outbufavail = 0; cd->data[last_step].outbufavail = 0;
cd->data[last_step].outbufsize = *outbytesleft; cd->data[last_step].outbufsize = *outbytesleft;
if (converted != NULL) if (converted != NULL)
*converted = 0; *converted = 0;
result = (*cd->steps->fct) (cd->steps, cd->data, *inbuf, inbytesleft, result = (*cd->steps->fct) (cd->steps, cd->data,
inbuf ? *inbuf : NULL, inbytesleft,
converted, inbuf == NULL || *inbuf == NULL); converted, inbuf == NULL || *inbuf == NULL);
*inbuf += oldinbytes - *inbytesleft; if (inbuf != NULL && *inbuf != NULL)
*outbuf += cd->data[last_step].outbufavail; *inbuf += oldinbytes - *inbytesleft;
*outbytesleft -= cd->data[last_step].outbufavail; if (outbuf != NULL && *outbuf != NULL)
{
*outbuf += cd->data[last_step].outbufavail;
*outbytesleft -= cd->data[last_step].outbufavail;
}
return result; return result;
} }

View File

@ -398,6 +398,10 @@ __gconv_read_conf (void)
elem = strtok_r (gconv_path, ":", &gconv_path); elem = strtok_r (gconv_path, ":", &gconv_path);
while (elem != NULL) while (elem != NULL)
{ {
#ifndef MAXPATHLEN
/* We define a reasonable limit. */
# define 4096
#endif
char real_elem[MAXPATHLEN]; char real_elem[MAXPATHLEN];
if (realpath (elem, real_elem) != NULL) if (realpath (elem, real_elem) != NULL)

View File

@ -108,9 +108,9 @@ get_sym (void *a)
} }
static void * void *
internal_function internal_function
find_func (void *handle, const char *name) __gconv_find_func (void *handle, const char *name)
{ {
struct get_sym_args args; struct get_sym_args args;
@ -170,7 +170,7 @@ __gconv_find_shlib (const char *name)
{ {
if (dlerror_run (do_open, found) == 0) if (dlerror_run (do_open, found) == 0)
{ {
found->fct = find_func (found->handle, "gconv"); found->fct = __gconv_find_func (found->handle, "gconv");
if (found->fct == NULL) if (found->fct == NULL)
{ {
/* Argh, no conversion function. There is something /* Argh, no conversion function. There is something
@ -180,8 +180,10 @@ __gconv_find_shlib (const char *name)
} }
else else
{ {
found->init_fct = find_func (found->handle, "gconv_init"); found->init_fct = __gconv_find_func (found->handle,
found->end_fct = find_func (found->handle, "gconv_end"); "gconv_init");
found->end_fct = __gconv_find_func (found->handle,
"gconv_end");
/* We have succeeded in loading the shared object. */ /* We have succeeded in loading the shared object. */
found->counter = 1; found->counter = 1;

View File

@ -129,6 +129,10 @@ extern int __gconv_close_transform (struct gconv_step *__steps,
extern struct gconv_loaded_object *__gconv_find_shlib (const char *__name) extern struct gconv_loaded_object *__gconv_find_shlib (const char *__name)
internal_function; internal_function;
/* Find function named NAME in shared object referenced by HANDLE. */
void *__gconv_find_func (void *handle, const char *name)
internal_function;
/* Release shared object. If no further reference is available unload /* Release shared object. If no further reference is available unload
the object. */ the object. */
extern int __gconv_release_shlib (struct gconv_loaded_object *__handle) extern int __gconv_release_shlib (struct gconv_loaded_object *__handle)
@ -149,6 +153,8 @@ extern void __gconv_get_builtin_trans (const char *__name,
int __do_flush) int __do_flush)
__BUILTIN_TRANS (__gconv_transform_dummy); __BUILTIN_TRANS (__gconv_transform_dummy);
__BUILTIN_TRANS (__gconv_transform_ascii_ucs4);
__BUILTIN_TRANS (__gconv_transform_ucs4_ascii);
__BUILTIN_TRANS (__gconv_transform_ucs4_utf8); __BUILTIN_TRANS (__gconv_transform_ucs4_utf8);
__BUILTIN_TRANS (__gconv_transform_utf8_ucs4); __BUILTIN_TRANS (__gconv_transform_utf8_ucs4);
__BUILTIN_TRANS (__gconv_transform_ucs2_ucs4); __BUILTIN_TRANS (__gconv_transform_ucs2_ucs4);

View File

@ -76,6 +76,234 @@ __gconv_transform_dummy (struct gconv_step *step, struct gconv_step_data *data,
} }
/* Convert from ISO 646-IRV to ISO 10646/UCS4. */
int
__gconv_transform_ascii_ucs4 (struct gconv_step *step,
struct gconv_step_data *data, const char *inbuf,
size_t *inlen, size_t *written, int do_flush)
{
struct gconv_step *next_step = step + 1;
struct gconv_step_data *next_data = data + 1;
gconv_fct fct = next_step->fct;
size_t do_write;
int result;
/* If the function is called with no input this means we have to reset
to the initial state. The possibly partly converted input is
dropped. */
if (do_flush)
{
/* Clear the state. */
memset (data->statep, '\0', sizeof (mbstate_t));
do_write = 0;
/* Call the steps down the chain if there are any. */
if (data->is_last)
result = GCONV_OK;
else
{
struct gconv_step *next_step = step + 1;
struct gconv_step_data *next_data = data + 1;
result = (*fct) (next_step, next_data, NULL, 0, written, 1);
/* Clear output buffer. */
data->outbufavail = 0;
}
}
else
{
int save_errno = errno;
do_write = 0;
result = GCONV_OK;
do
{
const unsigned char *newinbuf = inbuf;
size_t actually = 0;
size_t cnt = 0;
while (data->outbufavail + sizeof (wchar_t) <= data->outbufsize
&& cnt < *inlen)
{
if (*newinbuf > '\x7f')
{
/* This is no correct ANSI_X3.4-1968 character. */
result = GCONV_ILLEGAL_INPUT;
break;
}
/* It's an one byte sequence. */
*(wchar_t *) &data->outbuf[data->outbufavail++]
= (wchar_t) *newinbuf;
++actually;
++newinbuf;
++cnt;
}
/* Remember how much we converted. */
do_write += cnt * sizeof (wchar_t);
*inlen -= cnt;
/* Check whether an illegal character appeared. */
if (result != GCONV_OK)
break;
if (data->is_last)
{
/* This is the last step. */
result = (*inlen == 0 ? GCONV_EMPTY_INPUT : GCONV_FULL_OUTPUT);
break;
}
/* Status so far. */
result = GCONV_EMPTY_INPUT;
if (data->outbufavail > 0)
{
/* Call the functions below in the chain. */
size_t newavail = data->outbufavail;
result = (*fct) (next_step, next_data, data->outbuf, &newavail,
written, 0);
/* Correct the output buffer. */
if (newavail != data->outbufavail && newavail > 0)
{
memmove (data->outbuf,
&data->outbuf[data->outbufavail - newavail],
newavail);
data->outbufavail = newavail;
}
}
}
while (*inlen > 0 && result == GCONV_EMPTY_INPUT);
__set_errno (save_errno);
}
if (written != NULL && data->is_last)
*written = do_write / sizeof (wchar_t);
return result;
}
/* Convert from ISO 10646/UCS to ISO 646-IRV. */
int
__gconv_transform_ucs4_ascii (struct gconv_step *step,
struct gconv_step_data *data, const char *inbuf,
size_t *inlen, size_t *written, int do_flush)
{
struct gconv_step *next_step = step + 1;
struct gconv_step_data *next_data = data + 1;
gconv_fct fct = next_step->fct;
size_t do_write;
int result;
/* If the function is called with no input this means we have to reset
to the initial state. The possibly partly converted input is
dropped. */
if (do_flush)
{
/* Clear the state. */
memset (data->statep, '\0', sizeof (mbstate_t));
do_write = 0;
/* Call the steps down the chain if there are any. */
if (data->is_last)
result = GCONV_OK;
else
{
struct gconv_step *next_step = step + 1;
struct gconv_step_data *next_data = data + 1;
result = (*fct) (next_step, next_data, NULL, 0, written, 1);
/* Clear output buffer. */
data->outbufavail = 0;
}
}
else
{
int save_errno = errno;
do_write = 0;
result = GCONV_OK;
do
{
const wchar_t *newinbuf = (const wchar_t *) inbuf;
size_t actually = 0;
size_t cnt = 0;
while (data->outbufavail < data->outbufsize
&& cnt + sizeof (wchar_t) <= *inlen)
{
if (*newinbuf < L'\0' || *newinbuf > L'\x7f')
{
/* This is no correct ANSI_X3.4-1968 character. */
result = GCONV_ILLEGAL_INPUT;
break;
}
/* It's an one byte sequence. */
data->outbuf[data->outbufavail++] = (char) *newinbuf;
++actually;
++newinbuf;
++cnt;
}
/* Remember how much we converted. */
do_write += cnt;
*inlen -= cnt * sizeof (wchar_t);
/* Check whether an illegal character appeared. */
if (result != GCONV_OK)
break;
if (data->is_last)
{
/* This is the last step. */
result = (*inlen < sizeof (wchar_t)
? GCONV_EMPTY_INPUT : GCONV_FULL_OUTPUT);
break;
}
/* Status so far. */
result = GCONV_EMPTY_INPUT;
if (data->outbufavail > 0)
{
/* Call the functions below in the chain. */
size_t newavail = data->outbufavail;
result = (*fct) (next_step, next_data, data->outbuf, &newavail,
written, 0);
/* Correct the output buffer. */
if (newavail != data->outbufavail && newavail > 0)
{
memmove (data->outbuf,
&data->outbuf[data->outbufavail - newavail],
newavail);
data->outbufavail = newavail;
}
}
}
while (*inlen > 0 && result == GCONV_EMPTY_INPUT);
__set_errno (save_errno);
}
if (written != NULL && data->is_last)
*written = do_write;
return result;
}
int int
__gconv_transform_ucs4_utf8 (struct gconv_step *step, __gconv_transform_ucs4_utf8 (struct gconv_step *step,
struct gconv_step_data *data, const char *inbuf, struct gconv_step_data *data, const char *inbuf,

View File

@ -22,8 +22,8 @@
#include <features.h> #include <features.h>
#include <stdint.h> #include <stdint.h>
#include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <bits/socket.h>
__BEGIN_DECLS __BEGIN_DECLS

View File

@ -781,7 +781,8 @@ _IO_file_xsgetn (fp, data, n)
void *data; void *data;
_IO_size_t n; _IO_size_t n;
{ {
register _IO_size_t want, have, count; register _IO_size_t want, have;
register _IO_ssize_t count;
register char *s = data; register char *s = data;
want = n; want = n;
@ -815,7 +816,7 @@ _IO_file_xsgetn (fp, data, n)
/* If we now want less than a buffer, underflow and repeat /* If we now want less than a buffer, underflow and repeat
the copy. Otherwise, _IO_SYSREAD directly to the copy. Otherwise, _IO_SYSREAD directly to
the user buffer. */ the user buffer. */
if (fp->_IO_buf_base && want < fp->_IO_buf_end - fp->_IO_buf_base) if (fp->_IO_buf_base && want <= fp->_IO_buf_end - fp->_IO_buf_base)
{ {
if (__underflow (fp) == EOF) if (__underflow (fp) == EOF)
break; break;
@ -823,6 +824,11 @@ _IO_file_xsgetn (fp, data, n)
continue; continue;
} }
/* These must be set before the sysread as we might longjmp out
waiting for input. */
_IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base);
_IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base);
count = _IO_SYSREAD (fp, s, want); count = _IO_SYSREAD (fp, s, want);
if (count <= 0) if (count <= 0)
{ {
@ -836,6 +842,8 @@ _IO_file_xsgetn (fp, data, n)
s += count; s += count;
want -= count; want -= count;
if (fp->_offset != _IO_pos_BAD)
_IO_pos_adjust (fp->_offset, count);
} }
} }

View File

@ -21,7 +21,7 @@
# #
subdir := linuxthreads subdir := linuxthreads
linuxthreads-version=0.7 libpthread-version=0.7
headers := pthread.h semaphore.h bits/semaphore.h headers := pthread.h semaphore.h bits/semaphore.h
distribute := internals.h queue.h restart.h spinlock.h distribute := internals.h queue.h restart.h spinlock.h

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@ -368,6 +368,6 @@ const struct locale_data _nl_C_LC_CTYPE =
{ string: "tolower\0" "toupper\0" }, { string: "tolower\0" "toupper\0" },
{ string: _nl_C_LC_CTYPE_width }, { string: _nl_C_LC_CTYPE_width },
{ word: 2 }, { word: 2 },
{ string: "ISO_646.IRV" } { string: "ANSI_X3.4-1968" }
} }
}; };

View File

@ -48,7 +48,7 @@ openpty (pmast, pslave, pname, tio, wins)
if (unlockpt (pfd)) if (unlockpt (pfd))
goto bail; goto bail;
if (!ptsname_r (pfd, name, PTYNAMELEN)) if (ptsname_r (pfd, name, PTYNAMELEN) != 0)
goto bail; goto bail;
tfd = open (name, O_RDWR); tfd = open (name, O_RDWR);

View File

@ -1,6 +1,6 @@
# Rules for MiG interfaces that want to go into the C library. # Rules for MiG interfaces that want to go into the C library.
# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. # Copyright (C) 1991, 92, 93, 94, 95, 96, 98 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -44,9 +44,6 @@ endif
include ../Makeconfig include ../Makeconfig
ifndef MIG
MIG = mig
endif
MIGFLAGS = -DMACH_IPC_COMPAT=0 -DSTANDALONE -DTypeCheck=0 \ MIGFLAGS = -DMACH_IPC_COMPAT=0 -DSTANDALONE -DTypeCheck=0 \
$(+includes) $(migdefines) -subrprefix __ $(+includes) $(migdefines) -subrprefix __

View File

@ -2345,6 +2345,13 @@ It is possible for @code{tmpnam} to fail if you call it too many times
without removing previously created files. This is because the fixed without removing previously created files. This is because the fixed
length of a temporary file name gives room for only a finite number of length of a temporary file name gives room for only a finite number of
different names. If @code{tmpnam} fails, it returns a null pointer. different names. If @code{tmpnam} fails, it returns a null pointer.
@strong{Warning:} Since between the time the pathname is constructed and
the file is created another process might have created a file with this
name using @code{tmpnam} is a possible security hole. The
implementation generates names which hardly can be predicted but opening
the file in any case should use the @code{O_EXCL} flag. Using
@code{tmpfile} is a safe way to avoid this problem.
@end deftypefun @end deftypefun
@comment stdio.h @comment stdio.h
@ -2445,6 +2452,13 @@ The @code{mktemp} function generates a unique file name by modifying
name, it makes @var{template} an empty string and returns that. If name, it makes @var{template} an empty string and returns that. If
@var{template} does not end with @samp{XXXXXX}, @code{mktemp} returns a @var{template} does not end with @samp{XXXXXX}, @code{mktemp} returns a
null pointer. null pointer.
@strong{Warning:} Since between the time the pathname is constructed and
the file is created another process might have created a file with this
name using @code{mktemp} is a possible security hole. The
implementation generates names which hardly can be predicted but opening
the file in any case should use the @code{O_EXCL} flag. Using
@code{mkstemp} is a safe way to avoid this problem.
@end deftypefun @end deftypefun
@comment unistd.h @comment unistd.h

View File

@ -171,6 +171,25 @@ value for the Makefile variable @code{install_root} on the command line.
This is useful to create chroot'ed environment or to prepare binary This is useful to create chroot'ed environment or to prepare binary
releases.@refill releases.@refill
For now (in this alpha version, and at least on RedHat Linux), if you
are trying to install this as your default libraries, a different
installation method is recommended. Move @file{/usr/include} out of the
way, create a new @file{/usr/include} directory (don't forget the
symlinks @file{/usr/include/asm} and @file{/usr/include/linux}, that
should point to @file{/usr/src/linux/include/asm} and
@file{/usr/src/linux/include/linux} -or wherever you keep your kernel
sources-respectively), build normally and install into somewhere else
via @code{install_root}. Then move your @code{/usr/include} back, and
copy the newly created stuff by hand over the old. Remember to copy
programs and shared libraries into @file{FILENAME.new} and then move
@file{FILENAME.new} to @file{FILENAME}, as the files might be in
use. You will have to @code{ranlib} your copies of the static libraries
@file{/usr/lib/libNAME.a}. You will see that @file{libbsd-compat.a},
@file{libieee.a}, and @file{libmcheck.a} are just object files, not
archives. This is normal. Copy the new header files over the old ones
by something like @w{@code{cd /usr; (cd INSTALL_ROOT; tar cf - include) |
tar xf -}}.
@node Tools for Installation @node Tools for Installation
@appendixsec Recommended Tools to Install the GNU C Library @appendixsec Recommended Tools to Install the GNU C Library
@cindex installation tools @cindex installation tools

View File

@ -19,7 +19,7 @@
@c sold 0.06/1.09, print run out 21may96 @c sold 0.06/1.09, print run out 21may96
@set EDITION 0.07 DRAFT @set EDITION 0.07 DRAFT
@set VERSION 2.00 Beta @set VERSION 2.00 Beta
@set UPDATED 04 Aug 1997 @set UPDATED 03 Apr 1998
@set ISBN 1-882114-53-1 @set ISBN 1-882114-53-1
@ifinfo @ifinfo
@ -28,7 +28,7 @@ This file documents the GNU C library.
This is Edition @value{EDITION}, last updated @value{UPDATED}, This is Edition @value{EDITION}, last updated @value{UPDATED},
of @cite{The GNU C Library Reference Manual}, for Version @value{VERSION}. of @cite{The GNU C Library Reference Manual}, for Version @value{VERSION}.
Copyright (C) 1993, '94, '95, '96, '97 Free Software Foundation, Inc. Copyright (C) 1993, '94, '95, '96, '97, '98 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice this manual provided the copyright notice and this permission notice
@ -74,7 +74,7 @@ Foundation.
@center for version @value{VERSION} @center for version @value{VERSION}
@page @page
@vskip 0pt plus 1filll @vskip 0pt plus 1filll
Copyright @copyright{} 1993, '94, '95, '96, '97 Free Software Foundation, Inc. Copyright @copyright{} 1993, '94, '95, '96, '97, '98 Free Software Foundation, Inc.
@sp 2 @sp 2
Published by the Free Software Foundation @* Published by the Free Software Foundation @*
59 Temple Place -- Suite 330, @* 59 Temple Place -- Suite 330, @*
@ -507,7 +507,7 @@ Sockets
* Socket Concepts:: Basic concepts you need to know about. * Socket Concepts:: Basic concepts you need to know about.
* Communication Styles:: Stream communication, datagrams, and others. * Communication Styles:: Stream communication, datagrams, and others.
* Socket Addresses:: How socket names (``addresses'') work. * Socket Addresses:: How socket names (``addresses'') work.
* File Namespace:: Details about the file namespace. * Local Namespace:: Details about the local namespace.
* Internet Namespace:: Details about the Internet namespace. * Internet Namespace:: Details about the Internet namespace.
* Open/Close Sockets:: Creating sockets and destroying them. * Open/Close Sockets:: Creating sockets and destroying them.
* Connections:: Operations on sockets with connection state. * Connections:: Operations on sockets with connection state.
@ -570,7 +570,7 @@ Datagrams
* Sending Datagrams:: Sending packets on a datagram socket. * Sending Datagrams:: Sending packets on a datagram socket.
* Receiving Datagrams:: Receiving packets on a datagram socket. * Receiving Datagrams:: Receiving packets on a datagram socket.
* Datagram Example:: An example program: packets sent over a * Datagram Example:: An example program: packets sent over a
datagram stream in the file namespace. datagram stream in the local namespace.
* Example Receiver:: Another program, that receives those packets. * Example Receiver:: Another program, that receives those packets.
Socket Options Socket Options

View File

@ -21,13 +21,16 @@ system, and the socket functions always exist, but if the system does
not really support sockets, these functions always fail. not really support sockets, these functions always fail.
@strong{Incomplete:} We do not currently document the facilities for @strong{Incomplete:} We do not currently document the facilities for
broadcast messages or for configuring Internet interfaces. broadcast messages or for configuring Internet interfaces. The
reentrant functions and some newer functions that are related to IPv6
aren't documented either so far.
@menu @menu
* Socket Concepts:: Basic concepts you need to know about. * Socket Concepts:: Basic concepts you need to know about.
* Communication Styles::Stream communication, datagrams, and other styles. * Communication Styles::Stream communication, datagrams, and other styles.
* Socket Addresses:: How socket names (``addresses'') work. * Socket Addresses:: How socket names (``addresses'') work.
* File Namespace:: Details about the file namespace. * Interface Naming:: Identifying specific network interfaces.
* Local Namespace:: Details about the local namespace.
* Internet Namespace:: Details about the Internet namespace. * Internet Namespace:: Details about the Internet namespace.
* Misc Namespaces:: Other namespaces not documented fully here. * Misc Namespaces:: Other namespaces not documented fully here.
* Open/Close Sockets:: Creating sockets and destroying them. * Open/Close Sockets:: Creating sockets and destroying them.
@ -141,13 +144,13 @@ But now the POSIX people came and unified the interface with their words
@code{size_t} is 64 bits wide and so variable references are not anymore @code{size_t} is 64 bits wide and so variable references are not anymore
possible. possible.
A solution provides the Unix98 specification which finally introduces a A solution is provided by the Unix98 specification which finally
type @code{socklen_t}. This type is used in all of the cases that were introduces a type @code{socklen_t}. This type is used in all of the
previously changed to use @code{size_t}. The only requirement of this cases that were previously changed to use @code{size_t}. The only
type is that it is an unsigned type of at least 32 bits. Therefore, requirement of this type is that it is an unsigned type of at least 32
implementations which require references to 32 bit variables be passed bits. Therefore, implementations which require references to 32 bit
can be as happy as implementations which use right from the start 64 bit variables be passed can be as happy as implementations which use right
values. from the start 64 bit values.
@node Communication Styles @node Communication Styles
@ -260,11 +263,11 @@ system assigns an address automatically if you have not specified one.
Occasionally a client needs to specify an address because the server Occasionally a client needs to specify an address because the server
discriminates based on addresses; for example, the rsh and rlogin discriminates based on addresses; for example, the rsh and rlogin
protocols look at the client's socket address and don't bypass password protocols look at the client's socket address and only bypass password
checking unless it is less than @code{IPPORT_RESERVED} (@pxref{Ports}). checking if it is less than @code{IPPORT_RESERVED} (@pxref{Ports}).
The details of socket addresses vary depending on what namespace you are The details of socket addresses vary depending on what namespace you are
using. @xref{File Namespace}, or @ref{Internet Namespace}, for specific using. @xref{Local Namespace}, or @ref{Internet Namespace}, for specific
information. information.
Regardless of the namespace, you use the same functions @code{bind} and Regardless of the namespace, you use the same functions @code{bind} and
@ -304,7 +307,7 @@ The symbols in this section are defined in the header file
@comment sys/socket.h @comment sys/socket.h
@comment BSD @comment BSD
@deftp {Date Type} {struct sockaddr} @deftp {Data Type} {struct sockaddr}
The @code{struct sockaddr} type itself has the following members: The @code{struct sockaddr} type itself has the following members:
@table @code @table @code
@ -329,7 +332,7 @@ corresponding namespace. Here is a list of address format names:
@item AF_FILE @item AF_FILE
@vindex AF_FILE @vindex AF_FILE
This designates the address format that goes with the file namespace. This designates the address format that goes with the file namespace.
(@code{PF_FILE} is the name of that namespace.) @xref{File Namespace (@code{PF_FILE} is the name of that namespace.) @xref{Local Namespace
Details}, for information about this address format. Details}, for information about this address format.
@comment sys/socket.h @comment sys/socket.h
@ -339,6 +342,14 @@ Details}, for information about this address format.
This is a synonym for @code{AF_FILE}, for compatibility. This is a synonym for @code{AF_FILE}, for compatibility.
(@code{PF_UNIX} is likewise a synonym for @code{PF_FILE}.) (@code{PF_UNIX} is likewise a synonym for @code{PF_FILE}.)
@comment sys/socket.h
@comment BSD
@item AF_UNIX
@vindex AF_LOCAL
This is another synonym for @code{AF_FILE}, for compatibility.
(@code{PF_LOCAL} is likewise a synonym for @code{PF_FILE}.)
@strong{POSIX? XXX}
@comment sys/socket.h @comment sys/socket.h
@comment BSD @comment BSD
@item AF_INET @item AF_INET
@ -376,7 +387,7 @@ information about how to use them.
@pindex sys/socket.h @pindex sys/socket.h
Use the @code{bind} function to assign an address to a socket. The Use the @code{bind} function to assign an address to a socket. The
prototype for @code{bind} is in the header file @file{sys/socket.h}. prototype for @code{bind} is in the header file @file{sys/socket.h}.
For examples of use, see @ref{File Namespace}, or see @ref{Inet Example}. For examples of use, see @ref{Local Socket Example}, or see @ref{Inet Example}.
@comment sys/socket.h @comment sys/socket.h
@comment BSD @comment BSD
@ -462,29 +473,107 @@ You can't read the address of a socket in the file namespace. This is
consistent with the rest of the system; in general, there's no way to consistent with the rest of the system; in general, there's no way to
find a file's name from a descriptor for that file. find a file's name from a descriptor for that file.
@node File Namespace @node Interface Naming
@section The File Namespace @section Interface Naming
@cindex file namespace, for sockets
This section describes the details of the file namespace, whose Each network interface has a name. This usually consists of a few
symbolic name (required when you create a socket) is @code{PF_FILE}. letters that relate to the type of interface, which may be followed by a
number if there is more than one interface of that type. Examples
might be @code{lo} (the loopback interface) and @code{eth0} (the first
Ethernet interface).
Although such names are convenient for humans, it would be clumsy to
have to use them whenever a program needed to refer to an interface. In
such situations an interface is referred to by its @dfn{index}, which is
an arbitrarily-assigned small positive integer.
The following functions, constants and data types are declared in the
header file @file{net/if.h}.
@comment net/if.h
@deftypevr Constant size_t IFNAMSIZ
This constant defines the maximum buffer size needed to hold an
interface name, including its terminating zero byte.
@end deftypevr
@comment net/if.h
@comment IPv6 basic API
@deftypefun unsigned int if_nametoindex (const char *ifname)
This function yields the interface index corresponding to a particular
name. If no interface exists with the name given, it returns 0.
@end deftypefun
@comment net/if.h
@comment IPv6 basic API
@deftypefun char *if_indextoname (unsigned int ifindex, char *ifname)
This function maps an interface index to its corresponding name. The
returned name is placed in the buffer pointed to by @code{ifname}, which
must be at least @code{IFNAMSIZE} bytes in length. If the index was
invalid, the function's return value is a null pointer, otherwise it is
@code{ifname}.
@end deftypefun
@comment net/if.h
@comment IPv6 basic API
@deftp {Data Type} {struct if_nameindex}
This data type is used to hold the information about a single
interface. It has the following members:
@table @code
@item unsigned int if_index;
This is the interface index.
@item char *if_name
This is the null-terminated index name.
@end table
@end deftp
@comment net/if.h
@comment IPv6 basic API
@deftypefun struct if_nameindex *if_nameindex (void)
This function returns an array of @code{if_nameindex} structures, one
for every interface that is present. The end of the list is indicated
by a structure with an interface of 0 and a null name pointer. If an
error occurs, this function returns a null pointer.
The returned structure must be freed with @code{if_freenameindex} after
use.
@end deftypefun
@comment net/if.h
@comment IPv6 basic API
@deftypefun void if_freenameindex (struct if_nameindex *ptr)
This function frees the structure returned by an earlier call to
@code{if_nameindex}.
@end deftypefun
@node Local Namespace
@section The Local Namespace
@cindex local namespace, for sockets
This section describes the details of the local namespace, whose
symbolic name (required when you create a socket) is @code{PF_LOCAL}.
The local namespace is also known as ``Unix domain sockets''. Another
name is file namespace since socket addresses are normally implemented
as file names.
@menu @menu
* Concepts: File Namespace Concepts. What you need to understand. * Concepts: Local Namespace Concepts. What you need to understand.
* Details: File Namespace Details. Address format, symbolic names, etc. * Details: Local Namespace Details. Address format, symbolic names, etc.
* Example: File Socket Example. Example of creating a socket. * Example: Local Socket Example. Example of creating a socket.
@end menu @end menu
@node File Namespace Concepts @node Local Namespace Concepts
@subsection File Namespace Concepts @subsection Local Namespace Concepts
In the file namespace, socket addresses are file names. You can specify In the local namespace, socket addresses are file names. You can specify
any file name you want as the address of the socket, but you must have any file name you want as the address of the socket, but you must have
write permission on the directory containing it. In order to connect to write permission on the directory containing it. In order to connect to
a socket, you must have read permission for it. It's common to put a socket, you must have read permission for it. It's common to put
these files in the @file{/tmp} directory. these files in the @file{/tmp} directory.
One peculiarity of the file namespace is that the name is only used when One peculiarity of the local namespace is that the name is only used when
opening the connection; once that is over with, the address is not opening the connection; once that is over with, the address is not
meaningful and may not exist. meaningful and may not exist.
@ -494,53 +583,60 @@ which contains the name of the socket. You can see the socket in a
directory listing, but connecting to it never succeeds. Some programs directory listing, but connecting to it never succeeds. Some programs
take advantage of this, such as by asking the client to send its own take advantage of this, such as by asking the client to send its own
process ID, and using the process IDs to distinguish between clients. process ID, and using the process IDs to distinguish between clients.
However, we recommend you not use this method in protocols you design, However, we recommend you not to use this method in protocols you design,
as we might someday permit connections from other machines that mount as we might someday permit connections from other machines that mount
the same file systems. Instead, send each new client an identifying the same file systems. Instead, send each new client an identifying
number if you want it to have one. number if you want it to have one.
After you close a socket in the file namespace, you should delete the After you close a socket in the local namespace, you should delete the
file name from the file system. Use @code{unlink} or @code{remove} to file name from the file system. Use @code{unlink} or @code{remove} to
do this; see @ref{Deleting Files}. do this; see @ref{Deleting Files}.
The file namespace supports just one protocol for any communication The local namespace supports just one protocol for any communication
style; it is protocol number @code{0}. style; it is protocol number @code{0}.
@node File Namespace Details @node Local Namespace Details
@subsection Details of File Namespace @subsection Details of Local Namespace
@pindex sys/socket.h @pindex sys/socket.h
To create a socket in the file namespace, use the constant To create a socket in the local namespace, use the constant
@code{PF_FILE} as the @var{namespace} argument to @code{socket} or @code{PF_LOCAL} as the @var{namespace} argument to @code{socket} or
@code{socketpair}. This constant is defined in @file{sys/socket.h}. @code{socketpair}. This constant is defined in @file{sys/socket.h}.
@comment sys/socket.h @comment sys/socket.h
@comment GNU @comment POSIX
@deftypevr Macro int PF_FILE @deftypevr Macro int PF_LOCAL
This designates the file namespace, in which socket addresses are file This designates the local namespace, in which socket addresses are local
names, and its associated family of protocols. names, and its associated family of protocols. @code{PF_Local} is the
macro used by Posix.1g.
@end deftypevr @end deftypevr
@comment sys/socket.h @comment sys/socket.h
@comment BSD @comment BSD
@deftypevr Macro int PF_UNIX @deftypevr Macro int PF_UNIX
This is a synonym for @code{PF_FILE}, for compatibility's sake. This is a synonym for @code{PF_LOCAL}, for compatibility's sake.
@end deftypevr @end deftypevr
The structure for specifying socket names in the file namespace is @comment sys/socket.h
@comment GNU
@deftypevr Macro int PF_FILE
This is a synonym for @code{PF_LOCAL}, for compatibility's sake.
@end deftypevr
The structure for specifying socket names in the local namespace is
defined in the header file @file{sys/un.h}: defined in the header file @file{sys/un.h}:
@pindex sys/un.h @pindex sys/un.h
@comment sys/un.h @comment sys/un.h
@comment BSD @comment BSD
@deftp {Data Type} {struct sockaddr_un} @deftp {Data Type} {struct sockaddr_un}
This structure is used to specify file namespace socket addresses. It has This structure is used to specify local namespace socket addresses. It has
the following members: the following members:
@table @code @table @code
@item short int sun_family @item short int sun_family
This identifies the address family or format of the socket address. This identifies the address family or format of the socket address.
You should store the value @code{AF_FILE} to designate the file You should store the value @code{AF_LOCAL} to designate the local
namespace. @xref{Socket Addresses}. namespace. @xref{Socket Addresses}.
@item char sun_path[108] @item char sun_path[108]
@ -554,14 +650,20 @@ the length of the filename.
@end deftp @end deftp
You should compute the @var{length} parameter for a socket address in You should compute the @var{length} parameter for a socket address in
the file namespace as the sum of the size of the @code{sun_family} the local namespace as the sum of the size of the @code{sun_family}
component and the string length (@emph{not} the allocation size!) of component and the string length (@emph{not} the allocation size!) of
the file name string. the file name string. This can be done using the macro @code{SUN_LEN}:
@node File Socket Example @comment sys/un.h
@subsection Example of File-Namespace Sockets @comment BSD
@deftypefn {Macro} int SUNLEN (@emph{struct sockaddr_un *} @var{ptr})
The macro computes the length of socket address in the local namespace.
@end deftypefn
Here is an example showing how to create and name a socket in the file @node Local Socket Example
@subsection Example of Local-Namespace Sockets
Here is an example showing how to create and name a socket in the local
namespace. namespace.
@smallexample @smallexample
@ -572,19 +674,30 @@ namespace.
@section The Internet Namespace @section The Internet Namespace
@cindex Internet namespace, for sockets @cindex Internet namespace, for sockets
This section describes the details the protocols and socket naming This section describes the details of the protocols and socket naming
conventions used in the Internet namespace. conventions used in the Internet namespace.
To create a socket in the Internet namespace, use the symbolic name Originaly the Internet namespace used only IP version 4 (IPv4). With
the growing number of hosts on the Internet, a new protocol with a
larger address space was neccessary: IP version 6 (IPv6). IPv6
introduces besides 128bit addresses (IPv4 has 32bit addresses) also
other features and will eventually replace IPv4.
To create a socket in the IPv4 Internet namespace, use the symbolic name
@code{PF_INET} of this namespace as the @var{namespace} argument to @code{PF_INET} of this namespace as the @var{namespace} argument to
@code{socket} or @code{socketpair}. This macro is defined in @code{socket} or @code{socketpair}. For IPv6 addresses, you need the
@file{sys/socket.h}. macro @code{PF_INET6}. These macros are defined in @file{sys/socket.h}.
@pindex sys/socket.h @pindex sys/socket.h
@comment sys/socket.h @comment sys/socket.h
@comment BSD @comment BSD
@deftypevr Macro int PF_INET @deftypevr Macro int PF_INET
This designates the Internet namespace and associated family of This designates the IPv4 Internet namespace and associated family of
protocols.
@end deftypevr
@deftypevr Macro int AF_INET6
This designates the IPv6 Internet namespace and associated family of
protocols. protocols.
@end deftypevr @end deftypevr
@ -637,7 +750,7 @@ This is the data type used to represent socket addresses in the
Internet namespace. It has the following members: Internet namespace. It has the following members:
@table @code @table @code
@item short int sin_family @item sa_family_t sin_family
This identifies the address family or format of the socket address. This identifies the address family or format of the socket address.
You should store the value of @code{AF_INET} in this member. You should store the value of @code{AF_INET} in this member.
@xref{Socket Addresses}. @xref{Socket Addresses}.
@ -654,14 +767,14 @@ This is the port number. @xref{Ports}.
When you call @code{bind} or @code{getsockname}, you should specify When you call @code{bind} or @code{getsockname}, you should specify
@code{sizeof (struct sockaddr_in)} as the @var{length} parameter if @code{sizeof (struct sockaddr_in)} as the @var{length} parameter if
you are using an Internet namespace socket address. you are using an IPv4 Internet namespace socket address.
@deftp {Data Type} {struct sockaddr_in6} @deftp {Data Type} {struct sockaddr_in6}
This is the data type used to represent socket addresses in the IPv6 This is the data type used to represent socket addresses in the IPv6
namespace. It has the following members: namespace. It has the following members:
@table @code @table @code
@item short int sin6_family @item sa_family_t sin6_family
This identifies the address family or format of the socket address. This identifies the address family or format of the socket address.
You should store the value of @code{AF_INET6} in this member. You should store the value of @code{AF_INET6} in this member.
@xref{Socket Addresses}. @xref{Socket Addresses}.
@ -691,7 +804,7 @@ numeric host addresses as sequences of up to eight numbers separated by
colons, as in @samp{5f03:1200:836f:c100::1}. colons, as in @samp{5f03:1200:836f:c100::1}.
Each computer also has one or more @dfn{host names}, which are strings Each computer also has one or more @dfn{host names}, which are strings
of words separated by periods, as in @samp{churchy.gnu.ai.mit.edu}. of words separated by periods, as in @samp{mescaline.gnu.org}.
Programs that let the user specify a host typically accept both numeric Programs that let the user specify a host typically accept both numeric
addresses and host names. But the program needs a numeric address to addresses and host names. But the program needs a numeric address to
@ -715,18 +828,21 @@ Each computer on the Internet has one or more Internet addresses,
numbers which identify that computer among all those on the Internet. numbers which identify that computer among all those on the Internet.
@end ifinfo @end ifinfo
@c I think this whole section could possibly be removed. It is slightly
@c misleading these days.
@cindex network number @cindex network number
@cindex local network address number @cindex local network address number
An Internet host address is a number containing four bytes of data. An IPv4 Internet host address is a number containing four bytes of data.
These are divided into two parts, a @dfn{network number} and a Historically these are divided into two parts, a @dfn{network number} and a
@dfn{local network address number} within that network. The network @dfn{local network address number} within that network. In the
number consists of the first one, two or three bytes; the rest of the mid-1990s classless address were introduced which changed the
bytes are the local address. behaviour. Since some functions implicitly expect the old definitions,
we first describe the class based network and will then describe
classless addresses. IPv6 uses only classless adresses and therefore
the following paragraphs don't apply.
Network numbers are registered with the Network Information Center The class based IPv4 network number consists of the first one, two or
three bytes; the rest of the bytes are the local address.
IPv4 network numbers are registered with the Network Information Center
(NIC), and are divided into three classes---A, B, and C. The local (NIC), and are divided into three classes---A, B, and C. The local
network address numbers of individual machines are registered with the network address numbers of individual machines are registered with the
administrator of the particular network. administrator of the particular network.
@ -742,7 +858,8 @@ Internet address specify the address within that network.
The Class A network 0 is reserved for broadcast to all networks. In The Class A network 0 is reserved for broadcast to all networks. In
addition, the host number 0 within each network is reserved for broadcast addition, the host number 0 within each network is reserved for broadcast
to all hosts in that network. to all hosts in that network. These uses are obsolete now but out of
compatibility reasons you shouldn't use network 0 and host number 0.
The Class A network 127 is reserved for loopback; you can always use The Class A network 127 is reserved for loopback; you can always use
the Internet address @samp{127.0.0.1} to refer to the host machine. the Internet address @samp{127.0.0.1} to refer to the host machine.
@ -752,6 +869,7 @@ have multiple Internet host addresses. However, there is never
supposed to be more than one machine with the same host address. supposed to be more than one machine with the same host address.
@c !!! this section could document the IN_CLASS* macros in <netinet/in.h>. @c !!! this section could document the IN_CLASS* macros in <netinet/in.h>.
@c No, it shouldn't since they're obsolete.
@cindex standard dot notation, for Internet addresses @cindex standard dot notation, for Internet addresses
@cindex dot notation, for Internet addresses @cindex dot notation, for Internet addresses
@ -760,7 +878,8 @@ for Internet addresses:
@table @code @table @code
@item @var{a}.@var{b}.@var{c}.@var{d} @item @var{a}.@var{b}.@var{c}.@var{d}
This specifies all four bytes of the address individually. This specifies all four bytes of the address individually and is the
commonly used representation.
@item @var{a}.@var{b}.@var{c} @item @var{a}.@var{b}.@var{c}
The last part of the address, @var{c}, is interpreted as a 2-byte quantity. The last part of the address, @var{c}, is interpreted as a 2-byte quantity.
@ -768,7 +887,7 @@ This is useful for specifying host addresses in a Class B network with
network address number @code{@var{a}.@var{b}}. network address number @code{@var{a}.@var{b}}.
@item @var{a}.@var{b} @item @var{a}.@var{b}
The last part of the address, @var{c}, is interpreted as a 3-byte quantity. The last part of the address, @var{b}, is interpreted as a 3-byte quantity.
This is useful for specifying host addresses in a Class A network with This is useful for specifying host addresses in a Class A network with
network address number @var{a}. network address number @var{a}.
@ -782,15 +901,50 @@ the radix apply. In other words, a leading @samp{0x} or @samp{0X} implies
hexadecimal radix; a leading @samp{0} implies octal; and otherwise decimal hexadecimal radix; a leading @samp{0} implies octal; and otherwise decimal
radix is assumed. radix is assumed.
@subsubheading Classless Addresses
IPv4 addresses (and IPv6 addresses also) are now considered as
classless. The distinction between classes A, B, and C can be ignored.
Instead a IPv4 host adddress consists of a 32-bit address and a 32-bit
mask. The mask contains bits of 1 for the network part and bits of 0
for the host part. The 1-bits are contigous from the leftmost bit, the
0-bits are contigous from the rightmost bit so that the netmask can also
be written as a prefix length of bits of 1. Classes A, B and C are just
special cases of this general rule. For example, class A addresses have
a netmask of @samp{255.0.0.0} or a prefix length of 8.
Classless IPv4 network addresses are written in numbers-and-dots
notation with the prefix length appended and a slash as separator. For
example the class A network 10 is written as @samp{10.0.0.0/8}.
@subsubheading IPv6 Addresses
IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data. A host
address is usually written as eight 16-bit hexadecimal numbers that are
separated by colons. Two colons are used to appreviated strings of
consecutive zeros. For example the IPv6 loopback address which is
@samp{0:0:0:0:0:0:0:1} can be just written as @samp{::1}.
@node Host Address Data Type @node Host Address Data Type
@subsubsection Host Address Data Type @subsubsection Host Address Data Type
Internet host addresses are represented in some contexts as integers IPv4 Internet host addresses are represented in some contexts as integers
(type @code{unsigned long int}). In other contexts, the integer is (type @code{uint32_t}). In other contexts, the integer is
packaged inside a structure of type @code{struct in_addr}. It would packaged inside a structure of type @code{struct in_addr}. It would
be better if the usage were made consistent, but it is not hard to extract be better if the usage were made consistent, but it is not hard to extract
the integer from the structure or put the integer into a structure. the integer from the structure or put the integer into a structure.
You will find older code that uses @code{unsigned long int} for
IPv4 Internet host addresses instead of @code{uint32_t} or @code{struct
in_addr}. Historically @code{unsigned long int} was a 32 bit number but
with 64 bit machines this has changed. Using @code{unsigned long int}
might break the code if it is used on machines where this type doesn't
have 32 bits. @code{uint32_t} is specified by Unix98 and guaranteed to have
32 bits.
IPv6 Internet host addresses have 128 bits and are packaged inside a
structure of type @code{struct in6_addr}.
The following basic definitions for Internet addresses are declared in The following basic definitions for Internet addresses are declared in
the header file @file{netinet/in.h}: the header file @file{netinet/in.h}:
@pindex netinet/in.h @pindex netinet/in.h
@ -798,16 +952,16 @@ the header file @file{netinet/in.h}:
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftp {Data Type} {struct in_addr} @deftp {Data Type} {struct in_addr}
This data type is used in certain contexts to contain an Internet host This data type is used in certain contexts to contain an IPv4 Internet
address. It has just one field, named @code{s_addr}, which records the host address. It has just one field, named @code{s_addr}, which records
host address number as an @code{unsigned long int}. the host address number as an @code{uint32_t}.
@end deftp @end deftp
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypevr Macro {unsigned int} INADDR_LOOPBACK @deftypevr Macro {uint32_t} INADDR_LOOPBACK
You can use this constant to stand for ``the address of this machine,'' You can use this constant to stand for ``the address of this machine,''
instead of finding its actual address. It is the Internet address instead of finding its actual address. It is the IPv4 Internet address
@samp{127.0.0.1}, which is usually called @samp{localhost}. This @samp{127.0.0.1}, which is usually called @samp{localhost}. This
special constant saves you the trouble of looking up the address of your special constant saves you the trouble of looking up the address of your
own machine. Also, the system usually implements @code{INADDR_LOOPBACK} own machine. Also, the system usually implements @code{INADDR_LOOPBACK}
@ -817,7 +971,7 @@ talking to itself.
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypevr Macro {unsigned int} INADDR_ANY @deftypevr Macro {uint32_t} INADDR_ANY
You can use this constant to stand for ``any incoming address,'' when You can use this constant to stand for ``any incoming address,'' when
binding to an address. @xref{Setting Address}. This is the usual binding to an address. @xref{Setting Address}. This is the usual
address to give in the @code{sin_addr} member of @w{@code{struct address to give in the @code{sin_addr} member of @w{@code{struct
@ -826,14 +980,14 @@ sockaddr_in}} when you want to accept Internet connections.
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypevr Macro {unsigned int} INADDR_BROADCAST @deftypevr Macro {uint32_t} INADDR_BROADCAST
This constant is the address you use to send a broadcast message. This constant is the address you use to send a broadcast message.
@c !!! broadcast needs further documented @c !!! broadcast needs further documented
@end deftypevr @end deftypevr
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypevr Macro {unsigned int} INADDR_NONE @deftypevr Macro {uint32_t} INADDR_NONE
This constant is returned by some functions to indicate an error. This constant is returned by some functions to indicate an error.
@end deftypevr @end deftypevr
@ -876,7 +1030,7 @@ Order}, for an explanation of network and host byte order.
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun int inet_aton (const char *@var{name}, struct in_addr *@var{addr}) @deftypefun int inet_aton (const char *@var{name}, struct in_addr *@var{addr})
This function converts the Internet host address @var{name} This function converts the IPv4 Internet host address @var{name}
from the standard numbers-and-dots notation into binary data and stores from the standard numbers-and-dots notation into binary data and stores
it in the @code{struct in_addr} that @var{addr} points to. it in the @code{struct in_addr} that @var{addr} points to.
@code{inet_aton} returns nonzero if the address is valid, zero if not. @code{inet_aton} returns nonzero if the address is valid, zero if not.
@ -884,8 +1038,8 @@ it in the @code{struct in_addr} that @var{addr} points to.
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun {unsigned long int} inet_addr (const char *@var{name}) @deftypefun {uint32_t} inet_addr (const char *@var{name})
This function converts the Internet host address @var{name} from the This function converts the IPv4 Internet host address @var{name} from the
standard numbers-and-dots notation into binary data. If the input is standard numbers-and-dots notation into binary data. If the input is
not valid, @code{inet_addr} returns @code{INADDR_NONE}. This is an not valid, @code{inet_addr} returns @code{INADDR_NONE}. This is an
obsolete interface to @code{inet_aton}, described immediately above; it obsolete interface to @code{inet_aton}, described immediately above; it
@ -896,17 +1050,21 @@ indicate error return.
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun {unsigned long int} inet_network (const char *@var{name}) @deftypefun {uint32_t} inet_network (const char *@var{name})
This function extracts the network number from the address @var{name}, This function extracts the network number from the address @var{name},
given in the standard numbers-and-dots notation. The returned address is given in the standard numbers-and-dots notation. The returned address is
in host order. If the input is not valid, @code{inet_network} returns in host order. If the input is not valid, @code{inet_network} returns
@code{-1}. @code{-1}.
The function works only with traditional IPv4 class A,B and C network
types. It doesn't work with classless addresses and shouldn't be used
anymore.
@end deftypefun @end deftypefun
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun {char *} inet_ntoa (struct in_addr @var{addr}) @deftypefun {char *} inet_ntoa (struct in_addr @var{addr})
This function converts the Internet host address @var{addr} to a This function converts the IPv4 Internet host address @var{addr} to a
string in the standard numbers-and-dots notation. The return value is string in the standard numbers-and-dots notation. The return value is
a pointer into a statically-allocated buffer. Subsequent calls will a pointer into a statically-allocated buffer. Subsequent calls will
overwrite the same buffer, so you should copy the string if you need overwrite the same buffer, so you should copy the string if you need
@ -915,28 +1073,40 @@ to save it.
In multi-threaded programs each thread has an own statically-allocated In multi-threaded programs each thread has an own statically-allocated
buffer. But still subsequent calls of @code{inet_ntoa} in the same buffer. But still subsequent calls of @code{inet_ntoa} in the same
thread will overwrite the result of the last call. thread will overwrite the result of the last call.
Instead of @code{inet_ntoa} the newer function @code{inet_ntop} which is
described below should be used since it handles both IPv4 and IPv6
addresses.
@end deftypefun @end deftypefun
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun {struct in_addr} inet_makeaddr (int @var{net}, int @var{local}) @deftypefun {struct in_addr} inet_makeaddr (uint32_t @var{net}, uint32_t @var{local})
This function makes an Internet host address by combining the network This function makes an IPv4 Internet host address by combining the network
number @var{net} with the local-address-within-network number number @var{net} with the local-address-within-network number
@var{local}. @var{local}.
@end deftypefun @end deftypefun
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun int inet_lnaof (struct in_addr @var{addr}) @deftypefun uint32_t inet_lnaof (struct in_addr @var{addr})
This function returns the local-address-within-network part of the This function returns the local-address-within-network part of the
Internet host address @var{addr}. Internet host address @var{addr}.
The function works only with traditional IPv4 class A,B and C network
types. It doesn't work with classless addresses and shouldn't be used
anymore.
@end deftypefun @end deftypefun
@comment arpa/inet.h @comment arpa/inet.h
@comment BSD @comment BSD
@deftypefun int inet_netof (struct in_addr @var{addr}) @deftypefun uint32_t inet_netof (struct in_addr @var{addr})
This function returns the network number part of the Internet host This function returns the network number part of the Internet host
address @var{addr}. address @var{addr}.
The function works only with traditional IPv4 class A,B and C network
types. It doesn't work with classless addresses and shouldn't be used
anymore.
@end deftypefun @end deftypefun
@comment arpa/inet.h @comment arpa/inet.h
@ -952,7 +1122,7 @@ responsibility to make sure the buffer is large enough.
@comment arpa/inet.h @comment arpa/inet.h
@comment IPv6 basic API @comment IPv6 basic API
@deftypefun {char *} inet_ntop (int @var{af}, const void *@var{cp}, char *@var{buf}, size_t @var{len}) @deftypefun {const char *} inet_ntop (int @var{af}, const void *@var{cp}, char *@var{buf}, size_t @var{len})
This function converts an Internet address (either IPv4 or IPv6) from This function converts an Internet address (either IPv4 or IPv6) from
network (binary) to presentation (textual) form. @var{af} should be network (binary) to presentation (textual) form. @var{af} should be
either @code{AF_INET} or @code{AF_INET6}, as appropriate. @var{cp} is a either @code{AF_INET} or @code{AF_INET6}, as appropriate. @var{cp} is a
@ -970,9 +1140,9 @@ buffer. The return value from the function will be this buffer address.
Besides the standard numbers-and-dots notation for Internet addresses, Besides the standard numbers-and-dots notation for Internet addresses,
you can also refer to a host by a symbolic name. The advantage of a you can also refer to a host by a symbolic name. The advantage of a
symbolic name is that it is usually easier to remember. For example, symbolic name is that it is usually easier to remember. For example,
the machine with Internet address @samp{128.52.46.32} is also known as the machine with Internet address @samp{158.121.106.19} is also known as
@samp{churchy.gnu.ai.mit.edu}; and other machines in the @samp{gnu.ai.mit.edu} @samp{alpha.gnu.org}; and other machines in the @samp{gnu.org}
domain can refer to it simply as @samp{churchy}. domain can refer to it simply as @samp{alpha}.
@pindex /etc/hosts @pindex /etc/hosts
@pindex netdb.h @pindex netdb.h
@ -1021,9 +1191,10 @@ first host address.
As far as the host database is concerned, each address is just a block As far as the host database is concerned, each address is just a block
of memory @code{h_length} bytes long. But in other contexts there is an of memory @code{h_length} bytes long. But in other contexts there is an
implicit assumption that you can convert this to a @code{struct in_addr} or implicit assumption that you can convert IPv4 addresses to a
an @code{unsigned long int}. Host addresses in a @code{struct hostent} @code{struct in_addr} or an @code{uint32_t}. Host addresses in
structure are always given in network byte order; see @ref{Byte Order}. a @code{struct hostent} structure are always given in network byte
order; see @ref{Byte Order}.
You can use @code{gethostbyname}, @code{gethostbyname2} or You can use @code{gethostbyname}, @code{gethostbyname2} or
@code{gethostbyaddr} to search the hosts database for information about @code{gethostbyaddr} to search the hosts database for information about
@ -1051,10 +1222,12 @@ allows the caller to specify the desired address family (e.g.@:
@comment BSD @comment BSD
@deftypefun {struct hostent *} gethostbyaddr (const char *@var{addr}, int @var{length}, int @var{format}) @deftypefun {struct hostent *} gethostbyaddr (const char *@var{addr}, int @var{length}, int @var{format})
The @code{gethostbyaddr} function returns information about the host The @code{gethostbyaddr} function returns information about the host
with Internet address @var{addr}. The @var{length} argument is the with Internet address @var{addr}. The parameter @var{addr} is not
size (in bytes) of the address at @var{addr}. @var{format} specifies really a pointer to char - it can be a pointer to an IPv4 or an IPv6
the address format; for an Internet address, specify a value of address. The @var{length} argument is the size (in bytes) of the address
@code{AF_INET}. at @var{addr}. @var{format} specifies the address format; for an IPv4
Internet address, specify a value of @code{AF_INET}; for an IPv6
Internet address, use @code{AF_INET6}.
If the lookup fails, @code{gethostbyaddr} returns a null pointer. If the lookup fails, @code{gethostbyaddr} returns a null pointer.
@end deftypefun @end deftypefun
@ -1122,14 +1295,14 @@ reopening the database for each call.
@comment netdb.h @comment netdb.h
@comment BSD @comment BSD
@deftypefun {struct hostent *} gethostent () @deftypefun {struct hostent *} gethostent (void)
This function returns the next entry in the hosts database. It This function returns the next entry in the hosts database. It
returns a null pointer if there are no more entries. returns a null pointer if there are no more entries.
@end deftypefun @end deftypefun
@comment netdb.h @comment netdb.h
@comment BSD @comment BSD
@deftypefun void endhostent () @deftypefun void endhostent (void)
This function closes the hosts database. This function closes the hosts database.
@end deftypefun @end deftypefun
@ -1306,40 +1479,44 @@ If you use @code{getservbyname} and @code{gethostbyname} or
already in the network byte order, and you can copy them directly into already in the network byte order, and you can copy them directly into
the @code{sockaddr_in} structure. the @code{sockaddr_in} structure.
Otherwise, you have to convert the values explicitly. Use Otherwise, you have to convert the values explicitly. Use @code{htons}
@code{htons} and @code{ntohs} to convert values for the @code{sin_port} and @code{ntohs} to convert values for the @code{sin_port} member. Use
member. Use @code{htonl} and @code{ntohl} to convert values for the @code{htonl} and @code{ntohl} to convert IPv4 addresses for the
@code{sin_addr} member. (Remember, @code{struct in_addr} is equivalent @code{sin_addr} member. (Remember, @code{struct in_addr} is equivalent
to @code{unsigned long int}.) These functions are declared in to @code{uint32_t}.) These functions are declared in
@file{netinet/in.h}. @file{netinet/in.h}.
@pindex netinet/in.h @pindex netinet/in.h
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypefun {unsigned short int} htons (unsigned short int @var{hostshort}) @deftypefun {uint16_t} htons (uint16_t @var{hostshort})
This function converts the @code{short} integer @var{hostshort} from This function converts the @code{uint16_t} integer @var{hostshort} from
host byte order to network byte order. host byte order to network byte order.
@end deftypefun @end deftypefun
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypefun {unsigned short int} ntohs (unsigned short int @var{netshort}) @deftypefun {uint16_t} ntohs (uint16_t @var{netshort})
This function converts the @code{short} integer @var{netshort} from This function converts the @code{uint16_t} integer @var{netshort} from
network byte order to host byte order. network byte order to host byte order.
@end deftypefun @end deftypefun
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypefun {unsigned long int} htonl (unsigned long int @var{hostlong}) @deftypefun {uint32_t} htonl (uint32_t @var{hostlong})
This function converts the @code{long} integer @var{hostlong} from This function converts the @code{uint32_t} integer @var{hostlong} from
host byte order to network byte order. host byte order to network byte order.
This is used for IPv4 internet addresses.
@end deftypefun @end deftypefun
@comment netinet/in.h @comment netinet/in.h
@comment BSD @comment BSD
@deftypefun {unsigned long int} ntohl (unsigned long int @var{netlong}) @deftypefun {uint32_t} ntohl (uint32_t @var{netlong})
This function converts the @code{long} integer @var{netlong} from This function converts the @code{uint32_t} integer @var{netlong} from
network byte order to host byte order. network byte order to host byte order.
This is used for IPv4 internet addresses.
@end deftypefun @end deftypefun
@node Protocols Database @node Protocols Database
@ -1511,7 +1688,7 @@ declared in @file{sys/socket.h}.
This function creates a socket and specifies communication style This function creates a socket and specifies communication style
@var{style}, which should be one of the socket styles listed in @var{style}, which should be one of the socket styles listed in
@ref{Communication Styles}. The @var{namespace} argument specifies @ref{Communication Styles}. The @var{namespace} argument specifies
the namespace; it must be @code{PF_FILE} (@pxref{File Namespace}) or the namespace; it must be @code{PF_LOCAL} (@pxref{Local Namespace}) or
@code{PF_INET} (@pxref{Internet Namespace}). @var{protocol} @code{PF_INET} (@pxref{Internet Namespace}). @var{protocol}
designates the specific protocol (@pxref{Socket Concepts}); zero is designates the specific protocol (@pxref{Socket Concepts}); zero is
usually right for @var{protocol}. usually right for @var{protocol}.
@ -1545,7 +1722,7 @@ positioning operations.
@end deftypefun @end deftypefun
For examples of how to call the @code{socket} function, For examples of how to call the @code{socket} function,
see @ref{File Namespace}, or @ref{Inet Example}. see @ref{Local Socket Example}, or @ref{Inet Example}.
@node Closing a Socket @node Closing a Socket
@ -1630,7 +1807,7 @@ The @var{namespace}, @var{style}, and @var{protocol} arguments are
interpreted as for the @code{socket} function. @var{style} should be interpreted as for the @code{socket} function. @var{style} should be
one of the communication styles listed in @ref{Communication Styles}. one of the communication styles listed in @ref{Communication Styles}.
The @var{namespace} argument specifies the namespace, which must be The @var{namespace} argument specifies the namespace, which must be
@code{AF_FILE} (@pxref{File Namespace}); @var{protocol} specifies the @code{AF_LOCAL} (@pxref{Local Namespace}); @var{protocol} specifies the
communications protocol, but zero is the only meaningful value. communications protocol, but zero is the only meaningful value.
If @var{style} specifies a connectionless communication style, then If @var{style} specifies a connectionless communication style, then
@ -1807,7 +1984,7 @@ your server, make it examine the addresses associated with connection
requests or implement some other handshaking or identification requests or implement some other handshaking or identification
protocol. protocol.
In the File namespace, the ordinary file protection bits control who has In the local namespace, the ordinary file protection bits control who has
access to connect to the socket. access to connect to the socket.
@comment sys/socket.h @comment sys/socket.h
@ -1910,7 +2087,7 @@ connections immediately available.
This function is defined as a cancelation point in multi-threaded This function is defined as a cancelation point in multi-threaded
programs. So one has to be prepared for this and make sure that programs. So one has to be prepared for this and make sure that
possibly allocated resources (like memory, files descriptors, possibly allocated resources (like memory, files descriptors,
semaphores or whatever) are freed even if the thread is cancel. semaphores or whatever) are freed even if the thread is canceled.
@c @xref{pthread_cleanup_push}, for a method how to do this. @c @xref{pthread_cleanup_push}, for a method how to do this.
@end deftypefun @end deftypefun
@ -1922,7 +2099,7 @@ connectionless communication styles.
@comment sys/socket.h @comment sys/socket.h
@comment BSD @comment BSD
@deftypefun int getpeername (int @var{socket}, struct sockaddr *@var{addr}, size_t *@var{length-ptr}) @deftypefun int getpeername (int @var{socket}, struct sockaddr *@var{addr}, socklen_t *@var{length-ptr})
The @code{getpeername} function returns the address of the socket that The @code{getpeername} function returns the address of the socket that
@var{socket} is connected to; it stores the address in the memory space @var{socket} is connected to; it stores the address in the memory space
specified by @var{addr} and @var{length-ptr}. It stores the length of specified by @var{addr} and @var{length-ptr}. It stores the length of
@ -2042,7 +2219,7 @@ signal is ignored or blocked, or if its handler returns, then
This function is defined as a cancelation point in multi-threaded This function is defined as a cancelation point in multi-threaded
programs. So one has to be prepared for this and make sure that programs. So one has to be prepared for this and make sure that
possibly allocated resources (like memory, files descriptors, possibly allocated resources (like memory, files descriptors,
semaphores or whatever) are freed even if the thread is cancel. semaphores or whatever) are freed even if the thread is canceled.
@c @xref{pthread_cleanup_push}, for a method how to do this. @c @xref{pthread_cleanup_push}, for a method how to do this.
@end deftypefun @end deftypefun
@ -2060,7 +2237,7 @@ Primitives}.
@deftypefun int recv (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags}) @deftypefun int recv (int @var{socket}, void *@var{buffer}, size_t @var{size}, int @var{flags})
The @code{recv} function is like @code{read}, but with the additional The @code{recv} function is like @code{read}, but with the additional
flags @var{flags}. The possible values of @var{flags} are described flags @var{flags}. The possible values of @var{flags} are described
In @ref{Socket Data Options}. in @ref{Socket Data Options}.
If nonblocking mode is set for @var{socket}, and no data is available to If nonblocking mode is set for @var{socket}, and no data is available to
be read, @code{recv} fails immediately rather than waiting. @xref{File be read, @code{recv} fails immediately rather than waiting. @xref{File
@ -2092,7 +2269,7 @@ You never connected this socket.
This function is defined as a cancelation point in multi-threaded This function is defined as a cancelation point in multi-threaded
programs. So one has to be prepared for this and make sure that programs. So one has to be prepared for this and make sure that
possibly allocated resources (like memory, files descriptors, possibly allocated resources (like memory, files descriptors,
semaphores or whatever) are freed even if the thread is cancel. semaphores or whatever) are freed even if the thread is canceled.
@c @xref{pthread_cleanup_push}, for a method how to do this. @c @xref{pthread_cleanup_push}, for a method how to do this.
@end deftypefun @end deftypefun
@ -2135,6 +2312,9 @@ stream socket in the Internet namespace. It doesn't do anything
particularly interesting once it has connected to the server; it just particularly interesting once it has connected to the server; it just
sends a text string to the server and exits. sends a text string to the server and exits.
This program uses @code{init_sockaddr} to set up the socket address; see
@ref{Inet Example}.
@smallexample @smallexample
@include inetcli.c.texi @include inetcli.c.texi
@end smallexample @end smallexample
@ -2155,8 +2335,8 @@ gotten a message from a client. It does close the socket for that
client when it detects an end-of-file condition (resulting from the client when it detects an end-of-file condition (resulting from the
client shutting down its end of the connection). client shutting down its end of the connection).
This program uses @code{make_socket} and @code{init_sockaddr} to set This program uses @code{make_socket} to set up the socket address; see
up the socket address; see @ref{Inet Example}. @ref{Inet Example}.
@smallexample @smallexample
@include inetsrv.c.texi @include inetsrv.c.texi
@ -2208,9 +2388,15 @@ in the receiving process, whether any ordinary data was sent before
the mark: the mark:
@smallexample @smallexample
success = ioctl (socket, SIOCATMARK, &result); success = ioctl (socket, SIOCATMARK, &atmark);
@end smallexample @end smallexample
The @code{integer} variable @var{atmark} is set to a nonzero value if
the socket's read pointer has reached the ``mark''.
@c Posix 1.g specifies sockatmark for this ioctl. sockatmark is not
@c implemented yet.
Here's a function to discard any ordinary data preceding the Here's a function to discard any ordinary data preceding the
out-of-band mark: out-of-band mark:
@ -2222,10 +2408,10 @@ discard_until_mark (int socket)
@{ @{
/* @r{This is not an arbitrary limit; any size will do.} */ /* @r{This is not an arbitrary limit; any size will do.} */
char buffer[1024]; char buffer[1024];
int result, success; int atmark, success;
/* @r{If we have reached the mark, return.} */ /* @r{If we have reached the mark, return.} */
success = ioctl (socket, SIOCATMARK, &result); success = ioctl (socket, SIOCATMARK, &atmark);
if (success < 0) if (success < 0)
perror ("ioctl"); perror ("ioctl");
if (result) if (result)
@ -2276,9 +2462,8 @@ read_oob (int socket)
/* @r{This is an arbitrary limit.} /* @r{This is an arbitrary limit.}
@r{Does anyone know how to do this without a limit?} */ @r{Does anyone know how to do this without a limit?} */
char *buffer = (char *) xmalloc (1024); char *buffer = (char *) xmalloc (1024);
struct buffer *link;
int success; int success;
int result; int atmark;
/* @r{Try again to read the out-of-band data.} */ /* @r{Try again to read the out-of-band data.} */
success = recv (socket, buffer, sizeof buffer, MSG_OOB); success = recv (socket, buffer, sizeof buffer, MSG_OOB);
@ -2294,10 +2479,10 @@ read_oob (int socket)
@} @}
/* @r{If we fail, see if we are at the mark.} */ /* @r{If we fail, see if we are at the mark.} */
success = ioctl (socket, SIOCATMARK, &result); success = ioctl (socket, SIOCATMARK, &atmark);
if (success < 0) if (success < 0)
perror ("ioctl"); perror ("ioctl");
if (result) if (atmark)
@{ @{
/* @r{At the mark; skipping past more ordinary data cannot help.} /* @r{At the mark; skipping past more ordinary data cannot help.}
@r{So just wait a while.} */ @r{So just wait a while.} */
@ -2351,7 +2536,7 @@ sockets using connectionless communication styles.
* Sending Datagrams:: Sending packets on a datagram socket. * Sending Datagrams:: Sending packets on a datagram socket.
* Receiving Datagrams:: Receiving packets on a datagram socket. * Receiving Datagrams:: Receiving packets on a datagram socket.
* Datagram Example:: An example program: packets sent over a * Datagram Example:: An example program: packets sent over a
datagram socket in the file namespace. datagram socket in the local namespace.
* Example Receiver:: Another program, that receives those packets. * Example Receiver:: Another program, that receives those packets.
@end menu @end menu
@ -2397,7 +2582,7 @@ due to a problem related to a previous call.
This function is defined as a cancelation point in multi-threaded This function is defined as a cancelation point in multi-threaded
programs. So one has to be prepared for this and make sure that programs. So one has to be prepared for this and make sure that
possibly allocated resources (like memory, files descriptors, possibly allocated resources (like memory, files descriptors,
semaphores or whatever) are freed even if the thread is cancel. semaphores or whatever) are freed even if the thread is canceled.
@c @xref{pthread_cleanup_push}, for a method how to do this. @c @xref{pthread_cleanup_push}, for a method how to do this.
@end deftypefun @end deftypefun
@ -2423,8 +2608,8 @@ packet protocol, you must always know how long a packet to expect.
The @var{addr} and @var{length-ptr} arguments are used to return the The @var{addr} and @var{length-ptr} arguments are used to return the
address where the packet came from. @xref{Socket Addresses}. For a address where the packet came from. @xref{Socket Addresses}. For a
socket in the file domain, the address information won't be meaningful, socket in the local domain, the address information won't be meaningful,
since you can't read the address of such a socket (@pxref{File since you can't read the address of such a socket (@pxref{Local
Namespace}). You can specify a null pointer as the @var{addr} argument Namespace}). You can specify a null pointer as the @var{addr} argument
if you are not interested in this information. if you are not interested in this information.
@ -2435,7 +2620,7 @@ are also the same as for @code{recv}.
This function is defined as a cancelation point in multi-threaded This function is defined as a cancelation point in multi-threaded
programs. So one has to be prepared for this and make sure that programs. So one has to be prepared for this and make sure that
possibly allocated resources (like memory, files descriptors, possibly allocated resources (like memory, files descriptors,
semaphores or whatever) are freed even if the thread is cancel. semaphores or whatever) are freed even if the thread is canceled.
@c @xref{pthread_cleanup_push}, for a method how to do this. @c @xref{pthread_cleanup_push}, for a method how to do this.
@end deftypefun @end deftypefun
@ -2474,7 +2659,7 @@ semaphores or whatever) are freed even if the thread is cancel.
This function is defined as a cancelation point in multi-threaded This function is defined as a cancelation point in multi-threaded
programs. So one has to be prepared for this and make sure that programs. So one has to be prepared for this and make sure that
possibly allocated resources (like memory, files descriptors, possibly allocated resources (like memory, files descriptors,
semaphores or whatever) are freed even if the thread is cancel. semaphores or whatever) are freed even if the thread is canceled.
@c @xref{pthread_cleanup_push}, for a method how to do this. @c @xref{pthread_cleanup_push}, for a method how to do this.
@end deftypefun @end deftypefun
@end ignore @end ignore
@ -2483,9 +2668,9 @@ semaphores or whatever) are freed even if the thread is cancel.
@subsection Datagram Socket Example @subsection Datagram Socket Example
Here is a set of example programs that send messages over a datagram Here is a set of example programs that send messages over a datagram
stream in the file namespace. Both the client and server programs use the stream in the local namespace. Both the client and server programs use
@code{make_named_socket} function that was presented in @ref{File the @code{make_named_socket} function that was presented in @ref{Local
Namespace}, to create and name their sockets. Socket Example}, to create and name their sockets.
First, here is the server program. It sits in a loop waiting for First, here is the server program. It sits in a loop waiting for
messages to arrive, bouncing each message back to the sender. messages to arrive, bouncing each message back to the sender.
@ -2741,7 +2926,7 @@ this option, you can actually have two sockets with the same Internet
port number; but the system won't allow you to use the two port number; but the system won't allow you to use the two
identically-named sockets in a way that would confuse the Internet. The identically-named sockets in a way that would confuse the Internet. The
reason for this option is that some higher-level Internet protocols, reason for this option is that some higher-level Internet protocols,
including FTP, require you to keep reusing the same socket number. including FTP, require you to keep reusing the same port number.
The value has type @code{int}; a nonzero value means ``yes''. The value has type @code{int}; a nonzero value means ``yes''.
@ -2890,7 +3075,7 @@ network.
@comment netdb.h @comment netdb.h
@comment BSD @comment BSD
@deftypefun {struct netent *} getnetbyaddr (long @var{net}, int @var{type}) @deftypefun {struct netent *} getnetbyaddr (unsigned long int @var{net}, int @var{type})
The @code{getnetbyaddr} function returns information about the network The @code{getnetbyaddr} function returns information about the network
of type @var{type} with number @var{net}. You should specify a value of of type @var{type} with number @var{net}. You should specify a value of
@code{AF_INET} for the @var{type} argument for Internet networks. @code{AF_INET} for the @var{type} argument for Internet networks.

View File

@ -435,8 +435,8 @@ yp_match (const char *indomain, const char *inmap, const char *inkey,
(caddr_t) & req, (xdrproc_t) xdr_ypresp_val, (caddr_t) & req, (xdrproc_t) xdr_ypresp_val,
(caddr_t) & resp); (caddr_t) & resp);
if (result != RPC_SUCCESS) if (result != YPERR_SUCCESS)
return YPERR_RPC; return result;
if (resp.stat != YP_TRUE) if (resp.stat != YP_TRUE)
return ypprot_err (resp.stat); return ypprot_err (resp.stat);
@ -519,8 +519,8 @@ yp_next (const char *indomain, const char *inmap, const char *inkey,
(caddr_t) & req, (xdrproc_t) xdr_ypresp_key_val, (caddr_t) & req, (xdrproc_t) xdr_ypresp_key_val,
(caddr_t) & resp); (caddr_t) & resp);
if (result != RPC_SUCCESS) if (result != YPERR_SUCCESS)
return YPERR_RPC; return result;
if (resp.stat != YP_TRUE) if (resp.stat != YP_TRUE)
return ypprot_err (resp.stat); return ypprot_err (resp.stat);
@ -557,8 +557,8 @@ yp_master (const char *indomain, const char *inmap, char **outname)
result = do_ypcall (indomain, YPPROC_MASTER, (xdrproc_t) xdr_ypreq_nokey, result = do_ypcall (indomain, YPPROC_MASTER, (xdrproc_t) xdr_ypreq_nokey,
(caddr_t) & req, (xdrproc_t) xdr_ypresp_master, (caddr_t) & resp); (caddr_t) & req, (xdrproc_t) xdr_ypresp_master, (caddr_t) & resp);
if (result != RPC_SUCCESS) if (result != YPERR_SUCCESS)
return YPERR_RPC; return result;
if (resp.stat != YP_TRUE) if (resp.stat != YP_TRUE)
return ypprot_err (resp.stat); return ypprot_err (resp.stat);
@ -587,8 +587,8 @@ yp_order (const char *indomain, const char *inmap, unsigned int *outorder)
result = do_ypcall (indomain, YPPROC_ORDER, (xdrproc_t) xdr_ypreq_nokey, result = do_ypcall (indomain, YPPROC_ORDER, (xdrproc_t) xdr_ypreq_nokey,
(caddr_t) & req, (xdrproc_t) xdr_ypresp_order, (caddr_t) & resp); (caddr_t) & req, (xdrproc_t) xdr_ypresp_order, (caddr_t) & resp);
if (result != RPC_SUCCESS) if (result != YPERR_SUCCESS)
return YPERR_RPC; return result;
if (resp.stat != YP_TRUE) if (resp.stat != YP_TRUE)
return ypprot_err (resp.stat); return ypprot_err (resp.stat);
@ -743,8 +743,8 @@ yp_maplist (const char *indomain, struct ypmaplist **outmaplist)
result = do_ypcall (indomain, YPPROC_MAPLIST, (xdrproc_t) xdr_domainname, result = do_ypcall (indomain, YPPROC_MAPLIST, (xdrproc_t) xdr_domainname,
(caddr_t) & indomain, (xdrproc_t) xdr_ypresp_maplist, (caddr_t) & resp); (caddr_t) & indomain, (xdrproc_t) xdr_ypresp_maplist, (caddr_t) & resp);
if (result != RPC_SUCCESS) if (result != YPERR_SUCCESS)
return YPERR_RPC; return result;
if (resp.stat != YP_TRUE) if (resp.stat != YP_TRUE)
return ypprot_err (resp.stat); return ypprot_err (resp.stat);

View File

@ -28,6 +28,7 @@
/* This is necessary to make this include file properly replace the /* This is necessary to make this include file properly replace the
Sun version. */ Sun version. */
#include <rpc/netdb.h> #include <rpc/netdb.h>
#include <sys/socket.h> /* need socklen_t */
#define __need_size_t #define __need_size_t
#include <stddef.h> #include <stddef.h>
@ -119,7 +120,7 @@ extern struct hostent *gethostbyaddr __P ((__const char *__addr, int __len,
extern struct hostent *gethostbyname __P ((__const char *__name)); extern struct hostent *gethostbyname __P ((__const char *__name));
/* Return entry from host data base for host with NAME. AF must be /* Return entry from host data base for host with NAME. AF must be
set to the address type which as `AF_INET' for IPv4 or `AF_INET6' set to the address type which is `AF_INET' for IPv4 or `AF_INET6'
for IPv6. */ for IPv6. */
extern struct hostent *gethostbyname2 __P ((__const char *__name, int __af)); extern struct hostent *gethostbyname2 __P ((__const char *__name, int __af));
@ -165,6 +166,19 @@ extern int gethostbyname2_r __P ((__const char *__name, int __af,
#endif /* misc */ #endif /* misc */
/* Return entry from host data base for host with NAME. AF must be
set to the desired address type (either `AF_INET' or `AF_INET6').
FLAGS is some combination of the following AI_* values. */
extern struct hostent *getnodebyname __P ((__const char *__name, int __af,
int __flags));
#define AI_V4MAPPED 1 /* IPv4-mapped addresses are acceptable. */
#define AI_ALL 2 /* Return both IPv4 and IPv6 addresses. */
#define AI_ADDRCONFIG 4 /* Use configuration of this host to choose
returned address type. */
#define AI_DEFAULT (AI_V4MAPPED | AI_ADDRCONFIG)
/* Description of data base entry for a single network. NOTE: here a /* Description of data base entry for a single network. NOTE: here a
poor assumption is made. The network number is expected to fit poor assumption is made. The network number is expected to fit
into an unsigned long int variable. */ into an unsigned long int variable. */
@ -413,6 +427,7 @@ struct addrinfo
/* Possible values for `ai_flags' field in `addrinfo' structure. */ /* Possible values for `ai_flags' field in `addrinfo' structure. */
# define AI_PASSIVE 1 /* Socket address is intended for `bind'. */ # define AI_PASSIVE 1 /* Socket address is intended for `bind'. */
# define AI_CANONNAME 2 /* Request for canonical name. */ # define AI_CANONNAME 2 /* Request for canonical name. */
# define AI_NUMERICHOST 3 /* Don't use name resolution. */
/* Error values for `getaddrinfo' function. */ /* Error values for `getaddrinfo' function. */
# define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */ # define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */
@ -430,11 +445,11 @@ struct addrinfo
# define NI_MAXHOST 1025 # define NI_MAXHOST 1025
# define NI_MAXSERV 32 # define NI_MAXSERV 32
# define NI_NUMERICHOST 1 # define NI_NUMERICHOST 1 /* Don't try to look up hostname. */
# define NI_NUMERICSERV 2 # define NI_NUMERICSERV 2 /* Don't convert port number to name. */
# define NI_NOFQDN 4 # define NI_NOFQDN 4 /* Only return nodename portion. */
# define NI_NAMEREQD 8 # define NI_NAMEREQD 8 /* Don't return numeric addresses. */
# define NI_DGRAM 16 # define NI_DGRAM 16 /* Look up UDP service rather than TCP. */
/* Translate name of a service location and/or a service name to set of /* Translate name of a service location and/or a service name to set of
socket addresses. */ socket addresses. */
@ -449,7 +464,7 @@ extern void freeaddrinfo __P ((struct addrinfo *__ai));
extern char *gai_strerror __P ((int __ecode)); extern char *gai_strerror __P ((int __ecode));
/* Translate a socket address to a location and service name. */ /* Translate a socket address to a location and service name. */
extern int getnameinfo __P ((__const struct sockaddr *__sa, size_t __salen, extern int getnameinfo __P ((__const struct sockaddr *__sa, socklen_t __salen,
char *__host, size_t __hostlen, char *__host, size_t __hostlen,
char *__serv, size_t __servlen, char *__serv, size_t __servlen,
int __flags)); int __flags));

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. # Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -21,7 +21,8 @@
# #
subdir := socket subdir := socket
headers := sys/socket.h sys/un.h bits/sockaddr.h bits/socket.h headers := sys/socket.h sys/un.h bits/sockaddr.h bits/socket.h \
bits/sockunion.h
routines := accept bind connect getpeername getsockname getsockopt \ routines := accept bind connect getpeername getsockname getsockopt \
listen recv recvfrom recvmsg send sendmsg sendto \ listen recv recvfrom recvmsg send sendmsg sendto \

View File

@ -33,6 +33,9 @@ __BEGIN_DECLS
`struct msghdr', and `struct linger' types. */ `struct msghdr', and `struct linger' types. */
#include <bits/socket.h> #include <bits/socket.h>
/* Get the definition of `sockaddr_union'. */
#include <bits/sockunion.h>
#ifdef __USE_BSD #ifdef __USE_BSD
/* This is the 4.3 BSD `struct sockaddr' format, which is used as wire /* This is the 4.3 BSD `struct sockaddr' format, which is used as wire
format in the grotty old 4.3 `talk' protocol. */ format in the grotty old 4.3 `talk' protocol. */

View File

@ -733,16 +733,20 @@ extern int grantpt __P ((int __fd));
Call after grantpt(). */ Call after grantpt(). */
extern int unlockpt __P ((int __fd)); extern int unlockpt __P ((int __fd));
/* Get the name of the slave. */ /* Return the pathname of the pseudo terminal slave assoicated with
the master FD is open on, or NULL on errors.
The returned storage is good until the next call to this function. */
extern char *ptsname __P ((int __fd)); extern char *ptsname __P ((int __fd));
#endif #endif
#ifdef __USE_GNU #ifdef __USE_GNU
/* Reentrant version of ptsname. */ /* Store at most BUFLEN characters of the pathname of the slave pseudo
extern char *__ptsname_r __P ((int __fd, char *__buf, unsigned int __len)); terminal associated with the master FD is open on in BUF.
extern char *ptsname_r __P ((int __fd, char *__buf, unsigned int __len)); Return 0 on success, otherwise an error number. */
extern int __ptsname_r __P ((int __fd, char *__buf, size_t __buflen));
extern int ptsname_r __P ((int __fd, char *__buf, size_t __buflen));
/* Open a master pseudo tty and return its file descriptor. */ /* Open a master pseudo terminal and return its file descriptor. */
extern int __getpt __P ((void)); extern int __getpt __P ((void));
extern int getpt __P ((void)); extern int getpt __P ((void));
#endif #endif

View File

@ -198,6 +198,7 @@ extern size_t strlen __P ((__const char *__s));
#ifdef __USE_GNU #ifdef __USE_GNU
/* Find the length of STRING, but scan at most MAXLEN characters. /* Find the length of STRING, but scan at most MAXLEN characters.
If no '\0' terminator is found in that many characters, return MAXLEN. */ If no '\0' terminator is found in that many characters, return MAXLEN. */
extern size_t __strnlen __P ((__const char *__string, size_t __maxlen));
extern size_t strnlen __P ((__const char *__string, size_t __maxlen)); extern size_t strnlen __P ((__const char *__string, size_t __maxlen));
#endif #endif

View File

@ -1,5 +1,5 @@
/* Find the length of STRING, but scan at most MAXLEN characters. /* Find the length of STRING, but scan at most MAXLEN characters.
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -23,8 +23,9 @@
If no '\0' terminator is found in that many characters, return MAXLEN. */ If no '\0' terminator is found in that many characters, return MAXLEN. */
size_t size_t
strnlen (const char *string, size_t maxlen) __strnlen (const char *string, size_t maxlen)
{ {
const char *end = memchr (string, '\0', maxlen); const char *end = memchr (string, '\0', maxlen);
return end ? end - string : maxlen; return end ? end - string : maxlen;
} }
weak_alias (__strnlen, strnlen)

View File

@ -1,5 +1,5 @@
/* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version. /* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -37,5 +37,8 @@ typedef unsigned short int sa_family_t;
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int)) #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
/* Return the length of a `sockaddr' structure. */
#define SA_LEN(_x) __libc_sa_len((_x)->sa_family)
extern int __libc_sa_len __P ((sa_family_t __af));
#endif /* bits/sockaddr.h */ #endif /* bits/sockaddr.h */

View File

@ -1,5 +1,5 @@
/* System-specific socket constants and types. Generic/4.3 BSD version. /* System-specific socket constants and types. Generic/4.3 BSD version.
Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc. Copyright (C) 1991, 92, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -17,7 +17,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#ifndef _SYS_SOCKET_H #if !defined _SYS_SOCKET_H && !defined _NETINET_IN_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead." # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif #endif

View File

@ -0,0 +1,40 @@
/* Definition of `sockaddr_union'. Generic/4.2 BSD version.
Copyright (C) 1998 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/socket.h> instead.
*/
#ifndef _BITS_SOCKUNION_H
#define _BITS_SOCKUNION_H 1
#include <netinet/in.h>
#include <sys/un.h>
/* Union of all sockaddr types (required by IPv6 Basic API). */
union sockaddr_union
{
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
struct sockaddr_un sun;
char __maxsize[128];
};
#endif /* bits/sockunion.h */

View File

@ -17,8 +17,9 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h>
#include <unistd.h>
/* Given the file descriptor of a master pty, return the pathname /* Given the file descriptor of a master pty, return the pathname
of the associated slave. */ of the associated slave. */
@ -28,14 +29,14 @@ ptsname (fd)
int fd __attribute__ ((unused)); int fd __attribute__ ((unused));
{ {
__set_errno (ENOSYS); __set_errno (ENOSYS);
return 0; return NULL;
} }
char * int
__ptsname_r (fd, buf, len) __ptsname_r (fd, buf, len)
int fd __attribute__ ((unused)); int fd __attribute__ ((unused));
char *buf __attribute__ ((unused)); char *buf __attribute__ ((unused));
unsigned int len __attribute__ ((unused)); size_t len __attribute__ ((unused));
{ {
__set_errno (ENOSYS); __set_errno (ENOSYS);
return 0; return 0;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1992, 1993, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1992, 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,8 +16,8 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#ifndef _SYS_IOCTL_H #if !defined _HURD_IOCTL_H && !defined _SYS_IOCTLS_H
# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead." # error "Never use <bits/ioctls.h> directly; include <hurd/ioctl.h> instead."
#endif #endif
/* These macros are also defined in <bits/termios.h> (with numerically /* These macros are also defined in <bits/termios.h> (with numerically

View File

@ -546,8 +546,8 @@ __close (int fd)
return 0; return 0;
} }
caddr_t weak_function __ptr_t weak_function
__mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset) __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
{ {
error_t err; error_t err;
vm_prot_t vmprot; vm_prot_t vmprot;
@ -656,7 +656,7 @@ _dl_sysdep_message (const char *msg, ...)
? VM_INHERIT_SHARE : VM_INHERIT_COPY); ? VM_INHERIT_SHARE : VM_INHERIT_COPY);
} }
return err ? (caddr_t) __hurd_fail (err) : (caddr_t) mapaddr; return err ? (__ptr_t) __hurd_fail (err) : (__ptr_t) mapaddr;
} }
void weak_function void weak_function

View File

@ -19,9 +19,11 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <sys/time.h>
/* Generate a unique temporary file name from TEMPLATE. /* Generate a unique temporary file name from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX"; The last six characters of TEMPLATE must be "XXXXXX";
@ -33,30 +35,54 @@ mkstemp (template)
{ {
static const char letters[] static const char letters[]
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
static uint32_t value;
struct timeval tv;
char *XXXXXX;
size_t len; size_t len;
size_t i; int count;
len = strlen (template); len = strlen (template);
if (len < 6 || strcmp (&template[len - 6], "XXXXXX")) if (len < 6 || strcmp (&template[len - 6], "XXXXXX"))
{ {
__set_errno (EINVAL); __set_errno (EINVAL);
return -1; return NULL;
} }
if (sprintf (&template[len - 5], "%.5u", /* This is where the Xs start. */
(unsigned int) getpid () % 100000) != 5) XXXXXX = &template[len - 6];
/* Inconceivable lossage. */
return -1;
for (i = 0; i < sizeof (letters); ++i) /* Get some more or less random data. */
__gettimeofday (&tv, NULL);
value += tv.tv_usec | getpid ();
for (count = 0; count < TMP_MAX; ++count)
{ {
struct stat ignored;
uint32_t v = value;
int fd; int fd;
template[len - 6] = letters[i]; /* Fill in the random bits. */
XXXXXX[0] = letters[v % 62];
v /= 62;
XXXXXX[1] = letters[v % 62];
v /= 62;
XXXXXX[2] = letters[v % 62];
v /= 62;
XXXXXX[3] = letters[v % 62];
v /= 62;
XXXXXX[4] = letters[v % 62];
v /= 62;
XXXXXX[5] = letters[v % 62];
fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600); fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600);
if (fd >= 0) if (fd >= 0)
/* The file does not exist. */
return fd; return fd;
/* This is a random value. It is only necessary that the next
TMP_MAX values generated by adding 7777 to VALUE are different
with (module 2^32). */
value += 7777;
} }
/* We return the null string if we can't find a unique file name. */ /* We return the null string if we can't find a unique file name. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1993, 1996, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -16,13 +16,15 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
/* Generate a unique temporary file name from TEMPLATE. /* Generate a unique temporary file name from TEMPLATE.
The last six characters of TEMPLATE must be "XXXXXX"; The last six characters of TEMPLATE must be "XXXXXX";
@ -33,8 +35,11 @@ mktemp (template)
{ {
static const char letters[] static const char letters[]
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
static uint32_t value;
struct timeval tv;
char *XXXXXX;
size_t len; size_t len;
size_t i; int count;
len = strlen (template); len = strlen (template);
if (len < 6 || strcmp (&template[len - 6], "XXXXXX")) if (len < 6 || strcmp (&template[len - 6], "XXXXXX"))
@ -43,20 +48,39 @@ mktemp (template)
return NULL; return NULL;
} }
if (sprintf (&template[len - 5], "%.5u", /* This is where the Xs start. */
(unsigned int) getpid () % 100000) != 5) XXXXXX = &template[len - 6];
/* Inconceivable lossage. */
return NULL;
for (i = 0; i < sizeof (letters); ++i) /* Get some more or less random data. */
__gettimeofday (&tv, NULL);
value += tv.tv_usec | getpid ();
for (count = 0; count < TMP_MAX; ++count)
{ {
struct stat ignored; struct stat ignored;
uint32_t v = value;
template[len - 6] = letters[i]; /* Fill in the random bits. */
XXXXXX[0] = letters[v % 62];
v /= 62;
XXXXXX[1] = letters[v % 62];
v /= 62;
XXXXXX[2] = letters[v % 62];
v /= 62;
XXXXXX[3] = letters[v % 62];
v /= 62;
XXXXXX[4] = letters[v % 62];
v /= 62;
XXXXXX[5] = letters[v % 62];
if (stat (template, &ignored) < 0 && errno == ENOENT) if (stat (template, &ignored) < 0 && errno == ENOENT)
/* The file does not exist. So return this name. */ /* The file does not exist. So return this name. */
return template; return template;
/* This is a random value. It is only necessary that the next
TMP_MAX values generated by adding 7777 to VALUE are different
with (module 2^32). */
value += 7777;
} }
/* We return the null string if we can't find a unique file name. */ /* We return the null string if we can't find a unique file name. */

View File

@ -1,5 +1,5 @@
/* Definition of `struct sockaddr_*' common members. 4.4 BSD version. /* Definition of `struct sockaddr_*' common members. 4.4 BSD version.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -38,5 +38,7 @@ typedef unsigned char sa_family_t;
#define __SOCKADDR_COMMON_SIZE (2 * sizeof (unsigned char)) #define __SOCKADDR_COMMON_SIZE (2 * sizeof (unsigned char))
/* Return the length of a `sockaddr' structure. */
#define SA_LEN(_x) ((_x)->sa_len)
#endif /* bits/sockaddr.h */ #endif /* bits/sockaddr.h */

View File

@ -34,7 +34,7 @@ unlockpt (fd)
{ {
char buf[PTYNAMELEN]; char buf[PTYNAMELEN];
if (ptsname_r (fd, buf, PTYNAMELEN)) if (__ptsname_r (fd, buf, PTYNAMELEN))
return -1; return -1;
return revoke (buf); return revoke (buf);

View File

@ -47,9 +47,9 @@ grantpt (fd)
char namebuf[PTYNAMELEN]; char namebuf[PTYNAMELEN];
/* Some systems do it for us. */ /* Some systems do it for us. */
if (__ptsname_r (fd, namebuf, PTYNAMELEN) == NULL) if (__ptsname_r (fd, namebuf, PTYNAMELEN) != 0)
return -1; return -1;
if (stat (namebuf, &st)) if (__xstat (_STAT_VER, namebuf, &st) != 0)
return -1; return -1;
if (st.st_uid == getuid ()) if (st.st_uid == getuid ())

View File

@ -46,6 +46,7 @@ rt_sigqueueinfo.c
rt_sigreturn.c rt_sigreturn.c
rt_sigsuspend.c rt_sigsuspend.c
rt_sigtimedwait.c rt_sigtimedwait.c
sa_len.c
scsi/sg.h scsi/sg.h
scsi/scsi.h scsi/scsi.h
sys/acct.h sys/acct.h

View File

@ -58,7 +58,7 @@ ifeq ($(subdir),socket)
sysdep_headers += net/if.h net/if_ppp.h net/ppp-comp.h \ sysdep_headers += net/if.h net/if_ppp.h net/ppp-comp.h \
net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \ net/ppp_defs.h net/if_arp.h net/route.h net/ethernet.h \
net/if_slip.h net/if_packet.h net/if_slip.h net/if_packet.h
sysdep_routines += cmsg_nxthdr sysdep_routines += cmsg_nxthdr sa_len
endif endif
ifeq ($(subdir),sunrpc) ifeq ($(subdir),sunrpc)

View File

@ -1,5 +1,5 @@
/* Low-level statistical profiling support function. Linux/ARM version. /* Low-level statistical profiling support function. Linux/ARM version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -18,9 +18,54 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <signal.h> #include <signal.h>
#include <asm/ptrace.h>
union k_sigcontext
{
struct
{
unsigned long int trap_no;
unsigned long int error_code;
unsigned long int oldmask;
unsigned long int arm_r0;
unsigned long int arm_r1;
unsigned long int arm_r2;
unsigned long int arm_r3;
unsigned long int arm_r4;
unsigned long int arm_r5;
unsigned long int arm_r6;
unsigned long int arm_r7;
unsigned long int arm_r8;
unsigned long int arm_r9;
unsigned long int arm_r10;
unsigned long int arm_fp;
unsigned long int arm_ip;
unsigned long int arm_sp;
unsigned long int arm_lr;
unsigned long int arm_pc;
unsigned long int arm_cpsr;
} v21;
struct
{
unsigned long int magic;
struct pt_regs reg;
unsigned long int trap_no;
unsigned long int error_code;
unsigned long int oldmask;
} v20;
};
void void
profil_counter (int signo, struct sigcontext sc) profil_counter (int signo, int _a2, int _a3, int _a4, union k_sigcontext sc)
{ {
profil_count ((void *) sc.reg.ARM_pc); /* The format of struct sigcontext changed between 2.0 and 2.1 kernels.
Fortunately 2.0 puts a magic number in the first word and this is not
a legal value for `trap_no', so we can tell them apart. */
void *pc;
if (sc.v20.magic == 0x4B534154)
pc = (void *) sc.v20.reg.ARM_pc;
else
pc = (void *) sc.v21.arm_pc;
profil_count (pc);
} }

View File

@ -17,7 +17,10 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#ifndef _SYS_SOCKET_H #ifndef __BITS_SOCKET_H
#define __BITS_SOCKET_H
#if !defined _SYS_SOCKET_H && !defined _NETINET_IN_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead." # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif #endif
@ -230,3 +233,5 @@ struct linger
int l_onoff; /* Nonzero to linger on close. */ int l_onoff; /* Nonzero to linger on close. */
int l_linger; /* Time to linger. */ int l_linger; /* Time to linger. */
}; };
#endif /* bits/socket.h */

View File

@ -0,0 +1,46 @@
/* Definition of `sockaddr_union'. Linux version.
Copyright (C) 1998 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. */
#ifndef _SYS_SOCKET_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif
#include <netash/ash.h>
#include <netatalk/at.h>
#include <netax25/ax25.h>
#include <netinet/in.h>
#include <netipx/ipx.h>
#include <netrose/rose.h>
#include <sys/un.h>
/* Union of all sockaddr types (required by IPv6 Basic API). This is
somewhat evil. */
union sockaddr_union
{
struct sockaddr sa;
struct sockaddr_ash sash;
struct sockaddr_at sat;
struct sockaddr_ax25 sax25;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
struct sockaddr_ipx sipx;
struct sockaddr_rose rose;
struct sockaddr_un sun;
char __maxsize[128];
};

View File

@ -117,52 +117,46 @@ if_nameindex (void)
#else #else
int fd = opensock (); int fd = opensock ();
struct ifconf ifc; struct ifconf ifc;
unsigned int rq_ifs = 4, nifs, i; unsigned int nifs, i;
int rq_len; int rq_len;
struct if_nameindex *idx = NULL; struct if_nameindex *idx = NULL;
#ifdef SIOCGIFCOUNT static int new_siocgifconf = 1;
static int siocgifcount_works = 1; #define RQ_IFS 4
#endif
if (fd < 0) if (fd < 0)
return NULL; return NULL;
#ifdef SIOCGIFCOUNT ifc.ifc_buf = NULL;
/* We may be able to find out how many interfaces really exist, rather
than guessing. This ioctl is not present in kernels before version
2.1.50. */
if (siocgifcount_works)
{
int serrno = errno;
if (ioctl (fd, SIOCGIFCOUNT, &nifs) < 0) /* We may be able to get the needed buffer size directly, rather than
guessing. */
if (new_siocgifconf)
{
ifc.ifc_buf = NULL;
ifc.ifc_len = 0;
if (ioctl (fd, SIOCGIFCONF, &ifc) < 0 || ifc.ifc_len == 0)
{ {
if (errno == EINVAL) new_siocgifconf = 0;
{ rq_len = RQ_IFS * sizeof (struct ifreq);
siocgifcount_works = 0;
__set_errno (serrno);
}
} }
else else
rq_ifs = nifs + 1; rq_len = ifc.ifc_len;
} }
#endif else
rq_len = RQ_IFS * sizeof (struct ifreq);
ifc.ifc_buf = NULL;
/* Read all the interfaces out of the kernel. */ /* Read all the interfaces out of the kernel. */
do do
{ {
rq_len = ifc.ifc_len = rq_ifs * sizeof (struct ifreq); ifc.ifc_buf = alloca (ifc.ifc_len = rq_len);
ifc.ifc_buf = alloca (ifc.ifc_len);
if ((ifc.ifc_buf == NULL) || (ioctl (fd, SIOCGIFCONF, &ifc) < 0)) if ((ifc.ifc_buf == NULL) || (ioctl (fd, SIOCGIFCONF, &ifc) < 0))
{ {
close (fd); close (fd);
return NULL; return NULL;
} }
rq_ifs *= 2; rq_len *= 2;
} }
while (ifc.ifc_len == rq_len); while (ifc.ifc_len == rq_len && new_siocgifconf == 0);
nifs = ifc.ifc_len / sizeof (struct ifreq); nifs = ifc.ifc_len / sizeof (struct ifreq);

View File

@ -17,7 +17,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#ifndef _SYS_STAT_H #if !defined _SYS_STAT_H && !defined _NETINET_IN_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead." # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif #endif

View File

@ -24,6 +24,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include "pty-internal.h" #include "pty-internal.h"
@ -40,21 +41,38 @@ char *
ptsname (fd) ptsname (fd)
int fd; int fd;
{ {
return __ptsname_r (fd, namebuf, PTYNAMELEN); return __ptsname_r (fd, namebuf, PTYNAMELEN) != 0 ? NULL : namebuf;
} }
char * int
__ptsname_r (fd, buf, len) __ptsname_r (fd, buf, buflen)
int fd; int fd;
char *buf; char *buf;
unsigned int len; size_t buflen;
{ {
char nbuf[PTYNAMELEN], idbuf[6];
int ptyno;
struct stat st; struct stat st;
int save = errno;
int ptyno;
char nbuf[PTYNAMELEN], idbuf[6];
char *cp;
#ifdef TIOCGPTN #ifdef TIOCGPTN
static int tiocgptn_works = 1; static int tiocgptn_works = 1;
#endif
if (!buf)
{
__set_errno (EINVAL);
return EINVAL;
}
if (!__isatty (fd))
{
__set_errno (ENOTTY);
return ENOTTY;
}
#ifdef TIOCGPTN
if (tiocgptn_works) if (tiocgptn_works)
{ {
if (ioctl (fd, TIOCGPTN, &ptyno) == 0) if (ioctl (fd, TIOCGPTN, &ptyno) == 0)
@ -62,23 +80,21 @@ __ptsname_r (fd, buf, len)
else else
{ {
if(errno != EINVAL) if(errno != EINVAL)
return 0; return errno;
else else
tiocgptn_works = 0; tiocgptn_works = 0;
} }
} }
#endif #endif
/* /dev/ptmx will make it into the kernel before 32 bit dev_t, so if (__fxstat (_STAT_VER, fd, &st) < 0)
this should be safe. */ return errno;
if (__fxstat (_STAT_VER, fd, &st))
return 0;
ptyno = minor (st.st_rdev); ptyno = minor (st.st_rdev);
if (major (st.st_rdev) == 4) if (major (st.st_rdev) == 4)
ptyno -= 128; ptyno -= 128;
#ifdef TIOCGPTN #ifdef TIOCGPTN
gotit: gotit:
#endif #endif
/* Two different possible naming schemes for pty slaves: /* Two different possible naming schemes for pty slaves:
the SVr4 way. */ the SVr4 way. */
@ -86,22 +102,32 @@ gotit:
idbuf[5] = '\0'; idbuf[5] = '\0';
__stpcpy (__stpcpy (nbuf, "/dev/pts/"), __stpcpy (__stpcpy (nbuf, "/dev/pts/"),
_itoa_word (ptyno, &idbuf[4], 10, 0)); _itoa_word (ptyno, &idbuf[4], 10, 0));
if (!__xstat (_STAT_VER, nbuf, &st)) if (__xstat (_STAT_VER, nbuf, &st) < 0)
return strncpy (buf, nbuf, len); {
else if (errno != ENOENT)
if (errno != ENOENT) return errno;
return NULL;
/* ...and the BSD way. */ /* ...and the BSD way. */
nbuf[5] = 't'; nbuf[5] = 't';
nbuf[7] = 'y'; nbuf[7] = 'y';
nbuf[8] = __ptyname1[ptyno / 16]; nbuf[8] = __ptyname1[ptyno / 16];
nbuf[9] = __ptyname2[ptyno % 16]; nbuf[9] = __ptyname2[ptyno % 16];
nbuf[10] = '\0'; nbuf[10] = '\0';
if (__xstat (_STAT_VER, nbuf, &st)) if (__xstat (_STAT_VER, nbuf, &st) < 0)
return NULL; return errno;
}
return strncpy (buf, nbuf, len); if (buflen < strlen (nbuf) + 1)
{
__set_errno (ERANGE);
return ERANGE;
}
cp = __stpncpy (buf, nbuf, buflen);
cp[0] = '\0';
__set_errno (save);
return 0;
} }
weak_alias (__ptsname_r, ptsname_r) weak_alias (__ptsname_r, ptsname_r)

View File

@ -0,0 +1,46 @@
/* Copyright (C) 1998 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. */
#include <sys/socket.h>
#include <netatalk/at.h>
#include <netax25/ax25.h>
#include <netinet/in.h>
#include <netipx/ipx.h>
#include <netrose/rose.h>
int
__libc_sa_len (sa_family_t af)
{
switch (af)
{
case AF_APPLETALK:
return sizeof (struct sockaddr_at);
case AF_AX25:
return sizeof (struct sockaddr_ax25);
case AF_INET:
return sizeof (struct sockaddr_in);
case AF_INET6:
return sizeof (struct sockaddr_in6);
case AF_IPX:
return sizeof (struct sockaddr_ipx);
case AF_ROSE:
return sizeof (struct sockaddr_rose);
}
return 0;
}

View File

@ -1,4 +1,4 @@
# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. # Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -22,21 +22,22 @@
subdir := wcsmbs subdir := wcsmbs
headers := wchar.h headers := wchar.h
distribute := wcwidth.h distribute := wcwidth.h wcsmbsload.h
routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \ routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \ wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \
wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy \ wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy \
btowc wctob mbsinit \ btowc wctob mbsinit \
mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \ mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
mbsnrtowcs wcsnrtombs wmemrtowcs wmemrtombs \ mbsnrtowcs wcsnrtombs wcsnlen \
wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \ wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
wcstol_l wcstoul_l wcstoll_l wcstoull_l \ wcstol_l wcstoul_l wcstoll_l wcstoull_l \
wcstod_l wcstold_l wcstof_l \ wcstod_l wcstold_l wcstof_l \
wcscoll wcsxfrm \ wcscoll wcsxfrm \
wcwidth wcswidth \ wcwidth wcswidth \
wcscoll_l wcsxfrm_l \ wcscoll_l wcsxfrm_l \
wcscasecmp wcsncase wcscasecmp_l wcsncase_l wcscasecmp wcsncase wcscasecmp_l wcsncase_l \
wcsmbsload
tests := tst-wcstof tests := tst-wcstof

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu> Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>
@ -17,18 +17,52 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <gconv.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
/* We use UTF8 encoding for multibyte strings and therefore a valid
one byte multibyte string only can have a value from 0 to 0x7f. */
wint_t wint_t
btowc (c) btowc (c)
int c; int c;
{ {
if (WEOF != (wint_t) EOF || c < 0 || c > 0x7f) char buf[sizeof (wchar_t)];
struct gconv_step_data data;
char inbuf[1];
size_t inbytes;
size_t converted;
int status;
/* If the parameter does not fit into one byte or it is the EOF value
we can give the answer now. */
if (c < -128 || c > 127 || c == EOF)
return WEOF; return WEOF;
else
return (wint_t) c; /* Tell where we want the result. */
data.outbuf = (char *) buf;
data.outbufavail = 0;
data.outbufsize = sizeof (wchar_t);
data.is_last = 1;
data.statep = &data.__state;
/* Make sure we start in the initial state. */
memset (&data.__state, '\0', sizeof (mbstate_t));
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* Create the input string. */
inbuf[0] = c;
inbytes = 1;
status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
&data, inbuf, &inbytes,
&converted, 0);
/* The conversion failed. */
if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)
return WEOF;
return *(wchar_t *)buf;
} }

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -18,113 +18,77 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <gconv.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
#include <assert.h>
#ifndef EILSEQ #ifndef EILSEQ
#define EILSEQ EINVAL # define EILSEQ EINVAL
#endif #endif
static mbstate_t internal; /* This is the private state used if PS is NULL. */
static mbstate_t state;
size_t size_t
__mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
{ {
size_t used = 0; wchar_t buf[1];
struct gconv_step_data data;
size_t inbytes;
int status;
size_t result;
if (ps == NULL) /* Tell where we want the result. */
ps = &internal; data.outbuf = (char *) (pwc ?: buf);
data.outbufavail = 0;
data.outbufsize = sizeof (wchar_t);
data.is_last = 1;
data.statep = ps ?: &state;
/* A first special case is if S is NULL. This means put PS in the
initial state. */
if (s == NULL) if (s == NULL)
{ {
/* See first paragraph of description in 7.16.6.3.2. */ data.outbuf = (char *) buf;
ps->count = 0; s = "";
return 0; n = 1;
} }
if (n > 0) /* Make sure we use the correct function. */
update_conversion_ptrs ();
/* Do a normal conversion. */
inbytes = n;
status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
&data, s, &inbytes, NULL, 0);
/* There must not be any problems with the conversion but illegal input
characters. The output buffer must be large enough, otherwise the
definition of MB_CUR_MAX is not correct. All the other possible
errors also must not happen. */
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|| status == GCONV_INCOMPLETE_INPUT);
if (status == GCONV_OK)
{ {
if (ps->count == 0) if (*(wchar_t *)data.outbuf == L'\0')
{ {
unsigned char byte = (unsigned char) *s++; /* The converted character is the NUL character. */
++used; assert (mbsinit (data.statep));
result = 0;
/* We must look for a possible first byte of a UTF8 sequence. */
if (byte < 0x80)
{
/* One byte sequence. */
if (pwc != NULL)
*pwc = (wchar_t) byte;
return byte ? used : 0;
}
if ((byte & 0xc0) == 0x80 || (byte & 0xfe) == 0xfe)
{
/* Oh, oh. An encoding error. */
__set_errno (EILSEQ);
return (size_t) -1;
}
if ((byte & 0xe0) == 0xc0)
{
/* We expect two bytes. */
ps->count = 1;
ps->value = byte & 0x1f;
}
else if ((byte & 0xf0) == 0xe0)
{
/* We expect three bytes. */
ps->count = 2;
ps->value = byte & 0x0f;
}
else if ((byte & 0xf8) == 0xf0)
{
/* We expect four bytes. */
ps->count = 3;
ps->value = byte & 0x07;
}
else if ((byte & 0xfc) == 0xf8)
{
/* We expect five bytes. */
ps->count = 4;
ps->value = byte & 0x03;
}
else
{
/* We expect six bytes. */
ps->count = 5;
ps->value = byte & 0x01;
}
}
/* We know we have to handle a multibyte character and there are
some more bytes to read. */
while (used < n)
{
/* The second to sixths byte must be of the form 10xxxxxx. */
unsigned char byte = (unsigned char) *s++;
++used;
if ((byte & 0xc0) != 0x80)
{
/* Oh, oh. An encoding error. */
__set_errno (EILSEQ);
return (size_t) -1;
}
ps->value <<= 6;
ps->value |= byte & 0x3f;
if (--ps->count == 0)
{
/* The character is finished. */
if (pwc != NULL)
*pwc = (wchar_t) ps->value;
return ps->value ? used : 0;
}
} }
else
result = n - inbytes;
}
else
{
result = status == GCONV_INCOMPLETE_INPUT ? (size_t) -2 : (size_t) -1;
__set_errno (EILSEQ);
} }
return (size_t) -2; return result;
} }
weak_alias (__mbrtowc, mbrtowc) weak_alias (__mbrtowc, mbrtowc)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -18,16 +18,20 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <gconv.h>
#include <string.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
#include <assert.h>
#ifndef EILSEQ #ifndef EILSEQ
#define EILSEQ EINVAL # define EILSEQ EINVAL
#endif #endif
/* We don't need the state really because we don't have shift states /* This is the private state used if PS is NULL. */
to maintain between calls to this function. */ static mbstate_t state;
static mbstate_t internal;
/* This is a non-standard function but it is very useful in the /* This is a non-standard function but it is very useful in the
implementation of stdio because we have to deal with unterminated implementation of stdio because we have to deal with unterminated
@ -40,128 +44,89 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
size_t len; size_t len;
mbstate_t *ps; mbstate_t *ps;
{ {
size_t written = 0; size_t inbytes_in;
const char *run = *src; struct gconv_step_data data;
const char *last = run + nmc; size_t result = 0;
wchar_t value; int status;
size_t count;
if (ps == NULL) /* Tell where we want the result. */
ps = &internal; data.is_last = 1;
data.statep = ps ?: &state;
/* Get information from last use of this state. */ if (nmc == 0)
count = ps->count; return 0;
value = ps->value; inbytes_in = __strnlen (*src, nmc - 1) + 1;
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* We have to handle DST == NULL special. */
if (dst == NULL) if (dst == NULL)
/* The LEN parameter has to be ignored if we don't actually write
anything. */
len = ~0;
/* Copy all words. */
while (written < len && run < last)
{ {
unsigned char byte; wchar_t buf[64]; /* Just an arbitrary size. */
size_t inbytes = inbytes_in;
const char *inbuf = *src;
size_t written;
/* Store address of next byte to process. */ data.outbuf = (char *) buf;
*src = run; data.outbufsize = sizeof (buf);
do
/* Start reading a new character only if we are in the initial
state. */
if (count == 0)
{ {
byte = *run++; inbuf += inbytes_in - inbytes;
inbytes_in = inbytes;
data.outbufavail = 0;
written = 0;
/* We expect a start of a new multibyte character. */ status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
if (byte < 0x80) &data, inbuf, &inbytes,
{ &written, 0);
/* One byte sequence. */ result += written;
count = 0;
value = byte;
}
else if ((byte & 0xe0) == 0xc0)
{
count = 1;
value = byte & 0x1f;
}
else if ((byte & 0xf0) == 0xe0)
{
/* We expect three bytes. */
count = 2;
value = byte & 0x0f;
}
else if ((byte & 0xf8) == 0xf0)
{
/* We expect four bytes. */
count = 3;
value = byte & 0x07;
}
else if ((byte & 0xfc) == 0xf8)
{
/* We expect five bytes. */
count = 4;
value = byte & 0x03;
}
else if ((byte & 0xfe) == 0xfc)
{
/* We expect six bytes. */
count = 5;
value = byte & 0x01;
}
else
{
/* This is an illegal encoding. */
__set_errno (EILSEQ);
return (size_t) -1;
}
} }
while (status == GCONV_FULL_OUTPUT);
/* Read the possible remaining bytes. */ if (status == GCONV_OK && ((wchar_t *) dst)[written - 1] == L'\0')
while (run < last && count > 0) /* Don't count the NUL character in. */
--result;
}
else
{
/* This code is based on the safe assumption that all internal
multi-byte encodings use the NUL byte only to mark the end
of the string. */
size_t inbytes = inbytes_in;
data.outbuf = (char *) dst;
data.outbufsize = len * sizeof (wchar_t);
data.outbufavail = 0;
status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
&data, *src, &inbytes,
&result, 0);
/* We have to determine whether the last character converted
is the NUL character. */
if (status == GCONV_OK && ((wchar_t *) dst)[result - 1] == L'\0')
{ {
byte = *run++; assert (result > 0);
--count; assert (mbsinit (data.statep));
if ((byte & 0xc0) != 0x80)
{
/* This is an illegal encoding. */
__set_errno (EILSEQ);
return (size_t) -1;
}
value <<= 6;
value |= byte & 0x3f;
}
/* If this character is only partially available remember this. */
if (run == last && count != 0)
{
ps->count = count;
ps->value = value;
break;
}
/* Store value is required. */
if (dst != NULL)
*dst++ = value;
/* The whole sequence is read. Check whether end of string is
reached. */
if (value == L'\0')
{
/* Found the end of the string. */
*src = NULL; *src = NULL;
ps->count = 0; --result;
return written;
} }
else
/* Increment counter of produced words. */ *src += inbytes_in - inbytes;
++written;
} }
/* Store address of next byte to process. */ /* There must not be any problems with the conversion but illegal input
*src = run; characters. */
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|| status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);
return written; if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)
{
result = (size_t) -1;
__set_errno (EILSEQ);
}
return result;
} }
weak_alias (__mbsnrtowcs, mbsnrtowcs) weak_alias (__mbsnrtowcs, mbsnrtowcs)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -18,16 +18,20 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <gconv.h>
#include <string.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
#include <assert.h>
#ifndef EILSEQ #ifndef EILSEQ
#define EILSEQ EINVAL # define EILSEQ EINVAL
#endif #endif
/* We don't need the state really because we don't have shift states /* This is the private state used if PS is NULL. */
to maintain between calls to this function. */ static mbstate_t state;
static mbstate_t internal;
size_t size_t
__mbsrtowcs (dst, src, len, ps) __mbsrtowcs (dst, src, len, ps)
@ -36,108 +40,86 @@ __mbsrtowcs (dst, src, len, ps)
size_t len; size_t len;
mbstate_t *ps; mbstate_t *ps;
{ {
size_t written = 0; struct gconv_step_data data;
const char *run = *src; size_t result = 0;
int status;
if (ps == NULL) /* Tell where we want the result. */
ps = &internal; data.is_last = 1;
data.statep = ps ?: &state;
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* We have to handle DST == NULL special. */
if (dst == NULL) if (dst == NULL)
/* The LEN parameter has to be ignored if we don't actually write
anything. */
len = ~0;
/* Copy all words. */
while (written < len)
{ {
wchar_t value; wchar_t buf[64]; /* Just an arbitrary size. */
size_t count; size_t inbytes_in = strlen (*src) + 1;
unsigned char byte; size_t inbytes = inbytes_in;
const char *inbuf = *src;
size_t written;
/* Store address of next byte to process. */ data.outbuf = (char *) buf;
*src = run; data.outbufsize = sizeof (buf);
do
{
inbuf += inbytes_in - inbytes;
inbytes_in = inbytes;
data.outbufavail = 0;
written = 0;
byte = *run++; status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
&data, inbuf, &inbytes,
&written, 0);
result += written;
}
while (status == GCONV_FULL_OUTPUT);
/* We expect a start of a new multibyte character. */ if (status == GCONV_OK && ((wchar_t *) dst)[written - 1] == L'\0')
if (byte < 0x80) /* Don't count the NUL character in. */
--result;
}
else
{
/* This code is based on the safe assumption that all internal
multi-byte encodings use the NUL byte only to mark the end
of the string. */
size_t inbytes_in = __strnlen (*src, len * MB_CUR_MAX) + 1;
size_t inbytes = inbytes_in;
data.outbuf = (char *) dst;
data.outbufsize = len * sizeof (wchar_t);
data.outbufavail = 0;
status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
&data, *src, &inbytes,
&result, 0);
/* We have to determine whether the last character converted
is the NUL character. */
if (status == GCONV_OK && ((wchar_t *) dst)[result - 1] == L'\0')
{ {
/* One byte sequence. */ assert (result > 0);
count = 0; assert (mbsinit (data.statep));
value = byte; *src = NULL;
} --result;
else if ((byte & 0xe0) == 0xc0)
{
count = 1;
value = byte & 0x1f;
}
else if ((byte & 0xf0) == 0xe0)
{
/* We expect three bytes. */
count = 2;
value = byte & 0x0f;
}
else if ((byte & 0xf8) == 0xf0)
{
/* We expect four bytes. */
count = 3;
value = byte & 0x07;
}
else if ((byte & 0xfc) == 0xf8)
{
/* We expect five bytes. */
count = 4;
value = byte & 0x03;
}
else if ((byte & 0xfe) == 0xfc)
{
/* We expect six bytes. */
count = 5;
value = byte & 0x01;
} }
else else
{ *src += inbytes_in - inbytes;
/* This is an illegal encoding. */
__set_errno (EILSEQ);
return (size_t) -1;
}
/* Read the possible remaining bytes. */
while (count-- > 0)
{
byte = *run++;
if ((byte & 0xc0) != 0x80)
{
/* This is an illegal encoding. */
__set_errno (EILSEQ);
return (size_t) -1;
}
value <<= 6;
value |= byte & 0x3f;
}
/* Store value is required. */
if (dst != NULL)
*dst++ = value;
/* The whole sequence is read. Check whether end of string is
reached. */
if (value == L'\0')
{
/* Found the end of the string. */
*src = NULL;
return written;
}
/* Increment counter of produced words. */
++written;
} }
/* Store address of next byte to process. */ /* There must not be any problems with the conversion but illegal input
*src = run; characters. */
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|| status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);
return written; if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)
{
result = (size_t) -1;
__set_errno (EILSEQ);
}
return result;
} }
weak_alias (__mbsrtowcs, mbsrtowcs) weak_alias (__mbsrtowcs, mbsrtowcs)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -166,8 +166,15 @@ extern wchar_t *wcstok __P ((wchar_t *__restrict __s,
wchar_t **__restrict __ptr)); wchar_t **__restrict __ptr));
/* Return the number of wide characters in S. */ /* Return the number of wide characters in S. */
extern size_t __wcslen __P ((__const wchar_t *__s));
extern size_t wcslen __P ((__const wchar_t *__s)); extern size_t wcslen __P ((__const wchar_t *__s));
#ifdef __USE_GNU
/* Return the number of wide characters in S, but at most MAXLEN. */
extern size_t __wcsnlen __P ((__const wchar_t *__s, size_t __maxlen));
extern size_t wcsnlen __P ((__const wchar_t *__s, size_t __maxlen));
#endif
/* Search N wide characters of S for C. */ /* Search N wide characters of S for C. */
extern wchar_t *wmemchr __P ((__const wchar_t *__s, wchar_t __c, size_t __n)); extern wchar_t *wmemchr __P ((__const wchar_t *__s, wchar_t __c, size_t __n));
@ -260,16 +267,6 @@ extern size_t mbsnrtowcs __P ((wchar_t *__restrict __dst,
__const char **__restrict __src, size_t __nmc, __const char **__restrict __src, size_t __nmc,
size_t __len, mbstate_t *__restrict __ps)); size_t __len, mbstate_t *__restrict __ps));
/* Similar function to the above but this does not stop at NUL bytes. */
extern size_t __wmemrtowcs __P ((wchar_t *__restrict __dst,
__const char **__restrict __src,
size_t __nmc, size_t __len,
mbstate_t *__restrict __ps));
extern size_t wmemrtowcs __P ((wchar_t *__restrict __dst,
__const char **__restrict __src,
size_t __nmc, size_t __len,
mbstate_t *__restrict __ps));
/* Write multibyte character representation of at most NWC characters /* Write multibyte character representation of at most NWC characters
from the wide character string SRC to DST. */ from the wide character string SRC to DST. */
extern size_t __wcsnrtombs __P ((char *__restrict __dst, extern size_t __wcsnrtombs __P ((char *__restrict __dst,
@ -280,16 +277,6 @@ extern size_t wcsnrtombs __P ((char *__restrict __dst,
__const wchar_t **__restrict __src, __const wchar_t **__restrict __src,
size_t __nwc, size_t __len, size_t __nwc, size_t __len,
mbstate_t *__restrict __ps)); mbstate_t *__restrict __ps));
/* Similar function to the above but this does not stop at NUL bytes. */
extern size_t __wmemrtombs __P ((char *__restrict __dst,
__const wchar_t **__restrict __src,
size_t __nwc, size_t len,
mbstate_t *__restrict __ps));
extern size_t wmemrtombs __P ((char *__restrict __dst,
__const wchar_t **__restrict __src,
size_t __nwc, size_t len,
mbstate_t *__restrict __ps));
#endif /* use GNU */ #endif /* use GNU */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -18,77 +18,86 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <gconv.h>
#include <stdlib.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
#include <assert.h>
#ifndef EILSEQ #ifndef EILSEQ
#define EILSEQ EINVAL # define EILSEQ EINVAL
#endif #endif
static const wchar_t encoding_mask[] =
{
~0x7ff, ~0xffff, ~0x1fffff, ~0x3ffffff
};
static const unsigned char encoding_byte[] = /* This is the private state used if PS is NULL. */
{ static mbstate_t state;
0xc0, 0xe0, 0xf0, 0xf8, 0xfc
};
/* The state is for this UTF8 encoding not used. */
static mbstate_t internal;
size_t size_t
__wcrtomb (char *s, wchar_t wc, mbstate_t *ps) __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
{ {
size_t written = 0; char buf[MB_CUR_MAX];
struct gconv_step_data data;
int status;
size_t result;
if (ps == NULL) /* Tell where we want the result. */
ps = &internal; data.outbuf = s;
data.outbufavail = 0;
data.outbufsize = MB_CUR_MAX;
data.is_last = 1;
data.statep = ps ?: &state;
/* A first special case is if S is NULL. This means put PS in the
initial state. */
if (s == NULL) if (s == NULL)
{ {
/* This is equivalent to wcrtomb (<<internal>, L'\0', ps). We data.outbuf = buf;
only have to reset the state. */ wc = L'\0';
ps->count = 0;
return 1;
} }
/* Store the UTF8 representation of WC. */ /* Make sure we use the correct function. */
if (wc < 0 || wc > 0x7fffffff) update_conversion_ptrs ();
/* If WC is the NUL character we write into the output buffer the byte
sequence necessary for PS to get into the initial state, followed
by a NUL byte. */
if (wc == L'\0')
{ {
/* This is no correct ISO 10646 character. */ size_t inbytes = 0;
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data, NULL, &inbytes,
NULL, 1);
if (status == GCONV_OK)
data.outbuf[data.outbufavail++] = '\0';
}
else
{
/* Do a normal conversion. */
size_t inbytes = sizeof (wchar_t);
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data, (char *) &wc, &inbytes,
NULL, 0);
}
/* There must not be any problems with the conversion but illegal input
characters. The output buffer must be large enough, otherwise the
definition of MB_CUR_MAX is not correct. All the other possible
errors also must not happen. */
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|| status == GCONV_INCOMPLETE_INPUT);
if (status == GCONV_OK)
result = data.outbufavail;
else
{
result = (size_t) -1;
__set_errno (EILSEQ); __set_errno (EILSEQ);
return (size_t) -1;
} }
if (wc < 0x80) return result;
{
/* It's a one byte sequence. */
if (s != NULL)
*s = (char) wc;
ps->count = 0;
return 1;
}
for (written = 2; written < 6; ++written)
if ((wc & encoding_mask[written - 2]) == 0)
break;
if (s != NULL)
{
size_t cnt = written;
s[0] = encoding_byte[cnt - 2];
--cnt;
do
{
s[cnt] = 0x80 | (wc & 0x3f);
wc >>= 6;
}
while (--cnt > 0);
s[0] |= wc;
}
return written;
} }
weak_alias (__wcrtomb, wcrtomb) weak_alias (__wcrtomb, wcrtomb)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
@ -22,7 +22,7 @@
/* Copy SRC to DEST. */ /* Copy SRC to DEST. */
size_t size_t
wcslen (s) __wcslen (s)
const wchar_t *s; const wchar_t *s;
{ {
size_t len = 0; size_t len = 0;
@ -40,3 +40,4 @@ wcslen (s)
return len; return len;
} }
weak_alias (__wcslen, wcslen)

132
wcsmbs/wcsmbsload.c Normal file
View File

@ -0,0 +1,132 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
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. */
#include <langinfo.h>
#include <limits.h>
#include <wcsmbsload.h>
#include <bits/libc-lock.h>
#include <iconv/gconv_int.h>
/* Last loaded locale for LC_CTYPE. We initialize for the C locale
which is enabled at startup. */
extern const struct locale_data _nl_C_LC_CTYPE;
const struct locale_data *__wcsmbs_last_locale = &_nl_C_LC_CTYPE;
/* These are the descriptions for the default conversion functions. */
static struct gconv_step to_wc =
{
shlib_handle: NULL,
modname: NULL,
counter: INT_MAX,
from_name: "ANSI_X3.4-1968",
to_name: "ISO-10646/UCS4/",
fct: __gconv_transform_ascii_ucs4,
init_fct: NULL,
end_fct: NULL,
data: NULL
};
static struct gconv_step to_mb =
{
shlib_handle: NULL,
modname: NULL,
counter: INT_MAX,
from_name: "ISO-10646/UCS4/",
to_name: "ANSI_X3.4-1968",
fct: __gconv_transform_ucs4_ascii,
init_fct: NULL,
end_fct: NULL,
data: NULL
};
/* For the default locale we only have to handle ANSI_X3.4-1968. */
struct gconv_fcts __wcsmbs_gconv_fcts =
{
towc: &to_wc,
tomb: &to_mb
};
static inline struct gconv_step *
getfct (const char *to, const char *from)
{
size_t nsteps;
struct gconv_step *result;
if (__gconv_find_transform (to, from, &result, &nsteps) != GCONV_OK)
/* Loading the conversion step is not possible. */
return NULL;
/* We must only have one step in this conversion. */
if (nsteps != 1)
return NULL;
return result;
}
/* Load conversion functions for the currently selected locale. */
void
__wcsmbs_load_conv (const struct locale_data *new_category)
{
/* We must modify global data. */
__libc_lock_define_initialized (static, lock)
/* Acquire the lock. */
__libc_lock_lock (lock);
/* We should repest the test since while we waited some other thread
might have run this function. */
if (__wcsmbs_last_locale != new_category)
{
if (new_category->name == _nl_C_name) /* Yes, pointer comparison. */
{
failed:
__wcsmbs_gconv_fcts.towc = &to_wc;
__wcsmbs_gconv_fcts.tomb = &to_mb;
}
else
{
/* We must find the real functions. */
const char *charset_name;
/* Get name of charset of the locale. */
charset_name = new_category->values[_NL_ITEM_INDEX(CODESET)].string;
__wcsmbs_gconv_fcts.tomb = getfct (charset_name, "ISO-10646/UCS4/");
__wcsmbs_gconv_fcts.towc = getfct ("ISO-10646/UCS4/", charset_name);
/* If any of the conversion functions is not available we don't
use any since this would mean we cannot convert back and
forth.*/
if (__wcsmbs_gconv_fcts.towc == NULL
|| __wcsmbs_gconv_fcts.tomb == NULL)
goto failed;
}
/* Set last-used variable for current locale. */
__wcsmbs_last_locale = new_category;
}
__libc_lock_unlock (lock);
}

52
wcsmbs/wcsmbsload.h Normal file
View File

@ -0,0 +1,52 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
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. */
#include <locale.h>
#include <wchar.h>
#include <locale/localeinfo.h>
/* Contains pointers to the used functions in the `gconv' modules. */
struct gconv_fcts
{
struct gconv_step *towc;
struct gconv_step *tomb;
};
/* Set of currently active conversion functions. */
extern struct gconv_fcts __wcsmbs_gconv_fcts;
/* Last loaded locale for LC_CTYPE. */
extern const struct locale_data *__wcsmbs_last_locale;
/* Load conversion functions for the currently selected locale. */
extern void __wcsmbs_load_conv (const struct locale_data *new_category)
internal_function;
/* Check whether the LC_CTYPE locale changed since the last call.
Update the pointers appropriately. */
static inline void
update_conversion_ptrs (void)
{
if (__wcsmbs_last_locale != _nl_current_LC_CTYPE)
__wcsmbs_load_conv (_nl_current_LC_CTYPE);
}

44
wcsmbs/wcsnlen.c Normal file
View File

@ -0,0 +1,44 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
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. */
#include <wchar.h>
/* Copy SRC to DEST. */
size_t
__wcsnlen (s, maxlen)
const wchar_t *s;
size_t maxlen;
{
size_t len = 0;
while (s[len] != L'\0' && maxlen > 0)
{
if (s[++len] == L'\0' || --maxlen == 0)
return len;
if (s[++len] == L'\0' || --maxlen == 0)
return len;
if (s[++len] == L'\0' || --maxlen == 0)
return len;
++len;
}
return len;
}
weak_alias (__wcsnlen, wcsnlen)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -18,26 +18,19 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <gconv.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
#include <assert.h>
#ifndef EILSEQ #ifndef EILSEQ
#define EILSEQ EINVAL # define EILSEQ EINVAL
#endif #endif
static const wchar_t encoding_mask[] = /* This is the private state used if PS is NULL. */
{ static mbstate_t state;
~0x7ff, ~0xffff, ~0x1fffff, ~0x3ffffff
};
static const unsigned char encoding_byte[] =
{
0xc0, 0xe0, 0xf0, 0xf8, 0xfc
};
/* We don't need the state really because we don't have shift states
to maintain between calls to this function. */
static mbstate_t internal;
/* This is a non-standard function but it is very useful in the /* This is a non-standard function but it is very useful in the
implementation of stdio because we have to deal with unterminated implementation of stdio because we have to deal with unterminated
@ -50,85 +43,91 @@ __wcsnrtombs (dst, src, nwc, len, ps)
size_t len; size_t len;
mbstate_t *ps; mbstate_t *ps;
{ {
size_t written = 0; struct gconv_step_data data;
const wchar_t *run = *src; size_t inbytes_in;
int status;
size_t result;
if (ps == NULL) /* Tell where we want the result. */
ps = &internal; data.is_last = 1;
data.statep = ps ?: &state;
if (nwc == 0)
return 0;
inbytes_in = __wcsnlen (*src, nwc - 1) + 1;
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* We have to handle DST == NULL special. */
if (dst == NULL) if (dst == NULL)
/* The LEN parameter has to be ignored if we don't actually write
anything. */
len = ~0;
while (written < len && nwc-- > 0)
{ {
wchar_t wc; char buf[256]; /* Just an arbitrary value. */
size_t inbytes = inbytes_in;
const wchar_t *inbuf = *src;
size_t written;
/* Store position of first unprocessed word. */ data.outbuf = buf;
*src = run; data.outbufsize = sizeof (buf);
wc = *run++; do
if (wc < 0 || wc > 0x7fffffff)
{ {
/* This is no correct ISO 10646 character. */ inbuf += (inbytes_in - inbytes) / sizeof (wchar_t);
__set_errno (EILSEQ); inbytes_in = inbytes;
return (size_t) -1; data.outbufavail = 0;
written = 0;
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data,
(const char *) inbuf,
&inbytes, &written, 0);
result += written;
} }
while (status == GCONV_FULL_OUTPUT);
if (wc == L'\0') if (status == GCONV_OK && dst[data.outbufavail - 1] == '\0')
/* Don't count the NUL character in. */
--result;
}
else
{
/* This code is based on the safe assumption that all internal
multi-byte encodings use the NUL byte only to mark the end
of the string. */
size_t inbytes = inbytes_in;
data.outbuf = dst;
data.outbufavail = 0;
data.outbufsize = len;
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data, (const char *) *src,
&inbytes, &result, 0);
/* We have to determine whether the last character converted
is the NUL character. */
if (status == GCONV_OK && dst[data.outbufavail - 1] == '\0')
{ {
/* Found the end. */ assert (data.outbufavail > 0);
if (dst != NULL) assert (mbsinit (data.statep));
*dst = '\0';
*src = NULL; *src = NULL;
return written; --result;
}
else if (wc < 0x80)
{
/* It's an one byte sequence. */
if (dst != NULL)
*dst++ = (char) wc;
++written;
} }
else else
{ *src += result;
size_t step;
for (step = 2; step < 6; ++step)
if ((wc & encoding_mask[step - 2]) == 0)
break;
if (written + step >= len)
/* Too long. */
break;
if (dst != NULL)
{
size_t cnt = step;
dst[0] = encoding_byte[cnt - 2];
--cnt;
do
{
dst[cnt] = 0x80 | (wc & 0x3f);
wc >>= 6;
}
while (--cnt > 0);
dst[0] |= wc;
dst += step;
}
written += step;
}
} }
/* Store position of first unprocessed word. */ /* There must not be any problems with the conversion but illegal input
*src = run; characters. */
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|| status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);
return written; if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)
{
result = (size_t) -1;
__set_errno (EILSEQ);
}
return result;
} }
weak_alias (__wcsnrtombs, wcsnrtombs) weak_alias (__wcsnrtombs, wcsnrtombs)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -18,26 +18,20 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <errno.h> #include <errno.h>
#include <stdlib.h>
#include <gconv.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
#include <assert.h>
#ifndef EILSEQ #ifndef EILSEQ
#define EILSEQ EINVAL # define EILSEQ EINVAL
#endif #endif
static const wchar_t encoding_mask[] = /* This is the private state used if PS is NULL. */
{ static mbstate_t state;
~0x7ff, ~0xffff, ~0x1fffff, ~0x3ffffff
};
static const unsigned char encoding_byte[] =
{
0xc0, 0xe0, 0xf0, 0xf8, 0xfc
};
/* We don't need the state really because we don't have shift states
to maintain between calls to this function. */
static mbstate_t internal;
size_t size_t
__wcsrtombs (dst, src, len, ps) __wcsrtombs (dst, src, len, ps)
@ -46,89 +40,88 @@ __wcsrtombs (dst, src, len, ps)
size_t len; size_t len;
mbstate_t *ps; mbstate_t *ps;
{ {
size_t written = 0; struct gconv_step_data data;
const wchar_t *run = *src; int status;
size_t result;
if (ps == NULL) /* Tell where we want the result. */
ps = &internal; data.is_last = 1;
data.statep = ps ?: &state;
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* We have to handle DST == NULL special. */
if (dst == NULL) if (dst == NULL)
/* The LEN parameter has to be ignored if we don't actually write
anything. */
len = ~0;
while (written < len)
{ {
wchar_t wc; char buf[256]; /* Just an arbitrary value. */
size_t inbytes_in = __wcslen (*src) + 1;
size_t inbytes = inbytes_in;
const wchar_t *inbuf = *src;
size_t written;
/* Store position of first unprocessed word. */ data.outbuf = buf;
*src = run; data.outbufsize = sizeof (buf);
wc = *run++; do
if (wc < 0 || wc > 0x7fffffff)
{ {
/* This is no correct ISO 10646 character. */ inbuf += (inbytes_in - inbytes) / sizeof (wchar_t);
__set_errno (EILSEQ); inbytes_in = inbytes;
return (size_t) -1; data.outbufavail = 0;
written = 0;
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data,
(const char *) inbuf,
&inbytes, &written, 0);
result += written;
} }
while (status == GCONV_FULL_OUTPUT);
if (wc == L'\0') if (status == GCONV_OK && dst[data.outbufavail - 1] == '\0')
/* Don't count the NUL character in. */
--result;
}
else
{
/* This code is based on the safe assumption that all internal
multi-byte encodings use the NUL byte only to mark the end
of the string. */
size_t inbytes_in = __wcsnlen (*src, len * MB_CUR_MAX) + 1;
size_t inbytes = inbytes_in;
data.outbuf = dst;
data.outbufavail = 0;
data.outbufsize = len;
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb,
&data, (const char *) *src,
&inbytes, &result, 0);
/* We have to determine whether the last character converted
is the NUL character. */
if (status == GCONV_OK && dst[data.outbufavail - 1] == '\0')
{ {
/* Found the end. */ assert (data.outbufavail > 0);
if (dst != NULL) assert (mbsinit (data.statep));
*dst = '\0';
ps->count = 0;
*src = NULL; *src = NULL;
return written; --result;
}
else if (wc < 0x80)
{
/* It's an one byte sequence. */
if (dst != NULL)
*dst++ = (char) wc;
++written;
} }
else else
{ *src += result;
size_t step;
for (step = 2; step < 6; ++step)
if ((wc & encoding_mask[step - 2]) == 0)
break;
if (written + step >= len)
/* Too long. */
break;
if (dst != NULL)
{
size_t cnt = step;
dst[0] = encoding_byte[cnt - 2];
--cnt;
do
{
dst[cnt] = 0x80 | (wc & 0x3f);
wc >>= 6;
}
while (--cnt > 0);
dst[0] |= wc;
dst += step;
}
written += step;
}
} }
/* Store position of first unprocessed word. */ /* There must not be any problems with the conversion but illegal input
*src = run; characters. */
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|| status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);
/* Signal that we finished correctly. */ if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)
ps->count = 0; {
result = (size_t) -1;
__set_errno (EILSEQ);
}
return written; return result;
} }
weak_alias (__wcsrtombs, wcsrtombs) weak_alias (__wcsrtombs, wcsrtombs)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
@ -17,15 +17,48 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <gconv.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <wchar.h> #include <wchar.h>
#include <wcsmbsload.h>
/* We use UTF8 encoding for multibyte strings and therefore a valid
one byte multibyte string only can have a value from 0 to 0x7f. */
int int
wctob (c) wctob (c)
wint_t c; wint_t c;
{ {
return (c >= 0 && c <= 0x7f) ? c : EOF; char buf[MB_LEN_MAX];
struct gconv_step_data data;
wchar_t inbuf[1];
size_t inbytes;
size_t converted;
int status;
/* Tell where we want the result. */
data.outbuf = (char *) buf;
data.outbufavail = 0;
data.outbufsize = MB_LEN_MAX;
data.is_last = 1;
data.statep = &data.__state;
/* Make sure we start in the initial state. */
memset (&data.__state, '\0', sizeof (mbstate_t));
/* Make sure we use the correct function. */
update_conversion_ptrs ();
/* Create the input string. */
inbuf[0] = c;
inbytes = sizeof (wchar_t);
status = (*__wcsmbs_gconv_fcts.tomb->fct) (__wcsmbs_gconv_fcts.tomb, &data,
(const char *) inbuf, &inbytes,
&converted, 0);
/* The conversion failed or the output is too long. */
if (status != GCONV_OK && status != GCONV_FULL_OUTPUT
|| data.outbufavail != 1)
return WEOF;
return buf[0];
} }