Previously, setting up the socket address was kind of scattered
throughout the resolver code: the address family was set up front; the
port number stashed a bit later; and then the address plugged in once
the resolution job finished.
Instead, keep the port number separate once we've worked out what it is,
and build the entire socket address in one go at each site (once in the
background-resolver callback, and once for parsing a numerical address).
r->func(r, ARES_FAIL);
} else {
T( trace(T_ADMIN, "admin: resop %s ok", BGTAG(r)); )
r->func(r, ARES_FAIL);
} else {
T( trace(T_ADMIN, "admin: resop %s ok", BGTAG(r)); )
+ r->sa.sin.sin_family = AF_INET;
memcpy(&r->sa.sin.sin_addr, h->h_addr, sizeof(struct in_addr));
memcpy(&r->sa.sin.sin_addr, h->h_addr, sizeof(struct in_addr));
+ r->sa.sin.sin_port = htons(r->port);
r->func(r, ARES_OK);
}
sel_rmtimer(&r->t);
r->func(r, ARES_OK);
}
sel_rmtimer(&r->t);
a_fail(a, "invalid-port", "%lu", pt, A_END);
goto fail;
}
a_fail(a, "invalid-port", "%lu", pt, A_END);
goto fail;
}
- r->sa.sin.sin_port = htons(pt);
/* --- Report backgrounding --- *
*
/* --- Report backgrounding --- *
*
if (inet_aton(av[i], &r->sa.sin.sin_addr)) {
T( trace(T_ADMIN, "admin: resop %s done the easy way", BGTAG(r)); )
if (inet_aton(av[i], &r->sa.sin.sin_addr)) {
T( trace(T_ADMIN, "admin: resop %s done the easy way", BGTAG(r)); )
+ r->sa.sin.sin_family = AF_INET;
+ r->sa.sin.sin_port = htons(r->port);
func(r, ARES_OK);
xfree(r->addr);
a_bgrelease(&r->bg);
func(r, ARES_OK);
xfree(r->addr);
a_bgrelease(&r->bg);
bres_client r; /* Background resolver task */
sel_timer t; /* Timer for resolver */
addr sa; /* Socket address */
bres_client r; /* Background resolver task */
sel_timer t; /* Timer for resolver */
addr sa; /* Socket address */
+ unsigned port; /* Port number chosen */
size_t sasz; /* Socket address size */
void (*func)(struct admin_resop *, int); /* Handler */
} admin_resop;
size_t sasz; /* Socket address size */
void (*func)(struct admin_resop *, int); /* Handler */
} admin_resop;