xref: /aosp_15_r20/external/libpcap/sockutils.h (revision 8b26181f966a6af5cf6981a6f474313de533bb28)
1*8b26181fSAndroid Build Coastguard Worker /*
2*8b26181fSAndroid Build Coastguard Worker  * Copyright (c) 2002 - 2003
3*8b26181fSAndroid Build Coastguard Worker  * NetGroup, Politecnico di Torino (Italy)
4*8b26181fSAndroid Build Coastguard Worker  * All rights reserved.
5*8b26181fSAndroid Build Coastguard Worker  *
6*8b26181fSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
7*8b26181fSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
8*8b26181fSAndroid Build Coastguard Worker  * are met:
9*8b26181fSAndroid Build Coastguard Worker  *
10*8b26181fSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
11*8b26181fSAndroid Build Coastguard Worker  * notice, this list of conditions and the following disclaimer.
12*8b26181fSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
13*8b26181fSAndroid Build Coastguard Worker  * notice, this list of conditions and the following disclaimer in the
14*8b26181fSAndroid Build Coastguard Worker  * documentation and/or other materials provided with the distribution.
15*8b26181fSAndroid Build Coastguard Worker  * 3. Neither the name of the Politecnico di Torino nor the names of its
16*8b26181fSAndroid Build Coastguard Worker  * contributors may be used to endorse or promote products derived from
17*8b26181fSAndroid Build Coastguard Worker  * this software without specific prior written permission.
18*8b26181fSAndroid Build Coastguard Worker  *
19*8b26181fSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*8b26181fSAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*8b26181fSAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*8b26181fSAndroid Build Coastguard Worker  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*8b26181fSAndroid Build Coastguard Worker  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*8b26181fSAndroid Build Coastguard Worker  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*8b26181fSAndroid Build Coastguard Worker  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*8b26181fSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*8b26181fSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*8b26181fSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*8b26181fSAndroid Build Coastguard Worker  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*8b26181fSAndroid Build Coastguard Worker  *
31*8b26181fSAndroid Build Coastguard Worker  */
32*8b26181fSAndroid Build Coastguard Worker 
33*8b26181fSAndroid Build Coastguard Worker #ifndef __SOCKUTILS_H__
34*8b26181fSAndroid Build Coastguard Worker #define __SOCKUTILS_H__
35*8b26181fSAndroid Build Coastguard Worker 
36*8b26181fSAndroid Build Coastguard Worker #ifdef _MSC_VER
37*8b26181fSAndroid Build Coastguard Worker #pragma once
38*8b26181fSAndroid Build Coastguard Worker #endif
39*8b26181fSAndroid Build Coastguard Worker 
40*8b26181fSAndroid Build Coastguard Worker #include <stdarg.h>	/* we declare varargs functions */
41*8b26181fSAndroid Build Coastguard Worker 
42*8b26181fSAndroid Build Coastguard Worker #include "pcap/funcattrs.h"
43*8b26181fSAndroid Build Coastguard Worker 
44*8b26181fSAndroid Build Coastguard Worker #include "pcap/socket.h"
45*8b26181fSAndroid Build Coastguard Worker 
46*8b26181fSAndroid Build Coastguard Worker #ifndef _WIN32
47*8b26181fSAndroid Build Coastguard Worker   /* UN*X */
48*8b26181fSAndroid Build Coastguard Worker   #include <unistd.h>	/* close() */
49*8b26181fSAndroid Build Coastguard Worker 
50*8b26181fSAndroid Build Coastguard Worker   /*!
51*8b26181fSAndroid Build Coastguard Worker    * \brief In Winsock, the close() call cannot be used on a socket;
52*8b26181fSAndroid Build Coastguard Worker    * closesocket() must be used.
53*8b26181fSAndroid Build Coastguard Worker    * We define closesocket() to be a wrapper around close() on UN*X,
54*8b26181fSAndroid Build Coastguard Worker    * so that it can be used on both platforms.
55*8b26181fSAndroid Build Coastguard Worker    */
56*8b26181fSAndroid Build Coastguard Worker   #define closesocket(a) close(a)
57*8b26181fSAndroid Build Coastguard Worker #endif
58*8b26181fSAndroid Build Coastguard Worker 
59*8b26181fSAndroid Build Coastguard Worker #include "sslutils.h"  // for SSL type, whatever that turns out to be
60*8b26181fSAndroid Build Coastguard Worker 
61*8b26181fSAndroid Build Coastguard Worker /*
62*8b26181fSAndroid Build Coastguard Worker  * MingW headers include this definition, but only for Windows XP and above.
63*8b26181fSAndroid Build Coastguard Worker  * MSDN states that this function is available for most versions on Windows.
64*8b26181fSAndroid Build Coastguard Worker  */
65*8b26181fSAndroid Build Coastguard Worker #if ((defined(__MINGW32__)) && (_WIN32_WINNT < 0x0501))
66*8b26181fSAndroid Build Coastguard Worker int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
67*8b26181fSAndroid Build Coastguard Worker 	char*,DWORD,int);
68*8b26181fSAndroid Build Coastguard Worker #endif
69*8b26181fSAndroid Build Coastguard Worker 
70*8b26181fSAndroid Build Coastguard Worker /*
71*8b26181fSAndroid Build Coastguard Worker  * \defgroup SockUtils Cross-platform socket utilities (IPv4-IPv6)
72*8b26181fSAndroid Build Coastguard Worker  */
73*8b26181fSAndroid Build Coastguard Worker 
74*8b26181fSAndroid Build Coastguard Worker /*
75*8b26181fSAndroid Build Coastguard Worker  * \addtogroup SockUtils
76*8b26181fSAndroid Build Coastguard Worker  * \{
77*8b26181fSAndroid Build Coastguard Worker  */
78*8b26181fSAndroid Build Coastguard Worker 
79*8b26181fSAndroid Build Coastguard Worker /*
80*8b26181fSAndroid Build Coastguard Worker  * \defgroup ExportedStruct Exported Structures and Definitions
81*8b26181fSAndroid Build Coastguard Worker  */
82*8b26181fSAndroid Build Coastguard Worker 
83*8b26181fSAndroid Build Coastguard Worker /*
84*8b26181fSAndroid Build Coastguard Worker  * \addtogroup ExportedStruct
85*8b26181fSAndroid Build Coastguard Worker  * \{
86*8b26181fSAndroid Build Coastguard Worker  */
87*8b26181fSAndroid Build Coastguard Worker 
88*8b26181fSAndroid Build Coastguard Worker /****************************************************
89*8b26181fSAndroid Build Coastguard Worker  *                                                  *
90*8b26181fSAndroid Build Coastguard Worker  * Exported functions / definitions                 *
91*8b26181fSAndroid Build Coastguard Worker  *                                                  *
92*8b26181fSAndroid Build Coastguard Worker  ****************************************************/
93*8b26181fSAndroid Build Coastguard Worker 
94*8b26181fSAndroid Build Coastguard Worker /* 'checkonly' flag, into the rpsock_bufferize() */
95*8b26181fSAndroid Build Coastguard Worker #define SOCKBUF_CHECKONLY 1
96*8b26181fSAndroid Build Coastguard Worker /* no 'checkonly' flag, into the rpsock_bufferize() */
97*8b26181fSAndroid Build Coastguard Worker #define SOCKBUF_BUFFERIZE 0
98*8b26181fSAndroid Build Coastguard Worker 
99*8b26181fSAndroid Build Coastguard Worker /* no 'server' flag; it opens a client socket */
100*8b26181fSAndroid Build Coastguard Worker #define SOCKOPEN_CLIENT 0
101*8b26181fSAndroid Build Coastguard Worker /* 'server' flag; it opens a server socket */
102*8b26181fSAndroid Build Coastguard Worker #define SOCKOPEN_SERVER 1
103*8b26181fSAndroid Build Coastguard Worker 
104*8b26181fSAndroid Build Coastguard Worker /*
105*8b26181fSAndroid Build Coastguard Worker  * Flags for sock_recv().
106*8b26181fSAndroid Build Coastguard Worker  */
107*8b26181fSAndroid Build Coastguard Worker #define SOCK_RECEIVEALL_NO	0x00000000	/* Don't wait to receive all data */
108*8b26181fSAndroid Build Coastguard Worker #define SOCK_RECEIVEALL_YES	0x00000001	/* Wait to receive all data */
109*8b26181fSAndroid Build Coastguard Worker 
110*8b26181fSAndroid Build Coastguard Worker #define SOCK_EOF_ISNT_ERROR	0x00000000	/* Return 0 on EOF */
111*8b26181fSAndroid Build Coastguard Worker #define SOCK_EOF_IS_ERROR	0x00000002	/* Return an error on EOF */
112*8b26181fSAndroid Build Coastguard Worker 
113*8b26181fSAndroid Build Coastguard Worker #define SOCK_MSG_PEEK		0x00000004	/* Return data but leave it in the socket queue */
114*8b26181fSAndroid Build Coastguard Worker 
115*8b26181fSAndroid Build Coastguard Worker /*
116*8b26181fSAndroid Build Coastguard Worker  * \}
117*8b26181fSAndroid Build Coastguard Worker  */
118*8b26181fSAndroid Build Coastguard Worker 
119*8b26181fSAndroid Build Coastguard Worker #ifdef __cplusplus
120*8b26181fSAndroid Build Coastguard Worker extern "C" {
121*8b26181fSAndroid Build Coastguard Worker #endif
122*8b26181fSAndroid Build Coastguard Worker 
123*8b26181fSAndroid Build Coastguard Worker /*
124*8b26181fSAndroid Build Coastguard Worker  * \defgroup ExportedFunc Exported Functions
125*8b26181fSAndroid Build Coastguard Worker  */
126*8b26181fSAndroid Build Coastguard Worker 
127*8b26181fSAndroid Build Coastguard Worker /*
128*8b26181fSAndroid Build Coastguard Worker  * \addtogroup ExportedFunc
129*8b26181fSAndroid Build Coastguard Worker  * \{
130*8b26181fSAndroid Build Coastguard Worker  */
131*8b26181fSAndroid Build Coastguard Worker 
132*8b26181fSAndroid Build Coastguard Worker int sock_init(char *errbuf, int errbuflen);
133*8b26181fSAndroid Build Coastguard Worker void sock_cleanup(void);
134*8b26181fSAndroid Build Coastguard Worker int sock_geterrcode(void);
135*8b26181fSAndroid Build Coastguard Worker void sock_vfmterrmsg(char *errbuf, size_t errbuflen, int errcode,
136*8b26181fSAndroid Build Coastguard Worker     PCAP_FORMAT_STRING(const char *fmt), va_list ap) PCAP_PRINTFLIKE(4, 0);
137*8b26181fSAndroid Build Coastguard Worker void sock_fmterrmsg(char *errbuf, size_t errbuflen, int errcode,
138*8b26181fSAndroid Build Coastguard Worker     PCAP_FORMAT_STRING(const char *fmt), ...) PCAP_PRINTFLIKE(4, 5);
139*8b26181fSAndroid Build Coastguard Worker void sock_geterrmsg(char *errbuf, size_t errbuflen,
140*8b26181fSAndroid Build Coastguard Worker     PCAP_FORMAT_STRING(const char *fmt), ...)  PCAP_PRINTFLIKE(3, 4);
141*8b26181fSAndroid Build Coastguard Worker int sock_initaddress(const char *address, const char *port,
142*8b26181fSAndroid Build Coastguard Worker     struct addrinfo *hints, struct addrinfo **addrinfo,
143*8b26181fSAndroid Build Coastguard Worker     char *errbuf, int errbuflen);
144*8b26181fSAndroid Build Coastguard Worker int sock_recv(SOCKET sock, SSL *, void *buffer, size_t size, int receiveall,
145*8b26181fSAndroid Build Coastguard Worker     char *errbuf, int errbuflen);
146*8b26181fSAndroid Build Coastguard Worker int sock_recv_dgram(SOCKET sock, SSL *, void *buffer, size_t size,
147*8b26181fSAndroid Build Coastguard Worker     char *errbuf, int errbuflen);
148*8b26181fSAndroid Build Coastguard Worker SOCKET sock_open(const char *host, struct addrinfo *addrinfo, int server, int nconn, char *errbuf, int errbuflen);
149*8b26181fSAndroid Build Coastguard Worker int sock_close(SOCKET sock, char *errbuf, int errbuflen);
150*8b26181fSAndroid Build Coastguard Worker 
151*8b26181fSAndroid Build Coastguard Worker int sock_send(SOCKET sock, SSL *, const char *buffer, size_t size,
152*8b26181fSAndroid Build Coastguard Worker     char *errbuf, int errbuflen);
153*8b26181fSAndroid Build Coastguard Worker int sock_bufferize(const void *data, int size, char *outbuf, int *offset, int totsize, int checkonly, char *errbuf, int errbuflen);
154*8b26181fSAndroid Build Coastguard Worker int sock_discard(SOCKET sock, SSL *, int size, char *errbuf, int errbuflen);
155*8b26181fSAndroid Build Coastguard Worker int	sock_check_hostlist(char *hostlist, const char *sep, struct sockaddr_storage *from, char *errbuf, int errbuflen);
156*8b26181fSAndroid Build Coastguard Worker int sock_cmpaddr(struct sockaddr_storage *first, struct sockaddr_storage *second);
157*8b26181fSAndroid Build Coastguard Worker 
158*8b26181fSAndroid Build Coastguard Worker int sock_getmyinfo(SOCKET sock, char *address, int addrlen, char *port, int portlen, int flags, char *errbuf, int errbuflen);
159*8b26181fSAndroid Build Coastguard Worker 
160*8b26181fSAndroid Build Coastguard Worker int sock_getascii_addrport(const struct sockaddr_storage *sockaddr, char *address, int addrlen, char *port, int portlen, int flags, char *errbuf, size_t errbuflen);
161*8b26181fSAndroid Build Coastguard Worker int sock_present2network(const char *address, struct sockaddr_storage *sockaddr, int addr_family, char *errbuf, int errbuflen);
162*8b26181fSAndroid Build Coastguard Worker 
163*8b26181fSAndroid Build Coastguard Worker #ifdef __cplusplus
164*8b26181fSAndroid Build Coastguard Worker }
165*8b26181fSAndroid Build Coastguard Worker #endif
166*8b26181fSAndroid Build Coastguard Worker 
167*8b26181fSAndroid Build Coastguard Worker /*
168*8b26181fSAndroid Build Coastguard Worker  * \}
169*8b26181fSAndroid Build Coastguard Worker  */
170*8b26181fSAndroid Build Coastguard Worker 
171*8b26181fSAndroid Build Coastguard Worker /*
172*8b26181fSAndroid Build Coastguard Worker  * \}
173*8b26181fSAndroid Build Coastguard Worker  */
174*8b26181fSAndroid Build Coastguard Worker 
175*8b26181fSAndroid Build Coastguard Worker #endif
176