]> The Tcpdump Group git mirrors - libpcap/blobdiff - sockutils.c
Merge branch 'master' of https://github.com/rixed/libpcap into rixed-master
[libpcap] / sockutils.c
index 7ed7d2984a4a69df1af801c74a038d21bdd77216..25844c6cd53d9dee0998b2c34f53bd03e8ffbd3e 100644 (file)
@@ -640,7 +640,7 @@ int sock_initaddress(const char *host, const char *port,
  * '-2' if we got one of those errors.
  * For errors, an error message is returned in the 'errbuf' variable.
  */
-int sock_send(SOCKET sock, const char *buffer, size_t size,
+int sock_send(SOCKET sock, SSL *ssl, const char *buffer, size_t size,
     char *errbuf, int errbuflen)
 {
        int remaining;
@@ -659,6 +659,12 @@ int sock_send(SOCKET sock, const char *buffer, size_t size,
        remaining = (int)size;
 
        do {
+#ifdef HAVE_OPENSSL
+               if (ssl) return ssl_send(ssl, buffer, remaining, errbuf, errbuflen);
+#else
+               (void)ssl;
+#endif
+
 #ifdef MSG_NOSIGNAL
                /*
                 * Send with MSG_NOSIGNAL, so that we don't get SIGPIPE
@@ -835,7 +841,7 @@ int sock_bufferize(const char *buffer, int size, char *tempbuf, int *offset, int
  * The error message is returned in the 'errbuf' variable.
  */
 
-int sock_recv(SOCKET sock, void *buffer, size_t size, int flags,
+int sock_recv(SOCKET sock, SSL *ssl, void *buffer, size_t size, int flags,
     char *errbuf, int errbuflen)
 {
        int recv_flags = 0;
@@ -870,7 +876,20 @@ int sock_recv(SOCKET sock, void *buffer, size_t size, int flags,
         * Win32.
         */
        for (;;) {
+#ifdef HAVE_OPENSSL
+               if (ssl)
+               {
+                       /*
+                        * XXX - what about MSG_PEEK?
+                        */
+                       nread = ssl_recv(ssl, bufp, remaining, errbuf, errbuflen);
+                       if (nread == -2) return -1;
+               }
+               else
+                       nread = recv(sock, bufp, remaining, recv_flags);
+#else
                nread = recv(sock, bufp, remaining, recv_flags);
+#endif
 
                if (nread == -1)
                {
@@ -928,7 +947,7 @@ int sock_recv(SOCKET sock, void *buffer, size_t size, int flags,
  *
  * Returns the size of the datagram on success or -1 on error.
  */
-int sock_recv_dgram(SOCKET sock, void *buffer, size_t size,
+int sock_recv_dgram(SOCKET sock, SSL *ssl, void *buffer, size_t size,
     char *errbuf, int errbuflen)
 {
        ssize_t nread;
@@ -953,6 +972,13 @@ int sock_recv_dgram(SOCKET sock, void *buffer, size_t size,
                return -1;
        }
 
+       // TODO: DTLS
+       if (ssl)
+       {
+               pcap_snprintf(errbuf, errbuflen, "DTLS not implemented yet");
+               return -1;
+       }
+
        /*
         * This should be a datagram socket, so we should get the
         * entire datagram in one recv() or recvmsg() call, and
@@ -1063,7 +1089,7 @@ int sock_recv_dgram(SOCKET sock, void *buffer, size_t size,
  * \return '0' if everything is fine, '-1' if some errors occurred.
  * The error message is returned in the 'errbuf' variable.
  */
-int sock_discard(SOCKET sock, int size, char *errbuf, int errbuflen)
+int sock_discard(SOCKET sock, SSL *ssl, int size, char *errbuf, int errbuflen)
 {
 #define TEMP_BUF_SIZE 32768
 
@@ -1079,7 +1105,7 @@ int sock_discard(SOCKET sock, int size, char *errbuf, int errbuflen)
         */
        while (size > TEMP_BUF_SIZE)
        {
-               if (sock_recv(sock, buffer, TEMP_BUF_SIZE, SOCK_RECEIVEALL_YES, errbuf, errbuflen) == -1)
+               if (sock_recv(sock, ssl, buffer, TEMP_BUF_SIZE, SOCK_RECEIVEALL_YES, errbuf, errbuflen) == -1)
                        return -1;
 
                size -= TEMP_BUF_SIZE;
@@ -1091,7 +1117,7 @@ int sock_discard(SOCKET sock, int size, char *errbuf, int errbuflen)
         */
        if (size)
        {
-               if (sock_recv(sock, buffer, size, SOCK_RECEIVEALL_YES, errbuf, errbuflen) == -1)
+               if (sock_recv(sock, ssl, buffer, size, SOCK_RECEIVEALL_YES, errbuf, errbuflen) == -1)
                        return -1;
        }