FAILS!!! why??? libcli/nbt: avoid talloc_reference() in nbt_name_*_send()
[metze/samba/wip.git] / libcli / nbt / nbtsocket.c
index dac61efc118bfb0b1825e71feef869e90f59c47f..92bd86aebb9dfd4cda92afc4a26252b9e0545ea5 100644 (file)
@@ -45,16 +45,13 @@ static int nbt_name_request_destructor(struct nbt_name_request *req)
                idr_remove(req->nbtsock->idr, req->name_trn_id);
                req->name_trn_id = 0;
        }
-       if (req->te) {
-               talloc_free(req->te);
-               req->te = NULL;
-       }
+       TALLOC_FREE(req->te);
        if (req->nbtsock->send_queue == NULL) {
-               EVENT_FD_NOT_WRITEABLE(req->nbtsock->fde);
+               TEVENT_FD_NOT_WRITEABLE(req->nbtsock->fde);
        }
        if (req->nbtsock->num_pending == 0 &&
            req->nbtsock->incoming.handler == NULL) {
-               EVENT_FD_NOT_READABLE(req->nbtsock->fde);
+               TEVENT_FD_NOT_READABLE(req->nbtsock->fde);
        }
        return 0;
 }
@@ -87,12 +84,12 @@ static void nbt_name_socket_send(struct nbt_name_socket *nbtsock)
                if (req->is_reply) {
                        talloc_free(req);
                } else {
-                       EVENT_FD_READABLE(nbtsock->fde);
+                       TEVENT_FD_READABLE(nbtsock->fde);
                        nbtsock->num_pending++;
                }
        }
 
-       EVENT_FD_NOT_WRITEABLE(nbtsock->fde);
+       TEVENT_FD_NOT_WRITEABLE(nbtsock->fde);
        talloc_free(tmp_ctx);
        return;
 
