85 lines
2.5 KiB
C
85 lines
2.5 KiB
C
/*******************************************************************************
|
|
* Copyright (c) 2009, 2020 IBM Corp.
|
|
*
|
|
* All rights reserved. This program and the accompanying materials
|
|
* are made available under the terms of the Eclipse Public License v2.0
|
|
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
|
*
|
|
* The Eclipse Public License is available at
|
|
* https://www.eclipse.org/legal/epl-2.0/
|
|
* and the Eclipse Distribution License is available at
|
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
|
*
|
|
* Contributors:
|
|
* Ian Craggs - initial API and implementation and/or initial documentation
|
|
* Ian Craggs, Allan Stockdill-Mander - SSL updates
|
|
*******************************************************************************/
|
|
|
|
#if !defined(SOCKETBUFFER_H)
|
|
#define SOCKETBUFFER_H
|
|
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
#include <winsock2.h>
|
|
#else
|
|
#include <sys/socket.h>
|
|
#endif
|
|
|
|
#if defined(OPENSSL)
|
|
#include <openssl/ssl.h>
|
|
#endif
|
|
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
typedef WSABUF iobuf;
|
|
#else
|
|
typedef struct iovec iobuf;
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
int socket;
|
|
unsigned int index;
|
|
size_t headerlen;
|
|
char fixed_header[5]; /**< header plus up to 4 length bytes */
|
|
size_t buflen, /**< total length of the buffer */
|
|
datalen; /**< current length of data in buf */
|
|
char* buf;
|
|
} socket_queue;
|
|
|
|
typedef struct
|
|
{
|
|
int socket, count;
|
|
size_t total;
|
|
#if defined(OPENSSL)
|
|
SSL* ssl;
|
|
#endif
|
|
size_t bytes;
|
|
iobuf iovecs[5];
|
|
int frees[5];
|
|
} pending_writes;
|
|
|
|
#define SOCKETBUFFER_COMPLETE 0
|
|
#if !defined(SOCKET_ERROR)
|
|
#define SOCKET_ERROR -1
|
|
#endif
|
|
#define SOCKETBUFFER_INTERRUPTED -22 /* must be the same value as TCPSOCKET_INTERRUPTED */
|
|
|
|
int SocketBuffer_initialize(void);
|
|
void SocketBuffer_terminate(void);
|
|
void SocketBuffer_cleanup(int socket);
|
|
char* SocketBuffer_getQueuedData(int socket, size_t bytes, size_t* actual_len);
|
|
int SocketBuffer_getQueuedChar(int socket, char* c);
|
|
void SocketBuffer_interrupted(int socket, size_t actual_len);
|
|
char* SocketBuffer_complete(int socket);
|
|
void SocketBuffer_queueChar(int socket, char c);
|
|
|
|
#if defined(OPENSSL)
|
|
int SocketBuffer_pendingWrite(int socket, SSL* ssl, int count, iobuf* iovecs, int* frees, size_t total, size_t bytes);
|
|
#else
|
|
int SocketBuffer_pendingWrite(int socket, int count, iobuf* iovecs, int* frees, size_t total, size_t bytes);
|
|
#endif
|
|
pending_writes* SocketBuffer_getWrite(int socket);
|
|
int SocketBuffer_writeComplete(int socket);
|
|
pending_writes* SocketBuffer_updateWrite(int socket, char* topic, char* payload);
|
|
|
|
#endif
|