aboutsummaryrefslogtreecommitdiff
path: root/REORG.TODO/inet
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/inet')
-rw-r--r--REORG.TODO/inet/Makefile105
-rw-r--r--REORG.TODO/inet/Versions92
-rw-r--r--REORG.TODO/inet/aliases.h63
-rw-r--r--REORG.TODO/inet/arpa/ftp.h105
-rw-r--r--REORG.TODO/inet/arpa/inet.h105
-rw-r--r--REORG.TODO/inet/arpa/telnet.h316
-rw-r--r--REORG.TODO/inet/arpa/tftp.h82
-rw-r--r--REORG.TODO/inet/bug-if1.c53
-rw-r--r--REORG.TODO/inet/check_native.c27
-rw-r--r--REORG.TODO/inet/check_pf.c71
-rw-r--r--REORG.TODO/inet/deadline.c122
-rw-r--r--REORG.TODO/inet/ether_aton.c28
-rw-r--r--REORG.TODO/inet/ether_aton_r.c63
-rw-r--r--REORG.TODO/inet/ether_hton.c81
-rw-r--r--REORG.TODO/inet/ether_line.c76
-rw-r--r--REORG.TODO/inet/ether_ntoa.c29
-rw-r--r--REORG.TODO/inet/ether_ntoa_r.c33
-rw-r--r--REORG.TODO/inet/ether_ntoh.c84
-rw-r--r--REORG.TODO/inet/getaliasent.c28
-rw-r--r--REORG.TODO/inet/getaliasent_r.c31
-rw-r--r--REORG.TODO/inet/getaliasname.c32
-rw-r--r--REORG.TODO/inet/getaliasname_r.c31
-rw-r--r--REORG.TODO/inet/gethstbyad.c30
-rw-r--r--REORG.TODO/inet/gethstbyad_r.c52
-rw-r--r--REORG.TODO/inet/gethstbynm.c37
-rw-r--r--REORG.TODO/inet/gethstbynm2.c38
-rw-r--r--REORG.TODO/inet/gethstbynm2_r.c45
-rw-r--r--REORG.TODO/inet/gethstbynm_r.c44
-rw-r--r--REORG.TODO/inet/gethstent.c26
-rw-r--r--REORG.TODO/inet/gethstent_r.c34
-rw-r--r--REORG.TODO/inet/getipv4sourcefilter.c32
-rw-r--r--REORG.TODO/inet/getnameinfo.c563
-rw-r--r--REORG.TODO/inet/getnetbyad.c34
-rw-r--r--REORG.TODO/inet/getnetbyad_r.c34
-rw-r--r--REORG.TODO/inet/getnetbynm.c33
-rw-r--r--REORG.TODO/inet/getnetbynm_r.c33
-rw-r--r--REORG.TODO/inet/getnetent.c29
-rw-r--r--REORG.TODO/inet/getnetent_r.c34
-rw-r--r--REORG.TODO/inet/getnetgrent.c49
-rw-r--r--REORG.TODO/inet/getnetgrent_r.c535
-rw-r--r--REORG.TODO/inet/getproto.c32
-rw-r--r--REORG.TODO/inet/getproto_r.c31
-rw-r--r--REORG.TODO/inet/getprtent.c28
-rw-r--r--REORG.TODO/inet/getprtent_r.c32
-rw-r--r--REORG.TODO/inet/getprtname.c32
-rw-r--r--REORG.TODO/inet/getprtname_r.c31
-rw-r--r--REORG.TODO/inet/getservent.c25
-rw-r--r--REORG.TODO/inet/getservent_r.c29
-rw-r--r--REORG.TODO/inet/getsourcefilter.c32
-rw-r--r--REORG.TODO/inet/getsrvbynm.c29
-rw-r--r--REORG.TODO/inet/getsrvbynm_r.c28
-rw-r--r--REORG.TODO/inet/getsrvbypt.c29
-rw-r--r--REORG.TODO/inet/getsrvbypt_r.c28
-rw-r--r--REORG.TODO/inet/herrno-loc.c29
-rw-r--r--REORG.TODO/inet/herrno.c30
-rw-r--r--REORG.TODO/inet/htonl.c35
-rw-r--r--REORG.TODO/inet/htons.c34
-rw-r--r--REORG.TODO/inet/htontest.c70
-rw-r--r--REORG.TODO/inet/if_index.c60
-rw-r--r--REORG.TODO/inet/ifaddrs.c47
-rw-r--r--REORG.TODO/inet/ifaddrs.h73
-rw-r--r--REORG.TODO/inet/ifreq.c26
-rw-r--r--REORG.TODO/inet/in6_addr.c30
-rw-r--r--REORG.TODO/inet/inet6_opt.c281
-rw-r--r--REORG.TODO/inet/inet6_option.c349
-rw-r--r--REORG.TODO/inet/inet6_rth.c196
-rw-r--r--REORG.TODO/inet/inet6_scopeid_pton.c63
-rw-r--r--REORG.TODO/inet/inet_lnaof.c50
-rw-r--r--REORG.TODO/inet/inet_mkadr.c55
-rw-r--r--REORG.TODO/inet/inet_net.c109
-rw-r--r--REORG.TODO/inet/inet_netof.c50
-rw-r--r--REORG.TODO/inet/inet_ntoa.c38
-rw-r--r--REORG.TODO/inet/net-internal.h119
-rw-r--r--REORG.TODO/inet/netgroup.h85
-rw-r--r--REORG.TODO/inet/netinet/ether.h55
-rw-r--r--REORG.TODO/inet/netinet/icmp6.h345
-rw-r--r--REORG.TODO/inet/netinet/igmp.h125
-rw-r--r--REORG.TODO/inet/netinet/in.h632
-rw-r--r--REORG.TODO/inet/netinet/ip6.h188
-rw-r--r--REORG.TODO/inet/protocols/routed.h101
-rw-r--r--REORG.TODO/inet/protocols/rwhod.h67
-rw-r--r--REORG.TODO/inet/protocols/talkd.h115
-rw-r--r--REORG.TODO/inet/protocols/timed.h99
-rw-r--r--REORG.TODO/inet/rcmd.c827
-rw-r--r--REORG.TODO/inet/rexec.c198
-rw-r--r--REORG.TODO/inet/ruserpass.c250
-rw-r--r--REORG.TODO/inet/setipv4sourcefilter.c33
-rw-r--r--REORG.TODO/inet/setsourcefilter.c33
-rw-r--r--REORG.TODO/inet/test-hnto-types.c39
-rw-r--r--REORG.TODO/inet/test-ifaddrs.c99
-rw-r--r--REORG.TODO/inet/test-inet6_opt.c211
-rw-r--r--REORG.TODO/inet/test_ifindex.c67
-rw-r--r--REORG.TODO/inet/tst-checks-posix.c23
-rw-r--r--REORG.TODO/inet/tst-checks.c172
-rw-r--r--REORG.TODO/inet/tst-deadline.c188
-rw-r--r--REORG.TODO/inet/tst-ether_aton.c60
-rw-r--r--REORG.TODO/inet/tst-ether_line.c38
-rw-r--r--REORG.TODO/inet/tst-gethnm.c67
-rw-r--r--REORG.TODO/inet/tst-getni1.c36
-rw-r--r--REORG.TODO/inet/tst-getni2.c41
-rw-r--r--REORG.TODO/inet/tst-inet6_rth.c192
-rw-r--r--REORG.TODO/inet/tst-inet6_scopeid_pton.c131
-rw-r--r--REORG.TODO/inet/tst-network.c81
-rw-r--r--REORG.TODO/inet/tst-ntoa.c39
-rw-r--r--REORG.TODO/inet/tst-sockaddr.c125
105 files changed, 10231 insertions, 0 deletions
diff --git a/REORG.TODO/inet/Makefile b/REORG.TODO/inet/Makefile
new file mode 100644
index 0000000000..38c61bdc61
--- /dev/null
+++ b/REORG.TODO/inet/Makefile
@@ -0,0 +1,105 @@
+# Copyright (C) 1991-2017 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 Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 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
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+#
+# Sub-makefile for inet portion of the library.
+#
+subdir := inet
+
+include ../Makeconfig
+
+headers := netinet/ether.h netinet/in.h netinet/in_systm.h \
+ netinet/if_ether.h netinet/igmp.h \
+ netinet/tcp.h netinet/ip.h $(wildcard arpa/*.h protocols/*.h) \
+ aliases.h ifaddrs.h netinet/ip6.h netinet/icmp6.h bits/in.h
+
+routines := htonl htons \
+ inet_lnaof inet_mkadr \
+ inet_netof inet_ntoa inet_net herrno herrno-loc \
+ gethstbyad gethstbyad_r gethstbynm gethstbynm2 gethstbynm2_r \
+ gethstbynm_r gethstent gethstent_r \
+ getnetbyad getnetbyad_r getnetbynm getnetent getnetent_r \
+ getnetbynm_r \
+ getproto getproto_r getprtent getprtent_r getprtname getprtname_r \
+ getsrvbynm getsrvbynm_r getsrvbypt getsrvbypt_r getservent \
+ getservent_r \
+ ether_aton ether_aton_r ether_hton ether_line \
+ ether_ntoa ether_ntoa_r ether_ntoh \
+ rcmd rexec ruserpass \
+ getnetgrent_r getnetgrent \
+ getaliasent_r getaliasent getaliasname getaliasname_r \
+ in6_addr getnameinfo if_index ifaddrs inet6_option \
+ getipv4sourcefilter setipv4sourcefilter \
+ getsourcefilter setsourcefilter inet6_opt inet6_rth \
+ inet6_scopeid_pton deadline
+
+aux := check_pf check_native ifreq
+
+tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
+ tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line \
+ tst-getni1 tst-getni2 tst-inet6_rth tst-checks tst-checks-posix \
+ tst-sockaddr test-hnto-types
+
+# tst-deadline must be linked statically so that we can access
+# internal functions.
+tests-static += tst-deadline
+tests-static-internal := tst-deadline
+
+# tst-inet6_scopeid_pton also needs internal functions but does not
+# need to be linked statically.
+tests-internal := tst-inet6_scopeid_pton
+
+include ../Rules
+
+ifeq ($(have-thread-library),yes)
+
+CFLAGS-gethstbyad_r.c = -fexceptions
+CFLAGS-gethstbyad.c = -fexceptions
+CFLAGS-gethstbynm_r.c = -fexceptions
+CFLAGS-gethstbynm.c = -fexceptions
+CFLAGS-gethstbynm2_r.c = -fexceptions
+CFLAGS-gethstbynm2.c = -fexceptions
+CFLAGS-gethstent_r.c = -fexceptions
+CFLAGS-gethstent.c = -fexceptions
+CFLAGS-rcmd.c = -fexceptions
+CFLAGS-getnetbynm_r.c = -fexceptions
+CFLAGS-getnetbynm.c = -fexceptions
+CFLAGS-getnetbyad_r.c = -fexceptions
+CFLAGS-getnetbyad.c = -fexceptions
+CFLAGS-getnetent_r.c = -fexceptions
+CFLAGS-getnetent.c = -fexceptions
+CFLAGS-getaliasent_r.c = -fexceptions
+CFLAGS-getaliasent.c = -fexceptions
+CFLAGS-getrpcent_r.c = -fexceptions
+CFLAGS-getrpcent.c = -fexceptions
+CFLAGS-getservent_r.c = -fexceptions
+CFLAGS-getservent.c = -fexceptions
+CFLAGS-getprtent_r.c = -fexceptions
+CFLAGS-getprtent.c = -fexceptions
+CFLAGS-either_ntoh.c = -fexceptions
+CFLAGS-either_hton.c = -fexceptions
+CFLAGS-getnetgrent.c = -fexceptions
+CFLAGS-getnetgrent_r.c = -fexceptions
+
+CFLAGS-tst-checks-posix.c = -std=c99
+CFLAGS-tst-sockaddr.c = -fno-strict-aliasing
+
+endif
+
+ifeq ($(build-static-nss),yes)
+CFLAGS += -DSTATIC_NSS
+endif
diff --git a/REORG.TODO/inet/Versions b/REORG.TODO/inet/Versions
new file mode 100644
index 0000000000..6f663f3648
--- /dev/null
+++ b/REORG.TODO/inet/Versions
@@ -0,0 +1,92 @@
+libc {
+ GLIBC_2.0 {
+ # functions with required interface outside normal name space
+ __ivaliduser; __check_rhosts_file; __rcmd_errstr;
+
+ # variables in normal name space
+ rexecoptions;
+
+ # e*
+ endaliasent; endhostent; endnetent; endnetgrent; endprotoent; endservent;
+
+ # e*
+ ether_aton; ether_aton_r; ether_hostton; ether_line; ether_ntoa;
+ ether_ntoa_r; ether_ntohost;
+
+ # g*
+ getaliasbyname; getaliasbyname_r; getaliasent; getaliasent_r;
+ getdomainname; gethostbyaddr; gethostbyaddr_r; gethostbyname;
+ gethostbyname2; gethostbyname2_r; gethostbyname_r; gethostent;
+ gethostent_r; getnetbyaddr; getnetbyaddr_r; getnetbyname;
+ getnetbyname_r; getnetent; getnetent_r; getnetgrent; getnetgrent_r;
+ getprotobyname; getprotobyname_r; getprotobynumber;
+ getprotobynumber_r; getprotoent; getprotoent_r;
+ getservbyname; getservbyname_r; getservbyport;
+ getservbyport_r; getservent; getservent_r;
+
+ # h*
+ htonl; htons;
+
+ # i*
+ inet_addr; inet_aton; inet_lnaof; inet_makeaddr; inet_netof; inet_network;
+ inet_nsap_addr; inet_nsap_ntoa; inet_ntoa; inet_ntop; inet_pton; innetgr;
+ iruserok;
+
+ # n*
+ ntohl; ntohs;
+
+ # r*
+ rcmd; rexec; rresvport; ruserok; ruserpass;
+
+ # s*
+ setaliasent; setnetent; setnetgrent; setprotoent; setservent;
+ }
+ GLIBC_2.1 {
+ # variables in normal name space
+ in6addr_any; in6addr_loopback;
+
+ # i*
+ if_freenameindex; if_indextoname; if_nameindex; if_nametoindex;
+ }
+ GLIBC_2.1.2 {
+ # g*
+ getaliasbyname_r; getaliasent_r; gethostbyaddr_r; gethostbyname2_r;
+ gethostbyname_r; gethostent_r; getnetbyaddr_r; getnetbyname_r;
+ getnetent_r; getnetgrent_r; getprotobyname_r; getprotobynumber_r;
+ getprotoent_r; getservbyname_r;
+ }
+ GLIBC_2.2 {
+ # i*
+ iruserok_af;
+ # r*
+ rcmd_af; rexec_af; rresvport_af; ruserok_af;
+ }
+ GLIBC_2.3 {
+ # f*
+ freeifaddrs;
+ # g*
+ getifaddrs;
+ }
+ GLIBC_2.3.3 {
+ inet6_option_space; inet6_option_init; inet6_option_append;
+ inet6_option_alloc; inet6_option_next; inet6_option_find;
+ }
+ GLIBC_2.3.4 {
+ getipv4sourcefilter; setipv4sourcefilter;
+ getsourcefilter; setsourcefilter;
+ }
+ GLIBC_2.5 {
+ inet6_opt_init; inet6_opt_append; inet6_opt_finish; inet6_opt_set_val;
+ inet6_opt_next; inet6_opt_find; inet6_opt_get_val;
+ inet6_rth_space; inet6_rth_init; inet6_rth_add; inet6_rth_reverse;
+ inet6_rth_segments; inet6_rth_getaddr;
+ }
+ GLIBC_PRIVATE {
+ # functions used in other libraries
+ __internal_endnetgrent; __internal_getnetgrent_r;
+ __internal_setnetgrent;
+
+ # Used from nscd.
+ __inet6_scopeid_pton;
+ }
+}
diff --git a/REORG.TODO/inet/aliases.h b/REORG.TODO/inet/aliases.h
new file mode 100644
index 0000000000..76b43cd96a
--- /dev/null
+++ b/REORG.TODO/inet/aliases.h
@@ -0,0 +1,63 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _ALIASES_H
+#define _ALIASES_H 1
+
+#include <features.h>
+
+#include <sys/types.h>
+
+
+__BEGIN_DECLS
+
+/* Structure to represent one entry of the alias data base. */
+struct aliasent
+ {
+ char *alias_name;
+ size_t alias_members_len;
+ char **alias_members;
+ int alias_local;
+ };
+
+
+/* Open alias data base files. */
+extern void setaliasent (void) __THROW;
+
+/* Close alias data base files. */
+extern void endaliasent (void) __THROW;
+
+/* Get the next entry from the alias data base. */
+extern struct aliasent *getaliasent (void) __THROW;
+
+/* Get the next entry from the alias data base and put it in RESULT_BUF. */
+extern int getaliasent_r (struct aliasent *__restrict __result_buf,
+ char *__restrict __buffer, size_t __buflen,
+ struct aliasent **__restrict __result) __THROW;
+
+/* Get alias entry corresponding to NAME. */
+extern struct aliasent *getaliasbyname (const char *__name) __THROW;
+
+/* Get alias entry corresponding to NAME and put it in RESULT_BUF. */
+extern int getaliasbyname_r (const char *__restrict __name,
+ struct aliasent *__restrict __result_buf,
+ char *__restrict __buffer, size_t __buflen,
+ struct aliasent **__restrict __result) __THROW;
+
+__END_DECLS
+
+#endif /* aliases.h */
diff --git a/REORG.TODO/inet/arpa/ftp.h b/REORG.TODO/inet/arpa/ftp.h
new file mode 100644
index 0000000000..e5b340db12
--- /dev/null
+++ b/REORG.TODO/inet/arpa/ftp.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 1983, 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ftp.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _ARPA_FTP_H
+#define _ARPA_FTP_H 1
+
+/* Definitions for FTP; see RFC-765. */
+
+/*
+ * Reply codes.
+ */
+#define PRELIM 1 /* positive preliminary */
+#define COMPLETE 2 /* positive completion */
+#define CONTINUE 3 /* positive intermediate */
+#define TRANSIENT 4 /* transient negative completion */
+#define ERROR 5 /* permanent negative completion */
+
+/*
+ * Type codes
+ */
+#define TYPE_A 1 /* ASCII */
+#define TYPE_E 2 /* EBCDIC */
+#define TYPE_I 3 /* image */
+#define TYPE_L 4 /* local byte size */
+
+#ifdef FTP_NAMES
+char *typenames[] = {"0", "ASCII", "EBCDIC", "Image", "Local" };
+#endif
+
+/*
+ * Form codes
+ */
+#define FORM_N 1 /* non-print */
+#define FORM_T 2 /* telnet format effectors */
+#define FORM_C 3 /* carriage control (ASA) */
+#ifdef FTP_NAMES
+char *formnames[] = {"0", "Nonprint", "Telnet", "Carriage-control" };
+#endif
+
+/*
+ * Structure codes
+ */
+#define STRU_F 1 /* file (no record structure) */
+#define STRU_R 2 /* record structure */
+#define STRU_P 3 /* page structure */
+#ifdef FTP_NAMES
+char *strunames[] = {"0", "File", "Record", "Page" };
+#endif
+
+/*
+ * Mode types
+ */
+#define MODE_S 1 /* stream */
+#define MODE_B 2 /* block */
+#define MODE_C 3 /* compressed */
+#ifdef FTP_NAMES
+char *modenames[] = {"0", "Stream", "Block", "Compressed" };
+#endif
+
+/*
+ * Record Tokens
+ */
+#define REC_ESC '\377' /* Record-mode Escape */
+#define REC_EOR '\001' /* Record-mode End-of-Record */
+#define REC_EOF '\002' /* Record-mode End-of-File */
+
+/*
+ * Block Header
+ */
+#define BLK_EOR 0x80 /* Block is End-of-Record */
+#define BLK_EOF 0x40 /* Block is End-of-File */
+#define BLK_ERRORS 0x20 /* Block is suspected of containing errors */
+#define BLK_RESTART 0x10 /* Block is Restart Marker */
+
+#define BLK_BYTECOUNT 2 /* Bytes in this block */
+
+#endif /* arpa/ftp.h */
diff --git a/REORG.TODO/inet/arpa/inet.h b/REORG.TODO/inet/arpa/inet.h
new file mode 100644
index 0000000000..17c777bae2
--- /dev/null
+++ b/REORG.TODO/inet/arpa/inet.h
@@ -0,0 +1,105 @@
+/* Copyright (C) 1997-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _ARPA_INET_H
+#define _ARPA_INET_H 1
+
+#include <features.h>
+#include <netinet/in.h> /* To define `struct in_addr'. */
+
+/* Type for length arguments in socket calls. */
+#ifndef __socklen_t_defined
+typedef __socklen_t socklen_t;
+# define __socklen_t_defined
+#endif
+
+__BEGIN_DECLS
+
+/* Convert Internet host address from numbers-and-dots notation in CP
+ into binary data in network byte order. */
+extern in_addr_t inet_addr (const char *__cp) __THROW;
+
+/* Return the local host address part of the Internet address in IN. */
+extern in_addr_t inet_lnaof (struct in_addr __in) __THROW;
+
+/* Make Internet host address in network byte order by combining the
+ network number NET with the local address HOST. */
+extern struct in_addr inet_makeaddr (in_addr_t __net, in_addr_t __host)
+ __THROW;
+
+/* Return network number part of the Internet address IN. */
+extern in_addr_t inet_netof (struct in_addr __in) __THROW;
+
+/* Extract the network number in network byte order from the address
+ in numbers-and-dots natation starting at CP. */
+extern in_addr_t inet_network (const char *__cp) __THROW;
+
+/* Convert Internet number in IN to ASCII representation. The return value
+ is a pointer to an internal array containing the string. */
+extern char *inet_ntoa (struct in_addr __in) __THROW;
+
+/* Convert from presentation format of an Internet number in buffer
+ starting at CP to the binary network format and store result for
+ interface type AF in buffer starting at BUF. */
+extern int inet_pton (int __af, const char *__restrict __cp,
+ void *__restrict __buf) __THROW;
+
+/* Convert a Internet address in binary network format for interface
+ type AF in buffer starting at CP to presentation form and place
+ result in buffer of length LEN astarting at BUF. */
+extern const char *inet_ntop (int __af, const void *__restrict __cp,
+ char *__restrict __buf, socklen_t __len)
+ __THROW;
+
+
+/* The following functions are not part of XNS 5.2. */
+#ifdef __USE_MISC
+/* Convert Internet host address from numbers-and-dots notation in CP
+ into binary data and store the result in the structure INP. */
+extern int inet_aton (const char *__cp, struct in_addr *__inp) __THROW;
+
+/* Format a network number NET into presentation format and place result
+ in buffer starting at BUF with length of LEN bytes. */
+extern char *inet_neta (in_addr_t __net, char *__buf, size_t __len) __THROW;
+
+/* Convert network number for interface type AF in buffer starting at
+ CP to presentation format. The result will specifiy BITS bits of
+ the number. */
+extern char *inet_net_ntop (int __af, const void *__cp, int __bits,
+ char *__buf, size_t __len) __THROW;
+
+/* Convert network number for interface type AF from presentation in
+ buffer starting at CP to network format and store result int
+ buffer starting at BUF of size LEN. */
+extern int inet_net_pton (int __af, const char *__cp,
+ void *__buf, size_t __len) __THROW;
+
+/* Convert ASCII representation in hexadecimal form of the Internet
+ address to binary form and place result in buffer of length LEN
+ starting at BUF. */
+extern unsigned int inet_nsap_addr (const char *__cp,
+ unsigned char *__buf, int __len) __THROW;
+
+/* Convert internet address in binary form in LEN bytes starting at CP
+ a presentation form and place result in BUF. */
+extern char *inet_nsap_ntoa (int __len, const unsigned char *__cp,
+ char *__buf) __THROW;
+#endif
+
+__END_DECLS
+
+#endif /* arpa/inet.h */
diff --git a/REORG.TODO/inet/arpa/telnet.h b/REORG.TODO/inet/arpa/telnet.h
new file mode 100644
index 0000000000..3774c89285
--- /dev/null
+++ b/REORG.TODO/inet/arpa/telnet.h
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)telnet.h 8.2 (Berkeley) 12/15/93
+ */
+
+#ifndef _ARPA_TELNET_H
+#define _ARPA_TELNET_H 1
+
+/*
+ * Definitions for the TELNET protocol.
+ */
+#define IAC 255 /* interpret as command: */
+#define DONT 254 /* you are not to use option */
+#define DO 253 /* please, you use option */
+#define WONT 252 /* I won't use option */
+#define WILL 251 /* I will use option */
+#define SB 250 /* interpret as subnegotiation */
+#define GA 249 /* you may reverse the line */
+#define EL 248 /* erase the current line */
+#define EC 247 /* erase the current character */
+#define AYT 246 /* are you there */
+#define AO 245 /* abort output--but let prog finish */
+#define IP 244 /* interrupt process--permanently */
+#define BREAK 243 /* break */
+#define DM 242 /* data mark--for connect. cleaning */
+#define NOP 241 /* nop */
+#define SE 240 /* end sub negotiation */
+#define EOR 239 /* end of record (transparent mode) */
+#define ABORT 238 /* Abort process */
+#define SUSP 237 /* Suspend process */
+#define xEOF 236 /* End of file: EOF is already used... */
+
+#define SYNCH 242 /* for telfunc calls */
+
+#ifdef TELCMDS
+char *telcmds[] = {
+ "EOF", "SUSP", "ABORT", "EOR",
+ "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
+ "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
+};
+#else
+extern char *telcmds[];
+#endif
+
+#define TELCMD_FIRST xEOF
+#define TELCMD_LAST IAC
+#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \
+ (unsigned int)(x) >= TELCMD_FIRST)
+#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]
+
+/* telnet options */
+#define TELOPT_BINARY 0 /* 8-bit data path */
+#define TELOPT_ECHO 1 /* echo */
+#define TELOPT_RCP 2 /* prepare to reconnect */
+#define TELOPT_SGA 3 /* suppress go ahead */
+#define TELOPT_NAMS 4 /* approximate message size */
+#define TELOPT_STATUS 5 /* give status */
+#define TELOPT_TM 6 /* timing mark */
+#define TELOPT_RCTE 7 /* remote controlled transmission and echo */
+#define TELOPT_NAOL 8 /* negotiate about output line width */
+#define TELOPT_NAOP 9 /* negotiate about output page size */
+#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */
+#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */
+#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */
+#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */
+#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */
+#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */
+#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */
+#define TELOPT_XASCII 17 /* extended ascii character set */
+#define TELOPT_LOGOUT 18 /* force logout */
+#define TELOPT_BM 19 /* byte macro */
+#define TELOPT_DET 20 /* data entry terminal */
+#define TELOPT_SUPDUP 21 /* supdup protocol */
+#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */
+#define TELOPT_SNDLOC 23 /* send location */
+#define TELOPT_TTYPE 24 /* terminal type */
+#define TELOPT_EOR 25 /* end or record */
+#define TELOPT_TUID 26 /* TACACS user identification */
+#define TELOPT_OUTMRK 27 /* output marking */
+#define TELOPT_TTYLOC 28 /* terminal location number */
+#define TELOPT_3270REGIME 29 /* 3270 regime */
+#define TELOPT_X3PAD 30 /* X.3 PAD */
+#define TELOPT_NAWS 31 /* window size */
+#define TELOPT_TSPEED 32 /* terminal speed */
+#define TELOPT_LFLOW 33 /* remote flow control */
+#define TELOPT_LINEMODE 34 /* Linemode option */
+#define TELOPT_XDISPLOC 35 /* X Display Location */
+#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */
+#define TELOPT_AUTHENTICATION 37/* Authenticate */
+#define TELOPT_ENCRYPT 38 /* Encryption option */
+#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */
+#define TELOPT_EXOPL 255 /* extended-options-list */
+
+
+#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
+#ifdef TELOPTS
+char *telopts[NTELOPTS+1] = {
+ "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
+ "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
+ "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
+ "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
+ "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
+ "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
+ "TACACS UID", "OUTPUT MARKING", "TTYLOC",
+ "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
+ "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
+ "ENCRYPT", "NEW-ENVIRON",
+ 0,
+};
+#define TELOPT_FIRST TELOPT_BINARY
+#define TELOPT_LAST TELOPT_NEW_ENVIRON
+#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST)
+#define TELOPT(x) telopts[(x)-TELOPT_FIRST]
+#endif
+
+/* sub-option qualifiers */
+#define TELQUAL_IS 0 /* option is... */
+#define TELQUAL_SEND 1 /* send option */
+#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
+#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */
+#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */
+
+#define LFLOW_OFF 0 /* Disable remote flow control */
+#define LFLOW_ON 1 /* Enable remote flow control */
+#define LFLOW_RESTART_ANY 2 /* Restart output on any char */
+#define LFLOW_RESTART_XON 3 /* Restart output only on XON */
+
+/*
+ * LINEMODE suboptions
+ */
+
+#define LM_MODE 1
+#define LM_FORWARDMASK 2
+#define LM_SLC 3
+
+#define MODE_EDIT 0x01
+#define MODE_TRAPSIG 0x02
+#define MODE_ACK 0x04
+#define MODE_SOFT_TAB 0x08
+#define MODE_LIT_ECHO 0x10
+
+#define MODE_MASK 0x1f
+
+/* Not part of protocol, but needed to simplify things... */
+#define MODE_FLOW 0x0100
+#define MODE_ECHO 0x0200
+#define MODE_INBIN 0x0400
+#define MODE_OUTBIN 0x0800
+#define MODE_FORCE 0x1000
+
+#define SLC_SYNCH 1
+#define SLC_BRK 2
+#define SLC_IP 3
+#define SLC_AO 4
+#define SLC_AYT 5
+#define SLC_EOR 6
+#define SLC_ABORT 7
+#define SLC_EOF 8
+#define SLC_SUSP 9
+#define SLC_EC 10
+#define SLC_EL 11
+#define SLC_EW 12
+#define SLC_RP 13
+#define SLC_LNEXT 14
+#define SLC_XON 15
+#define SLC_XOFF 16
+#define SLC_FORW1 17
+#define SLC_FORW2 18
+
+#define NSLC 18
+
+/*
+ * For backwards compatibility, we define SLC_NAMES to be the
+ * list of names if SLC_NAMES is not defined.
+ */
+#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
+ "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+ "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#ifdef SLC_NAMES
+char *slc_names[] = {
+ SLC_NAMELIST
+};
+#else
+extern char *slc_names[];
+#define SLC_NAMES SLC_NAMELIST
+#endif
+
+#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC)
+#define SLC_NAME(x) slc_names[x]
+
+#define SLC_NOSUPPORT 0
+#define SLC_CANTCHANGE 1
+#define SLC_VARIABLE 2
+#define SLC_DEFAULT 3
+#define SLC_LEVELBITS 0x03
+
+#define SLC_FUNC 0
+#define SLC_FLAGS 1
+#define SLC_VALUE 2
+
+#define SLC_ACK 0x80
+#define SLC_FLUSHIN 0x40
+#define SLC_FLUSHOUT 0x20
+
+#define OLD_ENV_VAR 1
+#define OLD_ENV_VALUE 0
+#define NEW_ENV_VAR 0
+#define NEW_ENV_VALUE 1
+#define ENV_ESC 2
+#define ENV_USERVAR 3
+
+/*
+ * AUTHENTICATION suboptions
+ */
+
+/*
+ * Who is authenticating who ...
+ */
+#define AUTH_WHO_CLIENT 0 /* Client authenticating server */
+#define AUTH_WHO_SERVER 1 /* Server authenticating client */
+#define AUTH_WHO_MASK 1
+
+/*
+ * amount of authentication done
+ */
+#define AUTH_HOW_ONE_WAY 0
+#define AUTH_HOW_MUTUAL 2
+#define AUTH_HOW_MASK 2
+
+#define AUTHTYPE_NULL 0
+#define AUTHTYPE_KERBEROS_V4 1
+#define AUTHTYPE_KERBEROS_V5 2
+#define AUTHTYPE_SPX 3
+#define AUTHTYPE_MINK 4
+#define AUTHTYPE_CNT 5
+
+#define AUTHTYPE_TEST 99
+
+#ifdef AUTH_NAMES
+char *authtype_names[] = {
+ "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
+};
+#else
+extern char *authtype_names[];
+#endif
+
+#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT)
+#define AUTHTYPE_NAME(x) authtype_names[x]
+
+/*
+ * ENCRYPTion suboptions
+ */
+#define ENCRYPT_IS 0 /* I pick encryption type ... */
+#define ENCRYPT_SUPPORT 1 /* I support encryption types ... */
+#define ENCRYPT_REPLY 2 /* Initial setup response */
+#define ENCRYPT_START 3 /* Am starting to send encrypted */
+#define ENCRYPT_END 4 /* Am ending encrypted */
+#define ENCRYPT_REQSTART 5 /* Request you start encrypting */
+#define ENCRYPT_REQEND 6 /* Request you send encrypting */
+#define ENCRYPT_ENC_KEYID 7
+#define ENCRYPT_DEC_KEYID 8
+#define ENCRYPT_CNT 9
+
+#define ENCTYPE_ANY 0
+#define ENCTYPE_DES_CFB64 1
+#define ENCTYPE_DES_OFB64 2
+#define ENCTYPE_CNT 3
+
+#ifdef ENCRYPT_NAMES
+char *encrypt_names[] = {
+ "IS", "SUPPORT", "REPLY", "START", "END",
+ "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
+ 0,
+};
+char *enctype_names[] = {
+ "ANY", "DES_CFB64", "DES_OFB64", 0,
+};
+#else
+extern char *encrypt_names[];
+extern char *enctype_names[];
+#endif
+
+
+#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT)
+#define ENCRYPT_NAME(x) encrypt_names[x]
+
+#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT)
+#define ENCTYPE_NAME(x) enctype_names[x]
+
+#endif /* arpa/telnet.h */
diff --git a/REORG.TODO/inet/arpa/tftp.h b/REORG.TODO/inet/arpa/tftp.h
new file mode 100644
index 0000000000..86e0b6e814
--- /dev/null
+++ b/REORG.TODO/inet/arpa/tftp.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)tftp.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _ARPA_TFTP_H
+#define _ARPA_TFTP_H 1
+
+/*
+ * Trivial File Transfer Protocol (IEN-133)
+ */
+#define SEGSIZE 512 /* data segment size */
+
+/*
+ * Packet types.
+ */
+#define RRQ 01 /* read request */
+#define WRQ 02 /* write request */
+#define DATA 03 /* data packet */
+#define ACK 04 /* acknowledgement */
+#define ERROR 05 /* error code */
+
+struct tftphdr {
+ short th_opcode; /* packet type */
+ union {
+ char tu_padding[3]; /* sizeof() compat */
+ struct {
+ union {
+ unsigned short tu_block; /* block # */
+ short tu_code; /* error code */
+ } __attribute__ ((__packed__)) th_u3;
+ char tu_data[0]; /* data or error string */
+ } __attribute__ ((__packed__)) th_u2;
+ char tu_stuff[0]; /* request packet stuff */
+ } __attribute__ ((__packed__)) th_u1;
+} __attribute__ ((__packed__));
+
+#define th_block th_u1.th_u2.th_u3.tu_block
+#define th_code th_u1.th_u2.th_u3.tu_code
+#define th_stuff th_u1.tu_stuff
+#define th_data th_u1.th_u2.tu_data
+#define th_msg th_u1.th_u2.tu_data
+
+/*
+ * Error codes.
+ */
+#define EUNDEF 0 /* not defined */
+#define ENOTFOUND 1 /* file not found */
+#define EACCESS 2 /* access violation */
+#define ENOSPACE 3 /* disk full or allocation exceeded */
+#define EBADOP 4 /* illegal TFTP operation */
+#define EBADID 5 /* unknown transfer ID */
+#define EEXISTS 6 /* file already exists */
+#define ENOUSER 7 /* no such user */
+
+#endif /* arpa/tftp.h */
diff --git a/REORG.TODO/inet/bug-if1.c b/REORG.TODO/inet/bug-if1.c
new file mode 100644
index 0000000000..b70a19d571
--- /dev/null
+++ b/REORG.TODO/inet/bug-if1.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <net/if.h>
+
+
+static int
+do_test (void)
+{
+ char buf[IF_NAMESIZE];
+ /* Index 0 is always invalid (see RFC 3493). */
+ char *cp = if_indextoname (0, buf);
+ if (cp != NULL)
+ {
+ printf ("invalid index returned result \"%s\"\n", cp);
+ return 1;
+ }
+ else if (errno != ENXIO)
+ {
+ int err = errno;
+ char errbuf1[256];
+ char errbuf2[256];
+
+ printf ("errno = %d (%s), expected %d (%s)\n",
+ err, strerror_r (err, errbuf1, sizeof (errbuf1)),
+ ENXIO, strerror_r (ENXIO, errbuf2, sizeof (errbuf2)));
+ return 1;
+ }
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/check_native.c b/REORG.TODO/inet/check_native.c
new file mode 100644
index 0000000000..3fc40536a3
--- /dev/null
+++ b/REORG.TODO/inet/check_native.c
@@ -0,0 +1,27 @@
+/* Determine whether interfaces use native transport. Generic version.
+ Copyright (C) 2012-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ifaddrs.h>
+#include <stdint.h>
+
+void
+attribute_hidden
+__check_native (uint32_t a1_index, int *a1_native,
+ uint32_t a2_index, int *a2_native)
+{
+}
diff --git a/REORG.TODO/inet/check_pf.c b/REORG.TODO/inet/check_pf.c
new file mode 100644
index 0000000000..a56723a7df
--- /dev/null
+++ b/REORG.TODO/inet/check_pf.c
@@ -0,0 +1,71 @@
+/* Determine protocol families for which interfaces exist. Generic version.
+ Copyright (C) 2003-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ifaddrs.h>
+#include <netdb.h>
+#include <stdint.h>
+
+void
+attribute_hidden
+__check_pf (bool *seen_ipv4, bool *seen_ipv6,
+ struct in6addrinfo **in6ai, size_t *in6ailen)
+{
+ /* By default we have no way to determine information about
+ deprecated and temporary addresses. */
+ *in6ai = NULL;
+ *in6ailen = 0;
+
+ /* Get the interface list via getifaddrs. */
+ struct ifaddrs *ifa = NULL;
+ if (getifaddrs (&ifa) != 0)
+ {
+ /* We cannot determine what interfaces are available. Be
+ pessimistic. */
+ *seen_ipv4 = true;
+ *seen_ipv6 = true;
+ return;
+ }
+
+ *seen_ipv4 = false;
+ *seen_ipv6 = false;
+
+ struct ifaddrs *runp;
+ for (runp = ifa; runp != NULL; runp = runp->ifa_next)
+ if (runp->ifa_addr->sa_family == PF_INET)
+ *seen_ipv4 = true;
+ else if (runp->ifa_addr->sa_family == PF_INET6)
+ *seen_ipv6 = true;
+
+ (void) freeifaddrs (ifa);
+}
+
+
+void
+__free_in6ai (struct in6addrinfo *in6ai)
+{
+ /* Nothing to do. */
+}
+
+
+#if IS_IN (nscd)
+uint32_t
+__bump_nl_timestamp (void)
+{
+ return 0;
+}
+#endif
diff --git a/REORG.TODO/inet/deadline.c b/REORG.TODO/inet/deadline.c
new file mode 100644
index 0000000000..c1fa415a39
--- /dev/null
+++ b/REORG.TODO/inet/deadline.c
@@ -0,0 +1,122 @@
+/* Computing deadlines for timeouts.
+ Copyright (C) 2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <net-internal.h>
+
+#include <assert.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <time.h>
+
+struct deadline_current_time internal_function
+__deadline_current_time (void)
+{
+ struct deadline_current_time result;
+ if (__clock_gettime (CLOCK_MONOTONIC, &result.current) != 0)
+ {
+ struct timeval current_tv;
+ if (__gettimeofday (&current_tv, NULL) == 0)
+ __libc_fatal ("Fatal error: gettimeofday system call failed\n");
+ result.current.tv_sec = current_tv.tv_sec;
+ result.current.tv_nsec = current_tv.tv_usec * 1000;
+ }
+ assert (result.current.tv_sec >= 0);
+ return result;
+}
+
+/* A special deadline value for which __deadline_is_infinite is
+ true. */
+static inline struct deadline
+infinite_deadline (void)
+{
+ return (struct deadline) { { -1, -1 } };
+}
+
+struct deadline internal_function
+__deadline_from_timeval (struct deadline_current_time current,
+ struct timeval tv)
+{
+ assert (__is_timeval_valid_timeout (tv));
+
+ /* Compute second-based deadline. Perform the addition in
+ uintmax_t, which is unsigned, to simply overflow detection. */
+ uintmax_t sec = current.current.tv_sec;
+ sec += tv.tv_sec;
+ if (sec < (uintmax_t) tv.tv_sec)
+ return infinite_deadline ();
+
+ /* Compute nanosecond deadline. */
+ int nsec = current.current.tv_nsec + tv.tv_usec * 1000;
+ if (nsec >= 1000 * 1000 * 1000)
+ {
+ /* Carry nanosecond overflow to seconds. */
+ nsec -= 1000 * 1000 * 1000;
+ if (sec + 1 < sec)
+ return infinite_deadline ();
+ ++sec;
+ }
+ /* This uses a GCC extension, otherwise these casts for detecting
+ overflow would not be defined. */
+ if ((time_t) sec < 0 || sec != (uintmax_t) (time_t) sec)
+ return infinite_deadline ();
+
+ return (struct deadline) { { sec, nsec } };
+}
+
+int internal_function
+__deadline_to_ms (struct deadline_current_time current,
+ struct deadline deadline)
+{
+ if (__deadline_is_infinite (deadline))
+ return INT_MAX;
+
+ if (current.current.tv_sec > deadline.absolute.tv_sec
+ || (current.current.tv_sec == deadline.absolute.tv_sec
+ && current.current.tv_nsec >= deadline.absolute.tv_nsec))
+ return 0;
+ time_t sec = deadline.absolute.tv_sec - current.current.tv_sec;
+ if (sec >= INT_MAX)
+ /* This value will overflow below. */
+ return INT_MAX;
+ int nsec = deadline.absolute.tv_nsec - current.current.tv_nsec;
+ if (nsec < 0)
+ {
+ /* Borrow from the seconds field. */
+ assert (sec > 0);
+ --sec;
+ nsec += 1000 * 1000 * 1000;
+ }
+
+ /* Prepare for rounding up to milliseconds. */
+ nsec += 999999;
+ if (nsec > 1000 * 1000 * 1000)
+ {
+ assert (sec < INT_MAX);
+ ++sec;
+ nsec -= 1000 * 1000 * 1000;
+ }
+
+ unsigned int msec = nsec / (1000 * 1000);
+ if (sec > INT_MAX / 1000)
+ return INT_MAX;
+ msec += sec * 1000;
+ if (msec > INT_MAX)
+ return INT_MAX;
+ return msec;
+}
diff --git a/REORG.TODO/inet/ether_aton.c b/REORG.TODO/inet/ether_aton.c
new file mode 100644
index 0000000000..830389e395
--- /dev/null
+++ b/REORG.TODO/inet/ether_aton.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netinet/ether.h>
+
+
+struct ether_addr *
+ether_aton (const char *asc)
+{
+ static struct ether_addr result;
+
+ return ether_aton_r (asc, &result);
+}
diff --git a/REORG.TODO/inet/ether_aton_r.c b/REORG.TODO/inet/ether_aton_r.c
new file mode 100644
index 0000000000..7b558325ea
--- /dev/null
+++ b/REORG.TODO/inet/ether_aton_r.c
@@ -0,0 +1,63 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+
+
+struct ether_addr *
+ether_aton_r (const char *asc, struct ether_addr *addr)
+{
+ size_t cnt;
+
+ for (cnt = 0; cnt < 6; ++cnt)
+ {
+ unsigned int number;
+ char ch;
+
+ ch = _tolower (*asc++);
+ if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
+ return NULL;
+ number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
+
+ ch = _tolower (*asc);
+ if ((cnt < 5 && ch != ':') || (cnt == 5 && ch != '\0' && !isspace (ch)))
+ {
+ ++asc;
+ if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
+ return NULL;
+ number <<= 4;
+ number += isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
+
+ ch = *asc;
+ if (cnt < 5 && ch != ':')
+ return NULL;
+ }
+
+ /* Store result. */
+ addr->ether_addr_octet[cnt] = (unsigned char) number;
+
+ /* Skip ':'. */
+ ++asc;
+ }
+
+ return addr;
+}
+libc_hidden_def (ether_aton_r)
diff --git a/REORG.TODO/inet/ether_hton.c b/REORG.TODO/inet/ether_hton.c
new file mode 100644
index 0000000000..a5523986c9
--- /dev/null
+++ b/REORG.TODO/inet/ether_hton.c
@@ -0,0 +1,81 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+#include <string.h>
+
+#include "../nss/nsswitch.h"
+
+/* Type of the lookup function we need here. */
+typedef int (*lookup_function) (const char *, struct etherent *, char *, int,
+ int *);
+
+/* The lookup function for the first entry of this service. */
+extern int __nss_ethers_lookup (service_user **nip, const char *name,
+ void **fctp) internal_function;
+
+
+int
+ether_hostton (const char *hostname, struct ether_addr *addr)
+{
+ static service_user *startp;
+ static lookup_function start_fct;
+ service_user *nip;
+ union
+ {
+ lookup_function f;
+ void *ptr;
+ } fct;
+ int no_more;
+ enum nss_status status = NSS_STATUS_UNAVAIL;
+ struct etherent etherent;
+
+ if (startp == NULL)
+ {
+ no_more = __nss_ethers_lookup (&nip, "gethostton_r", &fct.ptr);
+ if (no_more)
+ startp = (service_user *) -1;
+ else
+ {
+ startp = nip;
+ start_fct = fct.f;
+ }
+ }
+ else
+ {
+ fct.f = start_fct;
+ no_more = (nip = startp) == (service_user *) -1;
+ }
+
+ while (no_more == 0)
+ {
+ char buffer[1024];
+
+ status = (*fct.f) (hostname, &etherent, buffer, sizeof buffer, &errno);
+
+ no_more = __nss_next2 (&nip, "gethostton_r", NULL, &fct.ptr, status, 0);
+ }
+
+ if (status == NSS_STATUS_SUCCESS)
+ memcpy (addr, etherent.e_addr.ether_addr_octet,
+ sizeof (struct ether_addr));
+
+ return status == NSS_STATUS_SUCCESS ? 0 : -1;
+}
diff --git a/REORG.TODO/inet/ether_line.c b/REORG.TODO/inet/ether_line.c
new file mode 100644
index 0000000000..0e2cbbbac6
--- /dev/null
+++ b/REORG.TODO/inet/ether_line.c
@@ -0,0 +1,76 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+
+
+int
+ether_line (const char *line, struct ether_addr *addr, char *hostname)
+{
+ for (size_t cnt = 0; cnt < 6; ++cnt)
+ {
+ unsigned int number;
+ char ch;
+
+ ch = _tolower (*line++);
+ if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
+ return -1;
+ number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
+
+ ch = _tolower (*line);
+ if ((cnt < 5 && ch != ':') || (cnt == 5 && ch != '\0' && !isspace (ch)))
+ {
+ ++line;
+ if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
+ return -1;
+ number <<= 4;
+ number += isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
+
+ ch = *line;
+ if (cnt < 5 && ch != ':')
+ return -1;
+ }
+
+ /* Store result. */
+ addr->ether_addr_octet[cnt] = (unsigned char) number;
+
+ /* Skip ':'. */
+ if (ch != '\0')
+ ++line;
+ }
+
+ /* Skip initial whitespace. */
+ while (isspace (*line))
+ ++line;
+
+ if (*line == '#' || *line == '\0')
+ /* No hostname. */
+ return -1;
+
+ /* The hostname is up to the next non-space character. */
+ /* XXX This can cause trouble because the hostname might be too long
+ but we have no possibility to check it here. */
+ while (*line != '\0' && *line != '#' && !isspace (*line))
+ *hostname++ = *line++;
+ *hostname = '\0';
+
+ return 0;
+}
diff --git a/REORG.TODO/inet/ether_ntoa.c b/REORG.TODO/inet/ether_ntoa.c
new file mode 100644
index 0000000000..1e061bae73
--- /dev/null
+++ b/REORG.TODO/inet/ether_ntoa.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+
+
+char *
+ether_ntoa (const struct ether_addr *addr)
+{
+ static char asc[18];
+
+ return ether_ntoa_r (addr, asc);
+}
diff --git a/REORG.TODO/inet/ether_ntoa_r.c b/REORG.TODO/inet/ether_ntoa_r.c
new file mode 100644
index 0000000000..0d735a98b5
--- /dev/null
+++ b/REORG.TODO/inet/ether_ntoa_r.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+
+
+char *
+ether_ntoa_r (const struct ether_addr *addr, char *buf)
+{
+ sprintf (buf, "%x:%x:%x:%x:%x:%x",
+ addr->ether_addr_octet[0], addr->ether_addr_octet[1],
+ addr->ether_addr_octet[2], addr->ether_addr_octet[3],
+ addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
+ return buf;
+}
+libc_hidden_def (ether_ntoa_r)
diff --git a/REORG.TODO/inet/ether_ntoh.c b/REORG.TODO/inet/ether_ntoh.c
new file mode 100644
index 0000000000..b2f7422ace
--- /dev/null
+++ b/REORG.TODO/inet/ether_ntoh.c
@@ -0,0 +1,84 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <netinet/ether.h>
+#include <netinet/if_ether.h>
+#include <string.h>
+
+#include <nss/nsswitch.h>
+
+
+/* Type of the lookup function we need here. */
+typedef int (*lookup_function) (const struct ether_addr *, struct etherent *,
+ char *, size_t, int *);
+
+/* The lookup function for the first entry of this service. */
+extern int __nss_ethers_lookup (service_user **nip, const char *name,
+ void **fctp) internal_function;
+
+
+int
+ether_ntohost (char *hostname, const struct ether_addr *addr)
+{
+ static service_user *startp;
+ static lookup_function start_fct;
+ service_user *nip;
+ union
+ {
+ lookup_function f;
+ void *ptr;
+ } fct;
+ int no_more;
+ enum nss_status status = NSS_STATUS_UNAVAIL;
+ struct etherent etherent;
+
+ if (startp == NULL)
+ {
+ no_more = __nss_ethers_lookup (&nip, "getntohost_r", &fct.ptr);
+ if (no_more)
+ startp = (service_user *) -1;
+ else
+ {
+ startp = nip;
+ start_fct = fct.f;
+ }
+ }
+ else
+ {
+ fct.f = start_fct;
+ no_more = (nip = startp) == (service_user *) -1;
+ }
+
+ while (no_more == 0)
+ {
+ char buffer[1024];
+
+ status = (*fct.f) (addr, &etherent, buffer, sizeof buffer, &errno);
+
+ no_more = __nss_next2 (&nip, "getntohost_r", NULL, &fct.ptr, status, 0);
+ }
+
+ if (status == NSS_STATUS_SUCCESS)
+ /* XXX This is a potential cause of trouble because the size of
+ the HOSTNAME buffer is not known but the interface does not
+ provide this information. */
+ strcpy (hostname, etherent.e_name);
+
+ return status == NSS_STATUS_SUCCESS ? 0 : -1;
+}
diff --git a/REORG.TODO/inet/getaliasent.c b/REORG.TODO/inet/getaliasent.c
new file mode 100644
index 0000000000..f5bb4f6732
--- /dev/null
+++ b/REORG.TODO/inet/getaliasent.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <aliases.h>
+
+
+#define LOOKUP_TYPE struct aliasent
+#define GETFUNC_NAME getaliasent
+#define BUFLEN 1024
+
+/* There is no nscd support for the aliases file. */
+#undef USE_NSCD
+
+#include "../nss/getXXent.c"
diff --git a/REORG.TODO/inet/getaliasent_r.c b/REORG.TODO/inet/getaliasent_r.c
new file mode 100644
index 0000000000..c018c52730
--- /dev/null
+++ b/REORG.TODO/inet/getaliasent_r.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <aliases.h>
+
+
+#define LOOKUP_TYPE struct aliasent
+#define SETFUNC_NAME setaliasent
+#define GETFUNC_NAME getaliasent
+#define ENDFUNC_NAME endaliasent
+#define DATABASE_NAME aliases
+
+/* There is no nscd support for the aliases file. */
+#undef USE_NSCD
+
+#include "../nss/getXXent_r.c"
diff --git a/REORG.TODO/inet/getaliasname.c b/REORG.TODO/inet/getaliasname.c
new file mode 100644
index 0000000000..fad022cc35
--- /dev/null
+++ b/REORG.TODO/inet/getaliasname.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <aliases.h>
+
+
+#define LOOKUP_TYPE struct aliasent
+#define FUNCTION_NAME getaliasbyname
+#define DATABASE_NAME aliases
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+#define BUFLEN 1024
+
+/* There is no nscd support for the aliases file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getaliasname_r.c b/REORG.TODO/inet/getaliasname_r.c
new file mode 100644
index 0000000000..20d5be6883
--- /dev/null
+++ b/REORG.TODO/inet/getaliasname_r.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <aliases.h>
+
+
+#define LOOKUP_TYPE struct aliasent
+#define FUNCTION_NAME getaliasbyname
+#define DATABASE_NAME aliases
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+
+/* There is no nscd support for the aliases file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/gethstbyad.c b/REORG.TODO/inet/gethstbyad.c
new file mode 100644
index 0000000000..9604c4b593
--- /dev/null
+++ b/REORG.TODO/inet/gethstbyad.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define FUNCTION_NAME gethostbyaddr
+#define DATABASE_NAME hosts
+#define ADD_PARAMS const void *addr, socklen_t len, int type
+#define ADD_VARIABLES addr, len, type
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/gethstbyad_r.c b/REORG.TODO/inet/gethstbyad_r.c
new file mode 100644
index 0000000000..88f428c1db
--- /dev/null
+++ b/REORG.TODO/inet/gethstbyad_r.c
@@ -0,0 +1,52 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+#include <string.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define FUNCTION_NAME gethostbyaddr
+#define DATABASE_NAME hosts
+#define ADD_PARAMS const void *addr, socklen_t len, int type
+#define ADD_VARIABLES addr, len, type
+#define NEED_H_ERRNO 1
+#define NEED__RES 1
+#define NEED__RES_HCONF 1
+/* If the addr parameter is the IPv6 unspecified address no query must
+ be performed. */
+#define PREPROCESS \
+ if (len == sizeof (struct in6_addr) \
+ && __builtin_expect (memcmp (&__in6addr_any, addr, \
+ sizeof (struct in6_addr)), 1) == 0) \
+ { \
+ *h_errnop = HOST_NOT_FOUND; \
+ *result = NULL; \
+ return ENOENT; \
+ }
+#define POSTPROCESS \
+ if (status == NSS_STATUS_SUCCESS) \
+ { \
+ _res_hconf_reorder_addrs (resbuf); \
+ _res_hconf_trim_domains (resbuf); \
+ }
+
+/* Special name for the lookup function. */
+#define DB_LOOKUP_FCT __nss_hosts_lookup2
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/gethstbynm.c b/REORG.TODO/inet/gethstbynm.c
new file mode 100644
index 0000000000..57125fc7f6
--- /dev/null
+++ b/REORG.TODO/inet/gethstbynm.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define FUNCTION_NAME gethostbyname
+#define DATABASE_NAME hosts
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+#define HANDLE_DIGITS_DOTS 1
+
+#include <nss/getXXbyYY.c>
diff --git a/REORG.TODO/inet/gethstbynm2.c b/REORG.TODO/inet/gethstbynm2.c
new file mode 100644
index 0000000000..5aac4d7dad
--- /dev/null
+++ b/REORG.TODO/inet/gethstbynm2.c
@@ -0,0 +1,38 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define FUNCTION_NAME gethostbyname2
+#define DATABASE_NAME hosts
+#define ADD_PARAMS const char *name, int af
+#define ADD_VARIABLES name, af
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+#define HANDLE_DIGITS_DOTS 1
+#define HAVE_AF 1
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/gethstbynm2_r.c b/REORG.TODO/inet/gethstbynm2_r.c
new file mode 100644
index 0000000000..5704797990
--- /dev/null
+++ b/REORG.TODO/inet/gethstbynm2_r.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define FUNCTION_NAME gethostbyname2
+#define DATABASE_NAME hosts
+#define ADD_PARAMS const char *name, int af
+#define ADD_VARIABLES name, af
+#define NEED_H_ERRNO 1
+#define NEED__RES_HCONF 1
+#define POSTPROCESS \
+ if (status == NSS_STATUS_SUCCESS) \
+ _res_hconf_reorder_addrs (resbuf);
+
+#define HANDLE_DIGITS_DOTS 1
+#define HAVE_LOOKUP_BUFFER 1
+#define HAVE_AF 1
+
+/* Special name for the lookup function. */
+#define DB_LOOKUP_FCT __nss_hosts_lookup2
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/gethstbynm_r.c b/REORG.TODO/inet/gethstbynm_r.c
new file mode 100644
index 0000000000..3758a9dde8
--- /dev/null
+++ b/REORG.TODO/inet/gethstbynm_r.c
@@ -0,0 +1,44 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ctype.h>
+#include <errno.h>
+#include <netdb.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define FUNCTION_NAME gethostbyname
+#define DATABASE_NAME hosts
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+#define NEED_H_ERRNO 1
+#define NEED__RES_HCONF 1
+#define POSTPROCESS \
+ if (status == NSS_STATUS_SUCCESS) \
+ _res_hconf_reorder_addrs (resbuf);
+
+#define HANDLE_DIGITS_DOTS 1
+#define HAVE_LOOKUP_BUFFER 1
+
+/* Special name for the lookup function. */
+#define DB_LOOKUP_FCT __nss_hosts_lookup2
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/gethstent.c b/REORG.TODO/inet/gethstent.c
new file mode 100644
index 0000000000..b7faf9f72c
--- /dev/null
+++ b/REORG.TODO/inet/gethstent.c
@@ -0,0 +1,26 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define GETFUNC_NAME gethostent
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+#include "../nss/getXXent.c"
diff --git a/REORG.TODO/inet/gethstent_r.c b/REORG.TODO/inet/gethstent_r.c
new file mode 100644
index 0000000000..dacbbc99f8
--- /dev/null
+++ b/REORG.TODO/inet/gethstent_r.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct hostent
+#define SETFUNC_NAME sethostent
+#define GETFUNC_NAME gethostent
+#define ENDFUNC_NAME endhostent
+#define DATABASE_NAME hosts
+#define STAYOPEN int stayopen
+#define STAYOPEN_VAR stayopen
+#define NEED_H_ERRNO 1
+#define NEED__RES 1
+
+/* Special name for the lookup function. */
+#define DB_LOOKUP_FCT __nss_hosts_lookup2
+
+#include "../nss/getXXent_r.c"
diff --git a/REORG.TODO/inet/getipv4sourcefilter.c b/REORG.TODO/inet/getipv4sourcefilter.c
new file mode 100644
index 0000000000..5b1734ccfe
--- /dev/null
+++ b/REORG.TODO/inet/getipv4sourcefilter.c
@@ -0,0 +1,32 @@
+/* Get source filter. Stub version.
+ Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdint.h>
+#include <netinet/in.h>
+
+
+int
+getipv4sourcefilter (int s, struct in_addr interface, struct in_addr group,
+ uint32_t *fmode, uint32_t *numsrc, struct in_addr *slist)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (getipv4sourcefilter)
diff --git a/REORG.TODO/inet/getnameinfo.c b/REORG.TODO/inet/getnameinfo.c
new file mode 100644
index 0000000000..5d2b9b7559
--- /dev/null
+++ b/REORG.TODO/inet/getnameinfo.c
@@ -0,0 +1,563 @@
+/* Convert socket address to string using Name Service Switch modules.
+ Copyright (C) 1997-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* The Inner Net License, Version 2.00
+
+ The author(s) grant permission for redistribution and use in source and
+binary forms, with or without modification, of the software and documentation
+provided that the following conditions are met:
+
+0. If you receive a version of the software that is specifically labelled
+ as not being for redistribution (check the version message and/or README),
+ you are not permitted to redistribute that version of the software in any
+ way or form.
+1. All terms of the all other applicable copyrights and licenses must be
+ followed.
+2. Redistributions of source code must retain the authors' copyright
+ notice(s), this list of conditions, and the following disclaimer.
+3. Redistributions in binary form must reproduce the authors' copyright
+ notice(s), this list of conditions, and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+4. [The copyright holder has authorized the removal of this clause.]
+5. Neither the name(s) of the author(s) nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ If these license terms cause you a real problem, contact the author. */
+
+/* This software is Copyright 1996 by Craig Metz, All Rights Reserved. */
+
+#include <errno.h>
+#include <netdb.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <sys/utsname.h>
+#include <libc-lock.h>
+#include <scratch_buffer.h>
+
+#ifdef HAVE_LIBIDN
+# include <libidn/idna.h>
+extern int __idna_to_unicode_lzlz (const char *input, char **output,
+ int flags);
+#endif
+
+#ifndef min
+# define min(x,y) (((x) > (y)) ? (y) : (x))
+#endif /* min */
+
+libc_freeres_ptr (static char *domain);
+
+
+static char *
+internal_function
+nrl_domainname (void)
+{
+ static int not_first;
+
+ if (! not_first)
+ {
+ __libc_lock_define_initialized (static, lock);
+ __libc_lock_lock (lock);
+
+ if (! not_first)
+ {
+ char *c;
+ struct hostent *h, th;
+ int herror;
+ struct scratch_buffer tmpbuf;
+
+ scratch_buffer_init (&tmpbuf);
+ not_first = 1;
+
+ while (__gethostbyname_r ("localhost", &th,
+ tmpbuf.data, tmpbuf.length,
+ &h, &herror))
+ {
+ if (herror == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (&tmpbuf))
+ goto done;
+ }
+ else
+ break;
+ }
+
+ if (h && (c = strchr (h->h_name, '.')))
+ domain = __strdup (++c);
+ else
+ {
+ /* The name contains no domain information. Use the name
+ now to get more information. */
+ while (__gethostname (tmpbuf.data, tmpbuf.length))
+ if (!scratch_buffer_grow (&tmpbuf))
+ goto done;
+
+ if ((c = strchr (tmpbuf.data, '.')))
+ domain = __strdup (++c);
+ else
+ {
+ /* We need to preserve the hostname. */
+ const char *hstname = strdupa (tmpbuf.data);
+
+ while (__gethostbyname_r (hstname, &th,
+ tmpbuf.data, tmpbuf.length,
+ &h, &herror))
+ {
+ if (herror == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (&tmpbuf))
+ goto done;
+ }
+ else
+ break;
+ }
+
+ if (h && (c = strchr(h->h_name, '.')))
+ domain = __strdup (++c);
+ else
+ {
+ struct in_addr in_addr;
+
+ in_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+ while (__gethostbyaddr_r ((const char *) &in_addr,
+ sizeof (struct in_addr),
+ AF_INET, &th,
+ tmpbuf.data, tmpbuf.length,
+ &h, &herror))
+ {
+ if (herror == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (&tmpbuf))
+ goto done;
+ }
+ else
+ break;
+ }
+
+ if (h && (c = strchr (h->h_name, '.')))
+ domain = __strdup (++c);
+ }
+ }
+ }
+ done:
+ scratch_buffer_free (&tmpbuf);
+ }
+
+ __libc_lock_unlock (lock);
+ }
+
+ return domain;
+};
+
+/* Copy a string to a destination buffer with length checking. Return
+ EAI_OVERFLOW if the buffer is not large enough, and 0 on
+ success. */
+static int
+checked_copy (char *dest, size_t destlen, const char *source)
+{
+ size_t source_length = strlen (source);
+ if (source_length + 1 > destlen)
+ return EAI_OVERFLOW;
+ memcpy (dest, source, source_length + 1);
+ return 0;
+}
+
+/* Helper function for CHECKED_SNPRINTF below. */
+static int
+check_sprintf_result (int result, size_t destlen)
+{
+ if (result < 0)
+ return EAI_SYSTEM;
+ if ((size_t) result >= destlen)
+ /* If ret == destlen, there was no room for the terminating NUL
+ character. */
+ return EAI_OVERFLOW;
+ return 0;
+}
+
+/* Format a string in the destination buffer. Return 0 on success,
+ EAI_OVERFLOW in case the buffer is too small, or EAI_SYSTEM on any
+ other error. */
+#define CHECKED_SNPRINTF(dest, destlen, format, ...) \
+ check_sprintf_result \
+ (__snprintf (dest, destlen, format, __VA_ARGS__), destlen)
+
+/* Convert host name, AF_INET/AF_INET6 case, name only. */
+static int
+gni_host_inet_name (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ int herrno;
+ struct hostent th;
+ struct hostent *h = NULL;
+ if (sa->sa_family == AF_INET6)
+ {
+ const struct sockaddr_in6 *sin6p = (const struct sockaddr_in6 *) sa;
+ while (__gethostbyaddr_r (&sin6p->sin6_addr, sizeof(struct in6_addr),
+ AF_INET6, &th, tmpbuf->data, tmpbuf->length,
+ &h, &herrno))
+ if (herrno == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (tmpbuf))
+ {
+ __set_h_errno (herrno);
+ return EAI_MEMORY;
+ }
+ }
+ else
+ break;
+ }
+ else
+ {
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
+ while (__gethostbyaddr_r (&sinp->sin_addr, sizeof(struct in_addr),
+ AF_INET, &th, tmpbuf->data, tmpbuf->length,
+ &h, &herrno))
+ if (herrno == NETDB_INTERNAL && errno == ERANGE)
+ {
+ if (!scratch_buffer_grow (tmpbuf))
+ {
+ __set_h_errno (herrno);
+ return EAI_MEMORY;
+ }
+ }
+ else
+ break;
+ }
+
+ if (h == NULL)
+ {
+ if (herrno == NETDB_INTERNAL)
+ {
+ __set_h_errno (herrno);
+ return EAI_SYSTEM;
+ }
+ if (herrno == TRY_AGAIN)
+ {
+ __set_h_errno (herrno);
+ return EAI_AGAIN;
+ }
+ }
+
+ if (h)
+ {
+ char *c;
+ if ((flags & NI_NOFQDN)
+ && (c = nrl_domainname ())
+ && (c = strstr (h->h_name, c))
+ && (c != h->h_name) && (*(--c) == '.'))
+ /* Terminate the string after the prefix. */
+ *c = '\0';
+
+#ifdef HAVE_LIBIDN
+ /* If requested, convert from the IDN format. */
+ if (flags & NI_IDN)
+ {
+ int idn_flags = 0;
+ if (flags & NI_IDN_ALLOW_UNASSIGNED)
+ idn_flags |= IDNA_ALLOW_UNASSIGNED;
+ if (flags & NI_IDN_USE_STD3_ASCII_RULES)
+ idn_flags |= IDNA_USE_STD3_ASCII_RULES;
+
+ char *out;
+ int rc = __idna_to_unicode_lzlz (h->h_name, &out,
+ idn_flags);
+ if (rc != IDNA_SUCCESS)
+ {
+ if (rc == IDNA_MALLOC_ERROR)
+ return EAI_MEMORY;
+ if (rc == IDNA_DLOPEN_ERROR)
+ return EAI_SYSTEM;
+ return EAI_IDN_ENCODE;
+ }
+
+ if (out != h->h_name)
+ {
+ h->h_name = strdupa (out);
+ free (out);
+ }
+ }
+#endif
+
+ size_t len = strlen (h->h_name) + 1;
+ if (len > hostlen)
+ return EAI_OVERFLOW;
+
+ memcpy (host, h->h_name, len);
+
+ return 0;
+ }
+
+ return EAI_NONAME;
+}
+
+/* Convert host name, AF_INET/AF_INET6 case, numeric conversion. */
+static int
+gni_host_inet_numeric (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ if (sa->sa_family == AF_INET6)
+ {
+ const struct sockaddr_in6 *sin6p = (const struct sockaddr_in6 *) sa;
+ if (inet_ntop (AF_INET6, &sin6p->sin6_addr, host, hostlen) == NULL)
+ return EAI_OVERFLOW;
+
+ uint32_t scopeid = sin6p->sin6_scope_id;
+ if (scopeid != 0)
+ {
+ size_t used_hostlen = __strnlen (host, hostlen);
+ /* Location of the scope string in the host buffer. */
+ char *scope_start = host + used_hostlen;
+ size_t scope_length = hostlen - used_hostlen;
+
+ if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
+ || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr))
+ {
+ char scopebuf[IFNAMSIZ];
+ if (if_indextoname (scopeid, scopebuf) != NULL)
+ return CHECKED_SNPRINTF
+ (scope_start, scope_length,
+ "%c%s", SCOPE_DELIMITER, scopebuf);
+ }
+ return CHECKED_SNPRINTF
+ (scope_start, scope_length, "%c%u", SCOPE_DELIMITER, scopeid);
+ }
+ }
+ else
+ {
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
+ if (inet_ntop (AF_INET, &sinp->sin_addr, host, hostlen) == NULL)
+ return EAI_OVERFLOW;
+ }
+ return 0;
+}
+
+/* Convert AF_INET or AF_INET6 socket address, host part. */
+static int
+gni_host_inet (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ if (!(flags & NI_NUMERICHOST))
+ {
+ int result = gni_host_inet_name
+ (tmpbuf, sa, addrlen, host, hostlen, flags);
+ if (result != EAI_NONAME)
+ return result;
+ }
+
+ if (flags & NI_NAMEREQD)
+ return EAI_NONAME;
+ else
+ return gni_host_inet_numeric
+ (tmpbuf, sa, addrlen, host, hostlen, flags);
+}
+
+/* Convert AF_LOCAL socket address, host part. */
+static int
+gni_host_local (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ if (!(flags & NI_NUMERICHOST))
+ {
+ struct utsname utsname;
+ if (uname (&utsname) == 0)
+ return checked_copy (host, hostlen, utsname.nodename);
+ }
+
+ if (flags & NI_NAMEREQD)
+ return EAI_NONAME;
+
+ return checked_copy (host, hostlen, "localhost");
+}
+
+/* Convert the host part of an AF_LOCAK socket address. */
+static int
+gni_host (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *host, socklen_t hostlen, int flags)
+{
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ case AF_INET6:
+ return gni_host_inet (tmpbuf, sa, addrlen, host, hostlen, flags);
+
+ case AF_LOCAL:
+ return gni_host_local (tmpbuf, sa, addrlen, host, hostlen, flags);
+
+ default:
+ return EAI_FAMILY;
+ }
+}
+
+/* Convert service to string, AF_INET and AF_INET6 variant. */
+static int
+gni_serv_inet (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *serv, socklen_t servlen, int flags)
+{
+ _Static_assert
+ (offsetof (struct sockaddr_in, sin_port)
+ == offsetof (struct sockaddr_in6, sin6_port)
+ && sizeof (((struct sockaddr_in) {}).sin_port) == sizeof (in_port_t)
+ && sizeof (((struct sockaddr_in6) {}).sin6_port) == sizeof (in_port_t),
+ "AF_INET and AF_INET6 port consistency");
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *) sa;
+ if (!(flags & NI_NUMERICSERV))
+ {
+ struct servent *s, ts;
+ int e;
+ while ((e = __getservbyport_r (sinp->sin_port,
+ ((flags & NI_DGRAM)
+ ? "udp" : "tcp"), &ts,
+ tmpbuf->data, tmpbuf->length, &s)))
+ {
+ if (e == ERANGE)
+ {
+ if (!scratch_buffer_grow (tmpbuf))
+ return EAI_MEMORY;
+ }
+ else
+ break;
+ }
+ if (s)
+ return checked_copy (serv, servlen, s->s_name);
+ /* Fall through to numeric conversion. */
+ }
+ return CHECKED_SNPRINTF (serv, servlen, "%d", ntohs (sinp->sin_port));
+}
+
+/* Convert service to string, AF_LOCAL variant. */
+static int
+gni_serv_local (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *serv, socklen_t servlen, int flags)
+{
+ return checked_copy
+ (serv, servlen, ((const struct sockaddr_un *) sa)->sun_path);
+}
+
+/* Convert service to string, dispatching to the implementations
+ above. */
+static int
+gni_serv (struct scratch_buffer *tmpbuf,
+ const struct sockaddr *sa, socklen_t addrlen,
+ char *serv, socklen_t servlen, int flags)
+{
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ case AF_INET6:
+ return gni_serv_inet (tmpbuf, sa, addrlen, serv, servlen, flags);
+ case AF_LOCAL:
+ return gni_serv_local (tmpbuf, sa, addrlen, serv, servlen, flags);
+ default:
+ return EAI_FAMILY;
+ }
+}
+
+int
+getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
+ socklen_t hostlen, char *serv, socklen_t servlen,
+ int flags)
+{
+ if (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV|NI_NOFQDN|NI_NAMEREQD|NI_DGRAM
+#ifdef HAVE_LIBIDN
+ |NI_IDN|NI_IDN_ALLOW_UNASSIGNED|NI_IDN_USE_STD3_ASCII_RULES
+#endif
+ ))
+ return EAI_BADFLAGS;
+
+ if (sa == NULL || addrlen < sizeof (sa_family_t))
+ return EAI_FAMILY;
+
+ if ((flags & NI_NAMEREQD) && host == NULL && serv == NULL)
+ return EAI_NONAME;
+
+ switch (sa->sa_family)
+ {
+ case AF_LOCAL:
+ if (addrlen < (socklen_t) offsetof (struct sockaddr_un, sun_path))
+ return EAI_FAMILY;
+ break;
+ case AF_INET:
+ if (addrlen < sizeof (struct sockaddr_in))
+ return EAI_FAMILY;
+ break;
+ case AF_INET6:
+ if (addrlen < sizeof (struct sockaddr_in6))
+ return EAI_FAMILY;
+ break;
+ default:
+ return EAI_FAMILY;
+ }
+
+ struct scratch_buffer tmpbuf;
+ scratch_buffer_init (&tmpbuf);
+
+ if (host != NULL && hostlen > 0)
+ {
+ int result = gni_host (&tmpbuf, sa, addrlen, host, hostlen, flags);
+ if (result != 0)
+ {
+ scratch_buffer_free (&tmpbuf);
+ return result;
+ }
+ }
+
+ if (serv && (servlen > 0))
+ {
+ int result = gni_serv (&tmpbuf, sa, addrlen, serv, servlen, flags);
+ if (result != 0)
+ {
+ scratch_buffer_free (&tmpbuf);
+ return result;
+ }
+ }
+
+ scratch_buffer_free (&tmpbuf);
+ return 0;
+}
+libc_hidden_def (getnameinfo)
diff --git a/REORG.TODO/inet/getnetbyad.c b/REORG.TODO/inet/getnetbyad.c
new file mode 100644
index 0000000000..7a713a6d53
--- /dev/null
+++ b/REORG.TODO/inet/getnetbyad.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+#include <stdint.h>
+
+
+#define LOOKUP_TYPE struct netent
+#define FUNCTION_NAME getnetbyaddr
+#define DATABASE_NAME networks
+#define ADD_PARAMS uint32_t net, int type
+#define ADD_VARIABLES net, type
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+/* There is no nscd support for the networks file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getnetbyad_r.c b/REORG.TODO/inet/getnetbyad_r.c
new file mode 100644
index 0000000000..608b838516
--- /dev/null
+++ b/REORG.TODO/inet/getnetbyad_r.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+#include <stdint.h>
+
+
+#define LOOKUP_TYPE struct netent
+#define FUNCTION_NAME getnetbyaddr
+#define DATABASE_NAME networks
+#define ADD_PARAMS uint32_t net, int type
+#define ADD_VARIABLES net, type
+#define NEED__RES 1
+#define NEED_H_ERRNO 1
+
+/* There is no nscd support for the networks file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/getnetbynm.c b/REORG.TODO/inet/getnetbynm.c
new file mode 100644
index 0000000000..5a6e144017
--- /dev/null
+++ b/REORG.TODO/inet/getnetbynm.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct netent
+#define FUNCTION_NAME getnetbyname
+#define DATABASE_NAME networks
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+/* There is no nscd support for the networks file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getnetbynm_r.c b/REORG.TODO/inet/getnetbynm_r.c
new file mode 100644
index 0000000000..90fb7141a7
--- /dev/null
+++ b/REORG.TODO/inet/getnetbynm_r.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct netent
+#define FUNCTION_NAME getnetbyname
+#define DATABASE_NAME networks
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+#define NEED__RES 1
+#define NEED_H_ERRNO 1
+
+/* There is no nscd support for the networks file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/getnetent.c b/REORG.TODO/inet/getnetent.c
new file mode 100644
index 0000000000..03fe497184
--- /dev/null
+++ b/REORG.TODO/inet/getnetent.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct netent
+#define GETFUNC_NAME getnetent
+#define BUFLEN 1024
+#define NEED_H_ERRNO 1
+
+/* There is no nscd support for the networks file. */
+#undef USE_NSCD
+
+#include "../nss/getXXent.c"
diff --git a/REORG.TODO/inet/getnetent_r.c b/REORG.TODO/inet/getnetent_r.c
new file mode 100644
index 0000000000..ee832e2aa4
--- /dev/null
+++ b/REORG.TODO/inet/getnetent_r.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct netent
+#define SETFUNC_NAME setnetent
+#define GETFUNC_NAME getnetent
+#define ENDFUNC_NAME endnetent
+#define DATABASE_NAME networks
+#define STAYOPEN int stayopen
+#define STAYOPEN_VAR stayopen
+#define NEED__RES 1
+#define NEED_H_ERRNO 1
+
+/* There is no nscd support for the networks file. */
+#undef USE_NSCD
+
+#include "../nss/getXXent_r.c"
diff --git a/REORG.TODO/inet/getnetgrent.c b/REORG.TODO/inet/getnetgrent.c
new file mode 100644
index 0000000000..4064edcb61
--- /dev/null
+++ b/REORG.TODO/inet/getnetgrent.c
@@ -0,0 +1,49 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <libc-lock.h>
+
+/* Static buffer for return value. We allocate it when needed. */
+libc_freeres_ptr (static char *buffer);
+/* All three strings should fit in a block of 1kB size. */
+#define BUFSIZE 1024
+
+
+
+static void
+allocate (void)
+{
+ buffer = (char *) malloc (BUFSIZE);
+}
+
+int
+getnetgrent (char **hostp, char **userp, char **domainp)
+{
+ __libc_once_define (static, once);
+ __libc_once (once, allocate);
+
+ if (buffer == NULL)
+ {
+ __set_errno (ENOMEM);
+ return -1;
+ }
+
+ return __getnetgrent_r (hostp, userp, domainp, buffer, BUFSIZE);
+}
diff --git a/REORG.TODO/inet/getnetgrent_r.c b/REORG.TODO/inet/getnetgrent_r.c
new file mode 100644
index 0000000000..1b4eb65b89
--- /dev/null
+++ b/REORG.TODO/inet/getnetgrent_r.c
@@ -0,0 +1,535 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+#include <atomic.h>
+#include <libc-lock.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include "netgroup.h"
+#include "nsswitch.h"
+#include <sysdep.h>
+#include <nscd/nscd_proto.h>
+
+
+/* Protect above variable against multiple uses at the same time. */
+__libc_lock_define_initialized (static, lock)
+
+/* The whole information for the set/get/endnetgrent functions are
+ kept in this structure. */
+static struct __netgrent dataset;
+
+/* The lookup function for the first entry of this service. */
+extern int __nss_netgroup_lookup (service_user **nipp, const char *name,
+ void **fctp) internal_function;
+
+/* Set up NIP to run through the services. Return nonzero if there are no
+ services (left). */
+static int
+setup (void **fctp, service_user **nipp)
+{
+ /* Remember the first service_entry, it's always the same. */
+ static bool startp_initialized;
+ static service_user *startp;
+ int no_more;
+
+ if (!startp_initialized)
+ {
+ /* Executing this more than once at the same time must yield the
+ same result every time. So we need no locking. */
+ no_more = __nss_netgroup_lookup (nipp, "setnetgrent", fctp);
+ startp = no_more ? (service_user *) -1 : *nipp;
+#ifdef PTR_MANGLE
+ PTR_MANGLE (startp);
+#endif
+ atomic_write_barrier ();
+ startp_initialized = true;
+ }
+ else
+ {
+ service_user *nip = startp;
+#ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (nip);
+#endif
+ if (nip == (service_user *) -1)
+ /* No services at all. */
+ return 1;
+
+ /* Reset to the beginning of the service list. */
+ *nipp = nip;
+ /* Look up the first function. */
+ no_more = __nss_lookup (nipp, "setnetgrent", NULL, fctp);
+ }
+ return no_more;
+}
+
+/* Free used memory. */
+static void
+free_memory (struct __netgrent *data)
+{
+ while (data->known_groups != NULL)
+ {
+ struct name_list *tmp = data->known_groups;
+ data->known_groups = data->known_groups->next;
+ free (tmp);
+ }
+
+ while (data->needed_groups != NULL)
+ {
+ struct name_list *tmp = data->needed_groups;
+ data->needed_groups = data->needed_groups->next;
+ free (tmp);
+ }
+}
+
+static void
+endnetgrent_hook (struct __netgrent *datap)
+{
+ enum nss_status (*endfct) (struct __netgrent *);
+
+ if (datap->nip == NULL || datap->nip == (service_user *) -1l)
+ return;
+
+ endfct = __nss_lookup_function (datap->nip, "endnetgrent");
+ if (endfct != NULL)
+ (void) (*endfct) (datap);
+ datap->nip = NULL;
+}
+
+static int
+internal_function
+__internal_setnetgrent_reuse (const char *group, struct __netgrent *datap,
+ int *errnop)
+{
+ union
+ {
+ enum nss_status (*f) (const char *, struct __netgrent *);
+ void *ptr;
+ } fct;
+ enum nss_status status = NSS_STATUS_UNAVAIL;
+ struct name_list *new_elem;
+
+ /* Free data from previous service. */
+ endnetgrent_hook (datap);
+
+ /* Cycle through all the services and run their setnetgrent functions. */
+ int no_more = setup (&fct.ptr, &datap->nip);
+ while (! no_more)
+ {
+ assert (datap->data == NULL);
+
+ /* Ignore status, we force check in `__nss_next2'. */
+ status = DL_CALL_FCT (*fct.f, (group, datap));
+
+ service_user *old_nip = datap->nip;
+ no_more = __nss_next2 (&datap->nip, "setnetgrent", NULL, &fct.ptr,
+ status, 0);
+
+ if (status == NSS_STATUS_SUCCESS && ! no_more)
+ {
+ enum nss_status (*endfct) (struct __netgrent *);
+
+ endfct = __nss_lookup_function (old_nip, "endnetgrent");
+ if (endfct != NULL)
+ (void) DL_CALL_FCT (*endfct, (datap));
+ }
+ }
+
+ /* Add the current group to the list of known groups. */
+ size_t group_len = strlen (group) + 1;
+ new_elem = (struct name_list *) malloc (sizeof (struct name_list)
+ + group_len);
+ if (new_elem == NULL)
+ {
+ *errnop = errno;
+ status = NSS_STATUS_TRYAGAIN;
+ }
+ else
+ {
+ new_elem->next = datap->known_groups;
+ memcpy (new_elem->name, group, group_len);
+ datap->known_groups = new_elem;
+ }
+
+ return status == NSS_STATUS_SUCCESS;
+}
+
+int
+internal_function
+__internal_setnetgrent (const char *group, struct __netgrent *datap)
+{
+ /* Free list of all netgroup names from last run. */
+ free_memory (datap);
+
+ return __internal_setnetgrent_reuse (group, datap, &errno);
+}
+libc_hidden_def (__internal_setnetgrent)
+
+static int
+nscd_setnetgrent (const char *group)
+{
+#ifdef USE_NSCD
+ if (__nss_not_use_nscd_netgroup > 0
+ && ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY)
+ __nss_not_use_nscd_netgroup = 0;
+
+ if (!__nss_not_use_nscd_netgroup
+ && !__nss_database_custom[NSS_DBSIDX_netgroup])
+ return __nscd_setnetgrent (group, &dataset);
+#endif
+ return -1;
+}
+
+int
+setnetgrent (const char *group)
+{
+ int result;
+
+ __libc_lock_lock (lock);
+
+ result = nscd_setnetgrent (group);
+ if (result < 0)
+ result = __internal_setnetgrent (group, &dataset);
+
+ __libc_lock_unlock (lock);
+
+ return result;
+}
+
+void
+internal_function
+__internal_endnetgrent (struct __netgrent *datap)
+{
+ endnetgrent_hook (datap);
+ /* Now free list of all netgroup names from last run. */
+ free_memory (datap);
+}
+libc_hidden_def (__internal_endnetgrent)
+
+
+void
+endnetgrent (void)
+{
+ __libc_lock_lock (lock);
+
+ __internal_endnetgrent (&dataset);
+
+ __libc_lock_unlock (lock);
+}
+
+#ifdef USE_NSCD
+static const char *
+get_nonempty_val (const char *in)
+{
+ if (*in == '\0')
+ return NULL;
+ return in;
+}
+
+static enum nss_status
+nscd_getnetgrent (struct __netgrent *datap, char *buffer, size_t buflen,
+ int *errnop)
+{
+ if (datap->cursor >= datap->data + datap->data_size)
+ return NSS_STATUS_UNAVAIL;
+
+ datap->type = triple_val;
+ datap->val.triple.host = get_nonempty_val (datap->cursor);
+ datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1;
+ datap->val.triple.user = get_nonempty_val (datap->cursor);
+ datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1;
+ datap->val.triple.domain = get_nonempty_val (datap->cursor);
+ datap->cursor = (char *) __rawmemchr (datap->cursor, '\0') + 1;
+
+ return NSS_STATUS_SUCCESS;
+}
+#endif
+
+int
+internal_function
+__internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
+ struct __netgrent *datap,
+ char *buffer, size_t buflen, int *errnop)
+{
+ enum nss_status (*fct) (struct __netgrent *, char *, size_t, int *);
+
+ /* Initialize status to return if no more functions are found. */
+ enum nss_status status = NSS_STATUS_NOTFOUND;
+
+ /* Run through available functions, starting with the same function last
+ run. We will repeat each function as long as it succeeds, and then go
+ on to the next service action. */
+ int no_more = datap->nip == NULL;
+ if (! no_more)
+ {
+#ifdef USE_NSCD
+ /* This bogus function pointer is a special marker left by
+ __nscd_setnetgrent to tell us to use the data it left
+ before considering any modules. */
+ if (datap->nip == (service_user *) -1l)
+ fct = nscd_getnetgrent;
+ else
+#endif
+ {
+ fct = __nss_lookup_function (datap->nip, "getnetgrent_r");
+ no_more = fct == NULL;
+ }
+
+ while (! no_more)
+ {
+ status = DL_CALL_FCT (*fct, (datap, buffer, buflen, &errno));
+
+ if (status == NSS_STATUS_RETURN
+ /* The service returned a NOTFOUND, but there are more groups that
+ we need to resolve before we give up. */
+ || (status == NSS_STATUS_NOTFOUND && datap->needed_groups != NULL))
+ {
+ /* This was the last one for this group. Look at next group
+ if available. */
+ int found = 0;
+ while (datap->needed_groups != NULL && ! found)
+ {
+ struct name_list *tmp = datap->needed_groups;
+ datap->needed_groups = datap->needed_groups->next;
+ tmp->next = datap->known_groups;
+ datap->known_groups = tmp;
+
+ found = __internal_setnetgrent_reuse (datap->known_groups->name,
+ datap, errnop);
+ }
+
+ if (found && datap->nip != NULL)
+ {
+ fct = __nss_lookup_function (datap->nip, "getnetgrent_r");
+ if (fct != NULL)
+ continue;
+ }
+ }
+ else if (status == NSS_STATUS_SUCCESS && datap->type == group_val)
+ {
+ /* The last entry was a name of another netgroup. */
+ struct name_list *namep;
+
+ /* Ignore if we've seen the name before. */
+ for (namep = datap->known_groups; namep != NULL;
+ namep = namep->next)
+ if (strcmp (datap->val.group, namep->name) == 0)
+ break;
+ if (namep == NULL)
+ for (namep = datap->needed_groups; namep != NULL;
+ namep = namep->next)
+ if (strcmp (datap->val.group, namep->name) == 0)
+ break;
+ if (namep != NULL)
+ /* Really ignore. */
+ continue;
+
+ size_t group_len = strlen (datap->val.group) + 1;
+ namep = (struct name_list *) malloc (sizeof (struct name_list)
+ + group_len);
+ if (namep == NULL)
+ /* We are out of memory. */
+ status = NSS_STATUS_RETURN;
+ else
+ {
+ namep->next = datap->needed_groups;
+ memcpy (namep->name, datap->val.group, group_len);
+ datap->needed_groups = namep;
+ /* And get the next entry. */
+ continue;
+ }
+ }
+ break;
+ }
+ }
+
+ if (status == NSS_STATUS_SUCCESS)
+ {
+ *hostp = (char *) datap->val.triple.host;
+ *userp = (char *) datap->val.triple.user;
+ *domainp = (char *) datap->val.triple.domain;
+ }
+
+ return status == NSS_STATUS_SUCCESS ? 1 : 0;
+}
+libc_hidden_def (__internal_getnetgrent_r)
+
+/* The real entry point. */
+int
+__getnetgrent_r (char **hostp, char **userp, char **domainp,
+ char *buffer, size_t buflen)
+{
+ enum nss_status status;
+
+ __libc_lock_lock (lock);
+
+ status = __internal_getnetgrent_r (hostp, userp, domainp, &dataset,
+ buffer, buflen, &errno);
+
+ __libc_lock_unlock (lock);
+
+ return status;
+}
+weak_alias (__getnetgrent_r, getnetgrent_r)
+
+/* Test whether given (host,user,domain) triple is in NETGROUP. */
+int
+innetgr (const char *netgroup, const char *host, const char *user,
+ const char *domain)
+{
+#ifdef USE_NSCD
+ if (__nss_not_use_nscd_netgroup > 0
+ && ++__nss_not_use_nscd_netgroup > NSS_NSCD_RETRY)
+ __nss_not_use_nscd_netgroup = 0;
+
+ if (!__nss_not_use_nscd_netgroup
+ && !__nss_database_custom[NSS_DBSIDX_netgroup])
+ {
+ int result = __nscd_innetgr (netgroup, host, user, domain);
+ if (result >= 0)
+ return result;
+ }
+#endif
+
+ union
+ {
+ enum nss_status (*f) (const char *, struct __netgrent *);
+ void *ptr;
+ } setfct;
+ void (*endfct) (struct __netgrent *);
+ int (*getfct) (struct __netgrent *, char *, size_t, int *);
+ struct __netgrent entry;
+ int result = 0;
+ const char *current_group = netgroup;
+
+ memset (&entry, '\0', sizeof (entry));
+
+ /* Walk through the services until we found an answer or we shall
+ not work further. We can do some optimization here. Since all
+ services must provide the `setnetgrent' function we can do all
+ the work during one walk through the service list. */
+ while (1)
+ {
+ int no_more = setup (&setfct.ptr, &entry.nip);
+ while (! no_more)
+ {
+ assert (entry.data == NULL);
+
+ /* Open netgroup. */
+ enum nss_status status = DL_CALL_FCT (*setfct.f,
+ (current_group, &entry));
+
+ if (status == NSS_STATUS_SUCCESS
+ && (getfct = __nss_lookup_function (entry.nip, "getnetgrent_r"))
+ != NULL)
+ {
+ char buffer[1024];
+
+ while (DL_CALL_FCT (*getfct,
+ (&entry, buffer, sizeof buffer, &errno))
+ == NSS_STATUS_SUCCESS)
+ {
+ if (entry.type == group_val)
+ {
+ /* Make sure we haven't seen the name before. */
+ struct name_list *namep;
+
+ for (namep = entry.known_groups; namep != NULL;
+ namep = namep->next)
+ if (strcmp (entry.val.group, namep->name) == 0)
+ break;
+ if (namep == NULL)
+ for (namep = entry.needed_groups; namep != NULL;
+ namep = namep->next)
+ if (strcmp (entry.val.group, namep->name) == 0)
+ break;
+ if (namep == NULL
+ && strcmp (netgroup, entry.val.group) != 0)
+ {
+ size_t group_len = strlen (entry.val.group) + 1;
+ namep =
+ (struct name_list *) malloc (sizeof (*namep)
+ + group_len);
+ if (namep == NULL)
+ {
+ /* Out of memory, simply return. */
+ result = -1;
+ break;
+ }
+
+ namep->next = entry.needed_groups;
+ memcpy (namep->name, entry.val.group, group_len);
+ entry.needed_groups = namep;
+ }
+ }
+ else
+ {
+ if ((entry.val.triple.host == NULL || host == NULL
+ || __strcasecmp (entry.val.triple.host, host) == 0)
+ && (entry.val.triple.user == NULL || user == NULL
+ || strcmp (entry.val.triple.user, user) == 0)
+ && (entry.val.triple.domain == NULL || domain == NULL
+ || __strcasecmp (entry.val.triple.domain,
+ domain) == 0))
+ {
+ result = 1;
+ break;
+ }
+ }
+ }
+
+ /* If we found one service which does know the given
+ netgroup we don't try further. */
+ status = NSS_STATUS_RETURN;
+ }
+
+ /* Free all resources of the service. */
+ endfct = __nss_lookup_function (entry.nip, "endnetgrent");
+ if (endfct != NULL)
+ DL_CALL_FCT (*endfct, (&entry));
+
+ if (result != 0)
+ break;
+
+ /* Look for the next service. */
+ no_more = __nss_next2 (&entry.nip, "setnetgrent", NULL,
+ &setfct.ptr, status, 0);
+ }
+
+ if (result == 0 && entry.needed_groups != NULL)
+ {
+ struct name_list *tmp = entry.needed_groups;
+ entry.needed_groups = tmp->next;
+ tmp->next = entry.known_groups;
+ entry.known_groups = tmp;
+ current_group = tmp->name;
+ continue;
+ }
+
+ /* No way out. */
+ break;
+ }
+
+ /* Free the memory. */
+ free_memory (&entry);
+
+ return result == 1;
+}
+libc_hidden_def (innetgr)
diff --git a/REORG.TODO/inet/getproto.c b/REORG.TODO/inet/getproto.c
new file mode 100644
index 0000000000..ba1ef6d0af
--- /dev/null
+++ b/REORG.TODO/inet/getproto.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct protoent
+#define FUNCTION_NAME getprotobynumber
+#define DATABASE_NAME protocols
+#define ADD_PARAMS int proto
+#define ADD_VARIABLES proto
+#define BUFLEN 1024
+
+/* There is no nscd support for the protocols file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getproto_r.c b/REORG.TODO/inet/getproto_r.c
new file mode 100644
index 0000000000..7f61605511
--- /dev/null
+++ b/REORG.TODO/inet/getproto_r.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct protoent
+#define FUNCTION_NAME getprotobynumber
+#define DATABASE_NAME protocols
+#define ADD_PARAMS int proto
+#define ADD_VARIABLES proto
+
+/* There is no nscd support for the protocols file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/getprtent.c b/REORG.TODO/inet/getprtent.c
new file mode 100644
index 0000000000..40ac5f992f
--- /dev/null
+++ b/REORG.TODO/inet/getprtent.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct protoent
+#define GETFUNC_NAME getprotoent
+#define BUFLEN 1024
+
+/* There is no nscd support for the protocols file. */
+#undef USE_NSCD
+
+#include "../nss/getXXent.c"
diff --git a/REORG.TODO/inet/getprtent_r.c b/REORG.TODO/inet/getprtent_r.c
new file mode 100644
index 0000000000..5d3bd1f3b9
--- /dev/null
+++ b/REORG.TODO/inet/getprtent_r.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct protoent
+#define SETFUNC_NAME setprotoent
+#define GETFUNC_NAME getprotoent
+#define ENDFUNC_NAME endprotoent
+#define DATABASE_NAME protocols
+#define STAYOPEN int stayopen
+#define STAYOPEN_VAR stayopen
+
+/* There is no nscd support for the protocols file. */
+#undef USE_NSCD
+
+#include "../nss/getXXent_r.c"
diff --git a/REORG.TODO/inet/getprtname.c b/REORG.TODO/inet/getprtname.c
new file mode 100644
index 0000000000..714eaf437d
--- /dev/null
+++ b/REORG.TODO/inet/getprtname.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct protoent
+#define FUNCTION_NAME getprotobyname
+#define DATABASE_NAME protocols
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+#define BUFLEN 1024
+
+/* There is no nscd support for the protocols file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getprtname_r.c b/REORG.TODO/inet/getprtname_r.c
new file mode 100644
index 0000000000..88d723d737
--- /dev/null
+++ b/REORG.TODO/inet/getprtname_r.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct protoent
+#define FUNCTION_NAME getprotobyname
+#define DATABASE_NAME protocols
+#define ADD_PARAMS const char *name
+#define ADD_VARIABLES name
+
+/* There is no nscd support for the protocols file. */
+#undef USE_NSCD
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/getservent.c b/REORG.TODO/inet/getservent.c
new file mode 100644
index 0000000000..ac2a037bda
--- /dev/null
+++ b/REORG.TODO/inet/getservent.c
@@ -0,0 +1,25 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct servent
+#define GETFUNC_NAME getservent
+#define BUFLEN 1024
+
+#include "../nss/getXXent.c"
diff --git a/REORG.TODO/inet/getservent_r.c b/REORG.TODO/inet/getservent_r.c
new file mode 100644
index 0000000000..22366e6135
--- /dev/null
+++ b/REORG.TODO/inet/getservent_r.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct servent
+#define SETFUNC_NAME setservent
+#define GETFUNC_NAME getservent
+#define ENDFUNC_NAME endservent
+#define DATABASE_NAME services
+#define STAYOPEN int stayopen
+#define STAYOPEN_VAR stayopen
+
+#include "../nss/getXXent_r.c"
diff --git a/REORG.TODO/inet/getsourcefilter.c b/REORG.TODO/inet/getsourcefilter.c
new file mode 100644
index 0000000000..8696b176ce
--- /dev/null
+++ b/REORG.TODO/inet/getsourcefilter.c
@@ -0,0 +1,32 @@
+/* Get source filter. Stub version.
+ Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <netinet/in.h>
+#include <stdint.h>
+
+int
+getsourcefilter (int s, uint32_t interface, const struct sockaddr *group,
+ socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc,
+ struct sockaddr_storage *slist)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (getsourcefilter)
diff --git a/REORG.TODO/inet/getsrvbynm.c b/REORG.TODO/inet/getsrvbynm.c
new file mode 100644
index 0000000000..edddacb20d
--- /dev/null
+++ b/REORG.TODO/inet/getsrvbynm.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct servent
+#define FUNCTION_NAME getservbyname
+#define DATABASE_NAME services
+#define ADD_PARAMS const char *name, const char *proto
+#define ADD_VARIABLES name, proto
+#define BUFLEN 1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getsrvbynm_r.c b/REORG.TODO/inet/getsrvbynm_r.c
new file mode 100644
index 0000000000..faa45f2f50
--- /dev/null
+++ b/REORG.TODO/inet/getsrvbynm_r.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct servent
+#define FUNCTION_NAME getservbyname
+#define DATABASE_NAME services
+#define ADD_PARAMS const char *name, const char *proto
+#define ADD_VARIABLES name, proto
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/getsrvbypt.c b/REORG.TODO/inet/getsrvbypt.c
new file mode 100644
index 0000000000..b82d91cd1b
--- /dev/null
+++ b/REORG.TODO/inet/getsrvbypt.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct servent
+#define FUNCTION_NAME getservbyport
+#define DATABASE_NAME services
+#define ADD_PARAMS int port, const char *proto
+#define ADD_VARIABLES port, proto
+#define BUFLEN 1024
+
+#include "../nss/getXXbyYY.c"
diff --git a/REORG.TODO/inet/getsrvbypt_r.c b/REORG.TODO/inet/getsrvbypt_r.c
new file mode 100644
index 0000000000..555c2a9cfc
--- /dev/null
+++ b/REORG.TODO/inet/getsrvbypt_r.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+
+
+#define LOOKUP_TYPE struct servent
+#define FUNCTION_NAME getservbyport
+#define DATABASE_NAME services
+#define ADD_PARAMS int port, const char *proto
+#define ADD_VARIABLES port, proto
+
+#include "../nss/getXXbyYY_r.c"
diff --git a/REORG.TODO/inet/herrno-loc.c b/REORG.TODO/inet/herrno-loc.c
new file mode 100644
index 0000000000..7dc661a7ba
--- /dev/null
+++ b/REORG.TODO/inet/herrno-loc.c
@@ -0,0 +1,29 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netdb.h>
+#include <tls.h>
+
+
+/* When threaded, h_errno may be a per-thread variable. */
+int *
+weak_const_function
+__h_errno_location (void)
+{
+ return &h_errno;
+}
+libc_hidden_def (__h_errno_location)
diff --git a/REORG.TODO/inet/herrno.c b/REORG.TODO/inet/herrno.c
new file mode 100644
index 0000000000..44ec0210f3
--- /dev/null
+++ b/REORG.TODO/inet/herrno.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <features.h>
+#include <netdb.h>
+#undef h_errno
+
+#include <tls.h>
+
+/* We need to have the error status variable of the resolver
+ accessible in the libc. */
+
+__thread int __h_errno;
+extern __thread int __libc_h_errno __attribute__ ((alias ("__h_errno")))
+ attribute_hidden;
+#define h_errno __libc_h_errno
diff --git a/REORG.TODO/inet/htonl.c b/REORG.TODO/inet/htonl.c
new file mode 100644
index 0000000000..06efe2c5f3
--- /dev/null
+++ b/REORG.TODO/inet/htonl.c
@@ -0,0 +1,35 @@
+/* Copyright (C) 1993-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdint.h>
+#include <netinet/in.h>
+
+#undef htonl
+#undef ntohl
+
+uint32_t
+htonl (uint32_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+ return x;
+#elif BYTE_ORDER == LITTLE_ENDIAN
+ return __bswap_32 (x);
+#else
+# error "What kind of system is this?"
+#endif
+}
+weak_alias (htonl, ntohl)
diff --git a/REORG.TODO/inet/htons.c b/REORG.TODO/inet/htons.c
new file mode 100644
index 0000000000..0b7159bb2e
--- /dev/null
+++ b/REORG.TODO/inet/htons.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 1993-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netinet/in.h>
+
+#undef htons
+#undef ntohs
+
+uint16_t
+htons (uint16_t x)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+ return x;
+#elif BYTE_ORDER == LITTLE_ENDIAN
+ return __bswap_16 (x);
+#else
+# error "What kind of system is this?"
+#endif
+}
+weak_alias (htons, ntohs)
diff --git a/REORG.TODO/inet/htontest.c b/REORG.TODO/inet/htontest.c
new file mode 100644
index 0000000000..9bc006396d
--- /dev/null
+++ b/REORG.TODO/inet/htontest.c
@@ -0,0 +1,70 @@
+/* Test hton/ntoh functions.
+ Copyright (C) 1997-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <endian.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+
+#if BYTE_ORDER == BIG_ENDIAN
+# define TEST(orig, swapped, fct) \
+ if ((fct (orig)) != (orig)) { \
+ printf ("Failed for %s -> %#x\n", #fct "(" #orig ")", fct (orig)); \
+ result = 1; \
+ }
+#elif BYTE_ORDER == LITTLE_ENDIAN
+# define TEST(orig, swapped, fct) \
+ if ((fct (orig)) != (swapped)) { \
+ printf ("Failed for %s -> %#x\n", #fct "(" #orig ")", fct (orig)); \
+ result = 1; \
+ }
+#else
+# error "Bah, what kind of system do you use?"
+#endif
+
+u_int32_t lo = 0x67452301;
+u_int16_t foo = 0x1234;
+
+int
+main (void)
+{
+ int result = 0;
+
+ TEST (0x67452301, 0x01234567, htonl);
+ TEST (0x67452301, 0x01234567, (htonl));
+ TEST (0x67452301, 0x01234567, ntohl);
+ TEST (0x67452301, 0x01234567, (ntohl));
+
+ TEST (lo, 0x01234567, htonl);
+ TEST (lo, 0x01234567, (htonl));
+ TEST (lo, 0x01234567, ntohl);
+ TEST (lo, 0x01234567, (ntohl));
+
+ TEST (0x1234, 0x3412, htons);
+ TEST (0x1234, 0x3412, (htons));
+ TEST (0x1234, 0x3412, ntohs);
+ TEST (0x1234, 0x3412, (ntohs));
+
+ TEST (foo, 0x3412, htons);
+ TEST (foo, 0x3412, (htons));
+ TEST (foo, 0x3412, ntohs);
+ TEST (foo, 0x3412, (ntohs));
+
+ return result;
+}
diff --git a/REORG.TODO/inet/if_index.c b/REORG.TODO/inet/if_index.c
new file mode 100644
index 0000000000..4604e0a35b
--- /dev/null
+++ b/REORG.TODO/inet/if_index.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 1997-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <net/if.h>
+#include <errno.h>
+#include <stddef.h>
+
+unsigned int
+__if_nametoindex (const char *ifname)
+{
+ __set_errno (ENOSYS);
+ return 0;
+}
+libc_hidden_def (__if_nametoindex)
+weak_alias (__if_nametoindex, if_nametoindex)
+libc_hidden_weak (if_nametoindex)
+stub_warning (if_nametoindex)
+
+char *
+__if_indextoname (unsigned int ifindex, char *ifname)
+{
+ __set_errno (ENOSYS);
+ return NULL;
+}
+weak_alias (__if_indextoname, if_indextoname)
+libc_hidden_weak (if_indextoname)
+stub_warning (if_indextoname)
+
+void
+__if_freenameindex (struct if_nameindex *ifn)
+{
+}
+libc_hidden_def (__if_freenameindex)
+weak_alias (__if_freenameindex, if_freenameindex)
+libc_hidden_weak (if_freenameindex)
+stub_warning (if_freenameindex)
+
+struct if_nameindex *
+__if_nameindex (void)
+{
+ __set_errno (ENOSYS);
+ return NULL;
+}
+weak_alias (__if_nameindex, if_nameindex)
+libc_hidden_weak (if_nameindex)
+stub_warning (if_nameindex)
diff --git a/REORG.TODO/inet/ifaddrs.c b/REORG.TODO/inet/ifaddrs.c
new file mode 100644
index 0000000000..35cc277225
--- /dev/null
+++ b/REORG.TODO/inet/ifaddrs.c
@@ -0,0 +1,47 @@
+/* getifaddrs -- get names and addresses of all network interfaces
+ Copyright (C) 2002-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <ifaddrs.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* Create a linked list of `struct ifaddrs' structures, one for each
+ network interface on the host machine. If successful, store the
+ list in *IFAP and return 0. On errors, return -1 and set `errno'. */
+int
+__getifaddrs (struct ifaddrs **ifap)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+weak_alias (__getifaddrs, getifaddrs)
+libc_hidden_weak (getifaddrs)
+stub_warning (getifaddrs)
+
+void
+__freeifaddrs (struct ifaddrs *ifa)
+{
+ if (ifa == NULL)
+ return; /* a la free, why not? */
+
+ /* Can't be called properly if getifaddrs never succeeded. */
+ abort ();
+}
+weak_alias (__freeifaddrs, freeifaddrs)
+libc_hidden_weak (freeifaddrs)
+stub_warning (freeifaddrs)
diff --git a/REORG.TODO/inet/ifaddrs.h b/REORG.TODO/inet/ifaddrs.h
new file mode 100644
index 0000000000..f850269061
--- /dev/null
+++ b/REORG.TODO/inet/ifaddrs.h
@@ -0,0 +1,73 @@
+/* ifaddrs.h -- declarations for getting network interface addresses
+ Copyright (C) 2002-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _IFADDRS_H
+#define _IFADDRS_H 1
+
+#include <features.h>
+#include <sys/socket.h>
+
+__BEGIN_DECLS
+
+/* The `getifaddrs' function generates a linked list of these structures.
+ Each element of the list describes one network interface. */
+struct ifaddrs
+{
+ struct ifaddrs *ifa_next; /* Pointer to the next structure. */
+
+ char *ifa_name; /* Name of this network interface. */
+ unsigned int ifa_flags; /* Flags as from SIOCGIFFLAGS ioctl. */
+
+ struct sockaddr *ifa_addr; /* Network address of this interface. */
+ struct sockaddr *ifa_netmask; /* Netmask of this interface. */
+ union
+ {
+ /* At most one of the following two is valid. If the IFF_BROADCAST
+ bit is set in `ifa_flags', then `ifa_broadaddr' is valid. If the
+ IFF_POINTOPOINT bit is set, then `ifa_dstaddr' is valid.
+ It is never the case that both these bits are set at once. */
+ struct sockaddr *ifu_broadaddr; /* Broadcast address of this interface. */
+ struct sockaddr *ifu_dstaddr; /* Point-to-point destination address. */
+ } ifa_ifu;
+ /* These very same macros are defined by <net/if.h> for `struct ifaddr'.
+ So if they are defined already, the existing definitions will be fine. */
+# ifndef ifa_broadaddr
+# define ifa_broadaddr ifa_ifu.ifu_broadaddr
+# endif
+# ifndef ifa_dstaddr
+# define ifa_dstaddr ifa_ifu.ifu_dstaddr
+# endif
+
+ void *ifa_data; /* Address-specific data (may be unused). */
+};
+
+
+/* Create a linked list of `struct ifaddrs' structures, one for each
+ network interface on the host machine. If successful, store the
+ list in *IFAP and return 0. On errors, return -1 and set `errno'.
+
+ The storage returned in *IFAP is allocated dynamically and can
+ only be properly freed by passing it to `freeifaddrs'. */
+extern int getifaddrs (struct ifaddrs **__ifap) __THROW;
+
+/* Reclaim the storage allocated by a previous `getifaddrs' call. */
+extern void freeifaddrs (struct ifaddrs *__ifa) __THROW;
+
+__END_DECLS
+
+#endif /* ifaddrs.h */
diff --git a/REORG.TODO/inet/ifreq.c b/REORG.TODO/inet/ifreq.c
new file mode 100644
index 0000000000..18aacb17ac
--- /dev/null
+++ b/REORG.TODO/inet/ifreq.c
@@ -0,0 +1,26 @@
+/* Collect network interface list. Stub version.
+ Copyright (C) 2013-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include "ifreq.h"
+
+void
+__ifreq (struct ifreq **ifreqs, int *num_ifs, int sockfd)
+{
+ *num_ifs = 0;
+ *ifreqs = NULL;
+}
diff --git a/REORG.TODO/inet/in6_addr.c b/REORG.TODO/inet/in6_addr.c
new file mode 100644
index 0000000000..cacc177006
--- /dev/null
+++ b/REORG.TODO/inet/in6_addr.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1997-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Philip Blundell <pjb27@cam.ac.uk>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netinet/in.h>
+
+const struct in6_addr __in6addr_any =
+{ { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } };
+libc_hidden_data_def (__in6addr_any)
+weak_alias (__in6addr_any, in6addr_any)
+libc_hidden_data_weak (in6addr_any)
+const struct in6_addr __in6addr_loopback =
+{ { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } };
+libc_hidden_data_def (__in6addr_loopback)
+weak_alias (__in6addr_loopback, in6addr_loopback)
+libc_hidden_data_weak (in6addr_loopback)
diff --git a/REORG.TODO/inet/inet6_opt.c b/REORG.TODO/inet/inet6_opt.c
new file mode 100644
index 0000000000..4581532a12
--- /dev/null
+++ b/REORG.TODO/inet/inet6_opt.c
@@ -0,0 +1,281 @@
+/* Copyright (C) 2006-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+
+
+/* RFC 3542, 10.1
+
+ This function returns the number of bytes needed for the empty
+ extension header i.e., without any options. If EXTBUF is not NULL it
+ also initializes the extension header to have the correct length
+ field. In that case if the EXTLEN value is not a positive (i.e.,
+ non-zero) multiple of 8 the function fails and returns -1. */
+int
+inet6_opt_init (void *extbuf, socklen_t extlen)
+{
+ if (extbuf != NULL)
+ {
+ if (extlen <= 0 || (extlen % 8) != 0 || extlen > 256 * 8)
+ return -1;
+
+ /* Fill in the length in units of 8 octets. */
+ struct ip6_hbh *extp = (struct ip6_hbh *) extbuf;
+
+ /* RFC 2460 requires that the header extension length is the
+ length of the option header in 8-byte units, not including
+ the first 8 bytes. Hence we have to subtract one. */
+ extp->ip6h_len = extlen / 8 - 1;
+ }
+
+ return sizeof (struct ip6_hbh);
+}
+
+
+static void
+add_padding (uint8_t *extbuf, int offset, int npad)
+{
+ if (npad == 1)
+ extbuf[offset] = IP6OPT_PAD1;
+ else if (npad > 0)
+ {
+ struct ip6_opt *pad_opt = (struct ip6_opt *) (extbuf + offset);
+
+ pad_opt->ip6o_type = IP6OPT_PADN;
+ pad_opt->ip6o_len = npad - sizeof (struct ip6_opt);
+ /* Clear the memory used by the padding. */
+ memset (pad_opt + 1, '\0', pad_opt->ip6o_len);
+ }
+}
+
+
+
+/* RFC 3542, 10.2
+
+ This function returns the updated total length taking into account
+ adding an option with length 'len' and alignment 'align'. If
+ EXTBUF is not NULL then, in addition to returning the length, the
+ function inserts any needed pad option, initializes the option
+ (setting the type and length fields) and returns a pointer to the
+ location for the option content in databufp. If the option does
+ not fit in the extension header buffer the function returns -1. */
+int
+inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type,
+ socklen_t len, uint8_t align, void **databufp)
+{
+ /* Check minimum offset. */
+ if (offset < sizeof (struct ip6_hbh))
+ return -1;
+
+ /* One cannot add padding options. */
+ if (type == IP6OPT_PAD1 || type == IP6OPT_PADN)
+ return -1;
+
+ /* The option length must fit in one octet. */
+ if (len > 255)
+ return -1;
+
+ /* The alignment can only by 1, 2, 4, or 8 and must not exceed the
+ option length. */
+ if (align == 0 || align > 8 || (align & (align - 1)) != 0 || align > len)
+ return -1;
+
+ /* Determine the needed padding for alignment. Following the
+ current content of the buffer we have the is the IPv6 option type
+ and length, followed immediately by the data. The data has the
+ alignment constraints. Therefore padding must be inserted in the
+ form of padding options before the new option. */
+ int data_offset = offset + sizeof (struct ip6_opt);
+ int npad = (align - data_offset % align) & (align - 1);
+
+ if (extbuf != NULL)
+ {
+ /* Now we can check whether the buffer is large enough. */
+ if (data_offset + npad + len > extlen)
+ return -1;
+
+ add_padding (extbuf, offset, npad);
+
+ offset += npad;
+
+ /* Now prepare the option itself. */
+ struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
+
+ opt->ip6o_type = type;
+ opt->ip6o_len = len;
+
+ *databufp = opt + 1;
+ }
+ else
+ offset += npad;
+
+ return offset + sizeof (struct ip6_opt) + len;
+}
+
+
+/* RFC 3542, 10.3
+
+ This function returns the updated total length taking into account
+ the final padding of the extension header to make it a multiple of
+ 8 bytes. If EXTBUF is not NULL the function also initializes the
+ option by inserting a Pad1 or PadN option of the proper length. */
+int
+inet6_opt_finish (void *extbuf, socklen_t extlen, int offset)
+{
+ /* Check minimum offset. */
+ if (offset < sizeof (struct ip6_hbh))
+ return -1;
+
+ /* Required padding at the end. */
+ int npad = (8 - (offset & 7)) & 7;
+
+ if (extbuf != NULL)
+ {
+ /* Make sure the buffer is large enough. */
+ if (offset + npad > extlen)
+ return -1;
+
+ add_padding (extbuf, offset, npad);
+ }
+
+ return offset + npad;
+}
+
+
+/* RFC 3542, 10.4
+
+ This function inserts data items of various sizes in the data
+ portion of the option. VAL should point to the data to be
+ inserted. OFFSET specifies where in the data portion of the option
+ the value should be inserted; the first byte after the option type
+ and length is accessed by specifying an offset of zero. */
+int
+inet6_opt_set_val (void *databuf, int offset, void *val, socklen_t vallen)
+{
+ memcpy ((uint8_t *) databuf + offset, val, vallen);
+
+ return offset + vallen;
+}
+
+
+/* RFC 3542, 10.5
+
+ This function parses received option extension headers returning
+ the next option. EXTBUF and EXTLEN specifies the extension header.
+ OFFSET should either be zero (for the first option) or the length
+ returned by a previous call to 'inet6_opt_next' or
+ 'inet6_opt_find'. It specifies the position where to continue
+ scanning the extension buffer. */
+int
+inet6_opt_next (void *extbuf, socklen_t extlen, int offset, uint8_t *typep,
+ socklen_t *lenp, void **databufp)
+{
+ if (offset == 0)
+ offset = sizeof (struct ip6_hbh);
+ else if (offset < sizeof (struct ip6_hbh))
+ return -1;
+
+ while (offset < extlen)
+ {
+ struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
+
+ if (opt->ip6o_type == IP6OPT_PAD1)
+ /* Single byte padding. */
+ ++offset;
+ else if (opt->ip6o_type == IP6OPT_PADN)
+ offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+ else
+ {
+ /* Check whether the option is valid. */
+ offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+ if (offset > extlen)
+ return -1;
+
+ *typep = opt->ip6o_type;
+ *lenp = opt->ip6o_len;
+ *databufp = opt + 1;
+ return offset;
+ }
+ }
+
+ return -1;
+}
+
+
+/* RFC 3542, 10.6
+
+ This function is similar to the previously described
+ 'inet6_opt_next' function, except this function lets the caller
+ specify the option type to be searched for, instead of always
+ returning the next option in the extension header. */
+int
+inet6_opt_find (void *extbuf, socklen_t extlen, int offset, uint8_t type,
+ socklen_t *lenp, void **databufp)
+{
+ if (offset == 0)
+ offset = sizeof (struct ip6_hbh);
+ else if (offset < sizeof (struct ip6_hbh))
+ return -1;
+
+ while (offset < extlen)
+ {
+ struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
+
+ if (opt->ip6o_type == IP6OPT_PAD1)
+ {
+ /* Single byte padding. */
+ ++offset;
+ if (type == IP6OPT_PAD1)
+ {
+ *lenp = 0;
+ *databufp = (uint8_t *) extbuf + offset;
+ return offset;
+ }
+ }
+ else if (opt->ip6o_type != type)
+ offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+ else
+ {
+ /* Check whether the option is valid. */
+ offset += sizeof (struct ip6_opt) + opt->ip6o_len;
+ if (offset > extlen)
+ return -1;
+
+ *lenp = opt->ip6o_len;
+ *databufp = opt + 1;
+ return offset;
+ }
+ }
+
+ return -1;
+}
+
+
+/* RFC 3542, 10.7
+
+ This function extracts data items of various sizes in the data
+ portion of the option. */
+int
+inet6_opt_get_val (void *databuf, int offset, void *val, socklen_t vallen)
+{
+ memcpy (val, (uint8_t *) databuf + offset, vallen);
+
+ return offset + vallen;
+}
diff --git a/REORG.TODO/inet/inet6_option.c b/REORG.TODO/inet/inet6_option.c
new file mode 100644
index 0000000000..f6d9b5dffe
--- /dev/null
+++ b/REORG.TODO/inet/inet6_option.c
@@ -0,0 +1,349 @@
+/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+#include <sys/param.h>
+
+
+static void
+internal_function
+add_pad (struct cmsghdr *cmsg, int len)
+{
+ unsigned char *p = CMSG_DATA (cmsg) + cmsg->cmsg_len - CMSG_LEN (0);
+
+ if (len == 1)
+ /* Special handling for 1, a one-byte solution. */
+ *p++ = IP6OPT_PAD1;
+ else if (len != 0)
+ {
+ /* Multibyte padding. */
+ *p++ = IP6OPT_PADN;
+ *p++ = len - 2; /* Discount the two header bytes. */
+ /* The rest is filled with zero. */
+ memset (p, '\0', len - 2);
+ p += len - 2;
+ }
+
+ /* Account for the bytes. */
+ cmsg->cmsg_len += len;
+}
+
+
+static int
+get_opt_end (const uint8_t **result, const uint8_t *startp,
+ const uint8_t *endp)
+{
+ if (startp >= endp)
+ /* Out of bounds. */
+ return -1;
+
+ if (*startp == IP6OPT_PAD1)
+ {
+ /* Just this one byte. */
+ *result = startp + 1;
+ return 0;
+ }
+
+ /* Now we know there must be at least two bytes. */
+ if (startp + 2 > endp
+ /* Now we can get the length byte. */
+ || startp + startp[1] + 2 > endp)
+ return -1;
+
+ *result = startp + startp[1] + 2;
+
+ return 0;
+}
+
+
+static uint8_t *option_alloc (struct cmsghdr *cmsg, int datalen, int multx,
+ int plusy);
+
+
+/* RFC 2292, 6.3.1
+
+ This function returns the number of bytes required to hold an option
+ when it is stored as ancillary data, including the cmsghdr structure
+ at the beginning, and any padding at the end (to make its size a
+ multiple of 8 bytes). The argument is the size of the structure
+ defining the option, which must include any pad bytes at the
+ beginning (the value y in the alignment term "xn + y"), the type
+ byte, the length byte, and the option data. */
+int
+inet6_option_space (int nbytes)
+{
+ /* Add room for the extension header. */
+ nbytes += sizeof (struct ip6_ext);
+
+ return CMSG_SPACE (roundup (nbytes, 8));
+}
+link_warning (inet6_option_space,
+ "inet6_option_space is obsolete, use the RFC 3542 interfaces")
+
+
+/* RFC 2292, 6.3.2
+
+ This function is called once per ancillary data object that will
+ contain either Hop-by-Hop or Destination options. It returns 0 on
+ success or -1 on an error. */
+int
+inet6_option_init (void *bp, struct cmsghdr **cmsgp, int type)
+{
+ /* Only Hop-by-Hop or Destination options allowed. */
+ if (type != IPV6_HOPOPTS && type != IPV6_DSTOPTS)
+ return -1;
+
+ /* BP is a pointer to the previously allocated space. */
+ struct cmsghdr *newp = (struct cmsghdr *) bp;
+
+ /* Initialize the message header.
+
+ Length: No data yet, only the cmsghdr struct. */
+ newp->cmsg_len = CMSG_LEN (0);
+ /* Originating protocol: obviously IPv6. */
+ newp->cmsg_level = IPPROTO_IPV6;
+ /* Message type. */
+ newp->cmsg_type = type;
+
+ /* Pass up the result. */
+ *cmsgp = newp;
+
+ return 0;
+}
+link_warning (inet6_option_init,
+ "inet6_option_init is obsolete, use the RFC 3542 interfaces")
+
+
+/* RFC 2292, 6.3.3
+
+ This function appends a Hop-by-Hop option or a Destination option
+ into an ancillary data object that has been initialized by
+ inet6_option_init(). This function returns 0 if it succeeds or -1 on
+ an error. */
+int
+inet6_option_append (struct cmsghdr *cmsg, const uint8_t *typep, int multx,
+ int plusy)
+{
+ /* typep is a pointer to the 8-bit option type. It is assumed that this
+ field is immediately followed by the 8-bit option data length field,
+ which is then followed immediately by the option data.
+
+ The option types IP6OPT_PAD1 and IP6OPT_PADN also must be handled. */
+ int len = typep[0] == IP6OPT_PAD1 ? 1 : typep[1] + 2;
+
+ /* Get the pointer to the space in the message. */
+ uint8_t *ptr = option_alloc (cmsg, len, multx, plusy);
+ if (ptr == NULL)
+ /* Some problem with the parameters. */
+ return -1;
+
+ /* Copy the content. */
+ memcpy (ptr, typep, len);
+
+ return 0;
+}
+link_warning (inet6_option_append,
+ "inet6_option_append is obsolete, use the RFC 3542 interfaces")
+
+
+/* RFC 2292, 6.3.4
+
+ This function appends a Hop-by-Hop option or a Destination option
+ into an ancillary data object that has been initialized by
+ inet6_option_init(). This function returns a pointer to the 8-bit
+ option type field that starts the option on success, or NULL on an
+ error. */
+static uint8_t *
+option_alloc (struct cmsghdr *cmsg, int datalen, int multx, int plusy)
+{
+ /* The RFC limits the value of the alignment values. */
+ if ((multx != 1 && multx != 2 && multx != 4 && multx != 8)
+ || ! (plusy >= 0 && plusy <= 7))
+ return NULL;
+
+ /* Current data size. */
+ int dsize = cmsg->cmsg_len - CMSG_LEN (0);
+
+ /* The first two bytes of the option are for the extended header. */
+ if (__glibc_unlikely (dsize == 0))
+ {
+ cmsg->cmsg_len += sizeof (struct ip6_ext);
+ dsize = sizeof (struct ip6_ext);
+ }
+
+ /* First add padding. */
+ add_pad (cmsg, ((multx - (dsize & (multx - 1))) & (multx - 1)) + plusy);
+
+ /* Return the pointer to the start of the option space. */
+ uint8_t *result = CMSG_DATA (cmsg) + cmsg->cmsg_len - CMSG_LEN (0);
+ cmsg->cmsg_len += datalen;
+
+ /* The extended option header length is measured in 8-byte groups.
+ To represent the current length we might have to add padding. */
+ dsize = cmsg->cmsg_len - CMSG_LEN (0);
+ add_pad (cmsg, (8 - (dsize & (8 - 1))) & (8 - 1));
+
+ /* Record the new length of the option. */
+ assert (((cmsg->cmsg_len - CMSG_LEN (0)) % 8) == 0);
+ int len8b = (cmsg->cmsg_len - CMSG_LEN (0)) / 8 - 1;
+ if (len8b >= 256)
+ /* Too long. */
+ return NULL;
+
+ struct ip6_ext *ie = (void *) CMSG_DATA (cmsg);
+ ie->ip6e_len = len8b;
+
+ return result;
+}
+
+
+uint8_t *
+inet6_option_alloc (struct cmsghdr *cmsg, int datalen, int multx, int plusy)
+{
+ return option_alloc (cmsg, datalen, multx, plusy);
+}
+link_warning (inet6_option_alloc,
+ "inet6_option_alloc is obsolete, use the RFC 3542 interfaces")
+
+
+/* RFC 2292, 6.3.5
+
+ This function processes the next Hop-by-Hop option or Destination
+ option in an ancillary data object. If another option remains to be
+ processed, the return value of the function is 0 and *tptrp points to
+ the 8-bit option type field (which is followed by the 8-bit option
+ data length, followed by the option data). If no more options remain
+ to be processed, the return value is -1 and *tptrp is NULL. If an
+ error occurs, the return value is -1 and *tptrp is not NULL. */
+int
+inet6_option_next (const struct cmsghdr *cmsg, uint8_t **tptrp)
+{
+ /* Make sure it is an option of the right type. */
+ if (cmsg->cmsg_level != IPPROTO_IPV6
+ || (cmsg->cmsg_type != IPV6_HOPOPTS && cmsg->cmsg_type != IPV6_DSTOPTS))
+ return -1;
+
+ /* Pointer to the extension header. We only compute the address, we
+ don't access anything yet. */
+ const struct ip6_ext *ip6e = (const struct ip6_ext *) CMSG_DATA (cmsg);
+
+ /* Make sure the message is long enough. */
+ if (cmsg->cmsg_len < CMSG_LEN (sizeof (struct ip6_ext))
+ /* Now we can access the extension header. */
+ || cmsg->cmsg_len < CMSG_LEN ((ip6e->ip6e_len + 1) * 8))
+ /* Too small. */
+ return -1;
+
+ /* Determine the address of the byte past the message. */
+ const uint8_t *endp = CMSG_DATA (cmsg) + (ip6e->ip6e_len + 1) * 8;
+
+ const uint8_t *result;
+ if (*tptrp == NULL)
+ /* This is the first call, return the first option if there is one. */
+ result = (const uint8_t *) (ip6e + 1);
+ else
+ {
+ /* Make sure *TPTRP points to a beginning of a new option in
+ the message. The upper limit is checked in get_opt_end. */
+ if (*tptrp < (const uint8_t *) (ip6e + 1))
+ return -1;
+
+ /* Get the beginning of the next option. */
+ if (get_opt_end (&result, *tptrp, endp) != 0)
+ return -1;
+ }
+
+ /* We know where the next option starts. */
+ *tptrp = (uint8_t *) result;
+
+ /* Check the option is fully represented in the message. */
+ return get_opt_end (&result, result, endp);
+}
+link_warning (inet6_option_next,
+ "inet6_option_next is obsolete, use the RFC 3542 interfaces")
+
+
+/* RFC 2292, 6.3.6
+
+ This function is similar to the previously described
+ inet6_option_next() function, except this function lets the caller
+ specify the option type to be searched for, instead of always
+ returning the next option in the ancillary data object. cmsg is a
+ pointer to cmsghdr structure of which cmsg_level equals IPPROTO_IPV6
+ and cmsg_type equals either IPV6_HOPOPTS or IPV6_DSTOPTS. */
+int
+inet6_option_find (const struct cmsghdr *cmsg, uint8_t **tptrp, int type)
+{
+ /* Make sure it is an option of the right type. */
+ if (cmsg->cmsg_level != IPPROTO_IPV6
+ || (cmsg->cmsg_type != IPV6_HOPOPTS && cmsg->cmsg_type != IPV6_DSTOPTS))
+ return -1;
+
+ /* Pointer to the extension header. We only compute the address, we
+ don't access anything yet. */
+ const struct ip6_ext *ip6e = (const struct ip6_ext *) CMSG_DATA (cmsg);
+
+ /* Make sure the message is long enough. */
+ if (cmsg->cmsg_len < CMSG_LEN (sizeof (struct ip6_ext))
+ /* Now we can access the extension header. */
+ || cmsg->cmsg_len < CMSG_LEN ((ip6e->ip6e_len + 1) * 8))
+ /* Too small. */
+ return -1;
+
+ /* Determine the address of the byte past the message. */
+ const uint8_t *endp = CMSG_DATA (cmsg) + (ip6e->ip6e_len + 1) * 8;
+
+ const uint8_t *next;
+ if (*tptrp == NULL)
+ /* This is the first call, return the first option if there is one. */
+ next = (const uint8_t *) (ip6e + 1);
+ else
+ {
+ /* Make sure *TPTRP points to a beginning of a new option in
+ the message. The upper limit is checked in get_opt_end. */
+ if (*tptrp < (const uint8_t *) (ip6e + 1))
+ return -1;
+
+ /* Get the beginning of the next option. */
+ if (get_opt_end (&next, *tptrp, endp) != 0)
+ return -1;
+ }
+
+ /* Now search for the appropriate typed entry. */
+ const uint8_t *result;
+ do
+ {
+ result = next;
+
+ /* Get the end of this entry. */
+ if (get_opt_end (&next, result, endp) != 0)
+ return -1;
+ }
+ while (*result != type);
+
+ /* We know where the next option starts. */
+ *tptrp = (uint8_t *) result;
+
+ /* Success. */
+ return 0;
+}
+link_warning (inet6_option_find,
+ "inet6_option_find is obsolete, use the RFC 3542 interfaces")
diff --git a/REORG.TODO/inet/inet6_rth.c b/REORG.TODO/inet/inet6_rth.c
new file mode 100644
index 0000000000..917753da09
--- /dev/null
+++ b/REORG.TODO/inet/inet6_rth.c
@@ -0,0 +1,196 @@
+/* Copyright (C) 2006-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+
+
+/* RFC 3542, 7.1
+
+ This function returns the number of bytes required to hold a
+ Routing header of the specified type containing the specified
+ number of segments (addresses). For an IPv6 Type 0 Routing header,
+ the number of segments must be between 0 and 127, inclusive. */
+socklen_t
+inet6_rth_space (int type, int segments)
+{
+ switch (type)
+ {
+ case IPV6_RTHDR_TYPE_0:
+ if (segments < 0 || segments > 127)
+ return 0;
+
+ return sizeof (struct ip6_rthdr0) + segments * sizeof (struct in6_addr);
+ }
+
+ return 0;
+}
+
+
+/* RFC 3542, 7.2
+
+ This function initializes the buffer pointed to by BP to contain a
+ Routing header of the specified type and sets ip6r_len based on the
+ segments parameter. */
+void *
+inet6_rth_init (void *bp, socklen_t bp_len, int type, int segments)
+{
+ struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+ switch (type)
+ {
+ case IPV6_RTHDR_TYPE_0:
+ /* Make sure the parameters are valid and the buffer is large enough. */
+ if (segments < 0 || segments > 127)
+ break;
+
+ socklen_t len = (sizeof (struct ip6_rthdr0)
+ + segments * sizeof (struct in6_addr));
+ if (len > bp_len)
+ break;
+
+ /* Some implementations seem to initialize the whole memory area. */
+ memset (bp, '\0', len);
+
+ /* Length in units of 8 octets. */
+ rthdr->ip6r_len = segments * sizeof (struct in6_addr) / 8;
+ rthdr->ip6r_type = IPV6_RTHDR_TYPE_0;
+ return bp;
+ }
+
+ return NULL;
+}
+
+
+/* RFC 3542, 7.3
+
+ This function adds the IPv6 address pointed to by addr to the end of
+ the Routing header being constructed. */
+int
+inet6_rth_add (void *bp, const struct in6_addr *addr)
+{
+ struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+ switch (rthdr->ip6r_type)
+ {
+ struct ip6_rthdr0 *rthdr0;
+ case IPV6_RTHDR_TYPE_0:
+ rthdr0 = (struct ip6_rthdr0 *) rthdr;
+ if (rthdr0->ip6r0_len * 8 / sizeof (struct in6_addr)
+ - rthdr0->ip6r0_segleft < 1)
+ return -1;
+
+ memcpy (&rthdr0->ip6r0_addr[rthdr0->ip6r0_segleft++],
+ addr, sizeof (struct in6_addr));
+
+ return 0;
+ }
+
+ return -1;
+}
+
+
+/* RFC 3542, 7.4
+
+ This function takes a Routing header extension header (pointed to by
+ the first argument) and writes a new Routing header that sends
+ datagrams along the reverse of that route. The function reverses the
+ order of the addresses and sets the segleft member in the new Routing
+ header to the number of segments. */
+int
+inet6_rth_reverse (const void *in, void *out)
+{
+ struct ip6_rthdr *in_rthdr = (struct ip6_rthdr *) in;
+
+ switch (in_rthdr->ip6r_type)
+ {
+ struct ip6_rthdr0 *in_rthdr0;
+ struct ip6_rthdr0 *out_rthdr0;
+ case IPV6_RTHDR_TYPE_0:
+ in_rthdr0 = (struct ip6_rthdr0 *) in;
+ out_rthdr0 = (struct ip6_rthdr0 *) out;
+
+ /* Copy header, not the addresses. The memory regions can overlap. */
+ memmove (out_rthdr0, in_rthdr0, sizeof (struct ip6_rthdr0));
+
+ int total = in_rthdr0->ip6r0_len * 8 / sizeof (struct in6_addr);
+ for (int i = 0; i < total / 2; ++i)
+ {
+ /* Remember, IN_RTHDR0 and OUT_RTHDR0 might overlap. */
+ struct in6_addr temp = in_rthdr0->ip6r0_addr[i];
+ out_rthdr0->ip6r0_addr[i] = in_rthdr0->ip6r0_addr[total - 1 - i];
+ out_rthdr0->ip6r0_addr[total - 1 - i] = temp;
+ }
+ if (total % 2 != 0 && in != out)
+ out_rthdr0->ip6r0_addr[total / 2] = in_rthdr0->ip6r0_addr[total / 2];
+
+ out_rthdr0->ip6r0_segleft = total;
+
+ return 0;
+ }
+
+ return -1;
+}
+
+
+/* RFC 3542, 7.5
+
+ This function returns the number of segments (addresses) contained in
+ the Routing header described by BP. */
+int
+inet6_rth_segments (const void *bp)
+{
+ struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+ switch (rthdr->ip6r_type)
+ {
+ case IPV6_RTHDR_TYPE_0:
+
+ return rthdr->ip6r_len * 8 / sizeof (struct in6_addr);
+ }
+
+ return -1;
+}
+
+
+/* RFC 3542, 7.6
+
+ This function returns a pointer to the IPv6 address specified by
+ index (which must have a value between 0 and one less than the
+ value returned by 'inet6_rth_segments') in the Routing header
+ described by BP. */
+struct in6_addr *
+inet6_rth_getaddr (const void *bp, int index)
+{
+ struct ip6_rthdr *rthdr = (struct ip6_rthdr *) bp;
+
+ switch (rthdr->ip6r_type)
+ {
+ struct ip6_rthdr0 *rthdr0;
+ case IPV6_RTHDR_TYPE_0:
+ rthdr0 = (struct ip6_rthdr0 *) rthdr;
+
+ if (index >= rthdr0->ip6r0_len * 8 / sizeof (struct in6_addr))
+ break;
+
+ return &rthdr0->ip6r0_addr[index];
+ }
+
+ return NULL;
+}
diff --git a/REORG.TODO/inet/inet6_scopeid_pton.c b/REORG.TODO/inet/inet6_scopeid_pton.c
new file mode 100644
index 0000000000..f842ffcadb
--- /dev/null
+++ b/REORG.TODO/inet/inet6_scopeid_pton.c
@@ -0,0 +1,63 @@
+/* Convert an IPv6 scope ID from text to the internal representation.
+ Copyright (C) 2016-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <net-internal.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <locale.h>
+#include <net/if.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* Parse SOURCE as a scope ID for ADDRESS. Return 0 on success and -1
+ on error. */
+internal_function int
+__inet6_scopeid_pton (const struct in6_addr *address, const char *scope,
+ uint32_t *result)
+{
+ if (IN6_IS_ADDR_LINKLOCAL (address)
+ || IN6_IS_ADDR_MC_LINKLOCAL (address))
+ {
+ uint32_t number = __if_nametoindex (scope);
+ if (number != 0)
+ {
+ *result = number;
+ return 0;
+ }
+ }
+
+ if (isdigit_l (scope[0], _nl_C_locobj_ptr))
+ {
+ char *end;
+ unsigned long long number
+ = ____strtoull_l_internal (scope, &end, /*base */ 10, /* group */ 0,
+ _nl_C_locobj_ptr);
+ if (*end == '\0' && number <= UINT32_MAX)
+ {
+ *result = number;
+ return 0;
+ }
+ }
+
+ __set_errno (EINVAL);
+ return -1;
+}
+
+libc_hidden_def (__inet6_scopeid_pton)
diff --git a/REORG.TODO/inet/inet_lnaof.c b/REORG.TODO/inet/inet_lnaof.c
new file mode 100644
index 0000000000..fc8196b709
--- /dev/null
+++ b/REORG.TODO/inet/inet_lnaof.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Return the local network address portion of an
+ * internet address; handles class a/b/c network
+ * number formats.
+ */
+in_addr_t
+inet_lnaof (struct in_addr in)
+{
+ u_int32_t i = ntohl(in.s_addr);
+
+ if (IN_CLASSA(i))
+ return ((i)&IN_CLASSA_HOST);
+ else if (IN_CLASSB(i))
+ return ((i)&IN_CLASSB_HOST);
+ else
+ return ((i)&IN_CLASSC_HOST);
+}
diff --git a/REORG.TODO/inet/inet_mkadr.c b/REORG.TODO/inet/inet_mkadr.c
new file mode 100644
index 0000000000..88faef74cf
--- /dev/null
+++ b/REORG.TODO/inet/inet_mkadr.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Formulate an Internet address from network + host. Used in
+ * building addresses stored in the ifnet structure.
+ */
+struct in_addr
+__inet_makeaddr (in_addr_t net, in_addr_t host)
+{
+ struct in_addr in;
+
+ if (net < 128)
+ in.s_addr = (net << IN_CLASSA_NSHIFT) | (host & IN_CLASSA_HOST);
+ else if (net < 65536)
+ in.s_addr = (net << IN_CLASSB_NSHIFT) | (host & IN_CLASSB_HOST);
+ else if (net < 16777216L)
+ in.s_addr = (net << IN_CLASSC_NSHIFT) | (host & IN_CLASSC_HOST);
+ else
+ in.s_addr = net | host;
+ in.s_addr = htonl(in.s_addr);
+ return in;
+}
+libc_hidden_def (__inet_makeaddr)
+weak_alias (__inet_makeaddr, inet_makeaddr)
diff --git a/REORG.TODO/inet/inet_net.c b/REORG.TODO/inet/inet_net.c
new file mode 100644
index 0000000000..434d716854
--- /dev/null
+++ b/REORG.TODO/inet/inet_net.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* Copyright (C) 2013-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+
+/*
+ * Internet network address interpretation routine.
+ * The library routines call this routine to interpret
+ * network numbers.
+ */
+u_int32_t
+inet_network (const char *cp)
+{
+ u_int32_t val, base, n, i;
+ char c;
+ u_int32_t parts[4], *pp = parts;
+ int digit;
+
+again:
+ val = 0; base = 10; digit = 0;
+ if (*cp == '0')
+ digit = 1, base = 8, cp++;
+ if (*cp == 'x' || *cp == 'X')
+ digit = 0, base = 16, cp++;
+ while ((c = *cp) != 0) {
+ if (isdigit(c)) {
+ if (base == 8 && (c == '8' || c == '9'))
+ return (INADDR_NONE);
+ val = (val * base) + (c - '0');
+ cp++;
+ digit = 1;
+ continue;
+ }
+ if (base == 16 && isxdigit(c)) {
+ val = (val << 4) + (tolower (c) + 10 - 'a');
+ cp++;
+ digit = 1;
+ continue;
+ }
+ break;
+ }
+ if (!digit)
+ return (INADDR_NONE);
+ if (pp >= parts + 4 || val > 0xff)
+ return (INADDR_NONE);
+ if (*cp == '.') {
+ *pp++ = val, cp++;
+ goto again;
+ }
+ while (isspace(*cp))
+ cp++;
+ if (*cp)
+ return (INADDR_NONE);
+ if (pp >= parts + 4 || val > 0xff)
+ return (INADDR_NONE);
+ *pp++ = val;
+ n = pp - parts;
+ for (val = 0, i = 0; i < n; i++) {
+ val <<= 8;
+ val |= parts[i] & 0xff;
+ }
+ return (val);
+}
diff --git a/REORG.TODO/inet/inet_netof.c b/REORG.TODO/inet/inet_netof.c
new file mode 100644
index 0000000000..ef6281d29f
--- /dev/null
+++ b/REORG.TODO/inet/inet_netof.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Return the network number from an internet
+ * address; handles class a/b/c network #'s.
+ */
+in_addr_t
+inet_netof (struct in_addr in)
+{
+ u_int32_t i = ntohl(in.s_addr);
+
+ if (IN_CLASSA(i))
+ return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
+ else if (IN_CLASSB(i))
+ return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
+ else
+ return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+}
+libc_hidden_def (inet_netof)
diff --git a/REORG.TODO/inet/inet_ntoa.c b/REORG.TODO/inet/inet_ntoa.c
new file mode 100644
index 0000000000..513d22c75e
--- /dev/null
+++ b/REORG.TODO/inet/inet_ntoa.c
@@ -0,0 +1,38 @@
+/* Convert Inet number to ASCII representation.
+ Copyright (C) 1997-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+
+/* The interface of this function is completely stupid, it requires a
+ static buffer. We relax this a bit in that we allow one buffer for
+ each thread. */
+static __thread char buffer[18];
+
+
+char *
+inet_ntoa (struct in_addr in)
+{
+ unsigned char *bytes = (unsigned char *) &in;
+ __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",
+ bytes[0], bytes[1], bytes[2], bytes[3]);
+
+ return buffer;
+}
diff --git a/REORG.TODO/inet/net-internal.h b/REORG.TODO/inet/net-internal.h
new file mode 100644
index 0000000000..2b2632c7ba
--- /dev/null
+++ b/REORG.TODO/inet/net-internal.h
@@ -0,0 +1,119 @@
+/* Network-related functions for internal library use.
+ Copyright (C) 2016-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NET_INTERNAL_H
+#define _NET_INTERNAL_H 1
+
+#include <arpa/inet.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <sys/time.h>
+
+int __inet6_scopeid_pton (const struct in6_addr *address,
+ const char *scope, uint32_t *result)
+ internal_function attribute_hidden;
+libc_hidden_proto (__inet6_scopeid_pton)
+
+
+/* Deadline handling for enforcing timeouts.
+
+ Code should call __deadline_current_time to obtain the current time
+ and cache it locally. The cache needs updating after every
+ long-running or potentially blocking operation. Deadlines relative
+ to the current time can be computed using __deadline_from_timeval.
+ The deadlines may have to be recomputed in response to certain
+ events (such as an incoming packet), but they are absolute (not
+ relative to the current time). A timeout suitable for use with the
+ poll function can be computed from such a deadline using
+ __deadline_to_ms.
+
+ The fields in the structs defined belowed should only be used
+ within the implementation. */
+
+/* Cache of the current time. Used to compute deadlines from relative
+ timeouts and vice versa. */
+struct deadline_current_time
+{
+ struct timespec current;
+};
+
+/* Return the current time. Terminates the process if the current
+ time is not available. */
+struct deadline_current_time __deadline_current_time (void)
+ internal_function attribute_hidden;
+
+/* Computed absolute deadline. */
+struct deadline
+{
+ struct timespec absolute;
+};
+
+
+/* For internal use only. */
+static inline bool
+__deadline_is_infinite (struct deadline deadline)
+{
+ return deadline.absolute.tv_nsec < 0;
+}
+
+/* Return true if the current time is at the deadline or past it. */
+static inline bool
+__deadline_elapsed (struct deadline_current_time current,
+ struct deadline deadline)
+{
+ return !__deadline_is_infinite (deadline)
+ && (current.current.tv_sec > deadline.absolute.tv_sec
+ || (current.current.tv_sec == deadline.absolute.tv_sec
+ && current.current.tv_nsec >= deadline.absolute.tv_nsec));
+}
+
+/* Return the deadline which occurs first. */
+static inline struct deadline
+__deadline_first (struct deadline left, struct deadline right)
+{
+ if (__deadline_is_infinite (right)
+ || left.absolute.tv_sec < right.absolute.tv_sec
+ || (left.absolute.tv_sec == right.absolute.tv_sec
+ && left.absolute.tv_nsec < right.absolute.tv_nsec))
+ return left;
+ else
+ return right;
+}
+
+/* Add TV to the current time and return it. Returns a special
+ infinite absolute deadline on overflow. */
+struct deadline __deadline_from_timeval (struct deadline_current_time,
+ struct timeval tv)
+ internal_function attribute_hidden;
+
+/* Compute the number of milliseconds until the specified deadline,
+ from the current time in the argument. The result is mainly for
+ use with poll. If the deadline has already passed, return 0. If
+ the result would overflow an int, return INT_MAX. */
+int __deadline_to_ms (struct deadline_current_time, struct deadline)
+ internal_function attribute_hidden;
+
+/* Return true if TV.tv_sec is non-negative and TV.tv_usec is in the
+ interval [0, 999999]. */
+static inline bool
+__is_timeval_valid_timeout (struct timeval tv)
+{
+ return tv.tv_sec >= 0 && tv.tv_usec >= 0 && tv.tv_usec < 1000 * 1000;
+}
+
+#endif /* _NET_INTERNAL_H */
diff --git a/REORG.TODO/inet/netgroup.h b/REORG.TODO/inet/netgroup.h
new file mode 100644
index 0000000000..9ad9dfe144
--- /dev/null
+++ b/REORG.TODO/inet/netgroup.h
@@ -0,0 +1,85 @@
+/* Internal header for netgroup related functions.
+ Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NETGROUP_H
+#define _NETGROUP_H 1
+
+#include <nsswitch.h>
+
+/* A netgroup can consist of names of other netgroups. We have to
+ track which netgroups were read and which still have to be read. */
+struct name_list
+{
+ struct name_list *next;
+ char name[];
+};
+
+
+/* Dataset for iterating netgroups. */
+struct __netgrent
+{
+ enum { triple_val, group_val } type;
+
+ union
+ {
+ struct
+ {
+ const char *host;
+ const char *user;
+ const char *domain;
+ }
+ triple;
+
+ const char *group;
+ } val;
+
+ /* Room for the data kept between the calls to the netgroup
+ functions. We must avoid global variables. */
+ char *data;
+ size_t data_size;
+ union
+ {
+ char *cursor;
+ unsigned long int position;
+ };
+ int first;
+
+ struct name_list *known_groups;
+ struct name_list *needed_groups;
+
+ /* This handle for the NSS data base is shared between all
+ set/get/endXXXent functions. */
+ service_user *nip;
+};
+
+
+/* The internal netgroup handling functions might be called from outside. */
+extern int __internal_setnetgrent (const char *group,
+ struct __netgrent *datap)
+ internal_function;
+libc_hidden_proto (__internal_setnetgrent)
+extern void __internal_endnetgrent (struct __netgrent *datap)
+ internal_function;
+libc_hidden_proto (__internal_endnetgrent)
+extern int __internal_getnetgrent_r (char **hostp, char **userp,
+ char **domainp, struct __netgrent *datap,
+ char *buffer, size_t buflen, int *errnop)
+ internal_function;
+libc_hidden_proto (__internal_getnetgrent_r)
+
+#endif /* netgroup.h */
diff --git a/REORG.TODO/inet/netinet/ether.h b/REORG.TODO/inet/netinet/ether.h
new file mode 100644
index 0000000000..966ec8aec1
--- /dev/null
+++ b/REORG.TODO/inet/netinet/ether.h
@@ -0,0 +1,55 @@
+/* Functions for storing Ethernet addresses in ASCII and mapping to hostnames.
+ Copyright (C) 1996-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NETINET_ETHER_H
+#define _NETINET_ETHER_H 1
+
+#include <features.h>
+
+/* Get definition of `struct ether_addr'. */
+#include <netinet/if_ether.h>
+
+#ifdef __USE_MISC
+__BEGIN_DECLS
+
+/* Convert 48 bit Ethernet ADDRess to ASCII. */
+extern char *ether_ntoa (const struct ether_addr *__addr) __THROW;
+extern char *ether_ntoa_r (const struct ether_addr *__addr, char *__buf)
+ __THROW;
+
+/* Convert ASCII string S to 48 bit Ethernet address. */
+extern struct ether_addr *ether_aton (const char *__asc) __THROW;
+extern struct ether_addr *ether_aton_r (const char *__asc,
+ struct ether_addr *__addr) __THROW;
+
+/* Map 48 bit Ethernet number ADDR to HOSTNAME. */
+extern int ether_ntohost (char *__hostname, const struct ether_addr *__addr)
+ __THROW;
+
+/* Map HOSTNAME to 48 bit Ethernet address. */
+extern int ether_hostton (const char *__hostname, struct ether_addr *__addr)
+ __THROW;
+
+/* Scan LINE and set ADDR and HOSTNAME. */
+extern int ether_line (const char *__line, struct ether_addr *__addr,
+ char *__hostname) __THROW;
+
+__END_DECLS
+#endif /* Use misc. */
+
+#endif /* netinet/ether.h */
diff --git a/REORG.TODO/inet/netinet/icmp6.h b/REORG.TODO/inet/netinet/icmp6.h
new file mode 100644
index 0000000000..fc5d09ecac
--- /dev/null
+++ b/REORG.TODO/inet/netinet/icmp6.h
@@ -0,0 +1,345 @@
+/* Copyright (C) 1991-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NETINET_ICMP6_H
+#define _NETINET_ICMP6_H 1
+
+#include <inttypes.h>
+#include <string.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+
+#define ICMP6_FILTER 1
+
+#define ICMP6_FILTER_BLOCK 1
+#define ICMP6_FILTER_PASS 2
+#define ICMP6_FILTER_BLOCKOTHERS 3
+#define ICMP6_FILTER_PASSONLY 4
+
+struct icmp6_filter
+ {
+ uint32_t icmp6_filt[8];
+ };
+
+struct icmp6_hdr
+ {
+ uint8_t icmp6_type; /* type field */
+ uint8_t icmp6_code; /* code field */
+ uint16_t icmp6_cksum; /* checksum field */
+ union
+ {
+ uint32_t icmp6_un_data32[1]; /* type-specific field */
+ uint16_t icmp6_un_data16[2]; /* type-specific field */
+ uint8_t icmp6_un_data8[4]; /* type-specific field */
+ } icmp6_dataun;
+ };
+
+#define icmp6_data32 icmp6_dataun.icmp6_un_data32
+#define icmp6_data16 icmp6_dataun.icmp6_un_data16
+#define icmp6_data8 icmp6_dataun.icmp6_un_data8
+#define icmp6_pptr icmp6_data32[0] /* parameter prob */
+#define icmp6_mtu icmp6_data32[0] /* packet too big */
+#define icmp6_id icmp6_data16[0] /* echo request/reply */
+#define icmp6_seq icmp6_data16[1] /* echo request/reply */
+#define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */
+
+#define ICMP6_DST_UNREACH 1
+#define ICMP6_PACKET_TOO_BIG 2
+#define ICMP6_TIME_EXCEEDED 3
+#define ICMP6_PARAM_PROB 4
+
+#define ICMP6_INFOMSG_MASK 0x80 /* all informational messages */
+
+#define ICMP6_ECHO_REQUEST 128
+#define ICMP6_ECHO_REPLY 129
+#define MLD_LISTENER_QUERY 130
+#define MLD_LISTENER_REPORT 131
+#define MLD_LISTENER_REDUCTION 132
+
+#define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */
+#define ICMP6_DST_UNREACH_ADMIN 1 /* communication with destination */
+ /* administratively prohibited */
+#define ICMP6_DST_UNREACH_BEYONDSCOPE 2 /* beyond scope of source address */
+#define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */
+#define ICMP6_DST_UNREACH_NOPORT 4 /* bad port */
+
+#define ICMP6_TIME_EXCEED_TRANSIT 0 /* Hop Limit == 0 in transit */
+#define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* Reassembly time out */
+
+#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */
+#define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized Next Header */
+#define ICMP6_PARAMPROB_OPTION 2 /* unrecognized IPv6 option */
+
+#define ICMP6_FILTER_WILLPASS(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0)
+
+#define ICMP6_FILTER_WILLBLOCK(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0)
+
+#define ICMP6_FILTER_SETPASS(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31))))
+
+#define ICMP6_FILTER_SETBLOCK(type, filterp) \
+ ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31))))
+
+#define ICMP6_FILTER_SETPASSALL(filterp) \
+ memset (filterp, 0, sizeof (struct icmp6_filter));
+
+#define ICMP6_FILTER_SETBLOCKALL(filterp) \
+ memset (filterp, 0xFF, sizeof (struct icmp6_filter));
+
+#define ND_ROUTER_SOLICIT 133
+#define ND_ROUTER_ADVERT 134
+#define ND_NEIGHBOR_SOLICIT 135
+#define ND_NEIGHBOR_ADVERT 136
+#define ND_REDIRECT 137
+
+struct nd_router_solicit /* router solicitation */
+ {
+ struct icmp6_hdr nd_rs_hdr;
+ /* could be followed by options */
+ };
+
+#define nd_rs_type nd_rs_hdr.icmp6_type
+#define nd_rs_code nd_rs_hdr.icmp6_code
+#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
+#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
+
+struct nd_router_advert /* router advertisement */
+ {
+ struct icmp6_hdr nd_ra_hdr;
+ uint32_t nd_ra_reachable; /* reachable time */
+ uint32_t nd_ra_retransmit; /* retransmit timer */
+ /* could be followed by options */
+ };
+
+#define nd_ra_type nd_ra_hdr.icmp6_type
+#define nd_ra_code nd_ra_hdr.icmp6_code
+#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
+#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
+#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
+#define ND_RA_FLAG_MANAGED 0x80
+#define ND_RA_FLAG_OTHER 0x40
+#define ND_RA_FLAG_HOME_AGENT 0x20
+#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
+
+struct nd_neighbor_solicit /* neighbor solicitation */
+ {
+ struct icmp6_hdr nd_ns_hdr;
+ struct in6_addr nd_ns_target; /* target address */
+ /* could be followed by options */
+ };
+
+#define nd_ns_type nd_ns_hdr.icmp6_type
+#define nd_ns_code nd_ns_hdr.icmp6_code
+#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
+#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
+
+struct nd_neighbor_advert /* neighbor advertisement */
+ {
+ struct icmp6_hdr nd_na_hdr;
+ struct in6_addr nd_na_target; /* target address */
+ /* could be followed by options */
+ };
+
+#define nd_na_type nd_na_hdr.icmp6_type
+#define nd_na_code nd_na_hdr.icmp6_code
+#define nd_na_cksum nd_na_hdr.icmp6_cksum
+#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ND_NA_FLAG_ROUTER 0x80000000
+#define ND_NA_FLAG_SOLICITED 0x40000000
+#define ND_NA_FLAG_OVERRIDE 0x20000000
+#else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+#define ND_NA_FLAG_ROUTER 0x00000080
+#define ND_NA_FLAG_SOLICITED 0x00000040
+#define ND_NA_FLAG_OVERRIDE 0x00000020
+#endif
+
+struct nd_redirect /* redirect */
+ {
+ struct icmp6_hdr nd_rd_hdr;
+ struct in6_addr nd_rd_target; /* target address */
+ struct in6_addr nd_rd_dst; /* destination address */
+ /* could be followed by options */
+ };
+
+#define nd_rd_type nd_rd_hdr.icmp6_type
+#define nd_rd_code nd_rd_hdr.icmp6_code
+#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
+#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
+
+struct nd_opt_hdr /* Neighbor discovery option header */
+ {
+ uint8_t nd_opt_type;
+ uint8_t nd_opt_len; /* in units of 8 octets */
+ /* followed by option specific data */
+ };
+
+#define ND_OPT_SOURCE_LINKADDR 1
+#define ND_OPT_TARGET_LINKADDR 2
+#define ND_OPT_PREFIX_INFORMATION 3
+#define ND_OPT_REDIRECTED_HEADER 4
+#define ND_OPT_MTU 5
+#define ND_OPT_RTR_ADV_INTERVAL 7
+#define ND_OPT_HOME_AGENT_INFO 8
+
+struct nd_opt_prefix_info /* prefix information */
+ {
+ uint8_t nd_opt_pi_type;
+ uint8_t nd_opt_pi_len;
+ uint8_t nd_opt_pi_prefix_len;
+ uint8_t nd_opt_pi_flags_reserved;
+ uint32_t nd_opt_pi_valid_time;
+ uint32_t nd_opt_pi_preferred_time;
+ uint32_t nd_opt_pi_reserved2;
+ struct in6_addr nd_opt_pi_prefix;
+ };
+
+#define ND_OPT_PI_FLAG_ONLINK 0x80
+#define ND_OPT_PI_FLAG_AUTO 0x40
+#define ND_OPT_PI_FLAG_RADDR 0x20
+
+struct nd_opt_rd_hdr /* redirected header */
+ {
+ uint8_t nd_opt_rh_type;
+ uint8_t nd_opt_rh_len;
+ uint16_t nd_opt_rh_reserved1;
+ uint32_t nd_opt_rh_reserved2;
+ /* followed by IP header and data */
+ };
+
+struct nd_opt_mtu /* MTU option */
+ {
+ uint8_t nd_opt_mtu_type;
+ uint8_t nd_opt_mtu_len;
+ uint16_t nd_opt_mtu_reserved;
+ uint32_t nd_opt_mtu_mtu;
+ };
+
+struct mld_hdr
+ {
+ struct icmp6_hdr mld_icmp6_hdr;
+ struct in6_addr mld_addr; /* multicast address */
+ };
+
+#define mld_type mld_icmp6_hdr.icmp6_type
+#define mld_code mld_icmp6_hdr.icmp6_code
+#define mld_cksum mld_icmp6_hdr.icmp6_cksum
+#define mld_maxdelay mld_icmp6_hdr.icmp6_data16[0]
+#define mld_reserved mld_icmp6_hdr.icmp6_data16[1]
+
+#define ICMP6_ROUTER_RENUMBERING 138
+
+struct icmp6_router_renum /* router renumbering header */
+ {
+ struct icmp6_hdr rr_hdr;
+ uint8_t rr_segnum;
+ uint8_t rr_flags;
+ uint16_t rr_maxdelay;
+ uint32_t rr_reserved;
+ };
+
+#define rr_type rr_hdr.icmp6_type
+#define rr_code rr_hdr.icmp6_code
+#define rr_cksum rr_hdr.icmp6_cksum
+#define rr_seqnum rr_hdr.icmp6_data32[0]
+
+/* Router renumbering flags */
+#define ICMP6_RR_FLAGS_TEST 0x80
+#define ICMP6_RR_FLAGS_REQRESULT 0x40
+#define ICMP6_RR_FLAGS_FORCEAPPLY 0x20
+#define ICMP6_RR_FLAGS_SPECSITE 0x10
+#define ICMP6_RR_FLAGS_PREVDONE 0x08
+
+struct rr_pco_match /* match prefix part */
+ {
+ uint8_t rpm_code;
+ uint8_t rpm_len;
+ uint8_t rpm_ordinal;
+ uint8_t rpm_matchlen;
+ uint8_t rpm_minlen;
+ uint8_t rpm_maxlen;
+ uint16_t rpm_reserved;
+ struct in6_addr rpm_prefix;
+ };
+
+/* PCO code values */
+#define RPM_PCO_ADD 1
+#define RPM_PCO_CHANGE 2
+#define RPM_PCO_SETGLOBAL 3
+
+struct rr_pco_use /* use prefix part */
+ {
+ uint8_t rpu_uselen;
+ uint8_t rpu_keeplen;
+ uint8_t rpu_ramask;
+ uint8_t rpu_raflags;
+ uint32_t rpu_vltime;
+ uint32_t rpu_pltime;
+ uint32_t rpu_flags;
+ struct in6_addr rpu_prefix;
+ };
+
+#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x20
+#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x10
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000
+# define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+# define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80
+# define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40
+#endif
+
+struct rr_result /* router renumbering result message */
+ {
+ uint16_t rrr_flags;
+ uint8_t rrr_ordinal;
+ uint8_t rrr_matchedlen;
+ uint32_t rrr_ifid;
+ struct in6_addr rrr_prefix;
+ };
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define ICMP6_RR_RESULT_FLAGS_OOB 0x0002
+# define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+# define ICMP6_RR_RESULT_FLAGS_OOB 0x0200
+# define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0100
+#endif
+
+/* Mobile IPv6 extension: Advertisement Interval. */
+struct nd_opt_adv_interval
+ {
+ uint8_t nd_opt_adv_interval_type;
+ uint8_t nd_opt_adv_interval_len;
+ uint16_t nd_opt_adv_interval_reserved;
+ uint32_t nd_opt_adv_interval_ival;
+ };
+
+/* Mobile IPv6 extension: Home Agent Info. */
+struct nd_opt_home_agent_info
+ {
+ uint8_t nd_opt_home_agent_info_type;
+ uint8_t nd_opt_home_agent_info_len;
+ uint16_t nd_opt_home_agent_info_reserved;
+ uint16_t nd_opt_home_agent_info_preference;
+ uint16_t nd_opt_home_agent_info_lifetime;
+ };
+
+#endif /* netinet/icmpv6.h */
diff --git a/REORG.TODO/inet/netinet/igmp.h b/REORG.TODO/inet/netinet/igmp.h
new file mode 100644
index 0000000000..292ced4a95
--- /dev/null
+++ b/REORG.TODO/inet/netinet/igmp.h
@@ -0,0 +1,125 @@
+/* Copyright (C) 1997-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NETINET_IGMP_H
+#define _NETINET_IGMP_H 1
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+#ifdef __USE_MISC
+
+#include <netinet/in.h>
+
+__BEGIN_DECLS
+
+/*
+ * Copyright (c) 1988 Stephen Deering.
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Stephen Deering of Stanford University.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)igmp.h 8.1 (Berkeley) 6/10/93
+ * $FreeBSD$
+ */
+
+struct igmp {
+ uint8_t igmp_type; /* IGMP type */
+ uint8_t igmp_code; /* routing code */
+ uint16_t igmp_cksum; /* checksum */
+ struct in_addr igmp_group; /* group address */
+};
+
+#define IGMP_MINLEN 8
+
+/*
+ * Message types, including version number.
+ */
+#define IGMP_MEMBERSHIP_QUERY 0x11 /* membership query */
+#define IGMP_V1_MEMBERSHIP_REPORT 0x12 /* Ver. 1 membership report */
+#define IGMP_V2_MEMBERSHIP_REPORT 0x16 /* Ver. 2 membership report */
+#define IGMP_V2_LEAVE_GROUP 0x17 /* Leave-group message */
+
+#define IGMP_DVMRP 0x13 /* DVMRP routing message */
+#define IGMP_PIM 0x14 /* PIM routing message */
+#define IGMP_TRACE 0x15
+
+#define IGMP_MTRACE_RESP 0x1e /* traceroute resp.(to sender)*/
+#define IGMP_MTRACE 0x1f /* mcast traceroute messages */
+
+#define IGMP_MAX_HOST_REPORT_DELAY 10 /* max delay for response to */
+ /* query (in seconds) according */
+ /* to RFC1112 */
+#define IGMP_TIMER_SCALE 10 /* denotes that the igmp code field */
+ /* specifies time in 10th of seconds*/
+
+/*
+ * States for the IGMP v2 state table.
+ */
+#define IGMP_DELAYING_MEMBER 1
+#define IGMP_IDLE_MEMBER 2
+#define IGMP_LAZY_MEMBER 3
+#define IGMP_SLEEPING_MEMBER 4
+#define IGMP_AWAKENING_MEMBER 5
+
+/*
+ * States for IGMP router version cache.
+ */
+#define IGMP_v1_ROUTER 1
+#define IGMP_v2_ROUTER 2
+
+/*
+ * The following four defininitions are for backwards compatibility.
+ * They should be removed as soon as all applications are updated to
+ * use the new constant names.
+ */
+#define IGMP_HOST_MEMBERSHIP_QUERY IGMP_MEMBERSHIP_QUERY
+#define IGMP_HOST_MEMBERSHIP_REPORT IGMP_V1_MEMBERSHIP_REPORT
+#define IGMP_HOST_NEW_MEMBERSHIP_REPORT IGMP_V2_MEMBERSHIP_REPORT
+#define IGMP_HOST_LEAVE_MESSAGE IGMP_V2_LEAVE_GROUP
+
+__END_DECLS
+
+#endif
+
+#endif /* netinet/igmp.h */
diff --git a/REORG.TODO/inet/netinet/in.h b/REORG.TODO/inet/netinet/in.h
new file mode 100644
index 0000000000..f94b4b4e1c
--- /dev/null
+++ b/REORG.TODO/inet/netinet/in.h
@@ -0,0 +1,632 @@
+/* Copyright (C) 1991-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NETINET_IN_H
+#define _NETINET_IN_H 1
+
+#include <features.h>
+#include <bits/stdint-uintn.h>
+#include <sys/socket.h>
+#include <bits/types.h>
+
+
+__BEGIN_DECLS
+
+/* Internet address. */
+typedef uint32_t in_addr_t;
+struct in_addr
+ {
+ in_addr_t s_addr;
+ };
+
+/* Get system-specific definitions. */
+#include <bits/in.h>
+
+/* Standard well-defined IP protocols. */
+enum
+ {
+ IPPROTO_IP = 0, /* Dummy protocol for TCP. */
+#define IPPROTO_IP IPPROTO_IP
+ IPPROTO_ICMP = 1, /* Internet Control Message Protocol. */
+#define IPPROTO_ICMP IPPROTO_ICMP
+ IPPROTO_IGMP = 2, /* Internet Group Management Protocol. */
+#define IPPROTO_IGMP IPPROTO_IGMP
+ IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94). */
+#define IPPROTO_IPIP IPPROTO_IPIP
+ IPPROTO_TCP = 6, /* Transmission Control Protocol. */
+#define IPPROTO_TCP IPPROTO_TCP
+ IPPROTO_EGP = 8, /* Exterior Gateway Protocol. */
+#define IPPROTO_EGP IPPROTO_EGP
+ IPPROTO_PUP = 12, /* PUP protocol. */
+#define IPPROTO_PUP IPPROTO_PUP
+ IPPROTO_UDP = 17, /* User Datagram Protocol. */
+#define IPPROTO_UDP IPPROTO_UDP
+ IPPROTO_IDP = 22, /* XNS IDP protocol. */
+#define IPPROTO_IDP IPPROTO_IDP
+ IPPROTO_TP = 29, /* SO Transport Protocol Class 4. */
+#define IPPROTO_TP IPPROTO_TP
+ IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol. */
+#define IPPROTO_DCCP IPPROTO_DCCP
+ IPPROTO_IPV6 = 41, /* IPv6 header. */
+#define IPPROTO_IPV6 IPPROTO_IPV6
+ IPPROTO_RSVP = 46, /* Reservation Protocol. */
+#define IPPROTO_RSVP IPPROTO_RSVP
+ IPPROTO_GRE = 47, /* General Routing Encapsulation. */
+#define IPPROTO_GRE IPPROTO_GRE
+ IPPROTO_ESP = 50, /* encapsulating security payload. */
+#define IPPROTO_ESP IPPROTO_ESP
+ IPPROTO_AH = 51, /* authentication header. */
+#define IPPROTO_AH IPPROTO_AH
+ IPPROTO_MTP = 92, /* Multicast Transport Protocol. */
+#define IPPROTO_MTP IPPROTO_MTP
+ IPPROTO_BEETPH = 94, /* IP option pseudo header for BEET. */
+#define IPPROTO_BEETPH IPPROTO_BEETPH
+ IPPROTO_ENCAP = 98, /* Encapsulation Header. */
+#define IPPROTO_ENCAP IPPROTO_ENCAP
+ IPPROTO_PIM = 103, /* Protocol Independent Multicast. */
+#define IPPROTO_PIM IPPROTO_PIM
+ IPPROTO_COMP = 108, /* Compression Header Protocol. */
+#define IPPROTO_COMP IPPROTO_COMP
+ IPPROTO_SCTP = 132, /* Stream Control Transmission Protocol. */
+#define IPPROTO_SCTP IPPROTO_SCTP
+ IPPROTO_UDPLITE = 136, /* UDP-Lite protocol. */
+#define IPPROTO_UDPLITE IPPROTO_UDPLITE
+ IPPROTO_MPLS = 137, /* MPLS in IP. */
+#define IPPROTO_MPLS IPPROTO_MPLS
+ IPPROTO_RAW = 255, /* Raw IP packets. */
+#define IPPROTO_RAW IPPROTO_RAW
+ IPPROTO_MAX
+ };
+
+/* If __USE_KERNEL_IPV6_DEFS is 1 then the user has included the kernel
+ network headers first and we should use those ABI-identical definitions
+ instead of our own, otherwise 0. */
+#if !__USE_KERNEL_IPV6_DEFS
+enum
+ {
+ IPPROTO_HOPOPTS = 0, /* IPv6 Hop-by-Hop options. */
+#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
+ IPPROTO_ROUTING = 43, /* IPv6 routing header. */
+#define IPPROTO_ROUTING IPPROTO_ROUTING
+ IPPROTO_FRAGMENT = 44, /* IPv6 fragmentation header. */
+#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
+ IPPROTO_ICMPV6 = 58, /* ICMPv6. */
+#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
+ IPPROTO_NONE = 59, /* IPv6 no next header. */
+#define IPPROTO_NONE IPPROTO_NONE
+ IPPROTO_DSTOPTS = 60, /* IPv6 destination options. */
+#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
+ IPPROTO_MH = 135 /* IPv6 mobility header. */
+#define IPPROTO_MH IPPROTO_MH
+ };
+#endif /* !__USE_KERNEL_IPV6_DEFS */
+
+/* Type to represent a port. */
+typedef uint16_t in_port_t;
+
+/* Standard well-known ports. */
+enum
+ {
+ IPPORT_ECHO = 7, /* Echo service. */
+ IPPORT_DISCARD = 9, /* Discard transmissions service. */
+ IPPORT_SYSTAT = 11, /* System status service. */
+ IPPORT_DAYTIME = 13, /* Time of day service. */
+ IPPORT_NETSTAT = 15, /* Network status service. */
+ IPPORT_FTP = 21, /* File Transfer Protocol. */
+ IPPORT_TELNET = 23, /* Telnet protocol. */
+ IPPORT_SMTP = 25, /* Simple Mail Transfer Protocol. */
+ IPPORT_TIMESERVER = 37, /* Timeserver service. */
+ IPPORT_NAMESERVER = 42, /* Domain Name Service. */
+ IPPORT_WHOIS = 43, /* Internet Whois service. */
+ IPPORT_MTP = 57,
+
+ IPPORT_TFTP = 69, /* Trivial File Transfer Protocol. */
+ IPPORT_RJE = 77,
+ IPPORT_FINGER = 79, /* Finger service. */
+ IPPORT_TTYLINK = 87,
+ IPPORT_SUPDUP = 95, /* SUPDUP protocol. */
+
+
+ IPPORT_EXECSERVER = 512, /* execd service. */
+ IPPORT_LOGINSERVER = 513, /* rlogind service. */
+ IPPORT_CMDSERVER = 514,
+ IPPORT_EFSSERVER = 520,
+
+ /* UDP ports. */
+ IPPORT_BIFFUDP = 512,
+ IPPORT_WHOSERVER = 513,
+ IPPORT_ROUTESERVER = 520,
+
+ /* Ports less than this value are reserved for privileged processes. */
+ IPPORT_RESERVED = 1024,
+
+ /* Ports greater this value are reserved for (non-privileged) servers. */
+ IPPORT_USERRESERVED = 5000
+ };
+
+/* Definitions of the bits in an Internet address integer.
+
+ On subnets, host and network parts are found according to
+ the subnet mask, not these masks. */
+
+#define IN_CLASSA(a) ((((in_addr_t)(a)) & 0x80000000) == 0)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
+#define IN_CLASSA_MAX 128
+
+#define IN_CLASSB(a) ((((in_addr_t)(a)) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
+#define IN_CLASSB_MAX 65536
+
+#define IN_CLASSC(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
+
+#define IN_CLASSD(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xe0000000)
+#define IN_MULTICAST(a) IN_CLASSD(a)
+
+#define IN_EXPERIMENTAL(a) ((((in_addr_t)(a)) & 0xe0000000) == 0xe0000000)
+#define IN_BADCLASS(a) ((((in_addr_t)(a)) & 0xf0000000) == 0xf0000000)
+
+/* Address to accept any incoming messages. */
+#define INADDR_ANY ((in_addr_t) 0x00000000)
+/* Address to send to all hosts. */
+#define INADDR_BROADCAST ((in_addr_t) 0xffffffff)
+/* Address indicating an error return. */
+#define INADDR_NONE ((in_addr_t) 0xffffffff)
+
+/* Network number for local host loopback. */
+#define IN_LOOPBACKNET 127
+/* Address to loopback in software to local host. */
+#ifndef INADDR_LOOPBACK
+# define INADDR_LOOPBACK ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1. */
+#endif
+
+/* Defines for Multicast INADDR. */
+#define INADDR_UNSPEC_GROUP ((in_addr_t) 0xe0000000) /* 224.0.0.0 */
+#define INADDR_ALLHOSTS_GROUP ((in_addr_t) 0xe0000001) /* 224.0.0.1 */
+#define INADDR_ALLRTRS_GROUP ((in_addr_t) 0xe0000002) /* 224.0.0.2 */
+#define INADDR_MAX_LOCAL_GROUP ((in_addr_t) 0xe00000ff) /* 224.0.0.255 */
+
+#if !__USE_KERNEL_IPV6_DEFS
+/* IPv6 address */
+struct in6_addr
+ {
+ union
+ {
+ uint8_t __u6_addr8[16];
+ uint16_t __u6_addr16[8];
+ uint32_t __u6_addr32[4];
+ } __in6_u;
+#define s6_addr __in6_u.__u6_addr8
+#ifdef __USE_MISC
+# define s6_addr16 __in6_u.__u6_addr16
+# define s6_addr32 __in6_u.__u6_addr32
+#endif
+ };
+#endif /* !__USE_KERNEL_IPV6_DEFS */
+
+extern const struct in6_addr in6addr_any; /* :: */
+extern const struct in6_addr in6addr_loopback; /* ::1 */
+#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
+#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
+
+#define INET_ADDRSTRLEN 16
+#define INET6_ADDRSTRLEN 46
+
+
+/* Structure describing an Internet socket address. */
+struct sockaddr_in
+ {
+ __SOCKADDR_COMMON (sin_);
+ in_port_t sin_port; /* Port number. */
+ struct in_addr sin_addr; /* Internet address. */
+
+ /* Pad to size of `struct sockaddr'. */
+ unsigned char sin_zero[sizeof (struct sockaddr) -
+ __SOCKADDR_COMMON_SIZE -
+ sizeof (in_port_t) -
+ sizeof (struct in_addr)];
+ };
+
+#if !__USE_KERNEL_IPV6_DEFS
+/* Ditto, for IPv6. */
+struct sockaddr_in6
+ {
+ __SOCKADDR_COMMON (sin6_);
+ in_port_t sin6_port; /* Transport layer port # */
+ uint32_t sin6_flowinfo; /* IPv6 flow information */
+ struct in6_addr sin6_addr; /* IPv6 address */
+ uint32_t sin6_scope_id; /* IPv6 scope-id */
+ };
+#endif /* !__USE_KERNEL_IPV6_DEFS */
+
+#ifdef __USE_MISC
+/* IPv4 multicast request. */
+struct ip_mreq
+ {
+ /* IP multicast address of group. */
+ struct in_addr imr_multiaddr;
+
+ /* Local IP address of interface. */
+ struct in_addr imr_interface;
+ };
+
+struct ip_mreq_source
+ {
+ /* IP multicast address of group. */
+ struct in_addr imr_multiaddr;
+
+ /* IP address of interface. */
+ struct in_addr imr_interface;
+
+ /* IP address of source. */
+ struct in_addr imr_sourceaddr;
+ };
+#endif
+
+#if !__USE_KERNEL_IPV6_DEFS
+/* Likewise, for IPv6. */
+struct ipv6_mreq
+ {
+ /* IPv6 multicast address of group */
+ struct in6_addr ipv6mr_multiaddr;
+
+ /* local interface */
+ unsigned int ipv6mr_interface;
+ };
+#endif /* !__USE_KERNEL_IPV6_DEFS */
+
+#ifdef __USE_MISC
+/* Multicast group request. */
+struct group_req
+ {
+ /* Interface index. */
+ uint32_t gr_interface;
+
+ /* Group address. */
+ struct sockaddr_storage gr_group;
+ };
+
+struct group_source_req
+ {
+ /* Interface index. */
+ uint32_t gsr_interface;
+
+ /* Group address. */
+ struct sockaddr_storage gsr_group;
+
+ /* Source address. */
+ struct sockaddr_storage gsr_source;
+ };
+
+
+/* Full-state filter operations. */
+struct ip_msfilter
+ {
+ /* IP multicast address of group. */
+ struct in_addr imsf_multiaddr;
+
+ /* Local IP address of interface. */
+ struct in_addr imsf_interface;
+
+ /* Filter mode. */
+ uint32_t imsf_fmode;
+
+ /* Number of source addresses. */
+ uint32_t imsf_numsrc;
+ /* Source addresses. */
+ struct in_addr imsf_slist[1];
+ };
+
+#define IP_MSFILTER_SIZE(numsrc) (sizeof (struct ip_msfilter) \
+ - sizeof (struct in_addr) \
+ + (numsrc) * sizeof (struct in_addr))
+
+struct group_filter
+ {
+ /* Interface index. */
+ uint32_t gf_interface;
+
+ /* Group address. */
+ struct sockaddr_storage gf_group;
+
+ /* Filter mode. */
+ uint32_t gf_fmode;
+
+ /* Number of source addresses. */
+ uint32_t gf_numsrc;
+ /* Source addresses. */
+ struct sockaddr_storage gf_slist[1];
+};
+
+#define GROUP_FILTER_SIZE(numsrc) (sizeof (struct group_filter) \
+ - sizeof (struct sockaddr_storage) \
+ + ((numsrc) \
+ * sizeof (struct sockaddr_storage)))
+#endif
+
+/* Functions to convert between host and network byte order.
+
+ Please note that these functions normally take `unsigned long int' or
+ `unsigned short int' values as arguments and also return them. But
+ this was a short-sighted decision since on different systems the types
+ may have different representations but the values are always the same. */
+
+extern uint32_t ntohl (uint32_t __netlong) __THROW __attribute__ ((__const__));
+extern uint16_t ntohs (uint16_t __netshort)
+ __THROW __attribute__ ((__const__));
+extern uint32_t htonl (uint32_t __hostlong)
+ __THROW __attribute__ ((__const__));
+extern uint16_t htons (uint16_t __hostshort)
+ __THROW __attribute__ ((__const__));
+
+#include <endian.h>
+
+/* Get machine dependent optimized versions of byte swapping functions. */
+#include <bits/byteswap.h>
+#include <bits/uintn-identity.h>
+
+#ifdef __OPTIMIZE__
+/* We can optimize calls to the conversion functions. Either nothing has
+ to be done or we are using directly the byte-swapping functions which
+ often can be inlined. */
+# if __BYTE_ORDER == __BIG_ENDIAN
+/* The host byte order is the same as network byte order,
+ so these functions are all just identity. */
+# define ntohl(x) __uint32_identity (x)
+# define ntohs(x) __uint16_identity (x)
+# define htonl(x) __uint32_identity (x)
+# define htons(x) __uint16_identity (x)
+# else
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define ntohl(x) __bswap_32 (x)
+# define ntohs(x) __bswap_16 (x)
+# define htonl(x) __bswap_32 (x)
+# define htons(x) __bswap_16 (x)
+# endif
+# endif
+#endif
+
+#ifdef __GNUC__
+# define IN6_IS_ADDR_UNSPECIFIED(a) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ __a->__in6_u.__u6_addr32[0] == 0 \
+ && __a->__in6_u.__u6_addr32[1] == 0 \
+ && __a->__in6_u.__u6_addr32[2] == 0 \
+ && __a->__in6_u.__u6_addr32[3] == 0; }))
+
+# define IN6_IS_ADDR_LOOPBACK(a) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ __a->__in6_u.__u6_addr32[0] == 0 \
+ && __a->__in6_u.__u6_addr32[1] == 0 \
+ && __a->__in6_u.__u6_addr32[2] == 0 \
+ && __a->__in6_u.__u6_addr32[3] == htonl (1); }))
+
+# define IN6_IS_ADDR_LINKLOCAL(a) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfe800000); }))
+
+# define IN6_IS_ADDR_SITELOCAL(a) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ (__a->__in6_u.__u6_addr32[0] & htonl (0xffc00000)) == htonl (0xfec00000); }))
+
+# define IN6_IS_ADDR_V4MAPPED(a) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ __a->__in6_u.__u6_addr32[0] == 0 \
+ && __a->__in6_u.__u6_addr32[1] == 0 \
+ && __a->__in6_u.__u6_addr32[2] == htonl (0xffff); }))
+
+# define IN6_IS_ADDR_V4COMPAT(a) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ __a->__in6_u.__u6_addr32[0] == 0 \
+ && __a->__in6_u.__u6_addr32[1] == 0 \
+ && __a->__in6_u.__u6_addr32[2] == 0 \
+ && ntohl (__a->__in6_u.__u6_addr32[3]) > 1; }))
+
+# define IN6_ARE_ADDR_EQUAL(a,b) \
+ (__extension__ \
+ ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \
+ const struct in6_addr *__b = (const struct in6_addr *) (b); \
+ __a->__in6_u.__u6_addr32[0] == __b->__in6_u.__u6_addr32[0] \
+ && __a->__in6_u.__u6_addr32[1] == __b->__in6_u.__u6_addr32[1] \
+ && __a->__in6_u.__u6_addr32[2] == __b->__in6_u.__u6_addr32[2] \
+ && __a->__in6_u.__u6_addr32[3] == __b->__in6_u.__u6_addr32[3]; }))
+#else
+# define IN6_IS_ADDR_UNSPECIFIED(a) \
+ (((const uint32_t *) (a))[0] == 0 \
+ && ((const uint32_t *) (a))[1] == 0 \
+ && ((const uint32_t *) (a))[2] == 0 \
+ && ((const uint32_t *) (a))[3] == 0)
+
+# define IN6_IS_ADDR_LOOPBACK(a) \
+ (((const uint32_t *) (a))[0] == 0 \
+ && ((const uint32_t *) (a))[1] == 0 \
+ && ((const uint32_t *) (a))[2] == 0 \
+ && ((const uint32_t *) (a))[3] == htonl (1))
+
+# define IN6_IS_ADDR_LINKLOCAL(a) \
+ ((((const uint32_t *) (a))[0] & htonl (0xffc00000)) \
+ == htonl (0xfe800000))
+
+# define IN6_IS_ADDR_SITELOCAL(a) \
+ ((((const uint32_t *) (a))[0] & htonl (0xffc00000)) \
+ == htonl (0xfec00000))
+
+# define IN6_IS_ADDR_V4MAPPED(a) \
+ ((((const uint32_t *) (a))[0] == 0) \
+ && (((const uint32_t *) (a))[1] == 0) \
+ && (((const uint32_t *) (a))[2] == htonl (0xffff)))
+
+# define IN6_IS_ADDR_V4COMPAT(a) \
+ ((((const uint32_t *) (a))[0] == 0) \
+ && (((const uint32_t *) (a))[1] == 0) \
+ && (((const uint32_t *) (a))[2] == 0) \
+ && (ntohl (((const uint32_t *) (a))[3]) > 1))
+
+# define IN6_ARE_ADDR_EQUAL(a,b) \
+ ((((const uint32_t *) (a))[0] == ((const uint32_t *) (b))[0]) \
+ && (((const uint32_t *) (a))[1] == ((const uint32_t *) (b))[1]) \
+ && (((const uint32_t *) (a))[2] == ((const uint32_t *) (b))[2]) \
+ && (((const uint32_t *) (a))[3] == ((const uint32_t *) (b))[3]))
+#endif
+
+#define IN6_IS_ADDR_MULTICAST(a) (((const uint8_t *) (a))[0] == 0xff)
+
+#ifdef __USE_MISC
+/* Bind socket to a privileged IP port. */
+extern int bindresvport (int __sockfd, struct sockaddr_in *__sock_in) __THROW;
+
+/* The IPv6 version of this function. */
+extern int bindresvport6 (int __sockfd, struct sockaddr_in6 *__sock_in)
+ __THROW;
+#endif
+
+
+#define IN6_IS_ADDR_MC_NODELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((const uint8_t *) (a))[1] & 0xf) == 0x1))
+
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((const uint8_t *) (a))[1] & 0xf) == 0x2))
+
+#define IN6_IS_ADDR_MC_SITELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((const uint8_t *) (a))[1] & 0xf) == 0x5))
+
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((const uint8_t *) (a))[1] & 0xf) == 0x8))
+
+#define IN6_IS_ADDR_MC_GLOBAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) \
+ && ((((const uint8_t *) (a))[1] & 0xf) == 0xe))
+
+
+#ifdef __USE_GNU
+struct cmsghdr; /* Forward declaration. */
+
+#if !__USE_KERNEL_IPV6_DEFS
+/* IPv6 packet information. */
+struct in6_pktinfo
+ {
+ struct in6_addr ipi6_addr; /* src/dst IPv6 address */
+ unsigned int ipi6_ifindex; /* send/recv interface index */
+ };
+
+/* IPv6 MTU information. */
+struct ip6_mtuinfo
+ {
+ struct sockaddr_in6 ip6m_addr; /* dst address including zone ID */
+ uint32_t ip6m_mtu; /* path MTU in host byte order */
+ };
+#endif /* !__USE_KERNEL_IPV6_DEFS */
+
+/* Obsolete hop-by-hop and Destination Options Processing (RFC 2292). */
+extern int inet6_option_space (int __nbytes)
+ __THROW __attribute_deprecated__;
+extern int inet6_option_init (void *__bp, struct cmsghdr **__cmsgp,
+ int __type) __THROW __attribute_deprecated__;
+extern int inet6_option_append (struct cmsghdr *__cmsg,
+ const uint8_t *__typep, int __multx,
+ int __plusy) __THROW __attribute_deprecated__;
+extern uint8_t *inet6_option_alloc (struct cmsghdr *__cmsg, int __datalen,
+ int __multx, int __plusy)
+ __THROW __attribute_deprecated__;
+extern int inet6_option_next (const struct cmsghdr *__cmsg,
+ uint8_t **__tptrp)
+ __THROW __attribute_deprecated__;
+extern int inet6_option_find (const struct cmsghdr *__cmsg,
+ uint8_t **__tptrp, int __type)
+ __THROW __attribute_deprecated__;
+
+
+/* Hop-by-Hop and Destination Options Processing (RFC 3542). */
+extern int inet6_opt_init (void *__extbuf, socklen_t __extlen) __THROW;
+extern int inet6_opt_append (void *__extbuf, socklen_t __extlen, int __offset,
+ uint8_t __type, socklen_t __len, uint8_t __align,
+ void **__databufp) __THROW;
+extern int inet6_opt_finish (void *__extbuf, socklen_t __extlen, int __offset)
+ __THROW;
+extern int inet6_opt_set_val (void *__databuf, int __offset, void *__val,
+ socklen_t __vallen) __THROW;
+extern int inet6_opt_next (void *__extbuf, socklen_t __extlen, int __offset,
+ uint8_t *__typep, socklen_t *__lenp,
+ void **__databufp) __THROW;
+extern int inet6_opt_find (void *__extbuf, socklen_t __extlen, int __offset,
+ uint8_t __type, socklen_t *__lenp,
+ void **__databufp) __THROW;
+extern int inet6_opt_get_val (void *__databuf, int __offset, void *__val,
+ socklen_t __vallen) __THROW;
+
+
+/* Routing Header Option (RFC 3542). */
+extern socklen_t inet6_rth_space (int __type, int __segments) __THROW;
+extern void *inet6_rth_init (void *__bp, socklen_t __bp_len, int __type,
+ int __segments) __THROW;
+extern int inet6_rth_add (void *__bp, const struct in6_addr *__addr) __THROW;
+extern int inet6_rth_reverse (const void *__in, void *__out) __THROW;
+extern int inet6_rth_segments (const void *__bp) __THROW;
+extern struct in6_addr *inet6_rth_getaddr (const void *__bp, int __index)
+ __THROW;
+
+
+/* Multicast source filter support. */
+
+/* Get IPv4 source filter. */
+extern int getipv4sourcefilter (int __s, struct in_addr __interface_addr,
+ struct in_addr __group, uint32_t *__fmode,
+ uint32_t *__numsrc, struct in_addr *__slist)
+ __THROW;
+
+/* Set IPv4 source filter. */
+extern int setipv4sourcefilter (int __s, struct in_addr __interface_addr,
+ struct in_addr __group, uint32_t __fmode,
+ uint32_t __numsrc,
+ const struct in_addr *__slist)
+ __THROW;
+
+
+/* Get source filter. */
+extern int getsourcefilter (int __s, uint32_t __interface_addr,
+ const struct sockaddr *__group,
+ socklen_t __grouplen, uint32_t *__fmode,
+ uint32_t *__numsrc,
+ struct sockaddr_storage *__slist) __THROW;
+
+/* Set source filter. */
+extern int setsourcefilter (int __s, uint32_t __interface_addr,
+ const struct sockaddr *__group,
+ socklen_t __grouplen, uint32_t __fmode,
+ uint32_t __numsrc,
+ const struct sockaddr_storage *__slist) __THROW;
+#endif /* use GNU */
+
+__END_DECLS
+
+#endif /* netinet/in.h */
diff --git a/REORG.TODO/inet/netinet/ip6.h b/REORG.TODO/inet/netinet/ip6.h
new file mode 100644
index 0000000000..dbced70502
--- /dev/null
+++ b/REORG.TODO/inet/netinet/ip6.h
@@ -0,0 +1,188 @@
+/* Copyright (C) 1991-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _NETINET_IP6_H
+#define _NETINET_IP6_H 1
+
+#include <inttypes.h>
+#include <netinet/in.h>
+
+struct ip6_hdr
+ {
+ union
+ {
+ struct ip6_hdrctl
+ {
+ uint32_t ip6_un1_flow; /* 4 bits version, 8 bits TC,
+ 20 bits flow-ID */
+ uint16_t ip6_un1_plen; /* payload length */
+ uint8_t ip6_un1_nxt; /* next header */
+ uint8_t ip6_un1_hlim; /* hop limit */
+ } ip6_un1;
+ uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits tclass */
+ } ip6_ctlun;
+ struct in6_addr ip6_src; /* source address */
+ struct in6_addr ip6_dst; /* destination address */
+ };
+
+#define ip6_vfc ip6_ctlun.ip6_un2_vfc
+#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+/* Generic extension header. */
+struct ip6_ext
+ {
+ uint8_t ip6e_nxt; /* next header. */
+ uint8_t ip6e_len; /* length in units of 8 octets. */
+ };
+
+/* Hop-by-Hop options header. */
+struct ip6_hbh
+ {
+ uint8_t ip6h_nxt; /* next header. */
+ uint8_t ip6h_len; /* length in units of 8 octets. */
+ /* followed by options */
+ };
+
+/* Destination options header */
+struct ip6_dest
+ {
+ uint8_t ip6d_nxt; /* next header */
+ uint8_t ip6d_len; /* length in units of 8 octets */
+ /* followed by options */
+ };
+
+/* Routing header */
+struct ip6_rthdr
+ {
+ uint8_t ip6r_nxt; /* next header */
+ uint8_t ip6r_len; /* length in units of 8 octets */
+ uint8_t ip6r_type; /* routing type */
+ uint8_t ip6r_segleft; /* segments left */
+ /* followed by routing type specific data */
+ };
+
+/* Type 0 Routing header */
+struct ip6_rthdr0
+ {
+ uint8_t ip6r0_nxt; /* next header */
+ uint8_t ip6r0_len; /* length in units of 8 octets */
+ uint8_t ip6r0_type; /* always zero */
+ uint8_t ip6r0_segleft; /* segments left */
+ uint8_t ip6r0_reserved; /* reserved field */
+ uint8_t ip6r0_slmap[3]; /* strict/loose bit map */
+ /* followed by up to 127 struct in6_addr */
+ struct in6_addr ip6r0_addr[0];
+ };
+
+/* Fragment header */
+struct ip6_frag
+ {
+ uint8_t ip6f_nxt; /* next header */
+ uint8_t ip6f_reserved; /* reserved field */
+ uint16_t ip6f_offlg; /* offset, reserved, and flag */
+ uint32_t ip6f_ident; /* identification */
+ };
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
+# define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
+# define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
+#else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+# define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */
+# define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */
+# define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */
+#endif
+
+/* IPv6 options */
+struct ip6_opt
+ {
+ uint8_t ip6o_type;
+ uint8_t ip6o_len;
+ };
+
+/* The high-order 3 bits of the option type define the behavior
+ * when processing an unknown option and whether or not the option
+ * content changes in flight.
+ */
+#define IP6OPT_TYPE(o) ((o) & 0xc0)
+#define IP6OPT_TYPE_SKIP 0x00
+#define IP6OPT_TYPE_DISCARD 0x40
+#define IP6OPT_TYPE_FORCEICMP 0x80
+#define IP6OPT_TYPE_ICMP 0xc0
+#define IP6OPT_TYPE_MUTABLE 0x20
+
+/* Special option types for padding. */
+#define IP6OPT_PAD1 0
+#define IP6OPT_PADN 1
+
+#define IP6OPT_JUMBO 0xc2
+#define IP6OPT_NSAP_ADDR 0xc3
+#define IP6OPT_TUNNEL_LIMIT 0x04
+#define IP6OPT_ROUTER_ALERT 0x05
+
+/* Jumbo Payload Option */
+struct ip6_opt_jumbo
+ {
+ uint8_t ip6oj_type;
+ uint8_t ip6oj_len;
+ uint8_t ip6oj_jumbo_len[4];
+ };
+#define IP6OPT_JUMBO_LEN 6
+
+/* NSAP Address Option */
+struct ip6_opt_nsap
+ {
+ uint8_t ip6on_type;
+ uint8_t ip6on_len;
+ uint8_t ip6on_src_nsap_len;
+ uint8_t ip6on_dst_nsap_len;
+ /* followed by source NSAP */
+ /* followed by destination NSAP */
+ };
+
+/* Tunnel Limit Option */
+struct ip6_opt_tunnel
+ {
+ uint8_t ip6ot_type;
+ uint8_t ip6ot_len;
+ uint8_t ip6ot_encap_limit;
+ };
+
+/* Router Alert Option */
+struct ip6_opt_router
+ {
+ uint8_t ip6or_type;
+ uint8_t ip6or_len;
+ uint8_t ip6or_value[2];
+ };
+
+/* Router alert values (in network byte order) */
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define IP6_ALERT_MLD 0x0000
+# define IP6_ALERT_RSVP 0x0001
+# define IP6_ALERT_AN 0x0002
+#else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+# define IP6_ALERT_MLD 0x0000
+# define IP6_ALERT_RSVP 0x0100
+# define IP6_ALERT_AN 0x0200
+#endif
+
+#endif /* netinet/ip6.h */
diff --git a/REORG.TODO/inet/protocols/routed.h b/REORG.TODO/inet/protocols/routed.h
new file mode 100644
index 0000000000..adb1767dca
--- /dev/null
+++ b/REORG.TODO/inet/protocols/routed.h
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 1983, 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)routed.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _PROTOCOLS_ROUTED_H
+#define _PROTOCOLS_ROUTED_H 1
+
+#include <sys/socket.h>
+/*
+ * Routing Information Protocol
+ *
+ * Derived from Xerox NS Routing Information Protocol
+ * by changing 32-bit net numbers to sockaddr's and
+ * padding stuff to 32-bit boundaries.
+ */
+#define RIPVERSION 1
+
+struct netinfo {
+ struct sockaddr rip_dst; /* destination net/host */
+ int rip_metric; /* cost of route */
+};
+
+struct rip {
+ unsigned char rip_cmd; /* request/response */
+ unsigned char rip_vers; /* protocol version # */
+ unsigned char rip_res1[2]; /* pad to 32-bit boundary */
+ union {
+ struct netinfo ru_nets[1]; /* variable length... */
+ char ru_tracefile[1]; /* ditto ... */
+ } ripun;
+#define rip_nets ripun.ru_nets
+#define rip_tracefile ripun.ru_tracefile
+};
+
+/*
+ * Packet types.
+ */
+#define RIPCMD_REQUEST 1 /* want info */
+#define RIPCMD_RESPONSE 2 /* responding to request */
+#define RIPCMD_TRACEON 3 /* turn tracing on */
+#define RIPCMD_TRACEOFF 4 /* turn it off */
+
+#define RIPCMD_MAX 5
+#ifdef RIPCMDS
+char *ripcmds[RIPCMD_MAX] =
+ { "#0", "REQUEST", "RESPONSE", "TRACEON", "TRACEOFF" };
+#endif
+
+#define HOPCNT_INFINITY 16 /* per Xerox NS */
+#define MAXPACKETSIZE 512 /* max broadcast size */
+
+/*
+ * Timer values used in managing the routing table.
+ * Complete tables are broadcast every SUPPLY_INTERVAL seconds.
+ * If changes occur between updates, dynamic updates containing only changes
+ * may be sent. When these are sent, a timer is set for a random value
+ * between MIN_WAITTIME and MAX_WAITTIME, and no additional dynamic updates
+ * are sent until the timer expires.
+ *
+ * Every update of a routing entry forces an entry's timer to be reset.
+ * After EXPIRE_TIME without updates, the entry is marked invalid,
+ * but held onto until GARBAGE_TIME so that others may
+ * see it "be deleted".
+ */
+#define TIMER_RATE 30 /* alarm clocks every 30 seconds */
+
+#define SUPPLY_INTERVAL 30 /* time to supply tables */
+#define MIN_WAITTIME 2 /* min. interval to broadcast changes */
+#define MAX_WAITTIME 5 /* max. time to delay changes */
+
+#define EXPIRE_TIME 180 /* time to mark entry invalid */
+#define GARBAGE_TIME 240 /* time to garbage collect */
+
+#endif /* protocols/routed.h */
diff --git a/REORG.TODO/inet/protocols/rwhod.h b/REORG.TODO/inet/protocols/rwhod.h
new file mode 100644
index 0000000000..446d6f97b8
--- /dev/null
+++ b/REORG.TODO/inet/protocols/rwhod.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)rwhod.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _PROTOCOLS_RWHOD_H
+#define _PROTOCOLS_RWHOD_H 1
+
+#include <sys/types.h>
+
+/*
+ * rwho protocol packet format.
+ */
+struct outmp {
+ char out_line[8]; /* tty name */
+ char out_name[8]; /* user id */
+ int32_t out_time; /* time on */
+};
+
+struct whod {
+ char wd_vers; /* protocol version # */
+ char wd_type; /* packet type, see below */
+ char wd_pad[2];
+ int wd_sendtime; /* time stamp by sender */
+ int wd_recvtime; /* time stamp applied by receiver */
+ char wd_hostname[32]; /* hosts's name */
+ int wd_loadav[3]; /* load average as in uptime */
+ int wd_boottime; /* time system booted */
+ struct whoent {
+ struct outmp we_utmp; /* active tty info */
+ int we_idle; /* tty idle time */
+ } wd_we[1024 / sizeof (struct whoent)];
+};
+
+#define WHODVERSION 1
+#define WHODTYPE_STATUS 1 /* host status */
+
+/* We used to define _PATH_RWHODIR here but it's now in <paths.h>. */
+#include <paths.h>
+
+#endif /* protocols/rwhod.h */
diff --git a/REORG.TODO/inet/protocols/talkd.h b/REORG.TODO/inet/protocols/talkd.h
new file mode 100644
index 0000000000..09bd8a90ba
--- /dev/null
+++ b/REORG.TODO/inet/protocols/talkd.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)talkd.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _PROTOCOLS_TALKD_H
+#define _PROTOCOLS_TALKD_H 1
+
+/*
+ * This describes the protocol used by the talk server and clients.
+ *
+ * The talk server acts a repository of invitations, responding to
+ * requests by clients wishing to rendezvous for the purpose of
+ * holding a conversation. In normal operation, a client, the caller,
+ * initiates a rendezvous by sending a CTL_MSG to the server of
+ * type LOOK_UP. This causes the server to search its invitation
+ * tables to check if an invitation currently exists for the caller
+ * (to speak to the callee specified in the message). If the lookup
+ * fails, the caller then sends an ANNOUNCE message causing the server
+ * to broadcast an announcement on the callee's login ports requesting
+ * contact. When the callee responds, the local server uses the
+ * recorded invitation to respond with the appropriate rendezvous
+ * address and the caller and callee client programs establish a
+ * stream connection through which the conversation takes place.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdint.h>
+#include <bits/types/struct_osockaddr.h>
+
+/*
+ * Client->server request message format.
+ */
+typedef struct {
+ unsigned char vers; /* protocol version */
+ unsigned char type; /* request type, see below */
+ unsigned char answer; /* not used */
+ unsigned char pad;
+ uint32_t id_num; /* message id */
+ struct osockaddr addr; /* old (4.3) style */
+ struct osockaddr ctl_addr; /* old (4.3) style */
+ int32_t pid; /* caller's process id */
+#define NAME_SIZE 12
+ char l_name[NAME_SIZE];/* caller's name */
+ char r_name[NAME_SIZE];/* callee's name */
+#define TTY_SIZE 16
+ char r_tty[TTY_SIZE];/* callee's tty name */
+} CTL_MSG;
+
+/*
+ * Server->client response message format.
+ */
+typedef struct {
+ unsigned char vers; /* protocol version */
+ unsigned char type; /* type of request message, see below */
+ unsigned char answer; /* response to request message, see below */
+ unsigned char pad;
+ uint32_t id_num; /* message id */
+ struct osockaddr addr; /* address for establishing conversation */
+} CTL_RESPONSE;
+
+#define TALK_VERSION 1 /* protocol version */
+
+/* message type values */
+#define LEAVE_INVITE 0 /* leave invitation with server */
+#define LOOK_UP 1 /* check for invitation by callee */
+#define DELETE 2 /* delete invitation by caller */
+#define ANNOUNCE 3 /* announce invitation by caller */
+
+/* answer values */
+#define SUCCESS 0 /* operation completed properly */
+#define NOT_HERE 1 /* callee not logged in */
+#define FAILED 2 /* operation failed for unexplained reason */
+#define MACHINE_UNKNOWN 3 /* caller's machine name unknown */
+#define PERMISSION_DENIED 4 /* callee's tty doesn't permit announce */
+#define UNKNOWN_REQUEST 5 /* request has invalid type value */
+#define BADVERSION 6 /* request has invalid protocol version */
+#define BADADDR 7 /* request has invalid addr value */
+#define BADCTLADDR 8 /* request has invalid ctl_addr value */
+
+/*
+ * Operational parameters.
+ */
+#define MAX_LIFE 60 /* max time daemon saves invitations */
+/* RING_WAIT should be 10's of seconds less than MAX_LIFE */
+#define RING_WAIT 30 /* time to wait before resending invitation */
+
+#endif /* protocols/talkd.h */
diff --git a/REORG.TODO/inet/protocols/timed.h b/REORG.TODO/inet/protocols/timed.h
new file mode 100644
index 0000000000..cabdce44a6
--- /dev/null
+++ b/REORG.TODO/inet/protocols/timed.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 1983, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)timed.h 8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _PROTOCOLS_TIMED_H
+#define _PROTOCOLS_TIMED_H 1
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+/*
+ * Time Synchronization Protocol
+ */
+
+#define TSPVERSION 1
+#define ANYADDR NULL
+#define MAXHOSTNAMELEN 64
+
+struct tsp {
+ unsigned char tsp_type;
+ unsigned char tsp_vers;
+ unsigned short tsp_seq;
+ union {
+ struct timeval tspu_time;
+ char tspu_hopcnt;
+ } tsp_u;
+ char tsp_name[MAXHOSTNAMELEN];
+};
+
+#define tsp_time tsp_u.tspu_time
+#define tsp_hopcnt tsp_u.tspu_hopcnt
+
+/*
+ * Command types.
+ */
+#define TSP_ANY 0 /* match any types */
+#define TSP_ADJTIME 1 /* send adjtime */
+#define TSP_ACK 2 /* generic acknowledgement */
+#define TSP_MASTERREQ 3 /* ask for master's name */
+#define TSP_MASTERACK 4 /* acknowledge master request */
+#define TSP_SETTIME 5 /* send network time */
+#define TSP_MASTERUP 6 /* inform slaves that master is up */
+#define TSP_SLAVEUP 7 /* slave is up but not polled */
+#define TSP_ELECTION 8 /* advance candidature for master */
+#define TSP_ACCEPT 9 /* support candidature of master */
+#define TSP_REFUSE 10 /* reject candidature of master */
+#define TSP_CONFLICT 11 /* two or more masters present */
+#define TSP_RESOLVE 12 /* masters' conflict resolution */
+#define TSP_QUIT 13 /* reject candidature if master is up */
+#define TSP_DATE 14 /* reset the time (date command) */
+#define TSP_DATEREQ 15 /* remote request to reset the time */
+#define TSP_DATEACK 16 /* acknowledge time setting */
+#define TSP_TRACEON 17 /* turn tracing on */
+#define TSP_TRACEOFF 18 /* turn tracing off */
+#define TSP_MSITE 19 /* find out master's site */
+#define TSP_MSITEREQ 20 /* remote master's site request */
+#define TSP_TEST 21 /* for testing election algo */
+#define TSP_SETDATE 22 /* New from date command */
+#define TSP_SETDATEREQ 23 /* New remote for above */
+#define TSP_LOOP 24 /* loop detection packet */
+
+#define TSPTYPENUMBER 25
+
+#ifdef TSPTYPES
+char *tsptype[TSPTYPENUMBER] =
+ { "ANY", "ADJTIME", "ACK", "MASTERREQ", "MASTERACK", "SETTIME", "MASTERUP",
+ "SLAVEUP", "ELECTION", "ACCEPT", "REFUSE", "CONFLICT", "RESOLVE", "QUIT",
+ "DATE", "DATEREQ", "DATEACK", "TRACEON", "TRACEOFF", "MSITE", "MSITEREQ",
+ "TEST", "SETDATE", "SETDATEREQ", "LOOP" };
+#endif
+
+#endif /* protocols/timed.h */
diff --git a/REORG.TODO/inet/rcmd.c b/REORG.TODO/inet/rcmd.c
new file mode 100644
index 0000000000..e970123a9a
--- /dev/null
+++ b/REORG.TODO/inet/rcmd.c
@@ -0,0 +1,827 @@
+/*
+ * Copyright (C) 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * Copyright (c) 1983, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/poll.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <alloca.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <ctype.h>
+#include <string.h>
+#include <libintl.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <sys/uio.h>
+#include <sigsetops.h>
+
+
+int __ivaliduser (FILE *, u_int32_t, const char *, const char *);
+static int __validuser2_sa (FILE *, struct sockaddr *, size_t,
+ const char *, const char *, const char *);
+static int ruserok2_sa (struct sockaddr *ra, size_t ralen,
+ int superuser, const char *ruser,
+ const char *luser, const char *rhost);
+static int ruserok_sa (struct sockaddr *ra, size_t ralen,
+ int superuser, const char *ruser,
+ const char *luser);
+int iruserok_af (const void *raddr, int superuser, const char *ruser,
+ const char *luser, sa_family_t af);
+int iruserok (u_int32_t raddr, int superuser, const char *ruser,
+ const char *luser);
+
+libc_hidden_proto (iruserok_af)
+
+libc_freeres_ptr(static char *ahostbuf);
+
+int
+rcmd_af (char **ahost, u_short rport, const char *locuser, const char *remuser,
+ const char *cmd, int *fd2p, sa_family_t af)
+{
+ char paddr[INET6_ADDRSTRLEN];
+ struct addrinfo hints, *res, *ai;
+ union
+ {
+ struct sockaddr sa;
+ struct sockaddr_storage ss;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ } from;
+ struct pollfd pfd[2];
+ sigset_t mask, omask;
+
+ pid_t pid;
+ int s, lport, timo, error;
+ char c;
+ int refused;
+ char num[8];
+ ssize_t n;
+
+ if (af != AF_INET && af != AF_INET6 && af != AF_UNSPEC)
+ {
+ __set_errno (EAFNOSUPPORT);
+ return -1;
+ }
+
+ pid = __getpid();
+
+ memset(&hints, '\0', sizeof(hints));
+ hints.ai_flags = AI_CANONNAME;
+ hints.ai_family = af;
+ hints.ai_socktype = SOCK_STREAM;
+ (void)__snprintf(num, sizeof(num), "%d", ntohs(rport));
+ error = getaddrinfo(*ahost, num, &hints, &res);
+ if (error) {
+ if (error == EAI_NONAME && *ahost != NULL)
+ __fxprintf(NULL, "%s: Unknown host\n", *ahost);
+ else
+ __fxprintf(NULL, "rcmd: getaddrinfo: %s\n",
+ gai_strerror(error));
+
+ return -1;
+ }
+
+ pfd[0].events = POLLIN;
+ pfd[1].events = POLLIN;
+
+ if (res->ai_canonname){
+ free (ahostbuf);
+ ahostbuf = __strdup (res->ai_canonname);
+ if (ahostbuf == NULL) {
+ __fxprintf(NULL, "%s",
+ _("rcmd: Cannot allocate memory\n"));
+ return -1;
+ }
+ *ahost = ahostbuf;
+ } else
+ *ahost = NULL;
+ ai = res;
+ refused = 0;
+ __sigemptyset(&mask);
+ __sigaddset(&mask, SIGURG);
+ __sigprocmask (SIG_BLOCK, &mask, &omask);
+ for (timo = 1, lport = IPPORT_RESERVED - 1;;) {
+ char errbuf[200];
+
+ s = rresvport_af(&lport, ai->ai_family);
+ if (s < 0) {
+ if (errno == EAGAIN)
+ __fxprintf(NULL, "%s", _("\
+rcmd: socket: All ports in use\n"));
+ else
+ __fxprintf(NULL, "rcmd: socket: %m\n");
+
+ __sigprocmask (SIG_SETMASK, &omask, 0);
+ freeaddrinfo(res);
+ return -1;
+ }
+ __fcntl(s, F_SETOWN, pid);
+ if (__connect(s, ai->ai_addr, ai->ai_addrlen) >= 0)
+ break;
+ (void)__close(s);
+ if (errno == EADDRINUSE) {
+ lport--;
+ continue;
+ }
+ if (errno == ECONNREFUSED)
+ refused = 1;
+ if (ai->ai_next != NULL) {
+ int oerrno = errno;
+ char *buf = NULL;
+
+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ paddr, sizeof(paddr),
+ NULL, 0,
+ NI_NUMERICHOST);
+
+ if (__asprintf (&buf, _("connect to address %s: "),
+ paddr) >= 0)
+ {
+ __fxprintf(NULL, "%s", buf);
+ free (buf);
+ }
+ __set_errno (oerrno);
+ perror(0);
+ ai = ai->ai_next;
+ getnameinfo(ai->ai_addr, ai->ai_addrlen,
+ paddr, sizeof(paddr),
+ NULL, 0,
+ NI_NUMERICHOST);
+ if (__asprintf (&buf, _("Trying %s...\n"), paddr) >= 0)
+ {
+ __fxprintf (NULL, "%s", buf);
+ free (buf);
+ }
+ continue;
+ }
+ if (refused && timo <= 16) {
+ (void)__sleep(timo);
+ timo *= 2;
+ ai = res;
+ refused = 0;
+ continue;
+ }
+ freeaddrinfo(res);
+ (void)__fxprintf(NULL, "%s: %s\n", *ahost,
+ __strerror_r(errno, errbuf, sizeof (errbuf)));
+ __sigprocmask (SIG_SETMASK, &omask, 0);
+ return -1;
+ }
+ lport--;
+ if (fd2p == 0) {
+ __write(s, "", 1);
+ lport = 0;
+ } else {
+ char num[8];
+ int s2 = rresvport_af(&lport, ai->ai_family), s3;
+ socklen_t len = ai->ai_addrlen;
+
+ if (s2 < 0)
+ goto bad;
+ __listen(s2, 1);
+ (void)__snprintf(num, sizeof(num), "%d", lport);
+ if (__write(s, num, strlen(num)+1) != (ssize_t)strlen(num)+1) {
+ char *buf = NULL;
+
+ if (__asprintf (&buf, _("\
+rcmd: write (setting up stderr): %m\n")) >= 0)
+ {
+ __fxprintf(NULL, "%s", buf);
+ free (buf);
+ }
+ (void)__close(s2);
+ goto bad;
+ }
+ pfd[0].fd = s;
+ pfd[1].fd = s2;
+ __set_errno (0);
+ if (__poll (pfd, 2, -1) < 1 || (pfd[1].revents & POLLIN) == 0){
+ char *buf = NULL;
+
+ if ((errno != 0
+ && __asprintf(&buf, _("\
+rcmd: poll (setting up stderr): %m\n")) >= 0)
+ || (errno == 0
+ && __asprintf(&buf, _("\
+poll: protocol failure in circuit setup\n")) >= 0))
+ {
+ __fxprintf (NULL, "%s", buf);
+ free (buf);
+ }
+ (void)__close(s2);
+ goto bad;
+ }
+ s3 = TEMP_FAILURE_RETRY (accept(s2, &from.sa, &len));
+ switch (from.sa.sa_family) {
+ case AF_INET:
+ rport = ntohs(from.sin.sin_port);
+ break;
+ case AF_INET6:
+ rport = ntohs(from.sin6.sin6_port);
+ break;
+ default:
+ rport = 0;
+ break;
+ }
+ (void)__close(s2);
+ if (s3 < 0) {
+ (void)__fxprintf(NULL, "rcmd: accept: %m\n");
+ lport = 0;
+ goto bad;
+ }
+ *fd2p = s3;
+
+ if (rport >= IPPORT_RESERVED || rport < IPPORT_RESERVED / 2){
+ char *buf = NULL;
+
+ if (__asprintf(&buf, _("\
+socket: protocol failure in circuit setup\n")) >= 0)
+ {
+ __fxprintf (NULL, "%s", buf);
+ free (buf);
+ }
+ goto bad2;
+ }
+ }
+ struct iovec iov[3] =
+ {
+ [0] = { .iov_base = (void *) locuser,
+ .iov_len = strlen (locuser) + 1 },
+ [1] = { .iov_base = (void *) remuser,
+ .iov_len = strlen (remuser) + 1 },
+ [2] = { .iov_base = (void *) cmd,
+ .iov_len = strlen (cmd) + 1 }
+ };
+ (void) TEMP_FAILURE_RETRY (__writev (s, iov, 3));
+ n = TEMP_FAILURE_RETRY (__read(s, &c, 1));
+ if (n != 1) {
+ char *buf = NULL;
+
+ if ((n == 0
+ && __asprintf(&buf, _("rcmd: %s: short read"),
+ *ahost) >= 0)
+ || (n != 0
+ && __asprintf(&buf, "rcmd: %s: %m\n", *ahost) >= 0))
+ {
+ __fxprintf (NULL, "%s", buf);
+ free (buf);
+ }
+ goto bad2;
+ }
+ if (c != 0) {
+ while (__read(s, &c, 1) == 1) {
+ (void)__write(STDERR_FILENO, &c, 1);
+ if (c == '\n')
+ break;
+ }
+ goto bad2;
+ }
+ __sigprocmask (SIG_SETMASK, &omask, 0);
+ freeaddrinfo(res);
+ return s;
+bad2:
+ if (lport)
+ (void)__close(*fd2p);
+bad:
+ (void)__close(s);
+ __sigprocmask (SIG_SETMASK, &omask, 0);
+ freeaddrinfo(res);
+ return -1;
+}
+libc_hidden_def (rcmd_af)
+
+int
+rcmd (char **ahost, u_short rport, const char *locuser, const char *remuser,
+ const char *cmd, int *fd2p)
+{
+ return rcmd_af (ahost, rport, locuser, remuser, cmd, fd2p, AF_INET);
+}
+
+int
+rresvport_af (int *alport, sa_family_t family)
+{
+ union {
+ struct sockaddr generic;
+ struct sockaddr_in in;
+ struct sockaddr_in6 in6;
+ } ss;
+ int s;
+ size_t len;
+ uint16_t *sport;
+
+ switch(family){
+ case AF_INET:
+ len = sizeof(struct sockaddr_in);
+ sport = &ss.in.sin_port;
+ break;
+ case AF_INET6:
+ len = sizeof(struct sockaddr_in6);
+ sport = &ss.in6.sin6_port;
+ break;
+ default:
+ __set_errno (EAFNOSUPPORT);
+ return -1;
+ }
+ /* NB: No SOCK_CLOEXEC for backwards compatibility. */
+ s = __socket(family, SOCK_STREAM, 0);
+ if (s < 0)
+ return -1;
+
+ memset (&ss, '\0', sizeof(ss));
+#ifdef SALEN
+ ss.generic.__ss_len = len;
+#endif
+ ss.generic.sa_family = family;
+
+ /* Ignore invalid values. */
+ if (*alport < IPPORT_RESERVED / 2)
+ *alport = IPPORT_RESERVED / 2;
+ else if (*alport >= IPPORT_RESERVED)
+ *alport = IPPORT_RESERVED - 1;
+
+ int start = *alport;
+ do {
+ *sport = htons((uint16_t) *alport);
+ if (__bind(s, &ss.generic, len) >= 0)
+ return s;
+ if (errno != EADDRINUSE) {
+ (void)__close(s);
+ return -1;
+ }
+ if ((*alport)-- == IPPORT_RESERVED/2)
+ *alport = IPPORT_RESERVED - 1;
+ } while (*alport != start);
+ (void)__close(s);
+ __set_errno (EAGAIN);
+ return -1;
+}
+libc_hidden_def (rresvport_af)
+
+int
+rresvport (int *alport)
+{
+ return rresvport_af(alport, AF_INET);
+}
+
+int __check_rhosts_file = 1;
+char *__rcmd_errstr;
+
+int
+ruserok_af (const char *rhost, int superuser, const char *ruser,
+ const char *luser, sa_family_t af)
+{
+ struct addrinfo hints, *res, *res0;
+ int gai;
+ int ret;
+
+ memset (&hints, '\0', sizeof(hints));
+ hints.ai_family = af;
+ gai = getaddrinfo(rhost, NULL, &hints, &res0);
+ if (gai)
+ return -1;
+ ret = -1;
+ for (res=res0; res; res=res->ai_next)
+ if (ruserok2_sa(res->ai_addr, res->ai_addrlen,
+ superuser, ruser, luser, rhost) == 0){
+ ret = 0;
+ break;
+ }
+ freeaddrinfo(res0);
+ return (ret);
+}
+libc_hidden_def (ruserok_af)
+
+int
+ruserok (const char *rhost, int superuser, const char *ruser,
+ const char *luser)
+{
+ return ruserok_af(rhost, superuser, ruser, luser, AF_INET);
+}
+
+/* Extremely paranoid file open function. */
+static FILE *
+iruserfopen (const char *file, uid_t okuser)
+{
+ struct stat64 st;
+ char *cp = NULL;
+ FILE *res = NULL;
+
+ /* If not a regular file, if owned by someone other than user or
+ root, if writeable by anyone but the owner, or if hardlinked
+ anywhere, quit. */
+ if (__lxstat64 (_STAT_VER, file, &st))
+ cp = _("lstat failed");
+ else if (!S_ISREG (st.st_mode))
+ cp = _("not regular file");
+ else
+ {
+ res = fopen (file, "rce");
+ if (!res)
+ cp = _("cannot open");
+ else if (__fxstat64 (_STAT_VER, fileno (res), &st) < 0)
+ cp = _("fstat failed");
+ else if (st.st_uid && st.st_uid != okuser)
+ cp = _("bad owner");
+ else if (st.st_mode & (S_IWGRP|S_IWOTH))
+ cp = _("writeable by other than owner");
+ else if (st.st_nlink > 1)
+ cp = _("hard linked somewhere");
+ }
+
+ /* If there were any problems, quit. */
+ if (cp != NULL)
+ {
+ __rcmd_errstr = cp;
+ if (res)
+ fclose (res);
+ return NULL;
+ }
+
+ /* No threads use this stream. */
+ __fsetlocking (res, FSETLOCKING_BYCALLER);
+
+ return res;
+}
+
+/*
+ * New .rhosts strategy: We are passed an ip address. We spin through
+ * hosts.equiv and .rhosts looking for a match. When the .rhosts only
+ * has ip addresses, we don't have to trust a nameserver. When it
+ * contains hostnames, we spin through the list of addresses the nameserver
+ * gives us and look for a match.
+ *
+ * Returns 0 if ok, -1 if not ok.
+ */
+static int
+ruserok2_sa (struct sockaddr *ra, size_t ralen, int superuser,
+ const char *ruser, const char *luser, const char *rhost)
+{
+ FILE *hostf = NULL;
+ int isbad = -1;
+
+ if (!superuser)
+ hostf = iruserfopen (_PATH_HEQUIV, 0);
+
+ if (hostf)
+ {
+ isbad = __validuser2_sa (hostf, ra, ralen, luser, ruser, rhost);
+ fclose (hostf);
+
+ if (!isbad)
+ return 0;
+ }
+
+ if (__check_rhosts_file || superuser)
+ {
+ char *pbuf;
+ struct passwd pwdbuf, *pwd;
+ size_t dirlen;
+ size_t buflen = __sysconf (_SC_GETPW_R_SIZE_MAX);
+ char *buffer = __alloca (buflen);
+ uid_t uid;
+
+ if (__getpwnam_r (luser, &pwdbuf, buffer, buflen, &pwd) != 0
+ || pwd == NULL)
+ return -1;
+
+ dirlen = strlen (pwd->pw_dir);
+ pbuf = alloca (dirlen + sizeof "/.rhosts");
+ __mempcpy (__mempcpy (pbuf, pwd->pw_dir, dirlen),
+ "/.rhosts", sizeof "/.rhosts");
+
+ /* Change effective uid while reading .rhosts. If root and
+ reading an NFS mounted file system, can't read files that
+ are protected read/write owner only. */
+ uid = __geteuid ();
+ seteuid (pwd->pw_uid);
+ hostf = iruserfopen (pbuf, pwd->pw_uid);
+
+ if (hostf != NULL)
+ {
+ isbad = __validuser2_sa (hostf, ra, ralen, luser, ruser, rhost);
+ fclose (hostf);
+ }
+
+ seteuid (uid);
+ return isbad;
+ }
+ return -1;
+}
+/*
+ * ruserok_sa() is now discussed on ipng, so
+ * currently disabled for external use
+ */
+static int
+ruserok_sa (struct sockaddr *ra, size_t ralen, int superuser,
+ const char *ruser, const char *luser)
+{
+ return ruserok2_sa(ra, ralen, superuser, ruser, luser, "-");
+}
+
+/* This is the exported version. */
+int
+iruserok_af (const void *raddr, int superuser, const char *ruser,
+ const char *luser, sa_family_t af)
+{
+ union {
+ struct sockaddr generic;
+ struct sockaddr_in in;
+ struct sockaddr_in6 in6;
+ } ra;
+ size_t ralen;
+
+ memset (&ra, '\0', sizeof(ra));
+ switch (af){
+ case AF_INET:
+ ra.in.sin_family = AF_INET;
+ memcpy (&ra.in.sin_addr, raddr, sizeof(struct in_addr));
+ ralen = sizeof(struct sockaddr_in);
+ break;
+ case AF_INET6:
+ ra.in6.sin6_family = AF_INET6;
+ memcpy (&ra.in6.sin6_addr, raddr, sizeof(struct in6_addr));
+ ralen = sizeof(struct sockaddr_in6);
+ break;
+ default:
+ return 0;
+ }
+ return ruserok_sa (&ra.generic, ralen, superuser, ruser, luser);
+}
+libc_hidden_def (iruserok_af)
+
+int
+iruserok (u_int32_t raddr, int superuser, const char *ruser, const char *luser)
+{
+ return iruserok_af (&raddr, superuser, ruser, luser, AF_INET);
+}
+
+/*
+ * XXX
+ * Don't make static, used by lpd(8).
+ *
+ * This function is not used anymore. It is only present because lpd(8)
+ * calls it (!?!). We simply call __invaliduser2() with an illegal rhost
+ * argument. This means that netgroups won't work in .rhost/hosts.equiv
+ * files. If you want lpd to work with netgroups, fix lpd to use ruserok()
+ * or PAM.
+ * Returns 0 if ok, -1 if not ok.
+ */
+int
+__ivaliduser (FILE *hostf, u_int32_t raddr, const char *luser,
+ const char *ruser)
+{
+ struct sockaddr_in ra;
+ memset(&ra, '\0', sizeof(ra));
+ ra.sin_family = AF_INET;
+ ra.sin_addr.s_addr = raddr;
+ return __validuser2_sa(hostf, (struct sockaddr *)&ra, sizeof(ra),
+ luser, ruser, "-");
+}
+
+
+/* Returns 1 on positive match, 0 on no match, -1 on negative match. */
+static int
+internal_function
+__checkhost_sa (struct sockaddr *ra, size_t ralen, char *lhost,
+ const char *rhost)
+{
+ struct addrinfo hints, *res0, *res;
+ char raddr[INET6_ADDRSTRLEN];
+ int match;
+ int negate=1; /* Multiply return with this to get -1 instead of 1 */
+
+ /* Check nis netgroup. */
+ if (strncmp ("+@", lhost, 2) == 0)
+ return innetgr (&lhost[2], rhost, NULL, NULL);
+
+ if (strncmp ("-@", lhost, 2) == 0)
+ return -innetgr (&lhost[2], rhost, NULL, NULL);
+
+ /* -host */
+ if (strncmp ("-", lhost,1) == 0) {
+ negate = -1;
+ lhost++;
+ } else if (strcmp ("+",lhost) == 0) {
+ return 1; /* asking for trouble, but ok.. */
+ }
+
+ /* Try for raw ip address first. */
+ /* XXX */
+ if (getnameinfo(ra, ralen,
+ raddr, sizeof(raddr), NULL, 0,
+ NI_NUMERICHOST) == 0
+ && strcmp(raddr, lhost) == 0)
+ return negate;
+
+ /* Better be a hostname. */
+ match = 0;
+ memset(&hints, '\0', sizeof(hints));
+ hints.ai_family = ra->sa_family;
+ if (getaddrinfo(lhost, NULL, &hints, &res0) == 0){
+ /* Spin through ip addresses. */
+ for (res = res0; res; res = res->ai_next)
+ {
+ if (res->ai_family == ra->sa_family
+ && !memcmp(res->ai_addr, ra, res->ai_addrlen))
+ {
+ match = 1;
+ break;
+ }
+ }
+ freeaddrinfo (res0);
+ }
+ return negate * match;
+}
+
+/* Returns 1 on positive match, 0 on no match, -1 on negative match. */
+static int
+internal_function
+__icheckuser (const char *luser, const char *ruser)
+{
+ /*
+ luser is user entry from .rhosts/hosts.equiv file
+ ruser is user id on remote host
+ */
+
+ /* [-+]@netgroup */
+ if (strncmp ("+@", luser, 2) == 0)
+ return innetgr (&luser[2], NULL, ruser, NULL);
+
+ if (strncmp ("-@", luser,2) == 0)
+ return -innetgr (&luser[2], NULL, ruser, NULL);
+
+ /* -user */
+ if (strncmp ("-", luser, 1) == 0)
+ return -(strcmp (&luser[1], ruser) == 0);
+
+ /* + */
+ if (strcmp ("+", luser) == 0)
+ return 1;
+
+ /* simple string match */
+ return strcmp (ruser, luser) == 0;
+}
+
+/*
+ * Returns 1 for blank lines (or only comment lines) and 0 otherwise
+ */
+static int
+__isempty (char *p)
+{
+ while (*p && isspace (*p)) {
+ ++p;
+ }
+
+ return (*p == '\0' || *p == '#') ? 1 : 0 ;
+}
+
+/*
+ * Returns 0 if positive match, -1 if _not_ ok.
+ */
+static int
+__validuser2_sa (FILE *hostf, struct sockaddr *ra, size_t ralen,
+ const char *luser, const char *ruser, const char *rhost)
+{
+ const char *user;
+ char *p;
+ int hcheck, ucheck;
+ char *buf = NULL;
+ size_t bufsize = 0;
+ int retval = -1;
+
+ while (__getline (&buf, &bufsize, hostf) > 0) {
+ buf[bufsize - 1] = '\0'; /* Make sure it's terminated. */
+ p = buf;
+
+ /* Skip empty or comment lines */
+ if (__isempty (p)) {
+ continue;
+ }
+
+ for (;*p && !isspace(*p); ++p) {
+ *p = _tolower (*p);
+ }
+
+ /* Next we want to find the permitted name for the remote user. */
+ if (*p == ' ' || *p == '\t') {
+ /* <nul> terminate hostname and skip spaces */
+ for (*p++='\0'; *p && isspace (*p); ++p);
+
+ user = p; /* this is the user's name */
+ while (*p && !isspace (*p))
+ ++p; /* find end of user's name */
+ } else
+ user = p;
+
+ *p = '\0'; /* <nul> terminate username (+host?) */
+
+ /* buf -> host(?) ; user -> username(?) */
+ if (*buf == '\0')
+ break;
+ if (*user == '\0')
+ user = luser;
+
+ /* First check the user part. In a naive implementation we
+ would check the host part first, then the user. However,
+ if we check the user first and reject the entry we will
+ have saved doing any host lookups to normalize the comparison
+ and that likely saves several DNS queries. Therefore we
+ check the user first. */
+ ucheck = __icheckuser (user, ruser);
+
+ /* Either we found the user, or we didn't and this is a
+ negative host check. We must do the negative host lookup
+ in order to preserve the semantics of stopping on this line
+ before processing others. */
+ if (ucheck != 0 || *buf == '-') {
+
+ /* Next check host part. */
+ hcheck = __checkhost_sa (ra, ralen, buf, rhost);
+
+ /* Negative '-host user(?)' match? */
+ if (hcheck < 0)
+ break;
+
+ /* Positive 'host user' match? */
+ if (hcheck > 0 && ucheck > 0) {
+ retval = 0;
+ break;
+ }
+
+ /* Negative 'host -user' match? */
+ if (hcheck > 0 && ucheck < 0)
+ break;
+
+ /* Neither, go on looking for match. */
+ }
+ }
+
+ free (buf);
+
+ return retval;
+}
diff --git a/REORG.TODO/inet/rexec.c b/REORG.TODO/inet/rexec.c
new file mode 100644
index 0000000000..bda536723b
--- /dev/null
+++ b/REORG.TODO/inet/rexec.c
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 1980, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include <alloca.h>
+#include <stdio.h>
+#include <netdb.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/uio.h>
+
+int rexecoptions;
+libc_freeres_ptr (static char *ahostbuf);
+
+int
+rexec_af (char **ahost, int rport, const char *name, const char *pass,
+ const char *cmd, int *fd2p, sa_family_t af)
+{
+ struct sockaddr_storage from;
+ struct addrinfo hints, *res0;
+ const char *orig_name = name;
+ const char *orig_pass = pass;
+ u_short port = 0;
+ int s, timo = 1, s3;
+ char c;
+ int gai;
+ char servbuff[NI_MAXSERV];
+
+ __snprintf(servbuff, sizeof(servbuff), "%d", ntohs(rport));
+ servbuff[sizeof(servbuff) - 1] = '\0';
+
+ memset(&hints, '\0', sizeof(hints));
+ hints.ai_family = af;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_CANONNAME;
+ gai = getaddrinfo(*ahost, servbuff, &hints, &res0);
+ if (gai){
+ /* XXX: set errno? */
+ return -1;
+ }
+
+ if (res0->ai_canonname){
+ free (ahostbuf);
+ ahostbuf = __strdup (res0->ai_canonname);
+ if (ahostbuf == NULL) {
+ perror ("rexec: strdup");
+ return (-1);
+ }
+ *ahost = ahostbuf;
+ } else {
+ *ahost = NULL;
+ __set_errno (ENOENT);
+ return -1;
+ }
+ ruserpass(res0->ai_canonname, &name, &pass);
+retry:
+ /* NB: No SOCK_CLOEXEC for backwards compatibility. */
+ s = __socket(res0->ai_family, res0->ai_socktype, 0);
+ if (s < 0) {
+ perror("rexec: socket");
+ return (-1);
+ }
+ if (__connect(s, res0->ai_addr, res0->ai_addrlen) < 0) {
+ if (errno == ECONNREFUSED && timo <= 16) {
+ (void) __close(s);
+ __sleep(timo);
+ timo *= 2;
+ goto retry;
+ }
+ perror(res0->ai_canonname);
+ return (-1);
+ }
+ if (fd2p == 0) {
+ (void) __write(s, "", 1);
+ port = 0;
+ } else {
+ char num[32];
+ int s2;
+ union
+ {
+ struct sockaddr_storage ss;
+ struct sockaddr sa;
+ } sa2;
+ socklen_t sa2len;
+
+ s2 = __socket(res0->ai_family, res0->ai_socktype, 0);
+ if (s2 < 0) {
+ (void) __close(s);
+ return (-1);
+ }
+ __listen(s2, 1);
+ sa2len = sizeof (sa2);
+ if (__getsockname(s2, &sa2.sa, &sa2len) < 0) {
+ perror("getsockname");
+ (void) __close(s2);
+ goto bad;
+ } else if (sa2len != SA_LEN(&sa2.sa)) {
+ __set_errno(EINVAL);
+ (void) __close(s2);
+ goto bad;
+ }
+ port = 0;
+ if (!getnameinfo(&sa2.sa, sa2len,
+ NULL, 0, servbuff, sizeof(servbuff),
+ NI_NUMERICSERV))
+ port = atoi(servbuff);
+ (void) sprintf(num, "%u", port);
+ (void) __write(s, num, strlen(num)+1);
+ { socklen_t len = sizeof (from);
+ s3 = TEMP_FAILURE_RETRY (accept(s2, (struct sockaddr *)&from,
+ &len));
+ __close(s2);
+ if (s3 < 0) {
+ perror("accept");
+ port = 0;
+ goto bad;
+ }
+ }
+ *fd2p = s3;
+ }
+
+ struct iovec iov[3] =
+ {
+ [0] = { .iov_base = (void *) name, .iov_len = strlen (name) + 1 },
+ /* should public key encypt the password here */
+ [1] = { .iov_base = (void *) pass, .iov_len = strlen (pass) + 1 },
+ [2] = { .iov_base = (void *) cmd, .iov_len = strlen (cmd) + 1 }
+ };
+ (void) TEMP_FAILURE_RETRY (__writev (s, iov, 3));
+
+ /* We don't need the memory allocated for the name and the password
+ in ruserpass anymore. */
+ if (name != orig_name)
+ free ((char *) name);
+ if (pass != orig_pass)
+ free ((char *) pass);
+
+ if (__read(s, &c, 1) != 1) {
+ perror(*ahost);
+ goto bad;
+ }
+ if (c != 0) {
+ while (__read(s, &c, 1) == 1) {
+ (void) __write(2, &c, 1);
+ if (c == '\n')
+ break;
+ }
+ goto bad;
+ }
+ freeaddrinfo(res0);
+ return (s);
+bad:
+ if (port)
+ (void) __close(*fd2p);
+ (void) __close(s);
+ freeaddrinfo(res0);
+ return (-1);
+}
+libc_hidden_def (rexec_af)
+
+int
+rexec (char **ahost, int rport, const char *name, const char *pass,
+ const char *cmd, int *fd2p)
+{
+ return rexec_af(ahost, rport, name, pass, cmd, fd2p, AF_INET);
+}
diff --git a/REORG.TODO/inet/ruserpass.c b/REORG.TODO/inet/ruserpass.c
new file mode 100644
index 0000000000..5b2747bc50
--- /dev/null
+++ b/REORG.TODO/inet/ruserpass.c
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 1985, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <libintl.h>
+
+/* #include "ftp_var.h" */
+
+static int token (void);
+static FILE *cfile;
+
+#define DEFAULT 1
+#define LOGIN 2
+#define PASSWD 3
+#define ACCOUNT 4
+#define MACDEF 5
+#define ID 10
+#define MACHINE 11
+
+static char tokval[100];
+
+static const char tokstr[] =
+{
+#define TOK_DEFAULT_IDX 0
+ "default\0"
+#define TOK_LOGIN_IDX (TOK_DEFAULT_IDX + sizeof "default")
+ "login\0"
+#define TOK_PASSWORD_IDX (TOK_LOGIN_IDX + sizeof "login")
+ "password\0"
+#define TOK_PASSWD_IDX (TOK_PASSWORD_IDX + sizeof "password")
+ "passwd\0"
+#define TOK_ACCOUNT_IDX (TOK_PASSWD_IDX + sizeof "passwd")
+ "account\0"
+#define TOK_MACHINE_IDX (TOK_ACCOUNT_IDX + sizeof "account")
+ "machine\0"
+#define TOK_MACDEF_IDX (TOK_MACHINE_IDX + sizeof "machine")
+ "macdef"
+};
+
+static const struct toktab {
+ int tokstr_off;
+ int tval;
+} toktab[]= {
+ { TOK_DEFAULT_IDX, DEFAULT },
+ { TOK_LOGIN_IDX, LOGIN },
+ { TOK_PASSWORD_IDX, PASSWD },
+ { TOK_PASSWD_IDX, PASSWD },
+ { TOK_ACCOUNT_IDX, ACCOUNT },
+ { TOK_MACHINE_IDX, MACHINE },
+ { TOK_MACDEF_IDX, MACDEF }
+};
+
+
+
+int
+ruserpass (const char *host, const char **aname, const char **apass)
+{
+ char *hdir, *buf, *tmp;
+ char myname[1024], *mydomain;
+ int t, usedefault = 0;
+ struct stat64 stb;
+
+ hdir = __libc_secure_getenv("HOME");
+ if (hdir == NULL) {
+ /* If we can't get HOME, fail instead of trying ".",
+ which is no improvement. This really should call
+ getpwuid(getuid()). */
+ /*hdir = ".";*/
+ return -1;
+ }
+
+ buf = alloca (strlen (hdir) + 8);
+
+ __stpcpy (__stpcpy (buf, hdir), "/.netrc");
+ cfile = fopen(buf, "rce");
+ if (cfile == NULL) {
+ if (errno != ENOENT)
+ warn("%s", buf);
+ return (0);
+ }
+ /* No threads use this stream. */
+ __fsetlocking (cfile, FSETLOCKING_BYCALLER);
+ if (__gethostname(myname, sizeof(myname)) < 0)
+ myname[0] = '\0';
+ mydomain = __strchrnul(myname, '.');
+next:
+ while ((t = token())) switch(t) {
+
+ case DEFAULT:
+ usedefault = 1;
+ /* FALL THROUGH */
+
+ case MACHINE:
+ if (!usedefault) {
+ if (token() != ID)
+ continue;
+ /*
+ * Allow match either for user's input host name
+ * or official hostname. Also allow match of
+ * incompletely-specified host in local domain.
+ */
+ if (__strcasecmp(host, tokval) == 0)
+ goto match;
+/* if (__strcasecmp(hostname, tokval) == 0)
+ goto match;
+ if ((tmp = strchr(hostname, '.')) != NULL &&
+ __strcasecmp(tmp, mydomain) == 0 &&
+ __strncasecmp(hostname, tokval, tmp-hostname) == 0 &&
+ tokval[tmp - hostname] == '\0')
+ goto match; */
+ if ((tmp = strchr(host, '.')) != NULL &&
+ __strcasecmp(tmp, mydomain) == 0 &&
+ __strncasecmp(host, tokval, tmp - host) == 0 &&
+ tokval[tmp - host] == '\0')
+ goto match;
+ continue;
+ }
+ match:
+ while ((t = token()) && t != MACHINE && t != DEFAULT) switch(t) {
+
+ case LOGIN:
+ if (token()) {
+ if (*aname == 0) {
+ char *newp;
+ newp = malloc((unsigned) strlen(tokval) + 1);
+ if (newp == NULL)
+ {
+ warnx(_("out of memory"));
+ goto bad;
+ }
+ *aname = strcpy(newp, tokval);
+ } else {
+ if (strcmp(*aname, tokval))
+ goto next;
+ }
+ }
+ break;
+ case PASSWD:
+ if (strcmp(*aname, "anonymous") &&
+ fstat64(fileno(cfile), &stb) >= 0 &&
+ (stb.st_mode & 077) != 0) {
+ warnx(_("Error: .netrc file is readable by others."));
+ warnx(_("Remove password or make file unreadable by others."));
+ goto bad;
+ }
+ if (token() && *apass == 0) {
+ char *newp;
+ newp = malloc((unsigned) strlen(tokval) + 1);
+ if (newp == NULL)
+ {
+ warnx(_("out of memory"));
+ goto bad;
+ }
+ *apass = strcpy(newp, tokval);
+ }
+ break;
+ case ACCOUNT:
+ break;
+ case MACDEF:
+ break;
+ default:
+ warnx(_("Unknown .netrc keyword %s"), tokval);
+ break;
+ }
+ goto done;
+ }
+done:
+ (void) fclose(cfile);
+ return (0);
+bad:
+ (void) fclose(cfile);
+ return (-1);
+}
+libc_hidden_def (ruserpass)
+
+static int
+token (void)
+{
+ char *cp;
+ int c;
+ int i;
+
+ if (feof_unlocked(cfile) || ferror_unlocked(cfile))
+ return (0);
+ while ((c = getc_unlocked(cfile)) != EOF &&
+ (c == '\n' || c == '\t' || c == ' ' || c == ','))
+ continue;
+ if (c == EOF)
+ return (0);
+ cp = tokval;
+ if (c == '"') {
+ while ((c = getc_unlocked(cfile)) != EOF && c != '"') {
+ if (c == '\\')
+ c = getc_unlocked(cfile);
+ *cp++ = c;
+ }
+ } else {
+ *cp++ = c;
+ while ((c = getc_unlocked(cfile)) != EOF
+ && c != '\n' && c != '\t' && c != ' ' && c != ',') {
+ if (c == '\\')
+ c = getc_unlocked(cfile);
+ *cp++ = c;
+ }
+ }
+ *cp = 0;
+ if (tokval[0] == 0)
+ return (0);
+ for (i = 0; i < (int) (sizeof (toktab) / sizeof (toktab[0])); ++i)
+ if (!strcmp(&tokstr[toktab[i].tokstr_off], tokval))
+ return toktab[i].tval;
+ return (ID);
+}
diff --git a/REORG.TODO/inet/setipv4sourcefilter.c b/REORG.TODO/inet/setipv4sourcefilter.c
new file mode 100644
index 0000000000..08e8300c12
--- /dev/null
+++ b/REORG.TODO/inet/setipv4sourcefilter.c
@@ -0,0 +1,33 @@
+/* Set source filter. Stub version.
+ Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdint.h>
+#include <netinet/in.h>
+
+
+int
+setipv4sourcefilter (int s, struct in_addr interface, struct in_addr group,
+ uint32_t fmode, uint32_t numsrc,
+ const struct in_addr *slist)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (setipv4sourcefilter)
diff --git a/REORG.TODO/inet/setsourcefilter.c b/REORG.TODO/inet/setsourcefilter.c
new file mode 100644
index 0000000000..e65674737f
--- /dev/null
+++ b/REORG.TODO/inet/setsourcefilter.c
@@ -0,0 +1,33 @@
+/* Set source filter. Stub version.
+ Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdint.h>
+#include <netinet/in.h>
+
+
+int
+setsourcefilter (int s, uint32_t interface, const struct sockaddr *group,
+ socklen_t grouplen, uint32_t fmode, uint32_t numsrc,
+ const struct sockaddr_storage *slist)
+{
+ __set_errno (ENOSYS);
+ return -1;
+}
+stub_warning (setsourcefilter)
diff --git a/REORG.TODO/inet/test-hnto-types.c b/REORG.TODO/inet/test-hnto-types.c
new file mode 100644
index 0000000000..b9770352ca
--- /dev/null
+++ b/REORG.TODO/inet/test-hnto-types.c
@@ -0,0 +1,39 @@
+/* Test netinet/in.h endian-conversion macros always return the correct type.
+ Copyright (C) 2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <netinet/in.h>
+#include <stdint.h>
+
+int i;
+uint16_t u16;
+uint32_t u32;
+
+int
+do_test (void)
+{
+ /* This is a compilation test. */
+ extern __typeof (htons (i)) u16;
+ extern __typeof (ntohs (i)) u16;
+ extern __typeof (htonl (i)) u32;
+ extern __typeof (ntohl (i)) u32;
+ (void) u16;
+ (void) u32;
+ return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/REORG.TODO/inet/test-ifaddrs.c b/REORG.TODO/inet/test-ifaddrs.c
new file mode 100644
index 0000000000..2baf9ad3a3
--- /dev/null
+++ b/REORG.TODO/inet/test-ifaddrs.c
@@ -0,0 +1,99 @@
+/* Test listing of network interface addresses.
+ Copyright (C) 2002-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ifaddrs.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+static int failures;
+
+static const char *
+addr_string (struct sockaddr *sa, char *buf, size_t size)
+{
+ if (sa == NULL)
+ return "<none>";
+
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ return inet_ntop (AF_INET, &((struct sockaddr_in *) sa)->sin_addr,
+ buf, size);
+ case AF_INET6:
+ return inet_ntop (AF_INET6, &((struct sockaddr_in6 *) sa)->sin6_addr,
+ buf, size);
+#ifdef AF_LINK
+ case AF_LINK:
+ return "<link>";
+#endif
+ case AF_UNSPEC:
+ return "---";
+
+#ifdef AF_PACKET
+ case AF_PACKET:
+ return "<packet>";
+#endif
+
+ default:
+ ++failures;
+ printf ("sa_family=%d %08x\n", sa->sa_family,
+ *(int*)&((struct sockaddr_in *) sa)->sin_addr.s_addr);
+ return "<unexpected sockaddr family>";
+ }
+}
+
+
+static int
+do_test (void)
+{
+ struct ifaddrs *ifaces, *ifa;
+
+ if (getifaddrs (&ifaces) < 0)
+ {
+ if (errno != ENOSYS)
+ {
+ printf ("Couldn't get any interfaces: %s.\n", strerror (errno));
+ exit (1);
+ }
+ /* The function is simply not implemented. */
+ exit (0);
+ }
+
+ puts ("\
+Name Flags Address Netmask Broadcast/Destination");
+
+ for (ifa = ifaces; ifa != NULL; ifa = ifa->ifa_next)
+ {
+ char abuf[64], mbuf[64], dbuf[64];
+ printf ("%-15s%#.4x %-15s %-15s %-15s\n",
+ ifa->ifa_name, ifa->ifa_flags,
+ addr_string (ifa->ifa_addr, abuf, sizeof (abuf)),
+ addr_string (ifa->ifa_netmask, mbuf, sizeof (mbuf)),
+ addr_string (ifa->ifa_broadaddr, dbuf, sizeof (dbuf)));
+ }
+
+ freeifaddrs (ifaces);
+
+ return failures ? 1 : 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/test-inet6_opt.c b/REORG.TODO/inet/test-inet6_opt.c
new file mode 100644
index 0000000000..a7ebf006c6
--- /dev/null
+++ b/REORG.TODO/inet/test-inet6_opt.c
@@ -0,0 +1,211 @@
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#define OPT_X 42
+#define OPT_Y 43
+#define OPT_Z 44
+
+static void *
+encode_inet6_opt (socklen_t *elp)
+{
+ void *eb = NULL;
+ socklen_t el;
+ int cl;
+ void *db;
+ int offset;
+ uint8_t val1;
+ uint16_t val2;
+ uint32_t val4;
+ uint64_t val8;
+
+ *elp = 0;
+#define CHECK() \
+ if (cl == -1) \
+ { \
+ printf ("cl == -1 on line %d\n", __LINE__); \
+ free (eb); \
+ return NULL; \
+ }
+
+ /* Estimate the length */
+ cl = inet6_opt_init (NULL, 0);
+ CHECK ();
+ cl = inet6_opt_append (NULL, 0, cl, OPT_X, 12, 8, NULL);
+ CHECK ();
+ cl = inet6_opt_append (NULL, 0, cl, OPT_Y, 7, 4, NULL);
+ CHECK ();
+ cl = inet6_opt_append (NULL, 0, cl, OPT_Z, 7, 1, NULL);
+ CHECK ();
+ cl = inet6_opt_finish (NULL, 0, cl);
+ CHECK ();
+ el = cl;
+
+ eb = malloc (el + 8);
+ if (eb == NULL)
+ {
+ puts ("malloc failed");
+ return NULL;
+ }
+ /* Canary. */
+ memcpy (eb + el, "deadbeef", 8);
+
+ cl = inet6_opt_init (eb, el);
+ CHECK ();
+
+ cl = inet6_opt_append (eb, el, cl, OPT_X, 12, 8, &db);
+ CHECK ();
+ val4 = 0x12345678;
+ offset = inet6_opt_set_val (db, 0, &val4, sizeof (val4));
+ val8 = 0x0102030405060708LL;
+ inet6_opt_set_val (db, offset, &val8, sizeof (val8));
+
+ cl = inet6_opt_append (eb, el, cl, OPT_Y, 7, 4, &db);
+ CHECK ();
+ val1 = 0x01;
+ offset = inet6_opt_set_val (db, 0, &val1, sizeof (val1));
+ val2 = 0x1331;
+ offset = inet6_opt_set_val (db, offset, &val2, sizeof (val2));
+ val4 = 0x01020304;
+ inet6_opt_set_val (db, offset, &val4, sizeof (val4));
+
+ cl = inet6_opt_append (eb, el, cl, OPT_Z, 7, 1, &db);
+ CHECK ();
+ inet6_opt_set_val (db, 0, (void *) "abcdefg", 7);
+
+ cl = inet6_opt_finish (eb, el, cl);
+ CHECK ();
+
+ if (memcmp (eb + el, "deadbeef", 8) != 0)
+ {
+ puts ("Canary corrupted");
+ free (eb);
+ return NULL;
+ }
+ *elp = el;
+ return eb;
+}
+
+int
+decode_inet6_opt (void *eb, socklen_t el)
+{
+ int ret = 0;
+ int seq = 0;
+ int cl = 0;
+ int offset;
+ uint8_t type;
+ socklen_t len;
+ uint8_t val1;
+ uint16_t val2;
+ uint32_t val4;
+ uint64_t val8;
+ void *db;
+ char buf[8];
+
+ while ((cl = inet6_opt_next (eb, el, cl, &type, &len, &db)) != -1)
+ switch (type)
+ {
+ case OPT_X:
+ if (seq++ != 0)
+ {
+ puts ("OPT_X is not first");
+ ret = 1;
+ }
+ if (len != 12)
+ {
+ printf ("OPT_X's length %d != 12\n", len);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, 0, &val4, sizeof (val4));
+ if (val4 != 0x12345678)
+ {
+ printf ("OPT_X's val4 %x != 0x12345678\n", val4);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, offset, &val8, sizeof (val8));
+ if (offset != len || val8 != 0x0102030405060708LL)
+ {
+ printf ("OPT_X's val8 %llx != 0x0102030405060708\n",
+ (long long) val8);
+ ret = 1;
+ }
+ break;
+ case OPT_Y:
+ if (seq++ != 1)
+ {
+ puts ("OPT_Y is not second");
+ ret = 1;
+ }
+ if (len != 7)
+ {
+ printf ("OPT_Y's length %d != 7\n", len);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, 0, &val1, sizeof (val1));
+ if (val1 != 0x01)
+ {
+ printf ("OPT_Y's val1 %x != 0x01\n", val1);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, offset, &val2, sizeof (val2));
+ if (val2 != 0x1331)
+ {
+ printf ("OPT_Y's val2 %x != 0x1331\n", val2);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, offset, &val4, sizeof (val4));
+ if (offset != len || val4 != 0x01020304)
+ {
+ printf ("OPT_Y's val4 %x != 0x01020304\n", val4);
+ ret = 1;
+ }
+ break;
+ case OPT_Z:
+ if (seq++ != 2)
+ {
+ puts ("OPT_Z is not third");
+ ret = 1;
+ }
+ if (len != 7)
+ {
+ printf ("OPT_Z's length %d != 7\n", len);
+ ret = 1;
+ }
+ offset = inet6_opt_get_val (db, 0, buf, 7);
+ if (offset != len || memcmp (buf, "abcdefg", 7) != 0)
+ {
+ buf[7] = '\0';
+ printf ("OPT_Z's buf \"%s\" != \"abcdefg\"\n", buf);
+ ret = 1;
+ }
+ break;
+ default:
+ printf ("Unknown option %d\n", type);
+ ret = 1;
+ break;
+ }
+ if (seq != 3)
+ {
+ puts ("Didn't see all of OPT_X, OPT_Y and OPT_Z");
+ ret = 1;
+ }
+ return ret;
+}
+
+static int
+do_test (void)
+{
+ void *eb;
+ socklen_t el;
+ eb = encode_inet6_opt (&el);
+ if (eb == NULL)
+ return 1;
+ if (decode_inet6_opt (eb, el))
+ return 1;
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/test_ifindex.c b/REORG.TODO/inet/test_ifindex.c
new file mode 100644
index 0000000000..06cdb78ef5
--- /dev/null
+++ b/REORG.TODO/inet/test_ifindex.c
@@ -0,0 +1,67 @@
+/* Test interface name <-> index conversions.
+ Copyright (C) 1997-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Philip Blundell <Philip.Blundell@pobox.com>.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <net/if.h>
+
+static int
+do_test (void)
+{
+ int failures = 0;
+ struct if_nameindex *idx = if_nameindex (), *p;
+ if (idx == NULL)
+ {
+ if (errno != ENOSYS)
+ {
+ printf ("Couldn't get any interfaces.\n");
+ exit (1);
+ }
+ /* The function is simply not implemented. */
+ exit (0);
+ }
+
+ printf ("Idx Name | Idx Name\n");
+
+ for (p = idx; p->if_index || p->if_name; ++p)
+ {
+ char buf[IFNAMSIZ];
+ unsigned int ni;
+ int result;
+ printf ("%3d %15s | ", p->if_index, p->if_name);
+ printf ("%3d", ni = if_nametoindex (p->if_name));
+ printf ("%15s", if_indextoname (p->if_index, buf));
+ result = (ni != p->if_index || (strcmp (buf, p->if_name)));
+ if (ni == p->if_index)
+ /* We have to make sure that this is not an alias with the
+ same interface number. */
+ if (p->if_index == if_nametoindex (buf))
+ result = 0;
+ printf ("%10s", result ? "fail" : "okay");
+ printf ("\n");
+ failures += result;
+ }
+ if_freenameindex (idx);
+ return failures ? 1 : 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-checks-posix.c b/REORG.TODO/inet/tst-checks-posix.c
new file mode 100644
index 0000000000..cdcb5cb3aa
--- /dev/null
+++ b/REORG.TODO/inet/tst-checks-posix.c
@@ -0,0 +1,23 @@
+/* Test IPv6 classification macros in POSIX mode.
+ Copyright (C) 2016-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Process tst-checks.c in POSIX mode. */
+#undef _GNU_SOURCE
+#define _POSIX_C_SOURCE 200112L
+
+#include "tst-checks.c"
diff --git a/REORG.TODO/inet/tst-checks.c b/REORG.TODO/inet/tst-checks.c
new file mode 100644
index 0000000000..1a4785d96e
--- /dev/null
+++ b/REORG.TODO/inet/tst-checks.c
@@ -0,0 +1,172 @@
+#include <stdio.h>
+#include <string.h>
+#include <netinet/in.h>
+
+
+static int
+do_test (void)
+{
+ int result = 0;
+ char buf[16];
+ memset (buf, '\0', 16);
+
+ if (! IN6_IS_ADDR_UNSPECIFIED (buf))
+ {
+ puts ("positive IN6_IS_ADDR_UNSPECIFIED failed");
+ result = 1;
+ }
+ for (size_t i = 0; i < 16; ++i)
+ {
+ buf[i] = 1;
+ if (IN6_IS_ADDR_UNSPECIFIED (buf))
+ {
+ printf ("negative IN6_IS_ADDR_UNSPECIFIED with byte %zu failed\n",
+ i);
+ result = 1;
+ }
+ buf[i] = 0;
+ }
+
+ if (IN6_IS_ADDR_LOOPBACK (buf))
+ {
+ puts ("negative IN6_IS_ADDR_UNSPECIFIED failed");
+ result = 1;
+ }
+ buf[15] = 1;
+ if (! IN6_IS_ADDR_LOOPBACK (buf))
+ {
+ puts ("positive IN6_IS_ADDR_UNSPECIFIED failed");
+ result = 1;
+ }
+ buf[15] = 0;
+
+ buf[0] = 0xfe;
+ buf[1] = 0x80;
+ if (! IN6_IS_ADDR_LINKLOCAL (buf))
+ {
+ puts ("positive IN6_IS_ADDR_LINKLOCAL failed");
+ result = 1;
+ }
+ for (size_t i = 1; i < 16; ++i)
+ {
+ buf[i] ^= 1;
+ if (! IN6_IS_ADDR_LINKLOCAL (buf))
+ {
+ printf ("positive IN6_IS_ADDR_LINKLOCAL byte %zu failed\n", i);
+ result = 1;
+ }
+ buf[i] ^= 1;
+ }
+ buf[0] = 0xff;
+ buf[1] = 0x80;
+ if (IN6_IS_ADDR_LINKLOCAL (buf))
+ {
+ puts ("negative IN6_IS_ADDR_LINKLOCAL failed");
+ result = 1;
+ }
+ buf[0] = 0xfe;
+ buf[1] = 0xc0;
+ if (IN6_IS_ADDR_LINKLOCAL (buf))
+ {
+ puts ("negative IN6_IS_ADDR_LINKLOCAL #2 failed");
+ result = 1;
+ }
+
+ buf[0] = 0xfe;
+ buf[1] = 0xc0;
+ if (! IN6_IS_ADDR_SITELOCAL (buf))
+ {
+ puts ("positive IN6_IS_ADDR_SITELOCAL failed");
+ result = 1;
+ }
+ for (size_t i = 1; i < 16; ++i)
+ {
+ buf[i] ^= 1;
+ if (! IN6_IS_ADDR_SITELOCAL (buf))
+ {
+ printf ("positive IN6_IS_ADDR_SITELOCAL byte %zu failed\n", i);
+ result = 1;
+ }
+ buf[i] ^= 1;
+ }
+ buf[0] = 0xff;
+ buf[1] = 0x80;
+ if (IN6_IS_ADDR_SITELOCAL (buf))
+ {
+ puts ("negative IN6_IS_ADDR_SITELOCAL failed");
+ result = 1;
+ }
+ buf[0] = 0xf8;
+ buf[1] = 0xc0;
+ if (IN6_IS_ADDR_SITELOCAL (buf))
+ {
+ puts ("negative IN6_IS_ADDR_SITELOCAL #2 failed");
+ result = 1;
+ }
+
+ memset (buf, '\0', 16);
+ buf[10] = 0xff;
+ buf[11] = 0xff;
+ if (! IN6_IS_ADDR_V4MAPPED (buf))
+ {
+ puts ("positive IN6_IS_ADDR_V4MAPPED failed");
+ result = 1;
+ }
+ for (size_t i = 12; i < 16; ++i)
+ {
+ buf[i] ^= 1;
+ if (! IN6_IS_ADDR_V4MAPPED (buf))
+ {
+ printf ("positive IN6_IS_ADDR_V4MAPPED byte %zu failed\n", i);
+ result = 1;
+ }
+ buf[i] ^= 1;
+ }
+ for (size_t i = 0; i < 12; ++i)
+ {
+ buf[i] ^= 1;
+ if (IN6_IS_ADDR_V4MAPPED (buf))
+ {
+ printf ("negative IN6_IS_ADDR_V4MAPPED byte %zu failed\n", i);
+ result = 1;
+ }
+ buf[i] ^= 1;
+ }
+
+ memset (buf, '\0', 16);
+ for (size_t i = 12; i < 16; ++i)
+ {
+ buf[i] ^= 2;
+ if (! IN6_IS_ADDR_V4COMPAT (buf))
+ {
+ printf ("positive IN6_IS_ADDR_V4COMPAT byte %zu failed\n", i);
+ result = 1;
+ }
+ buf[i] ^= 2;
+ }
+ for (size_t i = 0; i < 12; ++i)
+ {
+ buf[i] ^= 1;
+ if (IN6_IS_ADDR_V4COMPAT (buf))
+ {
+ printf ("negative IN6_IS_ADDR_V4COMPAT byte %zu failed\n", i);
+ result = 1;
+ }
+ buf[i] ^= 1;
+ }
+ if (IN6_IS_ADDR_V4COMPAT (buf))
+ {
+ puts ("negative IN6_IS_ADDR_V4COMPAT #2 failed");
+ result = 1;
+ }
+ buf[15] = 1;
+ if (IN6_IS_ADDR_V4COMPAT (buf))
+ {
+ puts ("negative IN6_IS_ADDR_V4COMPAT #3 failed");
+ result = 1;
+ }
+
+ return result;
+}
+
+#include <support/test-driver.c>
diff --git a/REORG.TODO/inet/tst-deadline.c b/REORG.TODO/inet/tst-deadline.c
new file mode 100644
index 0000000000..ed04345c35
--- /dev/null
+++ b/REORG.TODO/inet/tst-deadline.c
@@ -0,0 +1,188 @@
+/* Tests for computing deadlines for timeouts.
+ Copyright (C) 2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <inet/net-internal.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <support/check.h>
+
+/* Find the maximum value which can be represented in a time_t. */
+static time_t
+time_t_max (void)
+{
+ _Static_assert (0 > (time_t) -1, "time_t is signed");
+ uintmax_t current = 1;
+ while (true)
+ {
+ uintmax_t next = current * 2;
+ /* This cannot happen because time_t is signed. */
+ TEST_VERIFY_EXIT (next > current);
+ ++next;
+ if ((time_t) next < 0 || next != (uintmax_t) (time_t) next)
+ /* Value cannot be represented in time_t. Return the previous
+ value. */
+ return current;
+ current = next;
+ }
+}
+
+static int
+do_test (void)
+{
+ {
+ struct deadline_current_time current_time = __deadline_current_time ();
+ TEST_VERIFY (current_time.current.tv_sec >= 0);
+ current_time = __deadline_current_time ();
+ /* Due to CLOCK_MONOTONIC, either seconds or nanoseconds are
+ greater than zero. This is also true for the gettimeofday
+ fallback. */
+ TEST_VERIFY (current_time.current.tv_sec >= 0);
+ TEST_VERIFY (current_time.current.tv_sec > 0
+ || current_time.current.tv_nsec > 0);
+ }
+
+ /* Check basic computations of deadlines. */
+ struct deadline_current_time current_time = { { 1, 123456789 } };
+ struct deadline deadline = __deadline_from_timeval
+ (current_time, (struct timeval) { 0, 1 });
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 123457789);
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1);
+
+ deadline = __deadline_from_timeval
+ (current_time, ((struct timeval) { 0, 2 }));
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 123458789);
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1);
+
+ deadline = __deadline_from_timeval
+ (current_time, ((struct timeval) { 1, 0 }));
+ TEST_VERIFY (deadline.absolute.tv_sec == 2);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 123456789);
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000);
+
+ /* Check if timeouts are correctly rounded up to the next
+ millisecond. */
+ for (int i = 0; i < 999999; ++i)
+ {
+ ++current_time.current.tv_nsec;
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000);
+ }
+
+ /* A full millisecond has elapsed, so the time to the deadline is
+ now less than 1000. */
+ ++current_time.current.tv_nsec;
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 999);
+
+ /* Check __deadline_to_ms carry-over. */
+ current_time = (struct deadline_current_time) { { 9, 123456789 } };
+ deadline = (struct deadline) { { 10, 122456789 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 999);
+ deadline = (struct deadline) { { 10, 122456790 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000);
+ deadline = (struct deadline) { { 10, 123456788 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000);
+ deadline = (struct deadline) { { 10, 123456789 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 1000);
+
+ /* Check __deadline_to_ms overflow. */
+ deadline = (struct deadline) { { INT_MAX - 1, 1 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == INT_MAX);
+
+ /* Check __deadline_to_ms for elapsed deadlines. */
+ current_time = (struct deadline_current_time) { { 9, 123456789 } };
+ deadline.absolute = current_time.current;
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0);
+ current_time = (struct deadline_current_time) { { 9, 123456790 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0);
+ current_time = (struct deadline_current_time) { { 10, 0 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0);
+ current_time = (struct deadline_current_time) { { 10, 123456788 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0);
+ current_time = (struct deadline_current_time) { { 10, 123456789 } };
+ TEST_VERIFY (__deadline_to_ms (current_time, deadline) == 0);
+
+ /* Check carry-over in __deadline_from_timeval. */
+ current_time = (struct deadline_current_time) { { 9, 998000001 } };
+ for (int i = 0; i < 2000; ++i)
+ {
+ deadline = __deadline_from_timeval
+ (current_time, (struct timeval) { 1, i });
+ TEST_VERIFY (deadline.absolute.tv_sec == 10);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 998000001 + i * 1000);
+ }
+ for (int i = 2000; i < 3000; ++i)
+ {
+ deadline = __deadline_from_timeval
+ (current_time, (struct timeval) { 2, i });
+ TEST_VERIFY (deadline.absolute.tv_sec == 12);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 1 + (i - 2000) * 1000);
+ }
+
+ /* Check infinite deadlines. */
+ deadline = __deadline_from_timeval
+ ((struct deadline_current_time) { { 0, 1000 * 1000 * 1000 - 1000 } },
+ (struct timeval) { time_t_max (), 1 });
+ TEST_VERIFY (__deadline_is_infinite (deadline));
+ deadline = __deadline_from_timeval
+ ((struct deadline_current_time) { { 0, 1000 * 1000 * 1000 - 1001 } },
+ (struct timeval) { time_t_max (), 1 });
+ TEST_VERIFY (!__deadline_is_infinite (deadline));
+ deadline = __deadline_from_timeval
+ ((struct deadline_current_time)
+ { { time_t_max (), 1000 * 1000 * 1000 - 1000 } },
+ (struct timeval) { 0, 1 });
+ TEST_VERIFY (__deadline_is_infinite (deadline));
+ deadline = __deadline_from_timeval
+ ((struct deadline_current_time)
+ { { time_t_max () / 2 + 1, 0 } },
+ (struct timeval) { time_t_max () / 2 + 1, 0 });
+ TEST_VERIFY (__deadline_is_infinite (deadline));
+
+ /* Check __deadline_first behavior. */
+ deadline = __deadline_first
+ ((struct deadline) { { 1, 2 } },
+ (struct deadline) { { 1, 3 } });
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 2);
+ deadline = __deadline_first
+ ((struct deadline) { { 1, 3 } },
+ (struct deadline) { { 1, 2 } });
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 2);
+ deadline = __deadline_first
+ ((struct deadline) { { 1, 2 } },
+ (struct deadline) { { 2, 1 } });
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 2);
+ deadline = __deadline_first
+ ((struct deadline) { { 1, 2 } },
+ (struct deadline) { { 2, 4 } });
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 2);
+ deadline = __deadline_first
+ ((struct deadline) { { 2, 4 } },
+ (struct deadline) { { 1, 2 } });
+ TEST_VERIFY (deadline.absolute.tv_sec == 1);
+ TEST_VERIFY (deadline.absolute.tv_nsec == 2);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/REORG.TODO/inet/tst-ether_aton.c b/REORG.TODO/inet/tst-ether_aton.c
new file mode 100644
index 0000000000..eba350ed3a
--- /dev/null
+++ b/REORG.TODO/inet/tst-ether_aton.c
@@ -0,0 +1,60 @@
+#include <stdio.h>
+#include <string.h>
+#include <netinet/ether.h>
+
+static int
+do_test (void)
+{
+ struct ether_addr *valp, val;
+ int result, r;
+ char hostname[32], buf[64], *p;
+
+ valp = ether_aton ("12:34:56:78:9a:bc");
+
+ printf ("ether_aton (\"12:34:56:78:9a:bc\") = %hhx:%hhx:%hhx:%hhx:%hhx:%hhx\n",
+ valp->ether_addr_octet[0],
+ valp->ether_addr_octet[1],
+ valp->ether_addr_octet[2],
+ valp->ether_addr_octet[3],
+ valp->ether_addr_octet[4],
+ valp->ether_addr_octet[5]);
+
+ result = (valp->ether_addr_octet[0] != 0x12
+ || valp->ether_addr_octet[1] != 0x34
+ || valp->ether_addr_octet[2] != 0x56
+ || valp->ether_addr_octet[3] != 0x78
+ || valp->ether_addr_octet[4] != 0x9a
+ || valp->ether_addr_octet[5] != 0xbc);
+
+ if ((r = ether_line ("0:c0:f0:46:5f:97 host.ether.com \t# comment",
+ &val, hostname)) == 0)
+ {
+ ether_ntoa_r (&val, buf);
+ p = strchr (buf, '\0');
+ *p++ = ' ';
+ strcpy (p, hostname);
+
+ printf ("ether_line (\"0:c0:f0:46:5f:97 host.ether.com\") = \"%s\"\n",
+ buf);
+
+ result |= strcmp ("0:c0:f0:46:5f:97 host.ether.com", buf) != 0;
+ }
+ else
+ {
+ printf ("ether_line (\"0:c0:f0:46:5f:97 host.ether.com\") = %d\n", r);
+ result |= 1;
+ }
+
+ r = ether_line ("0:c0:2:d0 foo.bar ", &val, hostname);
+ printf ("ether_line (\"0:c0:2:d0 foo.bar \") = %d\n", r);
+ result |= r != -1;
+
+ r = ether_line ("0:c0:2:d0:1a:2a ", &val, hostname);
+ printf ("ether_line (\"0:c0:2:d0:1a:2a \") = %d\n", r);
+ result |= r != -1;
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-ether_line.c b/REORG.TODO/inet/tst-ether_line.c
new file mode 100644
index 0000000000..ff0560b16a
--- /dev/null
+++ b/REORG.TODO/inet/tst-ether_line.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <string.h>
+#include <netinet/ether.h>
+
+
+static int
+do_test (void)
+{
+ struct ether_addr a;
+ char buf[1000];
+ if (ether_line ("00:01:02:03:04:05 aaaaa \n", &a, buf) != 0)
+ {
+ puts ("ether_line failed");
+ return 1;
+ }
+
+ int res = 0;
+ int i;
+ for (i = 0; i < ETH_ALEN; ++i)
+ {
+ printf ("%02x%s",
+ (int) a.ether_addr_octet[i], i + 1 == ETH_ALEN ? "" : ":");
+ if (a.ether_addr_octet[i] != i)
+ {
+ printf ("octet %d is %d, expected %d\n",
+ i, (int) a.ether_addr_octet[i], i);
+ res = 1;
+ }
+ }
+
+ printf (" \"%s\"\n", buf);
+ res |= strcmp (buf, "aaaaa") != 0;
+
+ return res;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-gethnm.c b/REORG.TODO/inet/tst-gethnm.c
new file mode 100644
index 0000000000..dd3a547811
--- /dev/null
+++ b/REORG.TODO/inet/tst-gethnm.c
@@ -0,0 +1,67 @@
+/* Based on a test case by grd@algonet.se. */
+
+#include <netdb.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+static int
+do_test (void)
+{
+ struct hostent *ent;
+ struct in_addr hostaddr;
+ int result = 0;
+
+ inet_aton ("127.0.0.1", (struct in_addr *) &hostaddr.s_addr);
+ ent = gethostbyaddr (&hostaddr, sizeof (hostaddr), AF_INET);
+ if (ent == NULL)
+ puts ("gethostbyaddr (...) == NULL");
+ else
+ {
+ puts ("Using gethostbyaddr(..):");
+ printf ("h_name: %s\n", ent->h_name);
+
+ if (ent->h_aliases == NULL)
+ puts ("ent->h_aliases == NULL");
+ else
+ printf ("h_aliases[0]: %s\n", ent->h_aliases[0]);
+ }
+
+ ent = gethostbyname ("127.0.0.1");
+ if (ent == NULL)
+ {
+ puts ("gethostbyname (\"127.0.0.1\") == NULL");
+ result = 1;
+ }
+ else
+ {
+ printf ("\nNow using gethostbyname(..):\n");
+ printf ("h_name: %s\n", ent->h_name);
+ if (strcmp (ent->h_name, "127.0.0.1") != 0)
+ {
+ puts ("ent->h_name != \"127.0.0.1\"");
+ result = 1;
+ }
+
+ if (ent->h_aliases == NULL)
+ {
+ puts ("ent->h_aliases == NULL");
+ result = 1;
+ }
+ else
+ {
+ printf ("h_aliases[0]: %s\n", ent->h_aliases[0]);
+ result |= ent->h_aliases[0] != NULL;
+ }
+ }
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-getni1.c b/REORG.TODO/inet/tst-getni1.c
new file mode 100644
index 0000000000..3960f7112e
--- /dev/null
+++ b/REORG.TODO/inet/tst-getni1.c
@@ -0,0 +1,36 @@
+#include <netdb.h>
+#include <stdio.h>
+#include <sys/socket.h>
+
+static int
+do_test (void)
+{
+ int retval = 0;
+
+ struct sockaddr_in s;
+ s.sin_family = AF_INET;
+ s.sin_port = 80;
+ s.sin_addr.s_addr = INADDR_LOOPBACK;
+ int r = getnameinfo((struct sockaddr *) &s, sizeof (s), NULL, 0, NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV);
+ printf("r = %d\n", r);
+ if (r != 0)
+ {
+ puts ("failed without NI_NAMEREQD");
+ retval = 1;
+ }
+
+ r = getnameinfo((struct sockaddr *) &s, sizeof (s), NULL, 0, NULL, 0,
+ NI_NUMERICHOST | NI_NUMERICSERV | NI_NAMEREQD);
+ printf("r = %d\n", r);
+ if (r != EAI_NONAME)
+ {
+ puts ("did not fail with EAI_NONAME with NI_NAMEREQD set");
+ retval = 1;
+ }
+
+ return retval;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-getni2.c b/REORG.TODO/inet/tst-getni2.c
new file mode 100644
index 0000000000..66e78062ba
--- /dev/null
+++ b/REORG.TODO/inet/tst-getni2.c
@@ -0,0 +1,41 @@
+#include <netdb.h>
+#include <stdio.h>
+#include <sys/socket.h>
+
+static int
+do_test (void)
+{
+ int retval = 0;
+
+ struct sockaddr_in6 s;
+ s.sin6_family = AF_INET6;
+ s.sin6_port = htons (80);
+ s.sin6_flowinfo = 0;
+ s.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
+ s.sin6_scope_id = 0;
+ char buf[1000];
+ buf[0] = '\0';
+ int r = getnameinfo((struct sockaddr *) &s, sizeof (s), buf, sizeof (buf),
+ NULL, 0, NI_NUMERICSERV);
+ printf("r = %d, buf = \"%s\"\n", r, buf);
+ if (r != 0)
+ {
+ puts ("failed without NI_NAMEREQD");
+ retval = 1;
+ }
+
+ buf[0] = '\0';
+ r = getnameinfo((struct sockaddr *) &s, sizeof (s), buf, sizeof (buf),
+ NULL, 0, NI_NUMERICSERV | NI_NAMEREQD);
+ printf("r = %d, buf = \"%s\"\n", r, buf);
+ if (r != EAI_NONAME)
+ {
+ puts ("did not fail with EAI_NONAME with NI_NAMEREQD set");
+ retval = 1;
+ }
+
+ return retval;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-inet6_rth.c b/REORG.TODO/inet/tst-inet6_rth.c
new file mode 100644
index 0000000000..549d717c7d
--- /dev/null
+++ b/REORG.TODO/inet/tst-inet6_rth.c
@@ -0,0 +1,192 @@
+#include <stdio.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/ip6.h>
+
+static int
+do_test (void)
+{
+ int res = 0;
+ char buf[1000];
+ void *p = inet6_rth_init (buf, 24, IPV6_RTHDR_TYPE_0, 0);
+ if (p == NULL)
+ {
+ puts ("first inet6_rth_init failed");
+ res = 1;
+ }
+ else if (inet6_rth_add (p, &in6addr_any) == 0)
+ {
+ puts ("first inet6_rth_add succeeded");
+ res = 1;
+ }
+
+ p = inet6_rth_init (buf, 24, IPV6_RTHDR_TYPE_0, 1);
+ if (p == NULL)
+ {
+ puts ("second inet6_rth_init failed");
+ res = 1;
+ }
+ else if (inet6_rth_add (p, &in6addr_any) != 0)
+ {
+ puts ("second inet6_rth_add failed");
+ res = 1;
+ }
+
+ for (int nseg = 4; nseg < 6; ++nseg)
+ {
+ printf ("nseg = %d\n", nseg);
+
+ p = inet6_rth_init (buf, sizeof (buf), IPV6_RTHDR_TYPE_0, nseg);
+ if (p == NULL)
+ {
+ puts ("third inet6_rth_init failed");
+ res = 1;
+ }
+ else
+ {
+ struct in6_addr tmp;
+ memset (&tmp, '\0', sizeof (tmp));
+
+ for (int i = 0; i < nseg; ++i)
+ {
+ tmp.s6_addr[0] = i;
+ if (inet6_rth_add (p, &tmp) != 0)
+ {
+ printf ("call %d of third inet6_rth_add failed\n", i + 1);
+ res = 1;
+ goto out;
+ }
+ }
+ ((struct ip6_rthdr0 *) p)->ip6r0_segleft = 0;
+ if (inet6_rth_segments (p) != nseg)
+ {
+ puts ("\
+inet6_rth_segments returned wrong value after loop with third inet6_rth_add");
+ res = 1;
+ goto out;
+ }
+
+ union
+ {
+ char buffer[1000];
+ struct ip6_rthdr0 rthdr0;
+ } buf2;
+ if (inet6_rth_reverse (p, buf2.buffer) != 0)
+ {
+ puts ("first inet6_rth_reverse call failed");
+ res = 1;
+ goto out;
+ }
+ if (buf2.rthdr0.ip6r0_segleft != nseg)
+ {
+ puts ("segleft after first inet6_rth_reverse wrong");
+ res = 1;
+ }
+
+ if (inet6_rth_segments (p) != inet6_rth_segments (buf2.buffer))
+ {
+ puts ("number of seconds after first inet6_rth_reverse differs");
+ res = 1;
+ goto out;
+ }
+
+ for (int i = 0; i < nseg; ++i)
+ {
+ struct in6_addr *addr = inet6_rth_getaddr (buf2.buffer, i);
+ if (addr == NULL)
+ {
+ printf ("call %d of first inet6_rth_getaddr failed\n",
+ i + 1);
+ res = 1;
+ }
+ else if (addr->s6_addr[0] != nseg - 1 - i
+ || memcmp (&addr->s6_addr[1], &in6addr_any.s6_addr[1],
+ sizeof (in6addr_any)
+ - sizeof (in6addr_any.s6_addr[0])) != 0)
+ {
+ char addrbuf[100];
+ inet_ntop (AF_INET6, addr, addrbuf, sizeof (addrbuf));
+ printf ("\
+address %d after first inet6_rth_reverse wrong (%s)\n",
+ i + 1, addrbuf);
+ res = 1;
+ }
+ }
+ out:
+ ;
+ }
+
+ p = inet6_rth_init (buf, sizeof (buf), IPV6_RTHDR_TYPE_0, nseg);
+ if (p == NULL)
+ {
+ puts ("fourth inet6_rth_init failed");
+ res = 1;
+ }
+ else
+ {
+ struct in6_addr tmp;
+ memset (&tmp, '\0', sizeof (tmp));
+
+ for (int i = 0; i < nseg; ++i)
+ {
+ tmp.s6_addr[0] = i;
+ if (inet6_rth_add (p, &tmp) != 0)
+ {
+ printf ("call %d of fourth inet6_rth_add failed\n", i + 1);
+ res = 1;
+ goto out2;
+ }
+ }
+ ((struct ip6_rthdr0 *) p)->ip6r0_segleft = 0;
+ if (inet6_rth_segments (p) != nseg)
+ {
+ puts ("\
+inet6_rth_segments returned wrong value after loop with fourth inet6_rth_add");
+ res = 1;
+ goto out2;
+ }
+
+ if (inet6_rth_reverse (p, p) != 0)
+ {
+ puts ("second inet6_rth_reverse call failed");
+ res = 1;
+ goto out2;
+ }
+ if (((struct ip6_rthdr0 *) p)->ip6r0_segleft != nseg)
+ {
+ puts ("segleft after second inet6_rth_reverse wrong");
+ res = 1;
+ }
+
+ for (int i = 0; i < nseg; ++i)
+ {
+ struct in6_addr *addr = inet6_rth_getaddr (p, i);
+ if (addr == NULL)
+ {
+ printf ("call %d of second inet6_rth_getaddr failed\n",
+ i + 1);
+ res = 1;
+ }
+ else if (addr->s6_addr[0] != nseg - 1 - i
+ || memcmp (&addr->s6_addr[1], &in6addr_any.s6_addr[1],
+ sizeof (in6addr_any)
+ - sizeof (in6addr_any.s6_addr[0])) != 0)
+ {
+ char addrbuf[100];
+ inet_ntop (AF_INET6, addr, addrbuf, sizeof (addrbuf));
+ printf ("\
+address %d after second inet6_rth_reverse wrong (%s)\n",
+ i + 1, addrbuf);
+ res = 1;
+ }
+ }
+ out2:
+ ;
+ }
+ }
+
+ return res;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-inet6_scopeid_pton.c b/REORG.TODO/inet/tst-inet6_scopeid_pton.c
new file mode 100644
index 0000000000..2178c5b4d2
--- /dev/null
+++ b/REORG.TODO/inet/tst-inet6_scopeid_pton.c
@@ -0,0 +1,131 @@
+/* Tests for __inet6_scopeid_pton.
+ Copyright (C) 2016-2017 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <arpa/inet.h>
+#include <inttypes.h>
+#include <net-internal.h>
+#include <net/if.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* An interface which is known to the system. */
+static const char *interface_name;
+static uint32_t interface_index;
+
+/* Initiale the variables above. */
+static void
+setup_interface (void)
+{
+ struct if_nameindex *list = if_nameindex ();
+ if (list != NULL && list[0].if_index != 0 && list[0].if_name[0] != '\0')
+ {
+ interface_name = list[0].if_name;
+ interface_index = list[0].if_index;
+ }
+}
+
+/* Convert ADDRESS to struct in6_addr. */
+static struct in6_addr
+from_string (const char *address)
+{
+ struct in6_addr addr;
+ if (inet_pton (AF_INET6, address, &addr) != 1)
+ {
+ printf ("error: inet_pton (\"%s\") failed\n", address);
+ exit (1);
+ }
+ return addr;
+}
+
+/* Check a single address were we expected a failure. */
+static void
+expect_failure (const char *address, const char *scope)
+{
+ struct in6_addr addr = from_string (address);
+ uint32_t result = 1234;
+ if (__inet6_scopeid_pton (&addr, scope, &result) == 0)
+ {
+ printf ("error: unexpected success for %s%%%s\n",
+ address, scope);
+ exit (1);
+ }
+ if (result != 1234)
+ {
+ printf ("error: unexpected result update for %s%%%s\n",
+ address, scope);
+ exit (1);
+ }
+}
+
+/* Check a single address were we expected a success. */
+static void
+expect_success (const char *address, const char *scope, uint32_t expected)
+{
+ struct in6_addr addr = from_string (address);
+ uint32_t actual = expected + 1;
+ if (__inet6_scopeid_pton (&addr, scope, &actual) != 0)
+ {
+ printf ("error: unexpected failure for %s%%%s\n",
+ address, scope);
+ exit (1);
+ }
+ if (actual != expected)
+ {
+ printf ("error: unexpected result for for %s%%%s\n",
+ address, scope);
+ printf (" expected: %" PRIu32 "\n", expected);
+ printf (" actual: %" PRIu32 "\n", actual);
+ exit (1);
+ }
+}
+
+static int
+do_test (void)
+{
+ setup_interface ();
+
+ static const char *test_addresses[]
+ = { "::", "::1", "2001:db8::1", NULL };
+ for (int i = 0; test_addresses[i] != NULL; ++i)
+ {
+ expect_success (test_addresses[i], "0", 0);
+ expect_success (test_addresses[i], "5555", 5555);
+
+ expect_failure (test_addresses[i], "");
+ expect_failure (test_addresses[i], "-1");
+ expect_failure (test_addresses[i], "-99");
+ expect_failure (test_addresses[i], "037777777777");
+ expect_failure (test_addresses[i], "0x");
+ expect_failure (test_addresses[i], "0x1");
+ }
+
+ if (interface_name != NULL)
+ {
+ expect_success ("fe80::1", interface_name, interface_index);
+ expect_success ("ff02::1", interface_name, interface_index);
+ expect_failure ("::", interface_name);
+ expect_failure ("::1", interface_name);
+ expect_failure ("ff01::1", interface_name);
+ expect_failure ("2001:db8::1", interface_name);
+ }
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-network.c b/REORG.TODO/inet/tst-network.c
new file mode 100644
index 0000000000..825b0cbc48
--- /dev/null
+++ b/REORG.TODO/inet/tst-network.c
@@ -0,0 +1,81 @@
+/* Test for inet_network.
+ Copyright (C) 2000-2017 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@suse.de>, 2000.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+struct
+{
+ const char *network;
+ uint32_t number;
+} tests [] =
+{
+ {"1.0.0.0", 0x1000000},
+ {"1.0.0", 0x10000},
+ {"1.0", 0x100},
+ {"1", 0x1},
+ {"192.168.0.0", 0xC0A80000},
+ {"0", 0},
+ {"0x0", 0},
+ /* Now some invalid addresses. */
+ {"0x", INADDR_NONE},
+ {"1 bar", INADDR_NONE}, /* Bug 15277. */
+ {"141.30.225.2800", INADDR_NONE},
+ {"141.76.1.1.1", INADDR_NONE},
+ {"141.76.1.11.", INADDR_NONE},
+ {"1410", INADDR_NONE},
+ {"1.1410", INADDR_NONE},
+ {"1.1410.", INADDR_NONE},
+ {"1.1410", INADDR_NONE},
+ {"141.76.1111", INADDR_NONE},
+ {"141.76.1111.", INADDR_NONE}
+};
+
+
+static int
+do_test (void)
+{
+ int errors = 0;
+ size_t i;
+ uint32_t res;
+
+ for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
+ {
+ printf ("Testing: %s\n", tests[i].network);
+ res = inet_network (tests[i].network);
+
+ if (res != tests[i].number)
+ {
+ ++errors;
+ printf ("Test failed for inet_network (\"%s\"):\n",
+ tests[i].network);
+ printf ("Expected return value %u (0x%x) but got %u (0x%x).\n",
+ tests[i].number, tests[i].number, res, res);
+ }
+
+ }
+
+ return errors != 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-ntoa.c b/REORG.TODO/inet/tst-ntoa.c
new file mode 100644
index 0000000000..ef82d4d537
--- /dev/null
+++ b/REORG.TODO/inet/tst-ntoa.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+
+static int
+test (unsigned int inaddr, const char *expected)
+{
+ struct in_addr addr;
+ char *res;
+ int fail;
+
+ addr.s_addr = htonl (inaddr);
+ res = inet_ntoa (addr);
+ fail = strcmp (res, expected);
+
+ printf ("%#010x -> \"%s\" -> %s%s\n", inaddr, res,
+ fail ? "fail, expected" : "ok", fail ? expected : "");
+
+ return fail;
+}
+
+
+static int
+do_test (void)
+{
+ int result = 0;
+
+ result |= test (INADDR_LOOPBACK, "127.0.0.1");
+ result |= test (INADDR_BROADCAST, "255.255.255.255");
+ result |= test (INADDR_ANY, "0.0.0.0");
+ result |= test (0xc0060746, "192.6.7.70");
+
+ return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/REORG.TODO/inet/tst-sockaddr.c b/REORG.TODO/inet/tst-sockaddr.c
new file mode 100644
index 0000000000..dccc3dac0c
--- /dev/null
+++ b/REORG.TODO/inet/tst-sockaddr.c
@@ -0,0 +1,125 @@
+/* Tests for socket address type definitions.
+ Copyright (C) 2016-2017 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 Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#include <netinet/in.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+/* This is a copy of the previous definition of struct
+ sockaddr_storage. It is not equal to the old value of _SS_SIZE
+ (128) on all architectures. We must stay compatible with the old
+ definition. */
+
+#define OLD_REFERENCE_SIZE 128
+#define OLD_PADSIZE (OLD_REFERENCE_SIZE - (2 * sizeof (__ss_aligntype)))
+struct sockaddr_storage_old
+ {
+ __SOCKADDR_COMMON (old_);
+ __ss_aligntype old_align;
+ char old_padding[OLD_PADSIZE];
+ };
+
+static bool errors;
+
+static void
+check (bool ok, const char *message)
+{
+ if (!ok)
+ {
+ printf ("error: failed check: %s\n", message);
+ errors = true;
+ }
+}
+
+static int
+do_test (void)
+{
+ check (OLD_REFERENCE_SIZE >= _SS_SIZE,
+ "old target size is not smaller than actual size");
+ check (sizeof (struct sockaddr_storage_old)
+ == sizeof (struct sockaddr_storage),
+ "old and new sizes match");
+ check (__alignof (struct sockaddr_storage_old)
+ == __alignof (struct sockaddr_storage),
+ "old and new alignment matches");
+ check (offsetof (struct sockaddr_storage_old, old_family)
+ == offsetof (struct sockaddr_storage, ss_family),
+ "old and new family offsets match");
+ check (sizeof (struct sockaddr_storage) == _SS_SIZE,
+ "struct sockaddr_storage size");
+
+ /* Check for lack of holes in the struct definition. */
+ check (offsetof (struct sockaddr_storage, __ss_padding)
+ == __SOCKADDR_COMMON_SIZE,
+ "implicit padding before explicit padding");
+ check (offsetof (struct sockaddr_storage, __ss_align)
+ == __SOCKADDR_COMMON_SIZE
+ + sizeof (((struct sockaddr_storage) {}).__ss_padding),
+ "implicit padding before explicit padding");
+
+ /* Check for POSIX compatibility requirements between struct
+ sockaddr_storage and struct sockaddr_un. */
+ check (sizeof (struct sockaddr_storage) >= sizeof (struct sockaddr_un),
+ "sockaddr_storage is at least as large as sockaddr_un");
+ check (__alignof (struct sockaddr_storage)
+ >= __alignof (struct sockaddr_un),
+ "sockaddr_storage is at least as aligned as sockaddr_un");
+ check (offsetof (struct sockaddr_storage, ss_family)
+ == offsetof (struct sockaddr_un, sun_family),
+ "family offsets match");
+
+ /* Check that the compiler preserves bit patterns in aggregate
+ copies. Based on <https://gcc.gnu.org/PR71120>. */
+ check (sizeof (struct sockaddr_storage) >= sizeof (struct sockaddr_in),
+ "sockaddr_storage is at least as large as sockaddr_in");
+ {
+ struct sockaddr_storage addr;
+ memset (&addr, 0, sizeof (addr));
+ {
+ struct sockaddr_in *sinp = (struct sockaddr_in *)&addr;
+ sinp->sin_family = AF_INET;
+ sinp->sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+ sinp->sin_port = htons (80);
+ }
+ struct sockaddr_storage copy;
+ copy = addr;
+
+ struct sockaddr_storage *p = malloc (sizeof (*p));
+ if (p == NULL)
+ {
+ printf ("error: malloc: %m\n");
+ return 1;
+ }
+ *p = copy;
+ const struct sockaddr_in *sinp = (const struct sockaddr_in *)p;
+ check (sinp->sin_family == AF_INET, "sin_family");
+ check (sinp->sin_addr.s_addr == htonl (INADDR_LOOPBACK), "sin_addr");
+ check (sinp->sin_port == htons (80), "sin_port");
+ free (p);
+ }
+
+ return errors;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"