r10200: added a composite_trigger_done() call that allows a composite function
authorAndrew Tridgell <tridge@samba.org>
Tue, 13 Sep 2005 12:46:03 +0000 (12:46 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:38:08 +0000 (13:38 -0500)
to cause an event to happen immediately. This allows metzes patch for
recognising IPs in resolve_name() to work, and also allows us to
remove some of the other code where we currently do specific checks
for is_ipaddress().
(This used to be commit 9cc000d868e1257ef6429f6f6f1f9d3c28ca330f)

source4/lib/socket/connect.c
source4/libcli/composite/composite.c
source4/libcli/composite/connect.c
source4/libcli/resolve/resolve.c

index bb4d7cc84342b2e5b4e269af13036657ae146a11..04902442e3eb24ba13f4dfd3a01e63be0f186d42 100644 (file)
@@ -36,11 +36,6 @@ static NTSTATUS connect_resolve(TALLOC_CTX *mem_ctx, const char *address,
 {
        struct nbt_name name;
 
-       if (is_ipaddress(address) || strcasecmp("localhost", address) == 0) {
-               *ret_address = address;
-               return NT_STATUS_OK;
-       }
-
        name.name = address;
        name.scope = NULL;
        name.type = NBT_NAME_CLIENT;
index 2b8ddea897a6f9dd8738c5a1e0b2eea240a00bd8..f04309bbfb9a88719b20bf436bdf378d662cebca 100644 (file)
@@ -44,3 +44,27 @@ NTSTATUS composite_wait(struct composite_context *c)
 }
 
 
+/* 
+   callback from composite_trigger_done() 
+*/
+static void composite_trigger(struct event_context *ev, struct timed_event *te,
+                             struct timeval t, void *ptr)
+{
+       struct composite_context *c = talloc_get_type(ptr, struct composite_context);
+       c->state = SMBCLI_REQUEST_DONE;
+       if (c->async.fn) {
+               c->async.fn(c);
+       }
+}
+
+
+/*
+  trigger an immediate 'done' event on a composite context
+  this is used when the composite code works out that the call
+  can be completed without waiting for any external event
+*/
+void composite_trigger_done(struct composite_context *c)
+{
+       /* a zero timeout means immediate */
+       event_add_timed(c->event_ctx, c, timeval_zero(), composite_trigger, c);
+}
index 4d35f5c73ac54401883608d56503c6a00ae7b028..a5ce5308e519212fadf843a9e5ab552f7eb3e0ab 100644 (file)
@@ -352,17 +352,9 @@ struct composite_context *smb_composite_connect_send(struct smb_composite_connec
        c->event_ctx = talloc_reference(c, state->sock->event.ctx);
        c->private = state;
 
-       /* if the destination is an IP address, then skip the name resolution part */
-       if (is_ipaddress(io->in.dest_host)) {
-               state->stage = CONNECT_SOCKET;
-               state->creq = smbcli_sock_connect_send(state->sock, io->in.dest_host, 
-                                                      state->io->in.port, 
-                                                      io->in.dest_host);
-       } else {
-               state->stage = CONNECT_RESOLVE;
-               make_nbt_name_server(&name, io->in.dest_host);
-               state->creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order());
-       }
+       state->stage = CONNECT_RESOLVE;
+       make_nbt_name_server(&name, io->in.dest_host);
+       state->creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order());
 
        if (state->creq == NULL) goto failed;
        state->creq->async.private = c;
index 733eddf643f149b1aa4435ed515c4f896bcc0c8b..d62890434b5591349d13d778c10ae875e70be950 100644 (file)
@@ -144,6 +144,15 @@ struct composite_context *resolve_name_send(struct nbt_name *name, struct event_
                c->event_ctx = talloc_reference(c, event_ctx);
        }
 
+       if (is_ipaddress(state->name.name) || 
+           strcasecmp(state->name.name, "localhost") == 0) {
+               struct ipv4_addr ip = interpret_addr2(state->name.name);
+               state->reply_addr = talloc_strdup(state, sys_inet_ntoa(ip));
+               if (!state->reply_addr) goto failed;
+               composite_trigger_done(c);
+               return c;
+       }
+
        state->req = setup_next_method(c);
        if (state->req == NULL) goto failed;