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