diff options
author | Stefan Metzmacher <metze@samba.org> | 2015-05-21 02:18:26 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2015-06-12 17:08:17 +0200 |
commit | ecb4d041de89441941a112ab3a724887e568117e (patch) | |
tree | 478f7343489f53dffc9c74abe7d001fd7c10ee79 | |
parent | 3ecf4ec6574de9bdd5a2d55529ed81b17c74d452 (diff) | |
download | samba-ecb4d041de89441941a112ab3a724887e568117e.tar.gz |
s3:libsmb: convert nb_packet_reader to tstream_* functions
By using the tstream abstraction we don't need to take care
error handling regarding dangling tevent_fd structures.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11316
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
-rw-r--r-- | source3/libsmb/unexpected.c | 72 |
1 files changed, 34 insertions, 38 deletions
diff --git a/source3/libsmb/unexpected.c b/source3/libsmb/unexpected.c index 5d494696bf4..013d798dd03 100644 --- a/source3/libsmb/unexpected.c +++ b/source3/libsmb/unexpected.c @@ -21,7 +21,6 @@ #include "includes.h" #include "../lib/util/tevent_ntstatus.h" #include "lib/tsocket/tsocket.h" -#include "lib/async_req/async_sock.h" #include "libsmb/nmblib.h" #include "lib/sys_rw.h" @@ -471,12 +470,11 @@ static void nb_packet_client_send_done(struct tevent_req *req) } struct nb_packet_reader { - int sock; + struct tstream_context *sock; }; struct nb_packet_reader_state { struct tevent_context *ev; - struct sockaddr_un addr; struct nb_packet_query query; const char *mailslot_name; struct iovec iov[2]; @@ -484,7 +482,6 @@ struct nb_packet_reader_state { struct nb_packet_reader *reader; }; -static int nb_packet_reader_destructor(struct nb_packet_reader *r); static void nb_packet_reader_connected(struct tevent_req *subreq); static void nb_packet_reader_sent_query(struct tevent_req *subreq); static void nb_packet_reader_got_ack(struct tevent_req *subreq); @@ -497,7 +494,10 @@ struct tevent_req *nb_packet_reader_send(TALLOC_CTX *mem_ctx, { struct tevent_req *req, *subreq; struct nb_packet_reader_state *state; - char *path; + struct tsocket_address *laddr; + char *rpath; + struct tsocket_address *raddr; + int ret; req = tevent_req_create(mem_ctx, &state, struct nb_packet_reader_state); @@ -518,25 +518,23 @@ struct tevent_req *nb_packet_reader_send(TALLOC_CTX *mem_ctx, return tevent_req_post(req, ev); } - path = talloc_asprintf(talloc_tos(), "%s/%s", nmbd_socket_dir(), + ret = tsocket_address_unix_from_path(state, "", &laddr); + if (ret != 0) { + tevent_req_nterror(req, map_nt_error_from_unix(errno)); + return tevent_req_post(req, ev); + } + rpath = talloc_asprintf(state, "%s/%s", nmbd_socket_dir(), "unexpected"); - if (tevent_req_nomem(path, req)) { + if (tevent_req_nomem(rpath, req)) { return tevent_req_post(req, ev); } - state->addr.sun_family = AF_UNIX; - strlcpy(state->addr.sun_path, path, sizeof(state->addr.sun_path)); - TALLOC_FREE(path); - - state->reader->sock = socket(AF_UNIX, SOCK_STREAM, 0); - if (state->reader->sock == -1) { + ret = tsocket_address_unix_from_path(state, rpath, &raddr); + if (ret != 0) { tevent_req_nterror(req, map_nt_error_from_unix(errno)); return tevent_req_post(req, ev); } - talloc_set_destructor(state->reader, nb_packet_reader_destructor); - subreq = async_connect_send(state, ev, state->reader->sock, - (struct sockaddr *)(void *)&state->addr, - sizeof(state->addr), NULL, NULL, NULL); + subreq = tstream_unix_connect_send(state, ev, laddr, raddr); if (tevent_req_nomem(subreq, req)) { return tevent_req_post(req, ev); } @@ -544,15 +542,6 @@ struct tevent_req *nb_packet_reader_send(TALLOC_CTX *mem_ctx, return req; } -static int nb_packet_reader_destructor(struct nb_packet_reader *r) -{ - if (r->sock != -1) { - close(r->sock); - r->sock = -1; - } - return 0; -} - static void nb_packet_reader_connected(struct tevent_req *subreq) { struct tevent_req *req = tevent_req_callback_data( @@ -562,10 +551,11 @@ static void nb_packet_reader_connected(struct tevent_req *subreq) int res, err; int num_iovecs = 1; - res = async_connect_recv(subreq, &err); + res = tstream_unix_connect_recv(subreq, &err, state->reader, + &state->reader->sock); TALLOC_FREE(subreq); if (res == -1) { - DEBUG(10, ("async_connect failed: %s\n", strerror(err))); + DEBUG(10, ("tstream_unix_connect failed: %s\n", strerror(err))); tevent_req_nterror(req, map_nt_error_from_unix(err)); return; } @@ -580,8 +570,8 @@ static void nb_packet_reader_connected(struct tevent_req *subreq) state->iov[1].iov_len = state->query.mailslot_namelen; } - subreq = writev_send(state, state->ev, NULL, state->reader->sock, - true, state->iov, num_iovecs); + subreq = tstream_writev_send(state, state->ev, state->reader->sock, + state->iov, num_iovecs); if (tevent_req_nomem(subreq, req)) { return; } @@ -597,7 +587,7 @@ static void nb_packet_reader_sent_query(struct tevent_req *subreq) ssize_t written; int err; - written = writev_recv(subreq, &err); + written = tstream_writev_recv(subreq, &err); TALLOC_FREE(subreq); if (written == -1) { tevent_req_nterror(req, map_nt_error_from_unix(err)); @@ -607,8 +597,9 @@ static void nb_packet_reader_sent_query(struct tevent_req *subreq) tevent_req_nterror(req, NT_STATUS_UNEXPECTED_IO_ERROR); return; } - subreq = read_packet_send(state, state->ev, state->reader->sock, - sizeof(state->c), NULL, NULL); + subreq = tstream_read_packet_send(state, state->ev, + state->reader->sock, + sizeof(state->c), NULL, NULL); if (tevent_req_nomem(subreq, req)) { return; } @@ -625,7 +616,7 @@ static void nb_packet_reader_got_ack(struct tevent_req *subreq) int err; uint8_t *buf; - nread = read_packet_recv(subreq, state, &buf, &err); + nread = tstream_read_packet_recv(subreq, state, &buf, &err); TALLOC_FREE(subreq); if (nread == -1) { DEBUG(10, ("read_packet_recv returned %s\n", @@ -650,9 +641,11 @@ NTSTATUS nb_packet_reader_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, NTSTATUS status; if (tevent_req_is_nterror(req, &status)) { + tevent_req_received(req); return status; } *preader = talloc_move(mem_ctx, &state->reader); + tevent_req_received(req); return NT_STATUS_OK; } @@ -676,9 +669,9 @@ struct tevent_req *nb_packet_read_send(TALLOC_CTX *mem_ctx, if (req == NULL) { return NULL; } - subreq = read_packet_send(state, ev, reader->sock, - sizeof(struct nb_packet_client_header), - nb_packet_read_more, state); + subreq = tstream_read_packet_send(state, ev, reader->sock, + sizeof(struct nb_packet_client_header), + nb_packet_read_more, state); if (tevent_req_nomem(subreq, req)) { return tevent_req_post(req, ev); } @@ -710,7 +703,7 @@ static void nb_packet_read_done(struct tevent_req *subreq) ssize_t nread; int err; - nread = read_packet_recv(subreq, state, &state->buf, &err); + nread = tstream_read_packet_recv(subreq, state, &state->buf, &err); if (nread == -1) { tevent_req_nterror(req, map_nt_error_from_unix(err)); return; @@ -729,6 +722,7 @@ NTSTATUS nb_packet_read_recv(struct tevent_req *req, NTSTATUS status; if (tevent_req_is_nterror(req, &status)) { + tevent_req_received(req); return status; } @@ -739,8 +733,10 @@ NTSTATUS nb_packet_read_recv(struct tevent_req *req, state->buflen - sizeof(struct nb_packet_client_header), state->hdr.type, state->hdr.ip, state->hdr.port); if (packet == NULL) { + tevent_req_received(req); return NT_STATUS_INVALID_NETWORK_RESPONSE; } *ppacket = packet; + tevent_req_received(req); return NT_STATUS_OK; } |