36 uint16_t backpressure = 0;
56 }
else if (wrsz == 0) {
61 "suspicious: wrote %zd bytes to <fd:%d, seq_id%lld>",
70 size_t rem = msg_size - sent_size;
73 "wrote %zd, rem is %zd", wrsz, rem);
102 size_t rem = msg_size - sent_size;
105 "write %p to %d, %zd bytes",
106 (
void*)&msg[sent_size], fd, rem);
118 "write: socket error writing, %s", strerror(errno));
122 }
else if (wrsz > 0) {
144 "SSL_write: socket %d, write %zd => wrsz %zd",
149 }
else if (wrsz < 0) {
152 case SSL_ERROR_WANT_WRITE:
156 "SSL_write: socket %d: WANT_WRITE", fd);
159 case SSL_ERROR_WANT_READ:
161 "SSL_write: socket %d: WANT_READ", fd);
165 case SSL_ERROR_SYSCALL:
176 "SSL_write on fd %d: SSL_ERROR_SYSCALL -- %s",
177 fd, strerror(errno));
184 "SSL_write: socket %d: error SSL (wrsz %zd)",
189 unsigned long e = ERR_get_error();
190 if (e == 0) {
break; }
192 "SSL_write error: %s",
193 ERR_error_string(e, NULL));
199 "SSL_write on socket %d: match fail: error %d", box->
fd, reason);
209 "SSL_write: leaving loop, %zd bytes written", written);
219 "telling listener to EXPECT sent response, with box %p, seq_id %lld",
230 uint16_t backpressure = 0;
239 "enqueue_request_sent: failed delivery %d", retries);
int syscall_SSL_get_error(const SSL *ssl, int ret)
bool Util_IsResumableIOError(int errno_)
bus_msg_result_t result
Result message, constructed in place after the request/response cycle has completed or failed due to ...
SendHelper_HandleWrite_res
#define LISTENER_EXPECT_BACKPRESSURE_SHIFT
How many bits to >> the backpressure value from the listener when a send has completed.
void * udata
User data for callbacks.
#define SEND_NOTIFY_LISTENER_RETRY_DELAY
SSL * ssl
valid pointer or BUS_BOXED_MSG_NO_SSL
void Bus_BackpressureDelay(struct bus *b, size_t backpressure, uint8_t shift)
Provide backpressure by sleeping for (backpressure >> shift) msec, if the value is greater than 0...
#define BUS_LOG_SNPRINTF(B, LEVEL, EVENT_KEY, UDATA, MAX_SZ, FMT,...)
#define SEND_NOTIFY_LISTENER_RETRIES
static bool enqueue_EXPECT_message_to_listener(bus *b, boxed_msg *box)
static ssize_t write_plain(struct bus *b, boxed_msg *box)
struct timeval tv_send_done
#define BUS_NO_SSL
Special "NO SSL" value, to distinguish from a NULL SSL handle.
static ssize_t write_ssl(struct bus *b, boxed_msg *box, SSL *ssl)
SendHelper_HandleWrite_res SendHelper_HandleWrite(bus *b, boxed_msg *box)
void Send_HandleFailure(struct bus *b, boxed_msg *box, bus_send_status_t status)
int syscall_SSL_write(SSL *ssl, const void *buf, int num)
Wrappers for OpenSSL calls.
bool Listener_ExpectResponse(struct listener *l, boxed_msg *box, uint16_t *backpressure)
The client has finished a write, the listener should expect a response.
ssize_t syscall_write(int fildes, const void *buf, size_t nbyte)
bool Util_Timestamp(struct timeval *tv, bool relative)
struct listener * Bus_GetListenerForSocket(struct bus *b, int fd)
For a given file descriptor, get the listener ID to use.
int fd
Destination filename and message body.
int syscall_poll(struct pollfd fds[], nfds_t nfds, int timeout)
Wrappers for syscalls, to allow mocking for testing.