hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
/* System-specific socket constants and types.  Linux version.
   Copyright (C) 1991-2021 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
   <https://www.gnu.org/licenses/>.  */
 
#ifndef __BITS_SOCKET_H
#define __BITS_SOCKET_H
 
#ifndef _SYS_SOCKET_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif
 
#define __need_size_t
#include <stddef.h>
 
#include <sys/types.h>
 
/* Type for length arguments in socket calls.  */
#ifndef __socklen_t_defined
typedef __socklen_t socklen_t;
# define __socklen_t_defined
#endif
 
/* Get the architecture-dependent definition of enum __socket_type.  */
#include <bits/socket_type.h>
 
/* Protocol families.  */
#define PF_UNSPEC    0    /* Unspecified.  */
#define PF_LOCAL    1    /* Local to host (pipes and file-domain).  */
#define PF_UNIX        PF_LOCAL /* POSIX name for PF_LOCAL.  */
#define PF_FILE        PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
#define PF_INET        2    /* IP protocol family.  */
#define PF_AX25        3    /* Amateur Radio AX.25.  */
#define PF_IPX        4    /* Novell Internet Protocol.  */
#define PF_APPLETALK    5    /* Appletalk DDP.  */
#define PF_NETROM    6    /* Amateur radio NetROM.  */
#define PF_BRIDGE    7    /* Multiprotocol bridge.  */
#define PF_ATMPVC    8    /* ATM PVCs.  */
#define PF_X25        9    /* Reserved for X.25 project.  */
#define PF_INET6    10    /* IP version 6.  */
#define PF_ROSE        11    /* Amateur Radio X.25 PLP.  */
#define PF_DECnet    12    /* Reserved for DECnet project.  */
#define PF_NETBEUI    13    /* Reserved for 802.2LLC project.  */
#define PF_SECURITY    14    /* Security callback pseudo AF.  */
#define PF_KEY        15    /* PF_KEY key management API.  */
#define PF_NETLINK    16
#define PF_ROUTE    PF_NETLINK /* Alias to emulate 4.4BSD.  */
#define PF_PACKET    17    /* Packet family.  */
#define PF_ASH        18    /* Ash.  */
#define PF_ECONET    19    /* Acorn Econet.  */
#define PF_ATMSVC    20    /* ATM SVCs.  */
#define PF_RDS        21    /* RDS sockets.  */
#define PF_SNA        22    /* Linux SNA Project */
#define PF_IRDA        23    /* IRDA sockets.  */
#define PF_PPPOX    24    /* PPPoX sockets.  */
#define PF_WANPIPE    25    /* Wanpipe API sockets.  */
#define PF_LLC        26    /* Linux LLC.  */
#define PF_IB        27    /* Native InfiniBand address.  */
#define PF_MPLS        28    /* MPLS.  */
#define PF_CAN        29    /* Controller Area Network.  */
#define PF_TIPC        30    /* TIPC sockets.  */
#define PF_BLUETOOTH    31    /* Bluetooth sockets.  */
#define PF_IUCV        32    /* IUCV sockets.  */
#define PF_RXRPC    33    /* RxRPC sockets.  */
#define PF_ISDN        34    /* mISDN sockets.  */
#define PF_PHONET    35    /* Phonet sockets.  */
#define PF_IEEE802154    36    /* IEEE 802.15.4 sockets.  */
#define PF_CAIF        37    /* CAIF sockets.  */
#define PF_ALG        38    /* Algorithm sockets.  */
#define PF_NFC        39    /* NFC sockets.  */
#define PF_VSOCK    40    /* vSockets.  */
#define PF_KCM        41    /* Kernel Connection Multiplexor.  */
#define PF_QIPCRTR    42    /* Qualcomm IPC Router.  */
#define PF_SMC        43    /* SMC sockets.  */
#define PF_XDP        44    /* XDP sockets.  */
#define PF_MAX        45    /* For now..  */
 