@@ -115,22 +112,21 @@ failed:
   handle a request timeout
 */
 static void nbt_name_socket_timeout(struct tevent_context *ev, struct tevent_timer *te,
-                                   struct timeval t, void *private)
+                                   struct timeval t, void *private_data)
 {
-       struct nbt_name_request *req = talloc_get_type(private,
+       struct nbt_name_request *req = talloc_get_type(private_data,
                                                       struct nbt_name_request);
 
        if (req->num_retries != 0) {
                req->num_retries--;
-               req->te = event_add_timed(req->nbtsock->event_ctx, req,
-                                         timeval_add(&t, req->timeout, 0),
-                                         nbt_name_socket_timeout, req);
+               req->te = tevent_add_timer(req->nbtsock->event_ctx, req,
+                                          timeval_add(&t, req->timeout, 0),
+                                          nbt_name_socket_timeout, req);
                if (req->state != NBT_REQUEST_SEND) {
                        req->state = NBT_REQUEST_SEND;
-                       DLIST_ADD_END(req->nbtsock->send_queue, req,
-                                     struct nbt_name_request *);
+                       DLIST_ADD_END(req->nbtsock->send_queue, req);
                }
-               EVENT_FD_WRITEABLE(req->nbtsock->fde);
+               TEVENT_FD_WRITEABLE(req->nbtsock->fde);
                return;
        }
 
@@ -191,7 +187,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
        }
 
        /* parse the request */
-       ndr_err = ndr_pull_struct_blob(&blob, packet, nbtsock->iconv_convenience, packet,
+       ndr_err = ndr_pull_struct_blob(&blob, packet, packet,
                                       (ndr_pull_flags_fn_t)ndr_pull_nbt_name_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                status = ndr_map_error2ntstatus(ndr_err);
@@ -273,9 +269,9 @@ void nbt_name_socket_handle_response_packet(struct nbt_name_request *req,
                        ttl = 5 + 4*25;
                }
                req->timeout = ttl;
-               req->te = event_add_timed(req->nbtsock->event_ctx, req,
-                                         timeval_current_ofs(req->timeout, 0),
-                                         nbt_name_socket_timeout, req);
+               req->te = tevent_add_timer(req->nbtsock->event_ctx, req,
+                                          timeval_current_ofs(req->timeout, 0),
+                                          nbt_name_socket_timeout, req);
                return;
        }
 
@@ -314,14 +310,14 @@ done:
   handle fd events on a nbt_name_socket
 */
 static void nbt_name_socket_handler(struct tevent_context *ev, struct tevent_fd *fde,
-                                   uint16_t flags, void *private)
+                                   uint16_t flags, void *private_data)
 {
-       struct nbt_name_socket *nbtsock = talloc_get_type(private,
+       struct nbt_name_socket *nbtsock = talloc_get_type(private_data,
                                                          struct nbt_name_socket);
-       if (flags & EVENT_FD_WRITE) {
+       if (flags & TEVENT_FD_WRITE) {
                nbt_name_socket_send(nbtsock);
        }
-       if (flags & EVENT_FD_READ) {
+       if (flags & TEVENT_FD_READ) {
                nbt_name_socket_recv(nbtsock);
        }
 }
@@ -332,8 +328,7 @@ static void nbt_name_socket_handler(struct tevent_context *ev, struct tevent_fd
   then operations will use that event context
 */
 _PUBLIC_ struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
-                                            struct tevent_context *event_ctx,
-                                            struct smb_iconv_convenience *iconv_convenience)
+                                            struct tevent_context *event_ctx)
 {
        struct nbt_name_socket *nbtsock;
        NTSTATUS status;
@@ -341,16 +336,15 @@ _PUBLIC_ struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
        nbtsock = talloc(mem_ctx, struct nbt_name_socket);
        if (nbtsock == NULL) goto failed;
 
-       nbtsock->event_ctx = talloc_reference(nbtsock, event_ctx);
+       nbtsock->event_ctx = event_ctx;
        if (nbtsock->event_ctx == NULL) goto failed;
 
-       status = socket_create("ip", SOCKET_TYPE_DGRAM, &nbtsock->sock, 0);
+       status = socket_create(nbtsock, "ip", SOCKET_TYPE_DGRAM,
+                              &nbtsock->sock, 0);
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
        socket_set_option(nbtsock->sock, "SO_BROADCAST", "1");
 
-       talloc_steal(nbtsock, nbtsock->sock);
-
        nbtsock->idr = idr_init(nbtsock);
        if (nbtsock->idr == NULL) goto failed;
 
@@ -358,11 +352,10 @@ _PUBLIC_ struct nbt_name_socket *nbt_name_socket_init(TALLOC_CTX *mem_ctx,
        nbtsock->num_pending = 0;
        nbtsock->incoming.handler = NULL;
        nbtsock->unexpected.handler = NULL;
-       nbtsock->iconv_convenience = iconv_convenience;
 
-       nbtsock->fde = event_add_fd(nbtsock->event_ctx, nbtsock,
-                                   socket_get_fd(nbtsock->sock), 0,
-                                   nbt_name_socket_handler, nbtsock);
+       nbtsock->fde = tevent_add_fd(nbtsock->event_ctx, nbtsock,
+                                    socket_get_fd(nbtsock->sock), 0,
+                                    nbt_name_socket_handler, nbtsock);
 
        return nbtsock;
 
@@ -393,8 +386,8 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
        req->is_reply               = false;
        req->timeout                = timeout;
        req->num_retries            = retries;
-       req->dest                   = dest;
-       if (talloc_reference(req, dest) == NULL) goto failed;
+       req->dest                   = socket_address_copy(req, dest);
+       if (req->dest == NULL) goto failed;
 
        /* we select a random transaction id unless the user supplied one */
        if (request->name_trn_id == 0) {
@@ -409,19 +402,18 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
        request->name_trn_id = id;
        req->name_trn_id     = id;
 
-       req->te = event_add_timed(nbtsock->event_ctx, req,
-                                 timeval_current_ofs(req->timeout, 0),
-                                 nbt_name_socket_timeout, req);
+       req->te = tevent_add_timer(nbtsock->event_ctx, req,
+                                  timeval_current_ofs(req->timeout, 0),
+                                  nbt_name_socket_timeout, req);
 
        talloc_set_destructor(req, nbt_name_request_destructor);
 
        ndr_err = ndr_push_struct_blob(&req->encoded, req,
-                                      req->nbtsock->iconv_convenience,
                                       request,
                                       (ndr_push_flags_fn_t)ndr_push_nbt_name_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) goto failed;
 
-       DLIST_ADD_END(nbtsock->send_queue, req, struct nbt_name_request *);
+       DLIST_ADD_END(nbtsock->send_queue, req);
 
        if (DEBUGLVL(10)) {
                DEBUG(10,("Queueing nbt packet to %s:%d\n",
@@ -429,7 +421,7 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
                NDR_PRINT_DEBUG(nbt_name_packet, request);
        }
 
-       EVENT_FD_WRITEABLE(nbtsock->fde);
+       TEVENT_FD_WRITEABLE(nbtsock->fde);
 
        return req;
 
@@ -453,8 +445,8 @@ _PUBLIC_ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
        NT_STATUS_HAVE_NO_MEMORY(req);
 
        req->nbtsock   = nbtsock;
-       req->dest = dest;
-       if (talloc_reference(req, dest) == NULL) goto failed;
+       req->dest = socket_address_copy(req, dest);
+       if (req>dest == NULL) goto failed;
        req->state     = NBT_REQUEST_SEND;
        req->is_reply = true;
 
@@ -465,7 +457,6 @@ _PUBLIC_ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
        }
 
        ndr_err = ndr_push_struct_blob(&req->encoded, req,
-                                      req->nbtsock->iconv_convenience,
                                       request,
                                       (ndr_push_flags_fn_t)ndr_push_nbt_name_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
@@ -473,9 +464,9 @@ _PUBLIC_ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
                return ndr_map_error2ntstatus(ndr_err);
        }
 
-       DLIST_ADD_END(nbtsock->send_queue, req, struct nbt_name_request *);
+       DLIST_ADD_END(nbtsock->send_queue, req);
 
-       EVENT_FD_WRITEABLE(nbtsock->fde);
+       TEVENT_FD_WRITEABLE(nbtsock->fde);
 
        return NT_STATUS_OK;
 
@@ -492,7 +483,7 @@ NTSTATUS nbt_name_request_recv(struct nbt_name_request *req)
        if (!req) return NT_STATUS_NO_MEMORY;
 
        while (req->state < NBT_REQUEST_DONE) {
-               if (event_loop_once(req->nbtsock->event_ctx) != 0) {
+               if (tevent_loop_once(req->nbtsock->event_ctx) != 0) {
                        req->state = NBT_REQUEST_ERROR;
                        req->status = NT_STATUS_UNEXPECTED_NETWORK_ERROR;
                        break;
@@ -508,11 +499,11 @@ NTSTATUS nbt_name_request_recv(struct nbt_name_request *req)
 _PUBLIC_ NTSTATUS nbt_set_incoming_handler(struct nbt_name_socket *nbtsock,
                                  void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *,
                                                  struct socket_address *),
-                                 void *private)
+                                 void *private_data)
 {
        nbtsock->incoming.handler = handler;
-       nbtsock->incoming.private_data = private;
-       EVENT_FD_READABLE(nbtsock->fde);
+       nbtsock->incoming.private_data = private_data;
+       TEVENT_FD_READABLE(nbtsock->fde);
        return NT_STATUS_OK;
 }
 
@@ -526,7 +517,7 @@ NTSTATUS nbt_set_unexpected_handler(struct nbt_name_socket *nbtsock,
 {
        nbtsock->unexpected.handler = handler;
        nbtsock->unexpected.private_data = private_data;
-       EVENT_FD_READABLE(nbtsock->fde);
+       TEVENT_FD_READABLE(nbtsock->fde);
        return NT_STATUS_OK;
 }