1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-21 06:59:01 +00:00

Removed the global ProxyOps list.

Each proxy node now provides a pointer to its operations struct.
This commit is contained in:
henri
2013-04-22 19:30:49 +00:00
parent 3451220630
commit f1a04abd6b
4 changed files with 37 additions and 21 deletions

View File

@@ -66,10 +66,6 @@
#include <string.h>
/* Defined in nsock_proxy.c */
extern struct proxy_op *ProxyOps[];
/* Create the actual socket (nse->iod->sd) underlying the iod. This unblocks the
* socket, binds to the localaddr address, sets IP options, and sets the
* broadcast flag. Trying to change these functions after making this call will
@@ -270,7 +266,11 @@ nsock_event_id nsock_connect_tcp(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_hand
msiod *nsi = (msiod *)ms_iod;
if (nsi->px_ctx) {
return IOD_PX_TCP_CONNECT(nsi)(nsp, ms_iod, handler, timeout_msecs, userdata, saddr, sslen, port);
struct proxy_node *current;
current = PROXY_CTX_CURRENT(nsi->px_ctx);
assert(current != NULL);
return current->ops->connect_tcp(nsp, ms_iod, handler, timeout_msecs, userdata, saddr, sslen, port);
}
return nsock_connect_tcp_direct(nsp, ms_iod, handler, timeout_msecs, userdata, saddr, sslen, port);

View File

@@ -89,11 +89,13 @@ void nsock_proxy_ev_dispatch(nsock_pool nspool, nsock_event nsevent, void *udata
void forward_event(mspool *nsp, msevent *nse, void *udata);
extern struct proxy_op proxy_http;
/* --- Implemented proxy backends --- */
extern const struct proxy_op proxy_http_ops;
/* Ensure that the proxy_op for PROXY_XX is at the PROXY_TYPE_XX index. */
const struct proxy_op *ProxyOps[PROXY_TYPE_COUNT] = {
[PROXY_TYPE_HTTP] = &proxy_http
const static struct proxy_op *ProxyBackends[] = {
&proxy_http_ops,
NULL
};
@@ -216,18 +218,22 @@ void proxy_parser_delete(struct proxy_parser *parser) {
* - user:pass@ prefix before host specification
*/
static struct proxy_node *proxy_node_new(char *proxystr) {
int i;
for (i = 0; ProxyBackends[i] != NULL; i++) {
const struct proxy_op *pxop;
pxop = ProxyBackends[i];
if (strncasecmp(proxystr, pxop->prefix, strlen(pxop->prefix)) == 0) {
struct proxy_node *proxy;
proxy = (struct proxy_node *)safe_zalloc(sizeof(struct proxy_node));
if (strncasecmp(proxystr, "http://", 7) == 0) {
ProxyOps[PROXY_TYPE_HTTP]->init(proxy, proxystr);
} else {
fatal("Invalid protocol in proxy specification string: %s", proxystr);
}
pxop->init(proxy, proxystr);
return proxy;
}
}
fatal("Invalid protocol in proxy specification string: %s", proxystr);
}
static void proxy_node_delete(struct proxy_node *proxy) {
if (proxy)
@@ -262,8 +268,7 @@ void nsock_proxy_ev_dispatch(nsock_pool nspool, nsock_event nsevent, void *udata
fatal("Error, but this is debug only!");
current = PROXY_CTX_CURRENT(nse->iod->px_ctx);
assert(current->px_type > 0 && current->px_type < PROXY_TYPE_COUNT);
ProxyOps[current->px_type]->handler(nspool, nsevent, udata);
assert(current);
current->ops->handler(nspool, nsevent, udata);
}

View File

@@ -66,9 +66,11 @@
#define PROXY_CTX_NEXT(ctx) ((struct proxy_node *)((GH_LIST_ELEM_NEXT((ctx)->px_current)) ? GH_LIST_ELEM_DATA(GH_LIST_ELEM_NEXT((ctx)->px_current)) : NULL))
#define PROXY_CTX_NODES(ctx) ((ctx)->px_chain->nodes)
#if 0
#define IOD_PX_TCP_CONNECT(iod) (ProxyOps[PROXY_CTX_CURRENT((iod)->px_ctx)->px_type]->connect_tcp)
#define IOD_PX_DATA_ENCODE(iod) (ProxyOps[PROXY_CTX_CURRENT((iod)->px_ctx)->px_type]->data_encode)
#define IOD_PX_DATA_DECODE(iod) (ProxyOps[PROXY_CTX_CURRENT((iod)->px_ctx)->px_type]->data_decode)
#endif
/* ------------------- CONSTANTS ------------------- */
@@ -92,6 +94,8 @@ enum nsock_proxy_state {
struct proxy_node {
enum nsock_proxy_type px_type;
const struct proxy_op *ops;
struct sockaddr_storage ss;
size_t sslen;
unsigned short port;
@@ -117,6 +121,9 @@ struct proxy_chain_context {
};
struct proxy_op {
const char *prefix;
enum nsock_proxy_type type;
void (*init)(struct proxy_node *proxy, char *proxystr);
void (*handler)(nsock_pool nspool, nsock_event nsevent, void *udata);
nsock_event_id (*connect_tcp)(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_handler handler, int mstimeout,

View File

@@ -77,7 +77,9 @@ static char *proxy_http_data_decode(const char *src, size_t len, size_t *dlen);
/* ---- PROXY DEFINITION ---- */
struct proxy_op proxy_http = {
const struct proxy_op proxy_http_ops = {
.prefix = "http://",
.type = PROXY_TYPE_HTTP,
.init = proxy_http_init,
.handler = proxy_http_handler,
.connect_tcp = proxy_http_connect_tcp,
@@ -90,6 +92,8 @@ void proxy_http_init(struct proxy_node *proxy, char *proxystr) {
struct sockaddr_in *sin;
char *strhost, *strport, *saveptr;
proxy->ops = &proxy_http_ops;
strhost = strtok_r(proxystr + 7, ":", &saveptr);
strport = strtok_r(NULL, ":", &saveptr);
if (strport == NULL)