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