s3-librpc: Rename spnego_ntlmssp_init_client and make generic
[ira/wip.git] / source3 / rpc_client / rpc_transport_sock.c
index b1d9d8fbe133aa7ffbdccb6b2afaebff4b1432cf..a833e4469a35870a51c8d70278966893af54eb9c 100644 (file)
  */
 
 #include "includes.h"
+#include "../lib/tsocket/tsocket.h"
+#include "rpc_client/rpc_transport.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_CLI
 
-struct rpc_transport_sock_state {
-       int fd;
-};
-
-static int rpc_transport_sock_state_destructor(struct rpc_transport_sock_state *s)
-{
-       if (s->fd != -1) {
-               close(s->fd);
-               s->fd = -1;
-       }
-       return 0;
-}
-
-struct rpc_sock_read_state {
-       ssize_t received;
-};
-
-static void rpc_sock_read_done(struct tevent_req *subreq);
-
-static struct async_req *rpc_sock_read_send(TALLOC_CTX *mem_ctx,
-                                           struct event_context *ev,
-                                           uint8_t *data, size_t size,
-                                           void *priv)
-{
-       struct rpc_transport_sock_state *sock_transp = talloc_get_type_abort(
-               priv, struct rpc_transport_sock_state);
-       struct async_req *result;
-       struct tevent_req *subreq;
-       struct rpc_sock_read_state *state;
-
-       if (!async_req_setup(mem_ctx, &result, &state,
-                            struct rpc_sock_read_state)) {
-               return NULL;
-       }
-
-       subreq = async_recv_send(state, ev, sock_transp->fd, data, size, 0);
-       if (subreq == NULL) {
-               goto fail;
-       }
-       tevent_req_set_callback(subreq, rpc_sock_read_done, result);
-       return result;
- fail:
-       TALLOC_FREE(result);
-       return NULL;
-}
-
-static void rpc_sock_read_done(struct tevent_req *subreq)
-{
-       struct async_req *req =
-               tevent_req_callback_data(subreq, struct async_req);
-       struct rpc_sock_read_state *state = talloc_get_type_abort(
-               req->private_data, struct rpc_sock_read_state);
-       int err;
-
-       state->received = async_recv_recv(subreq, &err);
-       if (state->received == -1) {
-               async_req_nterror(req, map_nt_error_from_unix(err));
-               return;
-       }
-       async_req_done(req);
-}
-
-static NTSTATUS rpc_sock_read_recv(struct async_req *req, ssize_t *preceived)
+NTSTATUS rpc_transport_sock_init(TALLOC_CTX *mem_ctx, int fd,
+                                struct rpc_cli_transport **presult)
 {
-       struct rpc_sock_read_state *state = talloc_get_type_abort(
-               req->private_data, struct rpc_sock_read_state);
+       struct rpc_cli_transport *result;
+       struct tstream_context *stream;
+       int ret;
        NTSTATUS status;
 
-       if (async_req_is_nterror(req, &status)) {
-               return status;
-       }
-       *preceived = state->received;
-       return NT_STATUS_OK;
-}
-
-struct rpc_sock_write_state {
-       ssize_t sent;
-};
+       set_blocking(fd, false);
 
-static void rpc_sock_write_done(struct tevent_req *subreq);
-
-static struct async_req *rpc_sock_write_send(TALLOC_CTX *mem_ctx,
-                                            struct event_context *ev,
-                                            const uint8_t *data, size_t size,
-                                            void *priv)
-{
-       struct rpc_transport_sock_state *sock_transp = talloc_get_type_abort(
-               priv, struct rpc_transport_sock_state);
-       struct async_req *result;
-       struct tevent_req *subreq;
-       struct rpc_sock_write_state *state;
-
-       if (!async_req_setup(mem_ctx, &result, &state,
-                            struct rpc_sock_write_state)) {
-               return NULL;
-       }
-       subreq = async_send_send(state, ev, sock_transp->fd, data, size, 0);
-       if (subreq == NULL) {
-               goto fail;
-       }
-       tevent_req_set_callback(subreq, rpc_sock_write_done, result);
-       return result;
- fail:
-       TALLOC_FREE(result);
-       return NULL;
-}
-
-static void rpc_sock_write_done(struct tevent_req *subreq)
-{
-       struct async_req *req =
-               tevent_req_callback_data(subreq, struct async_req);
-       struct rpc_sock_write_state *state = talloc_get_type_abort(
-               req->private_data, struct rpc_sock_write_state);
-       int err;
-
-       state->sent = async_send_recv(subreq, &err);
-       if (state->sent == -1) {
-               async_req_nterror(req, map_nt_error_from_unix(err));
-               return;
-       }
-       async_req_done(req);
-}
-
-static NTSTATUS rpc_sock_write_recv(struct async_req *req, ssize_t *psent)
-{
-       struct rpc_sock_write_state *state = talloc_get_type_abort(
-               req->private_data, struct rpc_sock_write_state);
-       NTSTATUS status;
-
-       if (async_req_is_nterror(req, &status)) {
+       ret = tstream_bsd_existing_socket(mem_ctx, fd, &stream);
+       if (ret != 0) {
+               status = map_nt_error_from_unix(errno);
                return status;
        }
-       *psent = state->sent;
-       return NT_STATUS_OK;
-}
 
-NTSTATUS rpc_transport_sock_init(TALLOC_CTX *mem_ctx, int fd,
-                                struct rpc_cli_transport **presult)
-{
-       struct rpc_cli_transport *result;
-       struct rpc_transport_sock_state *state;
-
-       result = talloc(mem_ctx, struct rpc_cli_transport);
-       if (result == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-       state = talloc(result, struct rpc_transport_sock_state);
-       if (state == NULL) {
-               TALLOC_FREE(result);
-               return NT_STATUS_NO_MEMORY;
+       status = rpc_transport_tstream_init(mem_ctx,
+                                           &stream,
+                                           &result);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(stream);
+               return status;
        }
-       result->priv = state;
-
-       state->fd = fd;
-       talloc_set_destructor(state, rpc_transport_sock_state_destructor);
-
-       result->trans_send = NULL;
-       result->trans_recv = NULL;
-       result->write_send = rpc_sock_write_send;
-       result->write_recv = rpc_sock_write_recv;
-       result->read_send = rpc_sock_read_send;
-       result->read_recv = rpc_sock_read_recv;
 
        *presult = result;
        return NT_STATUS_OK;