Blame inet/net-internal.h

Packit Service 82fcde
/* Network-related functions for internal library use.
Packit Service 82fcde
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _NET_INTERNAL_H
Packit Service 82fcde
#define _NET_INTERNAL_H 1
Packit Service 82fcde
Packit Service 82fcde
#include <arpa/inet.h>
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include <sys/time.h>
Packit Service 82fcde
Packit Service 82fcde
int __inet6_scopeid_pton (const struct in6_addr *address,
Packit Service 82fcde
                          const char *scope, uint32_t *result);
Packit Service 82fcde
libc_hidden_proto (__inet6_scopeid_pton)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* IDNA conversion.  These functions convert domain names between the
Packit Service 82fcde
   current multi-byte character set and the IDNA encoding.  On
Packit Service 82fcde
   success, the result string is written to *RESULT (which the caller
Packit Service 82fcde
   has to free), and zero is returned.  On error, an EAI_* error code
Packit Service 82fcde
   is returned (see <netdb.h>), and *RESULT is not changed.  */
Packit Service 82fcde
int __idna_to_dns_encoding (const char *name, char **result);
Packit Service 82fcde
libc_hidden_proto (__idna_to_dns_encoding)
Packit Service 82fcde
int __idna_from_dns_encoding (const char *name, char **result);
Packit Service 82fcde
libc_hidden_proto (__idna_from_dns_encoding)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Return value of __idna_name_classify below.  */
Packit Service 82fcde
enum idna_name_classification
Packit Service 82fcde
{
Packit Service 82fcde
  idna_name_ascii,          /* No non-ASCII characters.  */
Packit Service 82fcde
  idna_name_nonascii,       /* Non-ASCII characters, no backslash.  */
Packit Service 82fcde
  idna_name_nonascii_backslash, /* Non-ASCII characters with backslash.  */
Packit Service 82fcde
  idna_name_encoding_error, /* Decoding error.  */
Packit Service 82fcde
  idna_name_memory_error,   /* Memory allocation failure.  */
Packit Service 82fcde
  idna_name_error,          /* Other error during decoding.  Check errno.  */
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* Check the specified name for non-ASCII characters and backslashes
Packit Service 82fcde
   or encoding errors.  */
Packit Service 82fcde
enum idna_name_classification __idna_name_classify (const char *name)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Deadline handling for enforcing timeouts.
Packit Service 82fcde
Packit Service 82fcde
   Code should call __deadline_current_time to obtain the current time
Packit Service 82fcde
   and cache it locally.  The cache needs updating after every
Packit Service 82fcde
   long-running or potentially blocking operation.  Deadlines relative
Packit Service 82fcde
   to the current time can be computed using __deadline_from_timeval.
Packit Service 82fcde
   The deadlines may have to be recomputed in response to certain
Packit Service 82fcde
   events (such as an incoming packet), but they are absolute (not
Packit Service 82fcde
   relative to the current time).  A timeout suitable for use with the
Packit Service 82fcde
   poll function can be computed from such a deadline using
Packit Service 82fcde
   __deadline_to_ms.
Packit Service 82fcde
Packit Service 82fcde
   The fields in the structs defined belowed should only be used
Packit Service 82fcde
   within the implementation.  */
Packit Service 82fcde
Packit Service 82fcde
/* Cache of the current time.  Used to compute deadlines from relative
Packit Service 82fcde
   timeouts and vice versa.  */
Packit Service 82fcde
struct deadline_current_time
Packit Service 82fcde
{
Packit Service 82fcde
  struct timespec current;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* Return the current time.  Terminates the process if the current
Packit Service 82fcde
   time is not available.  */
Packit Service 82fcde
struct deadline_current_time __deadline_current_time (void) attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Computed absolute deadline.  */
Packit Service 82fcde
struct deadline
Packit Service 82fcde
{
Packit Service 82fcde
  struct timespec absolute;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* For internal use only.  */
Packit Service 82fcde
static inline bool
Packit Service 82fcde
__deadline_is_infinite (struct deadline deadline)
Packit Service 82fcde
{
Packit Service 82fcde
  return deadline.absolute.tv_nsec < 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Return true if the current time is at the deadline or past it.  */
Packit Service 82fcde
static inline bool
Packit Service 82fcde
__deadline_elapsed (struct deadline_current_time current,
Packit Service 82fcde
                    struct deadline deadline)
Packit Service 82fcde
{
Packit Service 82fcde
  return !__deadline_is_infinite (deadline)
Packit Service 82fcde
    && (current.current.tv_sec > deadline.absolute.tv_sec
Packit Service 82fcde
        || (current.current.tv_sec == deadline.absolute.tv_sec
Packit Service 82fcde
            && current.current.tv_nsec >= deadline.absolute.tv_nsec));
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Return the deadline which occurs first.  */
Packit Service 82fcde
static inline struct deadline
Packit Service 82fcde
__deadline_first (struct deadline left, struct deadline right)
Packit Service 82fcde
{
Packit Service 82fcde
  if (__deadline_is_infinite (right)
Packit Service 82fcde
      || left.absolute.tv_sec < right.absolute.tv_sec
Packit Service 82fcde
      || (left.absolute.tv_sec == right.absolute.tv_sec
Packit Service 82fcde
          && left.absolute.tv_nsec < right.absolute.tv_nsec))
Packit Service 82fcde
    return left;
Packit Service 82fcde
  else
Packit Service 82fcde
    return right;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Add TV to the current time and return it.  Returns a special
Packit Service 82fcde
   infinite absolute deadline on overflow.  */
Packit Service 82fcde
struct deadline __deadline_from_timeval (struct deadline_current_time,
Packit Service 82fcde
                                         struct timeval tv) attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Compute the number of milliseconds until the specified deadline,
Packit Service 82fcde
   from the current time in the argument.  The result is mainly for
Packit Service 82fcde
   use with poll.  If the deadline has already passed, return 0.  If
Packit Service 82fcde
   the result would overflow an int, return INT_MAX.  */
Packit Service 82fcde
int __deadline_to_ms (struct deadline_current_time, struct deadline)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Return true if TV.tv_sec is non-negative and TV.tv_usec is in the
Packit Service 82fcde
   interval [0, 999999].  */
Packit Service 82fcde
static inline bool
Packit Service 82fcde
__is_timeval_valid_timeout (struct timeval tv)
Packit Service 82fcde
{
Packit Service 82fcde
  return tv.tv_sec >= 0 && tv.tv_usec >= 0 && tv.tv_usec < 1000 * 1000;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#endif /* _NET_INTERNAL_H */