summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/util_file.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/source3/lib/util_file.c b/source3/lib/util_file.c
index 2425281f139..ba96eeee365 100644
--- a/source3/lib/util_file.c
+++ b/source3/lib/util_file.c
@@ -28,19 +28,21 @@
struct file_ploadv_state {
struct tevent_context *ev;
+ struct tevent_req *subreq;
size_t maxsize;
int fd;
uint8_t *buf;
};
-static int file_ploadv_state_destructor(struct file_ploadv_state *s);
+static void file_ploadv_cleanup_fn(
+ struct tevent_req *req, enum tevent_req_state req_state);
static void file_ploadv_readable(struct tevent_req *subreq);
struct tevent_req *file_ploadv_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
char * const argl[], size_t maxsize)
{
- struct tevent_req *req = NULL, *subreq = NULL;
+ struct tevent_req *req = NULL;
struct file_ploadv_state *state = NULL;
req = tevent_req_create(mem_ctx, &state, struct file_ploadv_state);
@@ -55,23 +57,27 @@ struct tevent_req *file_ploadv_send(TALLOC_CTX *mem_ctx,
tevent_req_error(req, errno);
return tevent_req_post(req, ev);
}
- talloc_set_destructor(state, file_ploadv_state_destructor);
+ tevent_req_set_cleanup_fn(req, file_ploadv_cleanup_fn);
- subreq = wait_for_read_send(state, state->ev, state->fd, false);
- if (tevent_req_nomem(subreq, req)) {
+ state->subreq = wait_for_read_send(state, state->ev, state->fd, false);
+ if (tevent_req_nomem(state->subreq, req)) {
return tevent_req_post(req, ev);
}
- tevent_req_set_callback(subreq, file_ploadv_readable, req);
+ tevent_req_set_callback(state->subreq, file_ploadv_readable, req);
return req;
}
-static int file_ploadv_state_destructor(struct file_ploadv_state *s)
+static void file_ploadv_cleanup_fn(
+ struct tevent_req *req, enum tevent_req_state req_state)
{
- if (s->fd != -1) {
- sys_pclose(s->fd);
- s->fd = -1;
+ struct file_ploadv_state *state = tevent_req_data(
+ req, struct file_ploadv_state);
+
+ TALLOC_FREE(state->subreq);
+ if (state->fd != -1) {
+ sys_pclose(state->fd);
+ state->fd = -1;
}
- return 0;
}
static void file_ploadv_readable(struct tevent_req *subreq)
@@ -89,6 +95,7 @@ static void file_ploadv_readable(struct tevent_req *subreq)
ok = wait_for_read_recv(subreq, &err);
TALLOC_FREE(subreq);
+ state->subreq = NULL;
if (!ok) {
tevent_req_error(req, err);
return;
@@ -134,11 +141,11 @@ static void file_ploadv_readable(struct tevent_req *subreq)
memcpy(state->buf + bufsize, buf, nread);
state->buf[bufsize+nread] = '\0';
- subreq = wait_for_read_send(state, state->ev, state->fd, false);
- if (tevent_req_nomem(subreq, req)) {
+ state->subreq = wait_for_read_send(state, state->ev, state->fd, false);
+ if (tevent_req_nomem(state->subreq, req)) {
return;
}
- tevent_req_set_callback(subreq, file_ploadv_readable, req);
+ tevent_req_set_callback(state->subreq, file_ploadv_readable, req);
}
int file_ploadv_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,