mirror of
https://sourceware.org/git/glibc.git
synced 2024-09-19 16:10:01 +00:00
Update.
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:
parent
91641c6522
commit
4bca4c1748
156
ChangeLog
156
ChangeLog
@ -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>
|
||||
|
||||
* elf/dl-runtime.c (fixup, profile_fixup): The final arg to
|
||||
|
@ -582,6 +582,13 @@ touch $@
|
||||
endef
|
||||
O%-lib = $(..)$(patsubst %,$(libtype$*),c)
|
||||
|
||||
ifndef static-only-routines
|
||||
subdir_lib: $(objpfx)stamp.oS
|
||||
$(objpfx)stamp.oS:
|
||||
$(make-target-directory)
|
||||
rm -f $@; > $@
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
# Rules to update the $(ar-symtab-name) member with ranlib,
|
||||
|
61
aclocal.m4
vendored
61
aclocal.m4
vendored
@ -34,54 +34,31 @@ dnl
|
||||
|
||||
dnl Locate a program and check that its version is acceptable.
|
||||
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,
|
||||
[# Prepare to iterate over the program-name list.
|
||||
set dummy $2; shift
|
||||
AC_MSG_CHECKING([for [$]1])
|
||||
AC_CACHE_VAL(ac_cv_prog_$1, [dnl
|
||||
if test -n "[$]$1"; then
|
||||
ac_cv_prog_$1="[$]$1" # Let the user override the test.
|
||||
[AC_CHECK_PROGS([$1], [$2])
|
||||
if test -z "[$]$1"; then
|
||||
ac_verc_fail=yes
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_word; do
|
||||
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
|
||||
# Found it, now check the version.
|
||||
AC_MSG_CHECKING([version of [$]$1])
|
||||
changequote(<<,>>)dnl
|
||||
ac_cv_prog_$1_ver=`$ac_word $3 2>&1 ifelse(<<$4>>,,,<<| sed -n 's/^.*$4.*$/\1/p'>>)`
|
||||
fi
|
||||
if test -n "$ac_cv_prog_$1_ver"; then
|
||||
case $ac_cv_prog_$1_ver in
|
||||
<<$5>>) ac_vers_ok=", ok"; $1=$ac_cv_prog_$1;;
|
||||
ac_prog_version=`<<$>>$1 $3 2>&1 ifelse(<<$4>>,,,
|
||||
<<| sed -n 's/^.*patsubst(<<$4>>,/,\/).*$/\1/p'>>)`
|
||||
case $ac_prog_version in
|
||||
'') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
|
||||
<<$5>>)
|
||||
changequote([,])dnl
|
||||
*) ac_vers_ok=", bad"; $1=:
|
||||
ac_verc_fail=t; ifelse([$6],,,[ac_verc_fatal=$6]);;
|
||||
ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
|
||||
*) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
|
||||
|
||||
esac
|
||||
else
|
||||
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)
|
||||
AC_MSG_RESULT([$ac_prog_version])
|
||||
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.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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))
|
||||
|
||||
/* 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 */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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,
|
||||
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."
|
||||
#endif
|
||||
|
||||
|
@ -64,6 +64,7 @@ AR = @AR@
|
||||
RANLIB = @RANLIB@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
AS = $(CC) -c
|
||||
MIG = @MIG@
|
||||
|
||||
# Installation tools.
|
||||
INSTALL = @INSTALL@
|
||||
|
498
configure
vendored
498
configure
vendored
@ -1187,208 +1187,258 @@ fi
|
||||
|
||||
|
||||
# These programs are version sensitive.
|
||||
# Prepare to iterate over the program-name list.
|
||||
set dummy gcc cc; shift
|
||||
echo $ac_n "checking for $1""... $ac_c" 1>&6
|
||||
echo "configure:1194: checking for $1" >&5
|
||||
echo $ac_n "checking build system type""... $ac_c" 1>&6
|
||||
echo "configure:1192: checking build system type" >&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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test -n "$CC"; then
|
||||
ac_cv_prog_CC="$CC" # Let the user override the test.
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_word; do
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f $ac_dir/$ac_word; then
|
||||
ac_cv_prog_CC="$ac_word"
|
||||
break
|
||||
fi
|
||||
done
|
||||
test -n "$ac_cv_prog_CC" && break
|
||||
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_CC="$ac_prog"
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
fi
|
||||
fi
|
||||
if test -z "$ac_cv_prog_CC"; then
|
||||
echo "$ac_t""no" 1>&6
|
||||
CC=:
|
||||
ac_verc_fail=t; ac_verc_fatal=t
|
||||
CC="$ac_cv_prog_CC"
|
||||
if test -n "$CC"; then
|
||||
echo "$ac_t""$CC" 1>&6
|
||||
else
|
||||
# Found it, now check the version.
|
||||
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
|
||||
echo "$ac_t""no" 1>&6
|
||||
fi
|
||||
|
||||
# Prepare to iterate over the program-name list.
|
||||
set dummy make gmake; shift
|
||||
echo $ac_n "checking for $1""... $ac_c" 1>&6
|
||||
echo "configure:1241: checking for $1" >&5
|
||||
test -n "$CC" && break
|
||||
done
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test -n "$MAKE"; then
|
||||
ac_cv_prog_MAKE="$MAKE" # Let the user override the test.
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_word; do
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f $ac_dir/$ac_word; then
|
||||
ac_cv_prog_MAKE="$ac_word"
|
||||
break
|
||||
fi
|
||||
done
|
||||
test -n "$ac_cv_prog_MAKE" && break
|
||||
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_MAKE="$ac_prog"
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
fi
|
||||
fi
|
||||
if test -z "$ac_cv_prog_MAKE"; then
|
||||
echo "$ac_t""no" 1>&6
|
||||
MAKE=:
|
||||
ac_verc_fail=t; ac_verc_fatal=t
|
||||
MAKE="$ac_cv_prog_MAKE"
|
||||
if test -n "$MAKE"; then
|
||||
echo "$ac_t""$MAKE" 1>&6
|
||||
else
|
||||
# Found it, now check the version.
|
||||
ac_word=$ac_cv_prog_MAKE
|
||||
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'`
|
||||
fi
|
||||
if test -n "$ac_cv_prog_MAKE_ver"; then
|
||||
case $ac_cv_prog_MAKE_ver in
|
||||
3.75 | 3.76.[2-9] | 3.7[789]* | 3.[89]*) ac_vers_ok=", ok"; MAKE=$ac_cv_prog_MAKE;;
|
||||
*) ac_vers_ok=", bad"; MAKE=:
|
||||
ac_verc_fail=t; ac_verc_fatal=t;;
|
||||
echo "$ac_t""no" 1>&6
|
||||
fi
|
||||
|
||||
test -n "$MAKE" && break
|
||||
done
|
||||
|
||||
if test -z "$MAKE"; then
|
||||
ac_verc_fail=yes
|
||||
else
|
||||
# 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
|
||||
else
|
||||
ac_vers_ok="v. ?.??, bad"; MAKE=:
|
||||
ac_verc_fail=t; ac_verc_fatal=t
|
||||
fi
|
||||
echo "$ac_t""$ac_word $ac_cv_prog_MAKE_ver$ac_vers_ok" 1>&6
|
||||
echo "$ac_t""$ac_prog_version" 1>&6
|
||||
fi
|
||||
if test $ac_verc_fail = yes; then
|
||||
critic_missing=t
|
||||
fi
|
||||
|
||||
|
||||
# Prepare to iterate over the program-name list.
|
||||
set dummy msgfmt gmsgfmt; shift
|
||||
echo $ac_n "checking for $1""... $ac_c" 1>&6
|
||||
echo "configure:1289: checking for $1" >&5
|
||||
for ac_prog in msgfmt gmsgfmt
|
||||
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:1327: checking for $ac_word" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test -n "$MSGFMT"; then
|
||||
ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test.
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_word; do
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f $ac_dir/$ac_word; then
|
||||
ac_cv_prog_MSGFMT="$ac_word"
|
||||
break
|
||||
fi
|
||||
done
|
||||
test -n "$ac_cv_prog_MSGFMT" && break
|
||||
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_MSGFMT="$ac_prog"
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
fi
|
||||
fi
|
||||
if test -z "$ac_cv_prog_MSGFMT"; then
|
||||
echo "$ac_t""no" 1>&6
|
||||
MSGFMT=:
|
||||
ac_verc_fail=t;
|
||||
MSGFMT="$ac_cv_prog_MSGFMT"
|
||||
if test -n "$MSGFMT"; then
|
||||
echo "$ac_t""$MSGFMT" 1>&6
|
||||
else
|
||||
# Found it, now check the version.
|
||||
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
|
||||
echo "$ac_t""no" 1>&6
|
||||
fi
|
||||
|
||||
# Prepare to iterate over the program-name list.
|
||||
set dummy makeinfo; shift
|
||||
echo $ac_n "checking for $1""... $ac_c" 1>&6
|
||||
echo "configure:1336: checking for $1" >&5
|
||||
test -n "$MSGFMT" && break
|
||||
done
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
if test -n "$MAKEINFO"; then
|
||||
ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
|
||||
else
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||
for ac_word; do
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f $ac_dir/$ac_word; then
|
||||
ac_cv_prog_MAKEINFO="$ac_word"
|
||||
break
|
||||
fi
|
||||
done
|
||||
test -n "$ac_cv_prog_MAKEINFO" && break
|
||||
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_MAKEINFO="$ac_prog"
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
fi
|
||||
fi
|
||||
if test -z "$ac_cv_prog_MAKEINFO"; then
|
||||
echo "$ac_t""no" 1>&6
|
||||
MAKEINFO=:
|
||||
ac_verc_fail=t;
|
||||
MAKEINFO="$ac_cv_prog_MAKEINFO"
|
||||
if test -n "$MAKEINFO"; then
|
||||
echo "$ac_t""$MAKEINFO" 1>&6
|
||||
else
|
||||
# Found it, now check the version.
|
||||
ac_word=$ac_cv_prog_MAKEINFO
|
||||
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'`
|
||||
fi
|
||||
if test -n "$ac_cv_prog_MAKEINFO_ver"; then
|
||||
case $ac_cv_prog_MAKEINFO_ver in
|
||||
3.1[1-9] | 3.[2-9][0-9]) ac_vers_ok=", ok"; MAKEINFO=$ac_cv_prog_MAKEINFO;;
|
||||
*) ac_vers_ok=", bad"; MAKEINFO=:
|
||||
ac_verc_fail=t; ;;
|
||||
echo "$ac_t""no" 1>&6
|
||||
fi
|
||||
|
||||
test -n "$MAKEINFO" && break
|
||||
done
|
||||
|
||||
if test -z "$MAKEINFO"; then
|
||||
ac_verc_fail=yes
|
||||
else
|
||||
# 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
|
||||
else
|
||||
ac_vers_ok="v. ?.??, bad"; MAKEINFO=:
|
||||
ac_verc_fail=t;
|
||||
fi
|
||||
echo "$ac_t""$ac_word $ac_cv_prog_MAKEINFO_ver$ac_vers_ok" 1>&6
|
||||
echo "$ac_t""$ac_prog_version" 1>&6
|
||||
fi
|
||||
if test $ac_verc_fail = yes; then
|
||||
MAKEINFO=: aux_missing=t
|
||||
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.
|
||||
*** 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;
|
||||
*** some features will be disabled.
|
||||
*** 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 "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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
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
|
||||
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1405 "configure"
|
||||
#line 1455 "configure"
|
||||
#include "confdefs.h"
|
||||
main(){return(0);}
|
||||
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
|
||||
# If we can't run a trivial program, we are probably using a cross compiler.
|
||||
if (./conftest; exit) 2>/dev/null; then
|
||||
@ -1430,7 +1480,7 @@ else
|
||||
cross_linkable=yes
|
||||
fi
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1442,7 +1492,7 @@ echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
|
||||
cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1451,7 +1501,7 @@ else
|
||||
yes;
|
||||
#endif
|
||||
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
|
||||
else
|
||||
ac_cv_prog_gcc=no
|
||||
@ -1464,7 +1514,7 @@ if test $ac_cv_prog_gcc != yes; then
|
||||
fi
|
||||
|
||||
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
|
||||
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.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1518,7 +1568,7 @@ done
|
||||
fi
|
||||
|
||||
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.
|
||||
if test -n "$CPP" && test -d "$CPP"; then
|
||||
CPP=
|
||||
@ -1533,13 +1583,13 @@ else
|
||||
# On the NeXT, cc -E runs the code through the compiler's parser,
|
||||
# not just through cpp.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1537 "configure"
|
||||
#line 1587 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
EOF
|
||||
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`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
@ -1550,13 +1600,13 @@ else
|
||||
rm -rf conftest*
|
||||
CPP="${CC-cc} -E -traditional-cpp"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1554 "configure"
|
||||
#line 1604 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
EOF
|
||||
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`
|
||||
if test -z "$ac_err"; then
|
||||
:
|
||||
@ -1589,7 +1639,7 @@ LD=`$CC -print-file-name=ld`
|
||||
|
||||
# Determine whether we are using GNU binutils.
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1607,7 +1657,7 @@ rm -f a.out
|
||||
gnu_as=$libc_cv_prog_as_gnu
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1623,16 +1673,10 @@ fi
|
||||
echo "$ac_t""$libc_cv_prog_ld_gnu" 1>&6
|
||||
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.
|
||||
set dummy ${ac_tool_prefix}ar; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1663,7 +1707,7 @@ fi
|
||||
# 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
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
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.
|
||||
set dummy ranlib; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1725,10 +1769,41 @@ else
|
||||
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
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1736,7 +1811,7 @@ else
|
||||
tmplib=lib$$.a
|
||||
rm -f $tmpo $tmplib
|
||||
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
|
||||
else
|
||||
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
|
||||
# - the path contains an element with a dot in it
|
||||
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
|
||||
[:\;]* | *[:\;] | *[:\;][:\;]* | *[:\;]. | .[:\;]*| . | *[:\;].[:\;]* )
|
||||
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.
|
||||
set dummy bash; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
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.
|
||||
set dummy ksh; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1862,7 +1937,7 @@ 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: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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1897,7 +1972,7 @@ test -n "$PERL" || PERL="no"
|
||||
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1921,12 +1996,12 @@ EOF
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1930 "configure"
|
||||
#line 2005 "configure"
|
||||
#include "confdefs.h"
|
||||
#define __need_size_t
|
||||
#define __need_wchar_t
|
||||
@ -1941,7 +2016,7 @@ size_t size; wchar_t wchar;
|
||||
if (&size == NULL || &wchar == NULL) abort ();
|
||||
; return 0; }
|
||||
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*
|
||||
libc_cv_friendly_stddef=yes
|
||||
else
|
||||
@ -1960,7 +2035,7 @@ override stddef.h = # The installed <stddef.h> seems to be libc-friendly."
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -1983,7 +2058,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives."
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2013,7 +2088,7 @@ EOF
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2047,7 +2122,7 @@ EOF
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2066,7 +2141,7 @@ fi
|
||||
|
||||
echo "$ac_t""$libc_cv_asm_symver_directive" 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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2089,7 +2164,7 @@ EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o
|
||||
-nostartfiles -nostdlib
|
||||
-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
|
||||
libc_cv_ld_version_script_option=yes
|
||||
else
|
||||
@ -2127,7 +2202,7 @@ if test $VERSIONING = no; then
|
||||
fi
|
||||
if test $elf = yes; then
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2135,7 +2210,7 @@ else
|
||||
.section foo_section
|
||||
.previous
|
||||
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
|
||||
else
|
||||
libc_cv_asm_previous_directive=no
|
||||
@ -2151,7 +2226,7 @@ EOF
|
||||
|
||||
else
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2159,7 +2234,7 @@ else
|
||||
.pushsection foo_section
|
||||
.popsection
|
||||
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
|
||||
else
|
||||
libc_cv_asm_popsection_directive=no
|
||||
@ -2179,12 +2254,12 @@ fi
|
||||
|
||||
if test $elf != yes; then
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2188 "configure"
|
||||
#line 2263 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() {
|
||||
@ -2193,7 +2268,7 @@ asm (".section .init");
|
||||
asm (".text");
|
||||
; return 0; }
|
||||
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*
|
||||
libc_cv_have_initfini=yes
|
||||
else
|
||||
@ -2221,19 +2296,19 @@ if test $elf = yes; then
|
||||
else
|
||||
if test $ac_cv_prog_cc_works = yes; then
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2230 "configure"
|
||||
#line 2305 "configure"
|
||||
#include "confdefs.h"
|
||||
asm ("_glibc_foobar:");
|
||||
int main() {
|
||||
glibc_foobar ();
|
||||
; return 0; }
|
||||
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*
|
||||
libc_cv_asm_underscores=yes
|
||||
else
|
||||
@ -2248,17 +2323,17 @@ fi
|
||||
echo "$ac_t""$libc_cv_asm_underscores" 1>&6
|
||||
else
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2257 "configure"
|
||||
#line 2332 "configure"
|
||||
#include "confdefs.h"
|
||||
void underscore_test(void) {
|
||||
return; }
|
||||
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
|
||||
rm -f conftest*
|
||||
libc_cv_asm_underscores=yes
|
||||
@ -2290,7 +2365,7 @@ if test $elf = yes; then
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2313,7 +2388,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
|
||||
|
||||
if test $libc_cv_asm_weak_directive = no; then
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2351,7 +2426,7 @@ EOF
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2362,7 +2437,7 @@ __throw () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-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
|
||||
else
|
||||
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_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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2384,7 +2459,7 @@ __throw () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS
|
||||
-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
|
||||
else
|
||||
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
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.c <<\EOF
|
||||
foo () { }
|
||||
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
|
||||
libc_cv_gcc_alpha_ng_prefix=yes
|
||||
else
|
||||
@ -2427,12 +2502,12 @@ fi
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.c <<EOF
|
||||
#line 2436 "configure"
|
||||
#line 2511 "configure"
|
||||
static char __EH_FRAME_BEGIN__;
|
||||
_start ()
|
||||
{
|
||||
@ -2459,7 +2534,7 @@ __bzero () {}
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS -DCHECK__register_frame_info
|
||||
-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
|
||||
else
|
||||
libc_cv_gcc_dwarf2_unwind_info=no
|
||||
@ -2467,7 +2542,7 @@ fi
|
||||
if test $libc_cv_gcc_dwarf2_unwind_info = no; then
|
||||
if { ac_try='${CC-cc} $CFLAGS -DCHECK__register_frame
|
||||
-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
|
||||
else
|
||||
libc_cv_gcc_dwarf2_unwind_info=no
|
||||
@ -2541,7 +2616,7 @@ if test "$uname" = "sysdeps/generic"; then
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2563,7 +2638,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
|
||||
uname_release="$libc_cv_uname_release"
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2585,7 +2660,7 @@ else
|
||||
fi
|
||||
|
||||
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
|
||||
libio) cat >> confdefs.h <<\EOF
|
||||
@ -2597,7 +2672,7 @@ esac
|
||||
echo "$ac_t""$stdio" 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
|
||||
*ldap*)
|
||||
@ -2660,7 +2735,7 @@ if test $static = no && test $shared = yes; then
|
||||
fi
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
@ -2839,21 +2914,22 @@ s%@sysnames@%$sysnames%g
|
||||
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
|
||||
s%@INSTALL_DATA@%$INSTALL_DATA%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_alias@%$build_alias%g
|
||||
s%@build_cpu@%$build_cpu%g
|
||||
s%@build_vendor@%$build_vendor%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%@cross_compiling@%$cross_compiling%g
|
||||
s%@CPP@%$CPP%g
|
||||
s%@AR@%$AR%g
|
||||
s%@RANLIB@%$RANLIB%g
|
||||
s%@MIG@%$MIG%g
|
||||
s%@libc_cv_ar_S@%$libc_cv_ar_S%g
|
||||
s%@BASH@%$BASH%g
|
||||
s%@libc_cv_have_bash2@%$libc_cv_have_bash2%g
|
||||
|
21
configure.in
21
configure.in
@ -431,25 +431,29 @@ fi
|
||||
AC_PROG_LN_S
|
||||
|
||||
# These programs are version sensitive.
|
||||
AC_CHECK_PROG_VER(CC, gcc cc, -v,
|
||||
[version \([egcs0-9.-]*\)],
|
||||
[egcs-2.91.*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|2.8.[1-9]*|2.9.[0-9]*], t)
|
||||
AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl
|
||||
AC_CHECK_PROG_VER(CC, ${ac_tool_prefix}gcc ${ac_tool_prefix}cc, -v,
|
||||
[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,
|
||||
[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,
|
||||
[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,
|
||||
[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.
|
||||
*** 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;
|
||||
*** some features will be disabled.
|
||||
*** Check the INSTALL file for required versions.])
|
||||
@ -464,6 +468,7 @@ AC_PROG_CPP
|
||||
LIBC_PROG_BINUTILS
|
||||
AC_CHECK_TOOL(AR, ar)
|
||||
AC_CHECK_TOOL(RANLIB, ranlib, :)
|
||||
AC_CHECK_TOOL(MIG, mig)
|
||||
|
||||
# check if ar takes S
|
||||
AC_CACHE_CHECK(for ar S, libc_cv_ar_S, [dnl
|
||||
|
@ -280,7 +280,7 @@ decompose_rpath (const char *rpath, size_t additional_room,
|
||||
const char *what, const char *where)
|
||||
{
|
||||
/* Make a copy we can work with. */
|
||||
char *copy = strdupa (rpath);
|
||||
char *copy = local_strdup (rpath);
|
||||
char *cp;
|
||||
struct r_search_path_elem **result;
|
||||
/* First count the number of necessary elements in the result array. */
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* Convert characters in input buffer using conversion descriptor to
|
||||
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.
|
||||
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)
|
||||
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].outbufsize = *outbytesleft;
|
||||
|
||||
if (converted != NULL)
|
||||
*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);
|
||||
|
||||
*inbuf += oldinbytes - *inbytesleft;
|
||||
*outbuf += cd->data[last_step].outbufavail;
|
||||
*outbytesleft -= cd->data[last_step].outbufavail;
|
||||
if (inbuf != NULL && *inbuf != NULL)
|
||||
*inbuf += oldinbytes - *inbytesleft;
|
||||
if (outbuf != NULL && *outbuf != NULL)
|
||||
{
|
||||
*outbuf += cd->data[last_step].outbufavail;
|
||||
*outbytesleft -= cd->data[last_step].outbufavail;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -398,6 +398,10 @@ __gconv_read_conf (void)
|
||||
elem = strtok_r (gconv_path, ":", &gconv_path);
|
||||
while (elem != NULL)
|
||||
{
|
||||
#ifndef MAXPATHLEN
|
||||
/* We define a reasonable limit. */
|
||||
# define 4096
|
||||
#endif
|
||||
char real_elem[MAXPATHLEN];
|
||||
|
||||
if (realpath (elem, real_elem) != NULL)
|
||||
|
@ -108,9 +108,9 @@ get_sym (void *a)
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
void *
|
||||
internal_function
|
||||
find_func (void *handle, const char *name)
|
||||
__gconv_find_func (void *handle, const char *name)
|
||||
{
|
||||
struct get_sym_args args;
|
||||
|
||||
@ -170,7 +170,7 @@ __gconv_find_shlib (const char *name)
|
||||
{
|
||||
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)
|
||||
{
|
||||
/* Argh, no conversion function. There is something
|
||||
@ -180,8 +180,10 @@ __gconv_find_shlib (const char *name)
|
||||
}
|
||||
else
|
||||
{
|
||||
found->init_fct = find_func (found->handle, "gconv_init");
|
||||
found->end_fct = find_func (found->handle, "gconv_end");
|
||||
found->init_fct = __gconv_find_func (found->handle,
|
||||
"gconv_init");
|
||||
found->end_fct = __gconv_find_func (found->handle,
|
||||
"gconv_end");
|
||||
|
||||
/* We have succeeded in loading the shared object. */
|
||||
found->counter = 1;
|
||||
|
@ -129,6 +129,10 @@ extern int __gconv_close_transform (struct gconv_step *__steps,
|
||||
extern struct gconv_loaded_object *__gconv_find_shlib (const char *__name)
|
||||
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
|
||||
the object. */
|
||||
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)
|
||||
|
||||
__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_utf8_ucs4);
|
||||
__BUILTIN_TRANS (__gconv_transform_ucs2_ucs4);
|
||||
|
@ -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
|
||||
__gconv_transform_ucs4_utf8 (struct gconv_step *step,
|
||||
struct gconv_step_data *data, const char *inbuf,
|
||||
|
@ -22,8 +22,8 @@
|
||||
#include <features.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <bits/socket.h>
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
@ -781,7 +781,8 @@ _IO_file_xsgetn (fp, data, n)
|
||||
void *data;
|
||||
_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;
|
||||
|
||||
want = n;
|
||||
@ -815,7 +816,7 @@ _IO_file_xsgetn (fp, data, n)
|
||||
/* If we now want less than a buffer, underflow and repeat
|
||||
the copy. Otherwise, _IO_SYSREAD directly to
|
||||
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)
|
||||
break;
|
||||
@ -823,6 +824,11 @@ _IO_file_xsgetn (fp, data, n)
|
||||
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);
|
||||
if (count <= 0)
|
||||
{
|
||||
@ -836,6 +842,8 @@ _IO_file_xsgetn (fp, data, n)
|
||||
|
||||
s += count;
|
||||
want -= count;
|
||||
if (fp->_offset != _IO_pos_BAD)
|
||||
_IO_pos_adjust (fp->_offset, count);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@
|
||||
#
|
||||
subdir := linuxthreads
|
||||
|
||||
linuxthreads-version=0.7
|
||||
libpthread-version=0.7
|
||||
|
||||
headers := pthread.h semaphore.h bits/semaphore.h
|
||||
distribute := internals.h queue.h restart.h spinlock.h
|
||||
|
@ -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.
|
||||
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: _nl_C_LC_CTYPE_width },
|
||||
{ word: 2 },
|
||||
{ string: "ISO_646.IRV" }
|
||||
{ string: "ANSI_X3.4-1968" }
|
||||
}
|
||||
};
|
||||
|
@ -48,7 +48,7 @@ openpty (pmast, pslave, pname, tio, wins)
|
||||
if (unlockpt (pfd))
|
||||
goto bail;
|
||||
|
||||
if (!ptsname_r (pfd, name, PTYNAMELEN))
|
||||
if (ptsname_r (pfd, name, PTYNAMELEN) != 0)
|
||||
goto bail;
|
||||
|
||||
tfd = open (name, O_RDWR);
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 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.
|
||||
|
||||
# The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -44,9 +44,6 @@ endif
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
ifndef MIG
|
||||
MIG = mig
|
||||
endif
|
||||
MIGFLAGS = -DMACH_IPC_COMPAT=0 -DSTANDALONE -DTypeCheck=0 \
|
||||
$(+includes) $(migdefines) -subrprefix __
|
||||
|
||||
|
@ -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
|
||||
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.
|
||||
|
||||
@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
|
||||
|
||||
@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
|
||||
@var{template} does not end with @samp{XXXXXX}, @code{mktemp} 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{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
|
||||
|
||||
@comment unistd.h
|
||||
|
@ -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
|
||||
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
|
||||
@appendixsec Recommended Tools to Install the GNU C Library
|
||||
@cindex installation tools
|
||||
|
@ -19,7 +19,7 @@
|
||||
@c sold 0.06/1.09, print run out 21may96
|
||||
@set EDITION 0.07 DRAFT
|
||||
@set VERSION 2.00 Beta
|
||||
@set UPDATED 04 Aug 1997
|
||||
@set UPDATED 03 Apr 1998
|
||||
@set ISBN 1-882114-53-1
|
||||
|
||||
@ifinfo
|
||||
@ -28,7 +28,7 @@ This file documents the GNU C library.
|
||||
This is Edition @value{EDITION}, last updated @value{UPDATED},
|
||||
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
|
||||
this manual provided the copyright notice and this permission notice
|
||||
@ -74,7 +74,7 @@ Foundation.
|
||||
@center for version @value{VERSION}
|
||||
@page
|
||||
@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
|
||||
Published by the Free Software Foundation @*
|
||||
59 Temple Place -- Suite 330, @*
|
||||
@ -507,7 +507,7 @@ Sockets
|
||||
* Socket Concepts:: Basic concepts you need to know about.
|
||||
* Communication Styles:: Stream communication, datagrams, and others.
|
||||
* 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.
|
||||
* Open/Close Sockets:: Creating sockets and destroying them.
|
||||
* Connections:: Operations on sockets with connection state.
|
||||
@ -570,7 +570,7 @@ Datagrams
|
||||
* Sending Datagrams:: Sending packets on a datagram socket.
|
||||
* Receiving Datagrams:: Receiving packets on a datagram socket.
|
||||
* 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.
|
||||
|
||||
Socket Options
|
||||
|
@ -21,13 +21,16 @@ system, and the socket functions always exist, but if the system does
|
||||
not really support sockets, these functions always fail.
|
||||
|
||||
@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
|
||||
* Socket Concepts:: Basic concepts you need to know about.
|
||||
* Communication Styles::Stream communication, datagrams, and other styles.
|
||||
* 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.
|
||||
* Misc Namespaces:: Other namespaces not documented fully here.
|
||||
* 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
|
||||
possible.
|
||||
|
||||
A solution provides the Unix98 specification which finally introduces a
|
||||
type @code{socklen_t}. This type is used in all of the cases that were
|
||||
previously changed to use @code{size_t}. The only requirement of this
|
||||
type is that it is an unsigned type of at least 32 bits. Therefore,
|
||||
implementations which require references to 32 bit variables be passed
|
||||
can be as happy as implementations which use right from the start 64 bit
|
||||
values.
|
||||
A solution is provided by the Unix98 specification which finally
|
||||
introduces a type @code{socklen_t}. This type is used in all of the
|
||||
cases that were previously changed to use @code{size_t}. The only
|
||||
requirement of this type is that it is an unsigned type of at least 32
|
||||
bits. Therefore, implementations which require references to 32 bit
|
||||
variables be passed can be as happy as implementations which use right
|
||||
from the start 64 bit values.
|
||||
|
||||
|
||||
@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
|
||||
discriminates based on addresses; for example, the rsh and rlogin
|
||||
protocols look at the client's socket address and don't bypass password
|
||||
checking unless it is less than @code{IPPORT_RESERVED} (@pxref{Ports}).
|
||||
protocols look at the client's socket address and only bypass password
|
||||
checking if it is less than @code{IPPORT_RESERVED} (@pxref{Ports}).
|
||||
|
||||
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.
|
||||
|
||||
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 BSD
|
||||
@deftp {Date Type} {struct sockaddr}
|
||||
@deftp {Data Type} {struct sockaddr}
|
||||
The @code{struct sockaddr} type itself has the following members:
|
||||
|
||||
@table @code
|
||||
@ -329,7 +332,7 @@ corresponding namespace. Here is a list of address format names:
|
||||
@item AF_FILE
|
||||
@vindex AF_FILE
|
||||
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.
|
||||
|
||||
@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.
|
||||
(@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 BSD
|
||||
@item AF_INET
|
||||
@ -376,7 +387,7 @@ information about how to use them.
|
||||
@pindex sys/socket.h
|
||||
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}.
|
||||
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 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
|
||||
find a file's name from a descriptor for that file.
|
||||
|
||||
@node File Namespace
|
||||
@section The File Namespace
|
||||
@cindex file namespace, for sockets
|
||||
@node Interface Naming
|
||||
@section Interface Naming
|
||||
|
||||
This section describes the details of the file namespace, whose
|
||||
symbolic name (required when you create a socket) is @code{PF_FILE}.
|
||||
Each network interface has a name. This usually consists of a few
|
||||
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
|
||||
* Concepts: File Namespace Concepts. What you need to understand.
|
||||
* Details: File Namespace Details. Address format, symbolic names, etc.
|
||||
* Example: File Socket Example. Example of creating a socket.
|
||||
* Concepts: Local Namespace Concepts. What you need to understand.
|
||||
* Details: Local Namespace Details. Address format, symbolic names, etc.
|
||||
* Example: Local Socket Example. Example of creating a socket.
|
||||
@end menu
|
||||
|
||||
@node File Namespace Concepts
|
||||
@subsection File Namespace Concepts
|
||||
@node Local 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
|
||||
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
|
||||
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
|
||||
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
|
||||
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.
|
||||
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
|
||||
the same file systems. Instead, send each new client an identifying
|
||||
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
|
||||
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}.
|
||||
|
||||
@node File Namespace Details
|
||||
@subsection Details of File Namespace
|
||||
@node Local Namespace Details
|
||||
@subsection Details of Local Namespace
|
||||
|
||||
@pindex sys/socket.h
|
||||
To create a socket in the file namespace, use the constant
|
||||
@code{PF_FILE} as the @var{namespace} argument to @code{socket} or
|
||||
To create a socket in the local namespace, use the constant
|
||||
@code{PF_LOCAL} as the @var{namespace} argument to @code{socket} or
|
||||
@code{socketpair}. This constant is defined in @file{sys/socket.h}.
|
||||
|
||||
@comment sys/socket.h
|
||||
@comment GNU
|
||||
@deftypevr Macro int PF_FILE
|
||||
This designates the file namespace, in which socket addresses are file
|
||||
names, and its associated family of protocols.
|
||||
@comment POSIX
|
||||
@deftypevr Macro int PF_LOCAL
|
||||
This designates the local namespace, in which socket addresses are local
|
||||
names, and its associated family of protocols. @code{PF_Local} is the
|
||||
macro used by Posix.1g.
|
||||
@end deftypevr
|
||||
|
||||
@comment sys/socket.h
|
||||
@comment BSD
|
||||
@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
|
||||
|
||||
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}:
|
||||
@pindex sys/un.h
|
||||
|
||||
@comment sys/un.h
|
||||
@comment BSD
|
||||
@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:
|
||||
|
||||
@table @code
|
||||
@item short int sun_family
|
||||
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}.
|
||||
|
||||
@item char sun_path[108]
|
||||
@ -554,14 +650,20 @@ the length of the filename.
|
||||
@end deftp
|
||||
|
||||
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
|
||||
the file name string.
|
||||
the file name string. This can be done using the macro @code{SUN_LEN}:
|
||||
|
||||
@node File Socket Example
|
||||
@subsection Example of File-Namespace Sockets
|
||||
@comment sys/un.h
|
||||
@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.
|
||||
|
||||
@smallexample
|
||||
@ -572,19 +674,30 @@ namespace.
|
||||
@section The Internet Namespace
|
||||
@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.
|
||||
|
||||
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{socket} or @code{socketpair}. This macro is defined in
|
||||
@file{sys/socket.h}.
|
||||
@code{socket} or @code{socketpair}. For IPv6 addresses, you need the
|
||||
macro @code{PF_INET6}. These macros are defined in @file{sys/socket.h}.
|
||||
@pindex sys/socket.h
|
||||
|
||||
@comment sys/socket.h
|
||||
@comment BSD
|
||||
@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.
|
||||
@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:
|
||||
|
||||
@table @code
|
||||
@item short int sin_family
|
||||
@item sa_family_t sin_family
|
||||
This identifies the address family or format of the socket address.
|
||||
You should store the value of @code{AF_INET} in this member.
|
||||
@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
|
||||
@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}
|
||||
This is the data type used to represent socket addresses in the IPv6
|
||||
namespace. It has the following members:
|
||||
|
||||
@table @code
|
||||
@item short int sin6_family
|
||||
@item sa_family_t sin6_family
|
||||
This identifies the address family or format of the socket address.
|
||||
You should store the value of @code{AF_INET6} in this member.
|
||||
@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}.
|
||||
|
||||
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
|
||||
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.
|
||||
@end ifinfo
|
||||
|
||||
@c I think this whole section could possibly be removed. It is slightly
|
||||
@c misleading these days.
|
||||
|
||||
@cindex network number
|
||||
@cindex local network address number
|
||||
An Internet host address is a number containing four bytes of data.
|
||||
These are divided into two parts, a @dfn{network number} and a
|
||||
@dfn{local network address number} within that network. The network
|
||||
number consists of the first one, two or three bytes; the rest of the
|
||||
bytes are the local address.
|
||||
An IPv4 Internet host address is a number containing four bytes of data.
|
||||
Historically these are divided into two parts, a @dfn{network number} and a
|
||||
@dfn{local network address number} within that network. In the
|
||||
mid-1990s classless address were introduced which changed the
|
||||
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
|
||||
network address numbers of individual machines are registered with the
|
||||
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
|
||||
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 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.
|
||||
|
||||
@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 dot notation, for Internet addresses
|
||||
@ -760,7 +878,8 @@ for Internet addresses:
|
||||
|
||||
@table @code
|
||||
@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}
|
||||
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}}.
|
||||
|
||||
@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
|
||||
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
|
||||
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
|
||||
@subsubsection Host Address Data Type
|
||||
|
||||
Internet host addresses are represented in some contexts as integers
|
||||
(type @code{unsigned long int}). In other contexts, the integer is
|
||||
IPv4 Internet host addresses are represented in some contexts as integers
|
||||
(type @code{uint32_t}). In other contexts, the integer is
|
||||
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
|
||||
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 header file @file{netinet/in.h}:
|
||||
@pindex netinet/in.h
|
||||
@ -798,16 +952,16 @@ the header file @file{netinet/in.h}:
|
||||
@comment netinet/in.h
|
||||
@comment BSD
|
||||
@deftp {Data Type} {struct in_addr}
|
||||
This data type is used in certain contexts to contain an Internet host
|
||||
address. It has just one field, named @code{s_addr}, which records the
|
||||
host address number as an @code{unsigned long int}.
|
||||
This data type is used in certain contexts to contain an IPv4 Internet
|
||||
host address. It has just one field, named @code{s_addr}, which records
|
||||
the host address number as an @code{uint32_t}.
|
||||
@end deftp
|
||||
|
||||
@comment netinet/in.h
|
||||
@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,''
|
||||
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
|
||||
special constant saves you the trouble of looking up the address of your
|
||||
own machine. Also, the system usually implements @code{INADDR_LOOPBACK}
|
||||
@ -817,7 +971,7 @@ talking to itself.
|
||||
|
||||
@comment netinet/in.h
|
||||
@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
|
||||
binding to an address. @xref{Setting Address}. This is the usual
|
||||
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 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.
|
||||
@c !!! broadcast needs further documented
|
||||
@end deftypevr
|
||||
|
||||
@comment netinet/in.h
|
||||
@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.
|
||||
@end deftypevr
|
||||
|
||||
@ -876,7 +1030,7 @@ Order}, for an explanation of network and host byte order.
|
||||
@comment arpa/inet.h
|
||||
@comment BSD
|
||||
@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
|
||||
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.
|
||||
@ -884,8 +1038,8 @@ it in the @code{struct in_addr} that @var{addr} points to.
|
||||
|
||||
@comment arpa/inet.h
|
||||
@comment BSD
|
||||
@deftypefun {unsigned long int} inet_addr (const char *@var{name})
|
||||
This function converts the Internet host address @var{name} from the
|
||||
@deftypefun {uint32_t} inet_addr (const char *@var{name})
|
||||
This function converts the IPv4 Internet host address @var{name} from the
|
||||
standard numbers-and-dots notation into binary data. If the input is
|
||||
not valid, @code{inet_addr} returns @code{INADDR_NONE}. This is an
|
||||
obsolete interface to @code{inet_aton}, described immediately above; it
|
||||
@ -896,17 +1050,21 @@ indicate error return.
|
||||
|
||||
@comment arpa/inet.h
|
||||
@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},
|
||||
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
|
||||
@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
|
||||
|
||||
@comment arpa/inet.h
|
||||
@comment BSD
|
||||
@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
|
||||
a pointer into a statically-allocated buffer. Subsequent calls will
|
||||
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
|
||||
buffer. But still subsequent calls of @code{inet_ntoa} in the same
|
||||
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
|
||||
|
||||
@comment arpa/inet.h
|
||||
@comment BSD
|
||||
@deftypefun {struct in_addr} inet_makeaddr (int @var{net}, int @var{local})
|
||||
This function makes an Internet host address by combining the network
|
||||
@deftypefun {struct in_addr} inet_makeaddr (uint32_t @var{net}, uint32_t @var{local})
|
||||
This function makes an IPv4 Internet host address by combining the network
|
||||
number @var{net} with the local-address-within-network number
|
||||
@var{local}.
|
||||
@end deftypefun
|
||||
|
||||
@comment arpa/inet.h
|
||||
@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
|
||||
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
|
||||
|
||||
@comment arpa/inet.h
|
||||
@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
|
||||
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
|
||||
|
||||
@comment arpa/inet.h
|
||||
@ -952,7 +1122,7 @@ responsibility to make sure the buffer is large enough.
|
||||
|
||||
@comment arpa/inet.h
|
||||
@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
|
||||
network (binary) to presentation (textual) form. @var{af} should be
|
||||
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,
|
||||
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,
|
||||
the machine with Internet address @samp{128.52.46.32} is also known as
|
||||
@samp{churchy.gnu.ai.mit.edu}; and other machines in the @samp{gnu.ai.mit.edu}
|
||||
domain can refer to it simply as @samp{churchy}.
|
||||
the machine with Internet address @samp{158.121.106.19} is also known as
|
||||
@samp{alpha.gnu.org}; and other machines in the @samp{gnu.org}
|
||||
domain can refer to it simply as @samp{alpha}.
|
||||
|
||||
@pindex /etc/hosts
|
||||
@pindex netdb.h
|
||||
@ -1021,9 +1191,10 @@ first host address.
|
||||
|
||||
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
|
||||
implicit assumption that you can convert this to a @code{struct in_addr} or
|
||||
an @code{unsigned long int}. Host addresses in a @code{struct hostent}
|
||||
structure are always given in network byte order; see @ref{Byte Order}.
|
||||
implicit assumption that you can convert IPv4 addresses to a
|
||||
@code{struct in_addr} or an @code{uint32_t}. Host addresses in
|
||||
a @code{struct hostent} structure are always given in network byte
|
||||
order; see @ref{Byte Order}.
|
||||
|
||||
You can use @code{gethostbyname}, @code{gethostbyname2} or
|
||||
@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
|
||||
@deftypefun {struct hostent *} gethostbyaddr (const char *@var{addr}, int @var{length}, int @var{format})
|
||||
The @code{gethostbyaddr} function returns information about the host
|
||||
with Internet address @var{addr}. The @var{length} argument is the
|
||||
size (in bytes) of the address at @var{addr}. @var{format} specifies
|
||||
the address format; for an Internet address, specify a value of
|
||||
@code{AF_INET}.
|
||||
with Internet address @var{addr}. The parameter @var{addr} is not
|
||||
really a pointer to char - it can be a pointer to an IPv4 or an IPv6
|
||||
address. The @var{length} argument is the size (in bytes) of the address
|
||||
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.
|
||||
@end deftypefun
|
||||
@ -1122,14 +1295,14 @@ reopening the database for each call.
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@deftypefun {struct hostent *} gethostent ()
|
||||
@deftypefun {struct hostent *} gethostent (void)
|
||||
This function returns the next entry in the hosts database. It
|
||||
returns a null pointer if there are no more entries.
|
||||
@end deftypefun
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@deftypefun void endhostent ()
|
||||
@deftypefun void endhostent (void)
|
||||
This function closes the hosts database.
|
||||
@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
|
||||
the @code{sockaddr_in} structure.
|
||||
|
||||
Otherwise, you have to convert the values explicitly. Use
|
||||
@code{htons} and @code{ntohs} to convert values for the @code{sin_port}
|
||||
member. Use @code{htonl} and @code{ntohl} to convert values for the
|
||||
Otherwise, you have to convert the values explicitly. Use @code{htons}
|
||||
and @code{ntohs} to convert values for the @code{sin_port} member. Use
|
||||
@code{htonl} and @code{ntohl} to convert IPv4 addresses for the
|
||||
@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}.
|
||||
@pindex netinet/in.h
|
||||
|
||||
@comment netinet/in.h
|
||||
@comment BSD
|
||||
@deftypefun {unsigned short int} htons (unsigned short int @var{hostshort})
|
||||
This function converts the @code{short} integer @var{hostshort} from
|
||||
@deftypefun {uint16_t} htons (uint16_t @var{hostshort})
|
||||
This function converts the @code{uint16_t} integer @var{hostshort} from
|
||||
host byte order to network byte order.
|
||||
@end deftypefun
|
||||
|
||||
@comment netinet/in.h
|
||||
@comment BSD
|
||||
@deftypefun {unsigned short int} ntohs (unsigned short int @var{netshort})
|
||||
This function converts the @code{short} integer @var{netshort} from
|
||||
@deftypefun {uint16_t} ntohs (uint16_t @var{netshort})
|
||||
This function converts the @code{uint16_t} integer @var{netshort} from
|
||||
network byte order to host byte order.
|
||||
@end deftypefun
|
||||
|
||||
@comment netinet/in.h
|
||||
@comment BSD
|
||||
@deftypefun {unsigned long int} htonl (unsigned long int @var{hostlong})
|
||||
This function converts the @code{long} integer @var{hostlong} from
|
||||
@deftypefun {uint32_t} htonl (uint32_t @var{hostlong})
|
||||
This function converts the @code{uint32_t} integer @var{hostlong} from
|
||||
host byte order to network byte order.
|
||||
|
||||
This is used for IPv4 internet addresses.
|
||||
@end deftypefun
|
||||
|
||||
@comment netinet/in.h
|
||||
@comment BSD
|
||||
@deftypefun {unsigned long int} ntohl (unsigned long int @var{netlong})
|
||||
This function converts the @code{long} integer @var{netlong} from
|
||||
@deftypefun {uint32_t} ntohl (uint32_t @var{netlong})
|
||||
This function converts the @code{uint32_t} integer @var{netlong} from
|
||||
network byte order to host byte order.
|
||||
|
||||
This is used for IPv4 internet addresses.
|
||||
@end deftypefun
|
||||
|
||||
@node Protocols Database
|
||||
@ -1511,7 +1688,7 @@ declared in @file{sys/socket.h}.
|
||||
This function creates a socket and specifies communication style
|
||||
@var{style}, which should be one of the socket styles listed in
|
||||
@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}
|
||||
designates the specific protocol (@pxref{Socket Concepts}); zero is
|
||||
usually right for @var{protocol}.
|
||||
@ -1545,7 +1722,7 @@ positioning operations.
|
||||
@end deftypefun
|
||||
|
||||
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
|
||||
@ -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
|
||||
one of the communication styles listed in @ref{Communication Styles}.
|
||||
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.
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
@comment sys/socket.h
|
||||
@ -1910,7 +2087,7 @@ connections immediately available.
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
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.
|
||||
@end deftypefun
|
||||
|
||||
@ -1922,7 +2099,7 @@ connectionless communication styles.
|
||||
|
||||
@comment sys/socket.h
|
||||
@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
|
||||
@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
|
||||
@ -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
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
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.
|
||||
@end deftypefun
|
||||
|
||||
@ -2060,7 +2237,7 @@ Primitives}.
|
||||
@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
|
||||
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
|
||||
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
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
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.
|
||||
@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
|
||||
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
|
||||
@include inetcli.c.texi
|
||||
@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 shutting down its end of the connection).
|
||||
|
||||
This program uses @code{make_socket} and @code{init_sockaddr} to set
|
||||
up the socket address; see @ref{Inet Example}.
|
||||
This program uses @code{make_socket} to set up the socket address; see
|
||||
@ref{Inet Example}.
|
||||
|
||||
@smallexample
|
||||
@include inetsrv.c.texi
|
||||
@ -2208,9 +2388,15 @@ in the receiving process, whether any ordinary data was sent before
|
||||
the mark:
|
||||
|
||||
@smallexample
|
||||
success = ioctl (socket, SIOCATMARK, &result);
|
||||
success = ioctl (socket, SIOCATMARK, &atmark);
|
||||
@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
|
||||
out-of-band mark:
|
||||
|
||||
@ -2222,10 +2408,10 @@ discard_until_mark (int socket)
|
||||
@{
|
||||
/* @r{This is not an arbitrary limit; any size will do.} */
|
||||
char buffer[1024];
|
||||
int result, success;
|
||||
int atmark, success;
|
||||
|
||||
/* @r{If we have reached the mark, return.} */
|
||||
success = ioctl (socket, SIOCATMARK, &result);
|
||||
success = ioctl (socket, SIOCATMARK, &atmark);
|
||||
if (success < 0)
|
||||
perror ("ioctl");
|
||||
if (result)
|
||||
@ -2276,9 +2462,8 @@ read_oob (int socket)
|
||||
/* @r{This is an arbitrary limit.}
|
||||
@r{Does anyone know how to do this without a limit?} */
|
||||
char *buffer = (char *) xmalloc (1024);
|
||||
struct buffer *link;
|
||||
int success;
|
||||
int result;
|
||||
int atmark;
|
||||
|
||||
/* @r{Try again to read the out-of-band data.} */
|
||||
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.} */
|
||||
success = ioctl (socket, SIOCATMARK, &result);
|
||||
success = ioctl (socket, SIOCATMARK, &atmark);
|
||||
if (success < 0)
|
||||
perror ("ioctl");
|
||||
if (result)
|
||||
if (atmark)
|
||||
@{
|
||||
/* @r{At the mark; skipping past more ordinary data cannot help.}
|
||||
@r{So just wait a while.} */
|
||||
@ -2351,7 +2536,7 @@ sockets using connectionless communication styles.
|
||||
* Sending Datagrams:: Sending packets on a datagram socket.
|
||||
* Receiving Datagrams:: Receiving packets on a datagram socket.
|
||||
* 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.
|
||||
@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
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
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.
|
||||
@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
|
||||
address where the packet came from. @xref{Socket Addresses}. For a
|
||||
socket in the file domain, the address information won't be meaningful,
|
||||
since you can't read the address of such a socket (@pxref{File
|
||||
socket in the local domain, the address information won't be meaningful,
|
||||
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
|
||||
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
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
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.
|
||||
@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
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
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.
|
||||
@end deftypefun
|
||||
@end ignore
|
||||
@ -2483,9 +2668,9 @@ semaphores or whatever) are freed even if the thread is cancel.
|
||||
@subsection Datagram Socket Example
|
||||
|
||||
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
|
||||
@code{make_named_socket} function that was presented in @ref{File
|
||||
Namespace}, to create and name their sockets.
|
||||
stream in the local namespace. Both the client and server programs use
|
||||
the @code{make_named_socket} function that was presented in @ref{Local
|
||||
Socket Example}, to create and name their sockets.
|
||||
|
||||
First, here is the server program. It sits in a loop waiting for
|
||||
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
|
||||
identically-named sockets in a way that would confuse the Internet. The
|
||||
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''.
|
||||
|
||||
@ -2890,7 +3075,7 @@ network.
|
||||
|
||||
@comment netdb.h
|
||||
@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
|
||||
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.
|
||||
|
20
nis/ypclnt.c
20
nis/ypclnt.c
@ -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) & resp);
|
||||
|
||||
if (result != RPC_SUCCESS)
|
||||
return YPERR_RPC;
|
||||
if (result != YPERR_SUCCESS)
|
||||
return result;
|
||||
if (resp.stat != YP_TRUE)
|
||||
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) & resp);
|
||||
|
||||
if (result != RPC_SUCCESS)
|
||||
return YPERR_RPC;
|
||||
if (result != YPERR_SUCCESS)
|
||||
return result;
|
||||
if (resp.stat != YP_TRUE)
|
||||
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,
|
||||
(caddr_t) & req, (xdrproc_t) xdr_ypresp_master, (caddr_t) & resp);
|
||||
|
||||
if (result != RPC_SUCCESS)
|
||||
return YPERR_RPC;
|
||||
if (result != YPERR_SUCCESS)
|
||||
return result;
|
||||
if (resp.stat != YP_TRUE)
|
||||
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,
|
||||
(caddr_t) & req, (xdrproc_t) xdr_ypresp_order, (caddr_t) & resp);
|
||||
|
||||
if (result != RPC_SUCCESS)
|
||||
return YPERR_RPC;
|
||||
if (result != YPERR_SUCCESS)
|
||||
return result;
|
||||
if (resp.stat != YP_TRUE)
|
||||
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,
|
||||
(caddr_t) & indomain, (xdrproc_t) xdr_ypresp_maplist, (caddr_t) & resp);
|
||||
|
||||
if (result != RPC_SUCCESS)
|
||||
return YPERR_RPC;
|
||||
if (result != YPERR_SUCCESS)
|
||||
return result;
|
||||
if (resp.stat != YP_TRUE)
|
||||
return ypprot_err (resp.stat);
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
/* This is necessary to make this include file properly replace the
|
||||
Sun version. */
|
||||
#include <rpc/netdb.h>
|
||||
#include <sys/socket.h> /* need socklen_t */
|
||||
#define __need_size_t
|
||||
#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));
|
||||
|
||||
/* 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. */
|
||||
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 */
|
||||
|
||||
|
||||
/* 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
|
||||
poor assumption is made. The network number is expected to fit
|
||||
into an unsigned long int variable. */
|
||||
@ -413,6 +427,7 @@ struct addrinfo
|
||||
/* Possible values for `ai_flags' field in `addrinfo' structure. */
|
||||
# define AI_PASSIVE 1 /* Socket address is intended for `bind'. */
|
||||
# define AI_CANONNAME 2 /* Request for canonical name. */
|
||||
# define AI_NUMERICHOST 3 /* Don't use name resolution. */
|
||||
|
||||
/* Error values for `getaddrinfo' function. */
|
||||
# define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */
|
||||
@ -430,11 +445,11 @@ struct addrinfo
|
||||
# define NI_MAXHOST 1025
|
||||
# define NI_MAXSERV 32
|
||||
|
||||
# define NI_NUMERICHOST 1
|
||||
# define NI_NUMERICSERV 2
|
||||
# define NI_NOFQDN 4
|
||||
# define NI_NAMEREQD 8
|
||||
# define NI_DGRAM 16
|
||||
# define NI_NUMERICHOST 1 /* Don't try to look up hostname. */
|
||||
# define NI_NUMERICSERV 2 /* Don't convert port number to name. */
|
||||
# define NI_NOFQDN 4 /* Only return nodename portion. */
|
||||
# define NI_NAMEREQD 8 /* Don't return numeric addresses. */
|
||||
# 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
|
||||
socket addresses. */
|
||||
@ -449,7 +464,7 @@ extern void freeaddrinfo __P ((struct addrinfo *__ai));
|
||||
extern char *gai_strerror __P ((int __ecode));
|
||||
|
||||
/* 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 *__serv, size_t __servlen,
|
||||
int __flags));
|
||||
|
@ -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.
|
||||
|
||||
# The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -21,7 +21,8 @@
|
||||
#
|
||||
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 \
|
||||
listen recv recvfrom recvmsg send sendmsg sendto \
|
||||
|
@ -33,6 +33,9 @@ __BEGIN_DECLS
|
||||
`struct msghdr', and `struct linger' types. */
|
||||
#include <bits/socket.h>
|
||||
|
||||
/* Get the definition of `sockaddr_union'. */
|
||||
#include <bits/sockunion.h>
|
||||
|
||||
#ifdef __USE_BSD
|
||||
/* This is the 4.3 BSD `struct sockaddr' format, which is used as wire
|
||||
format in the grotty old 4.3 `talk' protocol. */
|
||||
|
@ -733,16 +733,20 @@ extern int grantpt __P ((int __fd));
|
||||
Call after grantpt(). */
|
||||
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));
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Reentrant version of ptsname. */
|
||||
extern char *__ptsname_r __P ((int __fd, char *__buf, unsigned int __len));
|
||||
extern char *ptsname_r __P ((int __fd, char *__buf, unsigned int __len));
|
||||
/* Store at most BUFLEN characters of the pathname of the slave pseudo
|
||||
terminal associated with the master FD is open on in BUF.
|
||||
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));
|
||||
#endif
|
||||
|
@ -198,6 +198,7 @@ extern size_t strlen __P ((__const char *__s));
|
||||
#ifdef __USE_GNU
|
||||
/* Find the length of STRING, but scan at most MAXLEN characters.
|
||||
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));
|
||||
#endif
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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. */
|
||||
|
||||
size_t
|
||||
strnlen (const char *string, size_t maxlen)
|
||||
__strnlen (const char *string, size_t maxlen)
|
||||
{
|
||||
const char *end = memchr (string, '\0', maxlen);
|
||||
return end ? end - string : maxlen;
|
||||
}
|
||||
weak_alias (__strnlen, strnlen)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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))
|
||||
|
||||
/* 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 */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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,
|
||||
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."
|
||||
#endif
|
||||
|
||||
|
40
sysdeps/generic/bits/sockunion.h
Normal file
40
sysdeps/generic/bits/sockunion.h
Normal 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 */
|
@ -17,8 +17,9 @@
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Given the file descriptor of a master pty, return the pathname
|
||||
of the associated slave. */
|
||||
@ -28,14 +29,14 @@ ptsname (fd)
|
||||
int fd __attribute__ ((unused));
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
int
|
||||
__ptsname_r (fd, buf, len)
|
||||
int fd __attribute__ ((unused));
|
||||
char *buf __attribute__ ((unused));
|
||||
unsigned int len __attribute__ ((unused));
|
||||
size_t len __attribute__ ((unused));
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return 0;
|
||||
|
@ -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.
|
||||
|
||||
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,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _SYS_IOCTL_H
|
||||
# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead."
|
||||
#if !defined _HURD_IOCTL_H && !defined _SYS_IOCTLS_H
|
||||
# error "Never use <bits/ioctls.h> directly; include <hurd/ioctl.h> instead."
|
||||
#endif
|
||||
|
||||
/* These macros are also defined in <bits/termios.h> (with numerically
|
||||
|
@ -546,8 +546,8 @@ __close (int fd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
caddr_t weak_function
|
||||
__mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
|
||||
__ptr_t weak_function
|
||||
__mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
|
||||
{
|
||||
error_t err;
|
||||
vm_prot_t vmprot;
|
||||
@ -656,7 +656,7 @@ _dl_sysdep_message (const char *msg, ...)
|
||||
? 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
|
||||
|
@ -19,9 +19,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
/* Generate a unique temporary file name from TEMPLATE.
|
||||
The last six characters of TEMPLATE must be "XXXXXX";
|
||||
@ -33,30 +35,54 @@ mkstemp (template)
|
||||
{
|
||||
static const char letters[]
|
||||
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
static uint32_t value;
|
||||
struct timeval tv;
|
||||
char *XXXXXX;
|
||||
size_t len;
|
||||
size_t i;
|
||||
int count;
|
||||
|
||||
len = strlen (template);
|
||||
if (len < 6 || strcmp (&template[len - 6], "XXXXXX"))
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (sprintf (&template[len - 5], "%.5u",
|
||||
(unsigned int) getpid () % 100000) != 5)
|
||||
/* Inconceivable lossage. */
|
||||
return -1;
|
||||
/* This is where the Xs start. */
|
||||
XXXXXX = &template[len - 6];
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
if (fd >= 0)
|
||||
/* The file does not exist. */
|
||||
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. */
|
||||
|
@ -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.
|
||||
|
||||
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,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Generate a unique temporary file name from TEMPLATE.
|
||||
The last six characters of TEMPLATE must be "XXXXXX";
|
||||
@ -33,8 +35,11 @@ mktemp (template)
|
||||
{
|
||||
static const char letters[]
|
||||
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||
static uint32_t value;
|
||||
struct timeval tv;
|
||||
char *XXXXXX;
|
||||
size_t len;
|
||||
size_t i;
|
||||
int count;
|
||||
|
||||
len = strlen (template);
|
||||
if (len < 6 || strcmp (&template[len - 6], "XXXXXX"))
|
||||
@ -43,20 +48,39 @@ mktemp (template)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (sprintf (&template[len - 5], "%.5u",
|
||||
(unsigned int) getpid () % 100000) != 5)
|
||||
/* Inconceivable lossage. */
|
||||
return NULL;
|
||||
/* This is where the Xs start. */
|
||||
XXXXXX = &template[len - 6];
|
||||
|
||||
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;
|
||||
|
||||
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)
|
||||
/* The file does not exist. So return this name. */
|
||||
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. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
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))
|
||||
|
||||
/* Return the length of a `sockaddr' structure. */
|
||||
#define SA_LEN(_x) ((_x)->sa_len)
|
||||
|
||||
#endif /* bits/sockaddr.h */
|
||||
|
@ -34,7 +34,7 @@ unlockpt (fd)
|
||||
{
|
||||
char buf[PTYNAMELEN];
|
||||
|
||||
if (ptsname_r (fd, buf, PTYNAMELEN))
|
||||
if (__ptsname_r (fd, buf, PTYNAMELEN))
|
||||
return -1;
|
||||
|
||||
return revoke (buf);
|
||||
|
@ -47,9 +47,9 @@ grantpt (fd)
|
||||
char namebuf[PTYNAMELEN];
|
||||
|
||||
/* Some systems do it for us. */
|
||||
if (__ptsname_r (fd, namebuf, PTYNAMELEN) == NULL)
|
||||
if (__ptsname_r (fd, namebuf, PTYNAMELEN) != 0)
|
||||
return -1;
|
||||
if (stat (namebuf, &st))
|
||||
if (__xstat (_STAT_VER, namebuf, &st) != 0)
|
||||
return -1;
|
||||
|
||||
if (st.st_uid == getuid ())
|
||||
|
@ -46,6 +46,7 @@ rt_sigqueueinfo.c
|
||||
rt_sigreturn.c
|
||||
rt_sigsuspend.c
|
||||
rt_sigtimedwait.c
|
||||
sa_len.c
|
||||
scsi/sg.h
|
||||
scsi/scsi.h
|
||||
sys/acct.h
|
||||
|
@ -58,7 +58,7 @@ ifeq ($(subdir),socket)
|
||||
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/if_slip.h net/if_packet.h
|
||||
sysdep_routines += cmsg_nxthdr
|
||||
sysdep_routines += cmsg_nxthdr sa_len
|
||||
endif
|
||||
|
||||
ifeq ($(subdir),sunrpc)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* 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.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -18,9 +18,54 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#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
|
||||
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);
|
||||
}
|
||||
|
@ -17,7 +17,10 @@
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
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."
|
||||
#endif
|
||||
|
||||
@ -230,3 +233,5 @@ struct linger
|
||||
int l_onoff; /* Nonzero to linger on close. */
|
||||
int l_linger; /* Time to linger. */
|
||||
};
|
||||
|
||||
#endif /* bits/socket.h */
|
||||
|
46
sysdeps/unix/sysv/linux/bits/sockunion.h
Normal file
46
sysdeps/unix/sysv/linux/bits/sockunion.h
Normal 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];
|
||||
};
|
@ -117,52 +117,46 @@ if_nameindex (void)
|
||||
#else
|
||||
int fd = opensock ();
|
||||
struct ifconf ifc;
|
||||
unsigned int rq_ifs = 4, nifs, i;
|
||||
unsigned int nifs, i;
|
||||
int rq_len;
|
||||
struct if_nameindex *idx = NULL;
|
||||
#ifdef SIOCGIFCOUNT
|
||||
static int siocgifcount_works = 1;
|
||||
#endif
|
||||
static int new_siocgifconf = 1;
|
||||
#define RQ_IFS 4
|
||||
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
#ifdef SIOCGIFCOUNT
|
||||
/* 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;
|
||||
ifc.ifc_buf = NULL;
|
||||
|
||||
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)
|
||||
{
|
||||
siocgifcount_works = 0;
|
||||
__set_errno (serrno);
|
||||
}
|
||||
new_siocgifconf = 0;
|
||||
rq_len = RQ_IFS * sizeof (struct ifreq);
|
||||
}
|
||||
else
|
||||
rq_ifs = nifs + 1;
|
||||
rq_len = ifc.ifc_len;
|
||||
}
|
||||
#endif
|
||||
|
||||
ifc.ifc_buf = NULL;
|
||||
else
|
||||
rq_len = RQ_IFS * sizeof (struct ifreq);
|
||||
|
||||
/* Read all the interfaces out of the kernel. */
|
||||
do
|
||||
{
|
||||
rq_len = ifc.ifc_len = rq_ifs * sizeof (struct ifreq);
|
||||
ifc.ifc_buf = alloca (ifc.ifc_len);
|
||||
ifc.ifc_buf = alloca (ifc.ifc_len = rq_len);
|
||||
if ((ifc.ifc_buf == NULL) || (ioctl (fd, SIOCGIFCONF, &ifc) < 0))
|
||||
{
|
||||
close (fd);
|
||||
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);
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
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."
|
||||
#endif
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "pty-internal.h"
|
||||
|
||||
@ -40,21 +41,38 @@ char *
|
||||
ptsname (fd)
|
||||
int fd;
|
||||
{
|
||||
return __ptsname_r (fd, namebuf, PTYNAMELEN);
|
||||
return __ptsname_r (fd, namebuf, PTYNAMELEN) != 0 ? NULL : namebuf;
|
||||
}
|
||||
|
||||
char *
|
||||
__ptsname_r (fd, buf, len)
|
||||
int
|
||||
__ptsname_r (fd, buf, buflen)
|
||||
int fd;
|
||||
char *buf;
|
||||
unsigned int len;
|
||||
size_t buflen;
|
||||
{
|
||||
char nbuf[PTYNAMELEN], idbuf[6];
|
||||
int ptyno;
|
||||
struct stat st;
|
||||
int save = errno;
|
||||
int ptyno;
|
||||
char nbuf[PTYNAMELEN], idbuf[6];
|
||||
char *cp;
|
||||
|
||||
#ifdef TIOCGPTN
|
||||
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 (ioctl (fd, TIOCGPTN, &ptyno) == 0)
|
||||
@ -62,23 +80,21 @@ __ptsname_r (fd, buf, len)
|
||||
else
|
||||
{
|
||||
if(errno != EINVAL)
|
||||
return 0;
|
||||
return errno;
|
||||
else
|
||||
tiocgptn_works = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* /dev/ptmx will make it into the kernel before 32 bit dev_t, so
|
||||
this should be safe. */
|
||||
if (__fxstat (_STAT_VER, fd, &st))
|
||||
return 0;
|
||||
if (__fxstat (_STAT_VER, fd, &st) < 0)
|
||||
return errno;
|
||||
|
||||
ptyno = minor (st.st_rdev);
|
||||
if (major (st.st_rdev) == 4)
|
||||
ptyno -= 128;
|
||||
|
||||
#ifdef TIOCGPTN
|
||||
gotit:
|
||||
gotit:
|
||||
#endif
|
||||
/* Two different possible naming schemes for pty slaves:
|
||||
the SVr4 way. */
|
||||
@ -86,22 +102,32 @@ gotit:
|
||||
idbuf[5] = '\0';
|
||||
__stpcpy (__stpcpy (nbuf, "/dev/pts/"),
|
||||
_itoa_word (ptyno, &idbuf[4], 10, 0));
|
||||
if (!__xstat (_STAT_VER, nbuf, &st))
|
||||
return strncpy (buf, nbuf, len);
|
||||
else
|
||||
if (errno != ENOENT)
|
||||
return NULL;
|
||||
if (__xstat (_STAT_VER, nbuf, &st) < 0)
|
||||
{
|
||||
if (errno != ENOENT)
|
||||
return errno;
|
||||
|
||||
/* ...and the BSD way. */
|
||||
nbuf[5] = 't';
|
||||
nbuf[7] = 'y';
|
||||
nbuf[8] = __ptyname1[ptyno / 16];
|
||||
nbuf[9] = __ptyname2[ptyno % 16];
|
||||
nbuf[10] = '\0';
|
||||
/* ...and the BSD way. */
|
||||
nbuf[5] = 't';
|
||||
nbuf[7] = 'y';
|
||||
nbuf[8] = __ptyname1[ptyno / 16];
|
||||
nbuf[9] = __ptyname2[ptyno % 16];
|
||||
nbuf[10] = '\0';
|
||||
|
||||
if (__xstat (_STAT_VER, nbuf, &st))
|
||||
return NULL;
|
||||
if (__xstat (_STAT_VER, nbuf, &st) < 0)
|
||||
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)
|
||||
|
46
sysdeps/unix/sysv/linux/sa_len.c
Normal file
46
sysdeps/unix/sysv/linux/sa_len.c
Normal 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;
|
||||
}
|
@ -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.
|
||||
|
||||
# The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -22,21 +22,22 @@
|
||||
subdir := wcsmbs
|
||||
|
||||
headers := wchar.h
|
||||
distribute := wcwidth.h
|
||||
distribute := wcwidth.h wcsmbsload.h
|
||||
|
||||
routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
|
||||
wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \
|
||||
wmemcmp wmemcpy wmemmove wmemset wcpcpy wcpncpy \
|
||||
btowc wctob mbsinit \
|
||||
mbrlen mbrtowc wcrtomb mbsrtowcs wcsrtombs \
|
||||
mbsnrtowcs wcsnrtombs wmemrtowcs wmemrtombs \
|
||||
mbsnrtowcs wcsnrtombs wcsnlen \
|
||||
wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
|
||||
wcstol_l wcstoul_l wcstoll_l wcstoull_l \
|
||||
wcstod_l wcstold_l wcstof_l \
|
||||
wcscoll wcsxfrm \
|
||||
wcwidth wcswidth \
|
||||
wcscoll_l wcsxfrm_l \
|
||||
wcscasecmp wcsncase wcscasecmp_l wcsncase_l
|
||||
wcscasecmp wcsncase wcscasecmp_l wcsncase_l \
|
||||
wcsmbsload
|
||||
|
||||
tests := tst-wcstof
|
||||
|
||||
|
@ -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.
|
||||
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,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
#include <stdio.h>
|
||||
#include <string.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
|
||||
btowc (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;
|
||||
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;
|
||||
}
|
||||
|
140
wcsmbs/mbrtowc.c
140
wcsmbs/mbrtowc.c
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
|
||||
|
||||
@ -18,113 +18,77 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <gconv.h>
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
#define EILSEQ EINVAL
|
||||
# define EILSEQ EINVAL
|
||||
#endif
|
||||
|
||||
|
||||
static mbstate_t internal;
|
||||
/* This is the private state used if PS is NULL. */
|
||||
static mbstate_t state;
|
||||
|
||||
size_t
|
||||
__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)
|
||||
ps = &internal;
|
||||
/* Tell where we want the result. */
|
||||
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)
|
||||
{
|
||||
/* See first paragraph of description in 7.16.6.3.2. */
|
||||
ps->count = 0;
|
||||
return 0;
|
||||
data.outbuf = (char *) buf;
|
||||
s = "";
|
||||
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++;
|
||||
++used;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
/* The converted character is the NUL character. */
|
||||
assert (mbsinit (data.statep));
|
||||
result = 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)
|
||||
|
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
|
||||
|
||||
@ -18,16 +18,20 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <gconv.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
#define EILSEQ EINVAL
|
||||
# define EILSEQ EINVAL
|
||||
#endif
|
||||
|
||||
|
||||
/* 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 the private state used if PS is NULL. */
|
||||
static mbstate_t state;
|
||||
|
||||
/* This is a non-standard function but it is very useful in the
|
||||
implementation of stdio because we have to deal with unterminated
|
||||
@ -40,128 +44,89 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
|
||||
size_t len;
|
||||
mbstate_t *ps;
|
||||
{
|
||||
size_t written = 0;
|
||||
const char *run = *src;
|
||||
const char *last = run + nmc;
|
||||
wchar_t value;
|
||||
size_t count;
|
||||
size_t inbytes_in;
|
||||
struct gconv_step_data data;
|
||||
size_t result = 0;
|
||||
int status;
|
||||
|
||||
if (ps == NULL)
|
||||
ps = &internal;
|
||||
/* Tell where we want the result. */
|
||||
data.is_last = 1;
|
||||
data.statep = ps ?: &state;
|
||||
|
||||
/* Get information from last use of this state. */
|
||||
count = ps->count;
|
||||
value = ps->value;
|
||||
if (nmc == 0)
|
||||
return 0;
|
||||
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)
|
||||
/* 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. */
|
||||
*src = run;
|
||||
|
||||
/* Start reading a new character only if we are in the initial
|
||||
state. */
|
||||
if (count == 0)
|
||||
data.outbuf = (char *) buf;
|
||||
data.outbufsize = sizeof (buf);
|
||||
do
|
||||
{
|
||||
byte = *run++;
|
||||
inbuf += inbytes_in - inbytes;
|
||||
inbytes_in = inbytes;
|
||||
data.outbufavail = 0;
|
||||
written = 0;
|
||||
|
||||
/* We expect a start of a new multibyte character. */
|
||||
if (byte < 0x80)
|
||||
{
|
||||
/* One byte sequence. */
|
||||
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;
|
||||
}
|
||||
status = (*__wcsmbs_gconv_fcts.towc->fct) (__wcsmbs_gconv_fcts.towc,
|
||||
&data, inbuf, &inbytes,
|
||||
&written, 0);
|
||||
result += written;
|
||||
}
|
||||
while (status == GCONV_FULL_OUTPUT);
|
||||
|
||||
/* Read the possible remaining bytes. */
|
||||
while (run < last && count > 0)
|
||||
if (status == GCONV_OK && ((wchar_t *) dst)[written - 1] == L'\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++;
|
||||
--count;
|
||||
|
||||
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. */
|
||||
assert (result > 0);
|
||||
assert (mbsinit (data.statep));
|
||||
*src = NULL;
|
||||
ps->count = 0;
|
||||
return written;
|
||||
--result;
|
||||
}
|
||||
|
||||
/* Increment counter of produced words. */
|
||||
++written;
|
||||
else
|
||||
*src += inbytes_in - inbytes;
|
||||
}
|
||||
|
||||
/* Store address of next byte to process. */
|
||||
*src = run;
|
||||
/* There must not be any problems with the conversion but illegal input
|
||||
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)
|
||||
|
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
|
||||
|
||||
@ -18,16 +18,20 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <gconv.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
#define EILSEQ EINVAL
|
||||
# define EILSEQ EINVAL
|
||||
#endif
|
||||
|
||||
|
||||
/* 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 the private state used if PS is NULL. */
|
||||
static mbstate_t state;
|
||||
|
||||
size_t
|
||||
__mbsrtowcs (dst, src, len, ps)
|
||||
@ -36,108 +40,86 @@ __mbsrtowcs (dst, src, len, ps)
|
||||
size_t len;
|
||||
mbstate_t *ps;
|
||||
{
|
||||
size_t written = 0;
|
||||
const char *run = *src;
|
||||
struct gconv_step_data data;
|
||||
size_t result = 0;
|
||||
int status;
|
||||
|
||||
if (ps == NULL)
|
||||
ps = &internal;
|
||||
/* Tell where we want the result. */
|
||||
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)
|
||||
/* 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;
|
||||
size_t count;
|
||||
unsigned char byte;
|
||||
wchar_t buf[64]; /* Just an arbitrary size. */
|
||||
size_t inbytes_in = strlen (*src) + 1;
|
||||
size_t inbytes = inbytes_in;
|
||||
const char *inbuf = *src;
|
||||
size_t written;
|
||||
|
||||
/* Store address of next byte to process. */
|
||||
*src = run;
|
||||
data.outbuf = (char *) buf;
|
||||
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 (byte < 0x80)
|
||||
if (status == GCONV_OK && ((wchar_t *) dst)[written - 1] == L'\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 = __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. */
|
||||
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;
|
||||
assert (result > 0);
|
||||
assert (mbsinit (data.statep));
|
||||
*src = NULL;
|
||||
--result;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 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;
|
||||
*src += inbytes_in - inbytes;
|
||||
}
|
||||
|
||||
/* Store address of next byte to process. */
|
||||
*src = run;
|
||||
/* There must not be any problems with the conversion but illegal input
|
||||
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)
|
||||
|
@ -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.
|
||||
|
||||
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));
|
||||
|
||||
/* 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));
|
||||
|
||||
#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. */
|
||||
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,
|
||||
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
|
||||
from the wide character string SRC to 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,
|
||||
size_t __nwc, size_t __len,
|
||||
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 */
|
||||
|
||||
|
||||
|
115
wcsmbs/wcrtomb.c
115
wcsmbs/wcrtomb.c
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
|
||||
|
||||
@ -18,77 +18,86 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <gconv.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
#define EILSEQ EINVAL
|
||||
# define EILSEQ EINVAL
|
||||
#endif
|
||||
|
||||
static const wchar_t encoding_mask[] =
|
||||
{
|
||||
~0x7ff, ~0xffff, ~0x1fffff, ~0x3ffffff
|
||||
};
|
||||
|
||||
static const unsigned char encoding_byte[] =
|
||||
{
|
||||
0xc0, 0xe0, 0xf0, 0xf8, 0xfc
|
||||
};
|
||||
|
||||
/* The state is for this UTF8 encoding not used. */
|
||||
static mbstate_t internal;
|
||||
/* This is the private state used if PS is NULL. */
|
||||
static mbstate_t state;
|
||||
|
||||
size_t
|
||||
__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)
|
||||
ps = &internal;
|
||||
/* Tell where we want the result. */
|
||||
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)
|
||||
{
|
||||
/* This is equivalent to wcrtomb (<<internal>, L'\0', ps). We
|
||||
only have to reset the state. */
|
||||
ps->count = 0;
|
||||
return 1;
|
||||
data.outbuf = buf;
|
||||
wc = L'\0';
|
||||
}
|
||||
|
||||
/* Store the UTF8 representation of WC. */
|
||||
if (wc < 0 || wc > 0x7fffffff)
|
||||
/* Make sure we use the correct function. */
|
||||
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);
|
||||
return (size_t) -1;
|
||||
}
|
||||
|
||||
if (wc < 0x80)
|
||||
{
|
||||
/* 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;
|
||||
return result;
|
||||
}
|
||||
weak_alias (__wcrtomb, wcrtomb)
|
||||
|
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
size_t
|
||||
wcslen (s)
|
||||
__wcslen (s)
|
||||
const wchar_t *s;
|
||||
{
|
||||
size_t len = 0;
|
||||
@ -40,3 +40,4 @@ wcslen (s)
|
||||
|
||||
return len;
|
||||
}
|
||||
weak_alias (__wcslen, wcslen)
|
||||
|
132
wcsmbs/wcsmbsload.c
Normal file
132
wcsmbs/wcsmbsload.c
Normal 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
52
wcsmbs/wcsmbsload.h
Normal 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
44
wcsmbs/wcsnlen.c
Normal 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)
|
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
|
||||
|
||||
@ -18,26 +18,19 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <gconv.h>
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
#define EILSEQ EINVAL
|
||||
# define EILSEQ EINVAL
|
||||
#endif
|
||||
|
||||
|
||||
static const wchar_t encoding_mask[] =
|
||||
{
|
||||
~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 the private state used if PS is NULL. */
|
||||
static mbstate_t state;
|
||||
|
||||
/* This is a non-standard function but it is very useful in the
|
||||
implementation of stdio because we have to deal with unterminated
|
||||
@ -50,85 +43,91 @@ __wcsnrtombs (dst, src, nwc, len, ps)
|
||||
size_t len;
|
||||
mbstate_t *ps;
|
||||
{
|
||||
size_t written = 0;
|
||||
const wchar_t *run = *src;
|
||||
struct gconv_step_data data;
|
||||
size_t inbytes_in;
|
||||
int status;
|
||||
size_t result;
|
||||
|
||||
if (ps == NULL)
|
||||
ps = &internal;
|
||||
/* Tell where we want the result. */
|
||||
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)
|
||||
/* 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. */
|
||||
*src = run;
|
||||
data.outbuf = buf;
|
||||
data.outbufsize = sizeof (buf);
|
||||
|
||||
wc = *run++;
|
||||
|
||||
if (wc < 0 || wc > 0x7fffffff)
|
||||
do
|
||||
{
|
||||
/* This is no correct ISO 10646 character. */
|
||||
__set_errno (EILSEQ);
|
||||
return (size_t) -1;
|
||||
inbuf += (inbytes_in - inbytes) / sizeof (wchar_t);
|
||||
inbytes_in = inbytes;
|
||||
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. */
|
||||
if (dst != NULL)
|
||||
*dst = '\0';
|
||||
assert (data.outbufavail > 0);
|
||||
assert (mbsinit (data.statep));
|
||||
*src = NULL;
|
||||
return written;
|
||||
}
|
||||
else if (wc < 0x80)
|
||||
{
|
||||
/* It's an one byte sequence. */
|
||||
if (dst != NULL)
|
||||
*dst++ = (char) wc;
|
||||
++written;
|
||||
--result;
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
}
|
||||
*src += result;
|
||||
}
|
||||
|
||||
/* Store position of first unprocessed word. */
|
||||
*src = run;
|
||||
/* There must not be any problems with the conversion but illegal input
|
||||
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)
|
||||
|
@ -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.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
|
||||
|
||||
@ -18,26 +18,20 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <gconv.h>
|
||||
#include <wchar.h>
|
||||
#include <wcsmbsload.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef EILSEQ
|
||||
#define EILSEQ EINVAL
|
||||
# define EILSEQ EINVAL
|
||||
#endif
|
||||
|
||||
|
||||
static const wchar_t encoding_mask[] =
|
||||
{
|
||||
~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 the private state used if PS is NULL. */
|
||||
static mbstate_t state;
|
||||
|
||||
size_t
|
||||
__wcsrtombs (dst, src, len, ps)
|
||||
@ -46,89 +40,88 @@ __wcsrtombs (dst, src, len, ps)
|
||||
size_t len;
|
||||
mbstate_t *ps;
|
||||
{
|
||||
size_t written = 0;
|
||||
const wchar_t *run = *src;
|
||||
struct gconv_step_data data;
|
||||
int status;
|
||||
size_t result;
|
||||
|
||||
if (ps == NULL)
|
||||
ps = &internal;
|
||||
/* Tell where we want the result. */
|
||||
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)
|
||||
/* 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. */
|
||||
*src = run;
|
||||
data.outbuf = buf;
|
||||
data.outbufsize = sizeof (buf);
|
||||
|
||||
wc = *run++;
|
||||
|
||||
if (wc < 0 || wc > 0x7fffffff)
|
||||
do
|
||||
{
|
||||
/* This is no correct ISO 10646 character. */
|
||||
__set_errno (EILSEQ);
|
||||
return (size_t) -1;
|
||||
inbuf += (inbytes_in - inbytes) / sizeof (wchar_t);
|
||||
inbytes_in = inbytes;
|
||||
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. */
|
||||
if (dst != NULL)
|
||||
*dst = '\0';
|
||||
ps->count = 0;
|
||||
assert (data.outbufavail > 0);
|
||||
assert (mbsinit (data.statep));
|
||||
*src = NULL;
|
||||
return written;
|
||||
}
|
||||
else if (wc < 0x80)
|
||||
{
|
||||
/* It's an one byte sequence. */
|
||||
if (dst != NULL)
|
||||
*dst++ = (char) wc;
|
||||
++written;
|
||||
--result;
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
}
|
||||
*src += result;
|
||||
}
|
||||
|
||||
/* Store position of first unprocessed word. */
|
||||
*src = run;
|
||||
/* There must not be any problems with the conversion but illegal input
|
||||
characters. */
|
||||
assert (status == GCONV_OK || status == GCONV_ILLEGAL_INPUT
|
||||
|| status == GCONV_INCOMPLETE_INPUT || status == GCONV_FULL_OUTPUT);
|
||||
|
||||
/* Signal that we finished correctly. */
|
||||
ps->count = 0;
|
||||
if (status != GCONV_OK && status != GCONV_FULL_OUTPUT)
|
||||
{
|
||||
result = (size_t) -1;
|
||||
__set_errno (EILSEQ);
|
||||
}
|
||||
|
||||
return written;
|
||||
return result;
|
||||
}
|
||||
weak_alias (__wcsrtombs, wcsrtombs)
|
||||
|
@ -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.
|
||||
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,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <gconv.h>
|
||||
#include <stdio.h>
|
||||
#include <string.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
|
||||
wctob (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];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user