if (tevent_req_nomem(state->queue_entry, req)) {
return tevent_req_post(req, ev);
}
+ if (!tevent_req_is_in_progress(req)) {
+ return tevent_req_post(req, ev);
+ }
return req;
}
return true;
}
+static void writev_do(struct tevent_req *req, struct writev_state *state)
+{
+ ssize_t written;
+ bool ok;
+
+ written = writev(state->fd, state->iov, state->count);
+ if ((written == -1) &&
+ ((errno == EINTR) ||
+ (errno == EAGAIN) ||
+ (errno == EWOULDBLOCK))) {
+ /* retry after going through the tevent loop */
+ return;
+ }
+ if (written == -1) {
+ tevent_req_error(req, errno);
+ return;
+ }
+ if (written == 0) {
+ tevent_req_error(req, EPIPE);
+ return;
+ }
+ state->total_size += written;
+
+ ok = iov_advance(&state->iov, &state->count, written);
+ if (!ok) {
+ tevent_req_error(req, EIO);
+ return;
+ }
+
+ if (state->count == 0) {
+ tevent_req_done(req);
+ return;
+ }
+}
+
static void writev_trigger(struct tevent_req *req, void *private_data)
{
struct writev_state *state = tevent_req_data(req, struct writev_state);
state->queue_entry = NULL;
+ writev_do(req, state);
+ if (!tevent_req_is_in_progress(req)) {
+ return;
+ }
+
state->fde = tevent_add_fd(state->ev, state, state->fd, state->flags,
writev_handler, req);
if (tevent_req_nomem(state->fde, req)) {
private_data, struct tevent_req);
struct writev_state *state =
tevent_req_data(req, struct writev_state);
- ssize_t written;
- bool ok;
if ((state->flags & TEVENT_FD_READ) && (flags & TEVENT_FD_READ)) {
int ret, value;
}
}
- written = writev(state->fd, state->iov, state->count);
- if ((written == -1) && (errno == EINTR)) {
- /* retry */
- return;
- }
- if (written == -1) {
- tevent_req_error(req, errno);
- return;
- }
- if (written == 0) {
- tevent_req_error(req, EPIPE);
- return;
- }
- state->total_size += written;
-
- ok = iov_advance(&state->iov, &state->count, written);
- if (!ok) {
- tevent_req_error(req, EIO);
- return;
- }
-
- if (state->count == 0) {
- tevent_req_done(req);
- return;
- }
+ writev_do(req, state);
}
ssize_t writev_recv(struct tevent_req *req, int *perrno)