#ifndef COMMON_H
#define COMMON_H
#ifdef _WIN32
#define sleep(s) Sleep(1000 * (s))
#define read(s, buf, n) recv(s, buf, n, 0)
#define close(s) closesocket(s)
#define bzero(buf, n) memset(buf, '\0', n)
#undef EAGAIN
#define EAGAIN WSAEWOULDBLOCK
#undef EWOULDBLOCK
#define EWOULDBLOCK WSAEWOULDBLOCK
#undef errno
#define errno WSAGetLastError()
#define perror(str) fprintf(stderr, str ": %d.\n", WSAGetLastError())
const char * ws_strerror(int err);
#define strerror(e) ws_strerror(e)
#ifndef STDOUT_FILENO
#define STDOUT_FILENO 1
#endif
#endif
enum crustls_demo_result
{
CRUSTLS_DEMO_OK,
CRUSTLS_DEMO_ERROR,
CRUSTLS_DEMO_AGAIN,
CRUSTLS_DEMO_EOF,
};
struct bytevec {
char *data;
size_t len;
size_t capacity;
};
struct conndata {
int fd;
const char *verify_arg;
const char *program_name;
struct bytevec data;
struct rustls_connection *rconn;
};
void
print_error(const char *program_name, const char *prefix, rustls_result result);
int
write_all(int fd, const char *buf, int n);
enum crustls_demo_result
nonblock(int sockfd);
int
read_cb(void *userdata, uint8_t *buf, uintptr_t len, uintptr_t *out_n);
rustls_io_result
write_tls(struct rustls_connection *rconn, struct conndata *conn, size_t *n);
int
write_cb(void *userdata, const uint8_t *buf, uintptr_t len, uintptr_t *out_n);
#ifndef _WIN32
rustls_io_result write_vectored_cb(
void *userdata, const struct rustls_iovec *iov, size_t count, size_t *out_n);
#endif
size_t
bytevec_available(struct bytevec *vec);
char *
bytevec_writeable(struct bytevec *vec);
void
bytevec_consume(struct bytevec *vec, size_t n);
enum crustls_demo_result
bytevec_ensure_available(struct bytevec *vec, size_t n);
int
copy_plaintext_to_buffer(struct conndata *conn);
void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
char *
body_beginning(struct bytevec *vec);
const char *
get_first_header_value(const char *headers, size_t headers_len,
const char *name, size_t name_len, size_t *n);
void
log_cb(void *userdata, const struct rustls_log_params *params);
#endif