/* Address families.  */
#define AF_UNSPEC    PF_UNSPEC
#define AF_LOCAL    PF_LOCAL
#define AF_UNIX        PF_UNIX
#define AF_FILE        PF_FILE
#define AF_INET        PF_INET
#define AF_AX25        PF_AX25
#define AF_IPX        PF_IPX
#define AF_APPLETALK    PF_APPLETALK
#define AF_NETROM    PF_NETROM
#define AF_BRIDGE    PF_BRIDGE
#define AF_ATMPVC    PF_ATMPVC
#define AF_X25        PF_X25
#define AF_INET6    PF_INET6
#define AF_ROSE        PF_ROSE
#define AF_DECnet    PF_DECnet
#define AF_NETBEUI    PF_NETBEUI
#define AF_SECURITY    PF_SECURITY
#define AF_KEY        PF_KEY
#define AF_NETLINK    PF_NETLINK
#define AF_ROUTE    PF_ROUTE
#define AF_PACKET    PF_PACKET
#define AF_ASH        PF_ASH
#define AF_ECONET    PF_ECONET
#define AF_ATMSVC    PF_ATMSVC
#define AF_RDS        PF_RDS
#define AF_SNA        PF_SNA
#define AF_IRDA        PF_IRDA
#define AF_PPPOX    PF_PPPOX
#define AF_WANPIPE    PF_WANPIPE
#define AF_LLC        PF_LLC
#define AF_IB        PF_IB
#define AF_MPLS        PF_MPLS
#define AF_CAN        PF_CAN
#define AF_TIPC        PF_TIPC
#define AF_BLUETOOTH    PF_BLUETOOTH
#define AF_IUCV        PF_IUCV
#define AF_RXRPC    PF_RXRPC
#define AF_ISDN        PF_ISDN
#define AF_PHONET    PF_PHONET
#define AF_IEEE802154    PF_IEEE802154
#define AF_CAIF        PF_CAIF
#define AF_ALG        PF_ALG
#define AF_NFC        PF_NFC
#define AF_VSOCK    PF_VSOCK
#define AF_KCM        PF_KCM
#define AF_QIPCRTR    PF_QIPCRTR
#define AF_SMC        PF_SMC
#define AF_XDP        PF_XDP
#define AF_MAX        PF_MAX
 
/* Socket level values.  Others are defined in the appropriate headers.
 
   XXX These definitions also should go into the appropriate headers as
   far as they are available.  */
#define SOL_RAW        255
#define SOL_DECNET      261
#define SOL_X25         262
#define SOL_PACKET    263
#define SOL_ATM        264    /* ATM layer (cell level).  */
#define SOL_AAL        265    /* ATM Adaption Layer (packet level).  */
#define SOL_IRDA    266
#define SOL_NETBEUI    267
#define SOL_LLC        268
#define SOL_DCCP    269
#define SOL_NETLINK    270
#define SOL_TIPC    271
#define SOL_RXRPC    272
#define SOL_PPPOL2TP    273
#define SOL_BLUETOOTH    274
#define SOL_PNPIPE    275
#define SOL_RDS        276
#define SOL_IUCV    277
#define SOL_CAIF    278
#define SOL_ALG        279
#define SOL_NFC        280
#define SOL_KCM        281
#define SOL_TLS        282
#define SOL_XDP        283
 
/* Maximum queue length specifiable by listen.  */
#define SOMAXCONN    4096
 
/* Get the definition of the macro to define the common sockaddr members.  */
#include <bits/sockaddr.h>
 
/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];        /* Address data.  */
  };
 
 
/* Structure large enough to hold any socket address (with the historical
   exception of AF_UNIX).  */
