2016-09-15 13:46:30 +00:00
|
|
|
/* Network-related functions for internal library use.
|
2020-01-01 00:14:33 +00:00
|
|
|
Copyright (C) 2016-2020 Free Software Foundation, Inc.
|
2016-09-15 13:46:30 +00:00
|
|
|
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
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2016-09-15 13:46:30 +00:00
|
|
|
|
|
|
|
#ifndef _NET_INTERNAL_H
|
|
|
|
#define _NET_INTERNAL_H 1
|
|
|
|
|
|
|
|
#include <arpa/inet.h>
|
2017-02-28 14:28:45 +00:00
|
|
|
#include <stdbool.h>
|
2016-09-15 13:46:30 +00:00
|
|
|
#include <stdint.h>
|
2017-02-28 14:28:45 +00:00
|
|
|
#include <sys/time.h>
|
2019-09-24 20:55:36 +00:00
|
|
|
#include <libc-diag.h>
|
2020-03-16 09:09:13 +00:00
|
|
|
#include <struct___timespec64.h>
|
2016-09-15 13:46:30 +00:00
|
|
|
|
|
|
|
int __inet6_scopeid_pton (const struct in6_addr *address,
|
2017-08-10 14:06:52 +00:00
|
|
|
const char *scope, uint32_t *result);
|
2016-09-15 13:46:30 +00:00
|
|
|
libc_hidden_proto (__inet6_scopeid_pton)
|
|
|
|
|
2017-02-28 14:28:45 +00:00
|
|
|
|
2018-05-23 13:26:19 +00:00
|
|
|
/* IDNA conversion. These functions convert domain names between the
|
|
|
|
current multi-byte character set and the IDNA encoding. On
|
|
|
|
success, the result string is written to *RESULT (which the caller
|
|
|
|
has to free), and zero is returned. On error, an EAI_* error code
|
|
|
|
is returned (see <netdb.h>), and *RESULT is not changed. */
|
|
|
|
int __idna_to_dns_encoding (const char *name, char **result);
|
|
|
|
libc_hidden_proto (__idna_to_dns_encoding)
|
|
|
|
int __idna_from_dns_encoding (const char *name, char **result);
|
|
|
|
libc_hidden_proto (__idna_from_dns_encoding)
|
|
|
|
|
|
|
|
|
|
|
|
/* Return value of __idna_name_classify below. */
|
|
|
|
enum idna_name_classification
|
|
|
|
{
|
|
|
|
idna_name_ascii, /* No non-ASCII characters. */
|
|
|
|
idna_name_nonascii, /* Non-ASCII characters, no backslash. */
|
|
|
|
idna_name_nonascii_backslash, /* Non-ASCII characters with backslash. */
|
|
|
|
idna_name_encoding_error, /* Decoding error. */
|
|
|
|
idna_name_memory_error, /* Memory allocation failure. */
|
|
|
|
idna_name_error, /* Other error during decoding. Check errno. */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Check the specified name for non-ASCII characters and backslashes
|
|
|
|
or encoding errors. */
|
|
|
|
enum idna_name_classification __idna_name_classify (const char *name)
|
|
|
|
attribute_hidden;
|
|
|
|
|
2017-02-28 14:28:45 +00:00
|
|
|
/* 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
|
|
|
|
{
|
2020-03-16 09:09:13 +00:00
|
|
|
struct __timespec64 current;
|
2017-02-28 14:28:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Return the current time. Terminates the process if the current
|
|
|
|
time is not available. */
|
2017-08-31 15:35:16 +00:00
|
|
|
struct deadline_current_time __deadline_current_time (void) attribute_hidden;
|
2017-02-28 14:28:45 +00:00
|
|
|
|
|
|
|
/* Computed absolute deadline. */
|
|
|
|
struct deadline
|
|
|
|
{
|
2020-03-16 09:09:13 +00:00
|
|
|
struct __timespec64 absolute;
|
2017-02-28 14:28:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/* For internal use only. */
|
|
|
|
static inline bool
|
|
|
|
__deadline_is_infinite (struct deadline deadline)
|
|
|
|
{
|
|
|
|
return deadline.absolute.tv_nsec < 0;
|
|
|
|
}
|
|
|
|
|
2019-09-24 20:55:36 +00:00
|
|
|
/* GCC 8.3 and 9.2 both incorrectly report total_deadline
|
|
|
|
* (from sunrpc/clnt_udp.c) as maybe-uninitialized when tv_sec is 8 bytes
|
|
|
|
* (64-bits) wide on 32-bit systems. We have to set -Wmaybe-uninitialized
|
|
|
|
* here as it won't fix the error in sunrpc/clnt_udp.c.
|
|
|
|
* A GCC bug has been filed here:
|
|
|
|
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91691
|
|
|
|
*/
|
|
|
|
DIAG_PUSH_NEEDS_COMMENT;
|
|
|
|
DIAG_IGNORE_NEEDS_COMMENT (9, "-Wmaybe-uninitialized");
|
|
|
|
|
2017-02-28 14:28:45 +00:00
|
|
|
/* 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;
|
|
|
|
}
|
|
|
|
|
2019-09-24 20:55:36 +00:00
|
|
|
DIAG_POP_NEEDS_COMMENT;
|
|
|
|
|
2017-02-28 14:28:45 +00:00
|
|
|
/* 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,
|
2017-08-31 15:35:16 +00:00
|
|
|
struct timeval tv) attribute_hidden;
|
2017-02-28 14:28:45 +00:00
|
|
|
|
|
|
|
/* 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)
|
2017-08-31 15:35:16 +00:00
|
|
|
attribute_hidden;
|
2017-02-28 14:28:45 +00:00
|
|
|
|
|
|
|
/* 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;
|
|
|
|
}
|
|
|
|
|
2016-09-15 13:46:30 +00:00
|
|
|
#endif /* _NET_INTERNAL_H */
|