]> git.ipfire.org Git - thirdparty/glibc.git/blame - inet/net-internal.h
sem_close: Use __twalk_r
[thirdparty/glibc.git] / inet / net-internal.h
CommitLineData
80d8cb91 1/* Network-related functions for internal library use.
04277e02 2 Copyright (C) 2016-2019 Free Software Foundation, Inc.
80d8cb91
FW
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
18
19#ifndef _NET_INTERNAL_H
20#define _NET_INTERNAL_H 1
21
22#include <arpa/inet.h>
cf0bd2f7 23#include <stdbool.h>
80d8cb91 24#include <stdint.h>
cf0bd2f7 25#include <sys/time.h>
80d8cb91
FW
26
27int __inet6_scopeid_pton (const struct in6_addr *address,
f87cc2bf 28 const char *scope, uint32_t *result);
80d8cb91
FW
29libc_hidden_proto (__inet6_scopeid_pton)
30
cf0bd2f7 31
7f9f1ecb
FW
32/* IDNA conversion. These functions convert domain names between the
33 current multi-byte character set and the IDNA encoding. On
34 success, the result string is written to *RESULT (which the caller
35 has to free), and zero is returned. On error, an EAI_* error code
36 is returned (see <netdb.h>), and *RESULT is not changed. */
37int __idna_to_dns_encoding (const char *name, char **result);
38libc_hidden_proto (__idna_to_dns_encoding)
39int __idna_from_dns_encoding (const char *name, char **result);
40libc_hidden_proto (__idna_from_dns_encoding)
41
42
43/* Return value of __idna_name_classify below. */
44enum idna_name_classification
45{
46 idna_name_ascii, /* No non-ASCII characters. */
47 idna_name_nonascii, /* Non-ASCII characters, no backslash. */
48 idna_name_nonascii_backslash, /* Non-ASCII characters with backslash. */
49 idna_name_encoding_error, /* Decoding error. */
50 idna_name_memory_error, /* Memory allocation failure. */
51 idna_name_error, /* Other error during decoding. Check errno. */
52};
53
54/* Check the specified name for non-ASCII characters and backslashes
55 or encoding errors. */
56enum idna_name_classification __idna_name_classify (const char *name)
57 attribute_hidden;
58
cf0bd2f7
FW
59/* Deadline handling for enforcing timeouts.
60
61 Code should call __deadline_current_time to obtain the current time
62 and cache it locally. The cache needs updating after every
63 long-running or potentially blocking operation. Deadlines relative
64 to the current time can be computed using __deadline_from_timeval.
65 The deadlines may have to be recomputed in response to certain
66 events (such as an incoming packet), but they are absolute (not
67 relative to the current time). A timeout suitable for use with the
68 poll function can be computed from such a deadline using
69 __deadline_to_ms.
70
71 The fields in the structs defined belowed should only be used
72 within the implementation. */
73
74/* Cache of the current time. Used to compute deadlines from relative
75 timeouts and vice versa. */
76struct deadline_current_time
77{
78 struct timespec current;
79};
80
81/* Return the current time. Terminates the process if the current
82 time is not available. */
9da93bd7 83struct deadline_current_time __deadline_current_time (void) attribute_hidden;
cf0bd2f7
FW
84
85/* Computed absolute deadline. */
86struct deadline
87{
88 struct timespec absolute;
89};
90
91
92/* For internal use only. */
93static inline bool
94__deadline_is_infinite (struct deadline deadline)
95{
96 return deadline.absolute.tv_nsec < 0;
97}
98
99/* Return true if the current time is at the deadline or past it. */
100static inline bool
101__deadline_elapsed (struct deadline_current_time current,
102 struct deadline deadline)
103{
104 return !__deadline_is_infinite (deadline)
105 && (current.current.tv_sec > deadline.absolute.tv_sec
106 || (current.current.tv_sec == deadline.absolute.tv_sec
107 && current.current.tv_nsec >= deadline.absolute.tv_nsec));
108}
109
110/* Return the deadline which occurs first. */
111static inline struct deadline
112__deadline_first (struct deadline left, struct deadline right)
113{
114 if (__deadline_is_infinite (right)
115 || left.absolute.tv_sec < right.absolute.tv_sec
116 || (left.absolute.tv_sec == right.absolute.tv_sec
117 && left.absolute.tv_nsec < right.absolute.tv_nsec))
118 return left;
119 else
120 return right;
121}
122
123/* Add TV to the current time and return it. Returns a special
124 infinite absolute deadline on overflow. */
125struct deadline __deadline_from_timeval (struct deadline_current_time,
9da93bd7 126 struct timeval tv) attribute_hidden;
cf0bd2f7
FW
127
128/* Compute the number of milliseconds until the specified deadline,
129 from the current time in the argument. The result is mainly for
130 use with poll. If the deadline has already passed, return 0. If
131 the result would overflow an int, return INT_MAX. */
132int __deadline_to_ms (struct deadline_current_time, struct deadline)
9da93bd7 133 attribute_hidden;
cf0bd2f7
FW
134
135/* Return true if TV.tv_sec is non-negative and TV.tv_usec is in the
136 interval [0, 999999]. */
137static inline bool
138__is_timeval_valid_timeout (struct timeval tv)
139{
140 return tv.tv_sec >= 0 && tv.tv_usec >= 0 && tv.tv_usec < 1000 * 1000;
141}
142
80d8cb91 143#endif /* _NET_INTERNAL_H */