#define __ss_aligntype    unsigned long int
#define _SS_PADSIZE \
  (_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
 
struct sockaddr_storage
  {
    __SOCKADDR_COMMON (ss_);    /* Address family, etc.  */
    char __ss_padding[_SS_PADSIZE];
    __ss_aligntype __ss_align;    /* Force desired alignment.  */
  };
 
 
/* Bits in the FLAGS argument to `send', `recv', et al.  */
enum
  {
    MSG_OOB        = 0x01,    /* Process out-of-band data.  */
#define MSG_OOB        MSG_OOB
    MSG_PEEK        = 0x02,    /* Peek at incoming messages.  */
#define MSG_PEEK    MSG_PEEK
    MSG_DONTROUTE    = 0x04,    /* Don't use local routing.  */
#define MSG_DONTROUTE    MSG_DONTROUTE
#ifdef __USE_GNU
    /* DECnet uses a different name.  */
    MSG_TRYHARD        = MSG_DONTROUTE,
# define MSG_TRYHARD    MSG_DONTROUTE
#endif
    MSG_CTRUNC        = 0x08,    /* Control data lost before delivery.  */
#define MSG_CTRUNC    MSG_CTRUNC
    MSG_PROXY        = 0x10,    /* Supply or ask second address.  */
#define MSG_PROXY    MSG_PROXY
    MSG_TRUNC        = 0x20,
#define MSG_TRUNC    MSG_TRUNC
    MSG_DONTWAIT    = 0x40, /* Nonblocking IO.  */
#define MSG_DONTWAIT    MSG_DONTWAIT
    MSG_EOR        = 0x80, /* End of record.  */
#define MSG_EOR        MSG_EOR
    MSG_WAITALL        = 0x100, /* Wait for a full request.  */
#define MSG_WAITALL    MSG_WAITALL
    MSG_FIN        = 0x200,
#define MSG_FIN        MSG_FIN
    MSG_SYN        = 0x400,
#define MSG_SYN        MSG_SYN
    MSG_CONFIRM        = 0x800, /* Confirm path validity.  */
#define MSG_CONFIRM    MSG_CONFIRM
    MSG_RST        = 0x1000,
#define MSG_RST        MSG_RST
    MSG_ERRQUEUE    = 0x2000, /* Fetch message from error queue.  */
#define MSG_ERRQUEUE    MSG_ERRQUEUE
    MSG_NOSIGNAL    = 0x4000, /* Do not generate SIGPIPE.  */
#define MSG_NOSIGNAL    MSG_NOSIGNAL
    MSG_MORE        = 0x8000,  /* Sender will send more.  */
#define MSG_MORE    MSG_MORE
    MSG_WAITFORONE    = 0x10000, /* Wait for at least one packet to return.*/
#define MSG_WAITFORONE    MSG_WAITFORONE
    MSG_BATCH        = 0x40000, /* sendmmsg: more messages coming.  */
#define MSG_BATCH    MSG_BATCH
    MSG_ZEROCOPY    = 0x4000000, /* Use user data in kernel path.  */
#define MSG_ZEROCOPY    MSG_ZEROCOPY
    MSG_FASTOPEN    = 0x20000000, /* Send data in TCP SYN.  */
#define MSG_FASTOPEN    MSG_FASTOPEN
 
    MSG_CMSG_CLOEXEC    = 0x40000000    /* Set close_on_exit for file
                      descriptor received through
                      SCM_RIGHTS.  */
#define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
  };
 
 
/* Structure describing messages sent by
   `sendmsg' and received by `recvmsg'.  */
struct msghdr
  {
    void *msg_name;        /* Address to send to/receive from.  */
    socklen_t msg_namelen;    /* Length of address data.  */
 
    struct iovec *msg_iov;    /* Vector of data to send/receive into.  */
    size_t msg_iovlen;        /* Number of elements in the vector.  */
 
    void *msg_control;        /* Ancillary data (eg BSD filedesc passing). */
    size_t msg_controllen;    /* Ancillary data buffer length.
                  !! The type should be socklen_t but the
                  definition of the kernel is incompatible
                  with this.  */
 
    int msg_flags;        /* Flags on received message.  */
  };
 
/* Structure used for storage of ancillary data object information.  */
struct cmsghdr
  {
    size_t cmsg_len;        /* Length of data in cmsg_data plus length
                  of cmsghdr structure.
                  !! The type should be socklen_t but the
                  definition of the kernel is incompatible
                  with this.  */
    int cmsg_level;        /* Originating protocol.  */
    int cmsg_type;        /* Protocol specific type.  */
#if __glibc_c99_flexarr_available
    __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
#endif
  };
 
/* Ancillary data object manipulation macros.  */
#if __glibc_c99_flexarr_available
# define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
#else
# define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1))
#endif
#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
#define CMSG_FIRSTHDR(mhdr) \
  ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr)              \
   ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) 0)
#define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \
            & (size_t) ~(sizeof (size_t) - 1))
#define CMSG_SPACE(len) (CMSG_ALIGN (len) \
            + CMSG_ALIGN (sizeof (struct cmsghdr)))
#define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
 
extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
                     struct cmsghdr *__cmsg) __THROW;
#ifdef __USE_EXTERN_INLINES
# ifndef _EXTERN_INLINE
#  define _EXTERN_INLINE __extern_inline
# endif
_EXTERN_INLINE struct cmsghdr *
__NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg))
{
  if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
    /* The kernel header does this so there may be a reason.  */
    return (struct cmsghdr *) 0;
 
  __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
                  + CMSG_ALIGN (__cmsg->cmsg_len));
  if ((unsigned char *) (__cmsg + 1) > ((unsigned char *) __mhdr->msg_control
                   + __mhdr->msg_controllen)
      || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len)
     > ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)))
    /* No more entries.  */
    return (struct cmsghdr *) 0;
  return __cmsg;
}
#endif    /* Use `extern inline'.  */
 
/* Socket level message types.  This must match the definitions in
   <linux/socket.h>.  */
enum
  {
    SCM_RIGHTS = 0x01        /* Transfer file descriptors.  */
#define SCM_RIGHTS SCM_RIGHTS
#ifdef __USE_GNU
    , SCM_CREDENTIALS = 0x02    /* Credentials passing.  */
# define SCM_CREDENTIALS SCM_CREDENTIALS
#endif
  };
 
#ifdef __USE_GNU
/* User visible structure for SCM_CREDENTIALS message */
struct ucred
{
  pid_t pid;            /* PID of sending process.  */
  uid_t uid;            /* UID of sending process.  */
  gid_t gid;            /* GID of sending process.  */
};
#endif
 
#ifdef __USE_MISC
# include <bits/types/time_t.h>
# include <asm/socket.h>
#else
# define SO_DEBUG 1
# include <bits/socket-constants.h>
#endif
 
/* Structure used to manipulate the SO_LINGER option.  */
struct linger
  {
    int l_onoff;        /* Nonzero to linger on close.  */
    int l_linger;        /* Time to linger.  */
  };
 
#endif    /* bits/socket.h */