Nmap Development mailing list archives
Re: [nmap-svn] r36171 - in nmap: nbase nsock nsock/include nsock/src
From: Daniel Miller <bonsaiviking () gmail com>
Date: Mon, 22 Aug 2016 15:12:44 -0500
Tudor, This is exciting that we're merging IOCP again! I did spot a few warnings during compilation that we should clean up: src\engine_iocp.c(203): warning C4101: 'next' : unreferenced local variable Probably just remove this. src\engine_iocp.c(298): warning C4018: '<' : signed/unsigned mismatch Here we should probably check for positive number then cast it to unsigned for the comparison: if (total_events > 0 && iinfo->capacity < (unsigned long) total_events); But I'm not positive that is the best solution? src\engine_iocp.c(364): warning C4018: '<' : signed/unsigned mismatch This loop variable should be changed to "unsigned long" to match the number it's counting up to. src\engine_iocp.c(758): warning C4806: '==' : unsafe operation: no value of type 'bool' promoted to type 'nse_type' can equal the given constant You need to use "nse->type !=" instead of "!nse->type ==" here, because the ! has higher precedence than the ==, so you're comparing either true == NSE_TYPE_READ or false == NSE_TYPE_READ, neither of which can ever be true. I'll let you know if I spot anything else in my testing. Dan On Mon, Aug 22, 2016 at 2:15 PM, <commit-mailer () nmap org> wrote:
Author: tudor
Date: Mon Aug 22 12:15:13 2016
New Revision: 36171
Log:
Added IOCP integration for Nsock, engine IOCP is the default engine on
Windows
Added:
nmap/nsock/src/engine_iocp.c
- copied unchanged from r36170, /nmap-exp/tudor/nsock-iocp/
nsock/src/engine_iocp.c
Modified:
nmap/nbase/nbase_misc.c (contents, props changed)
nmap/nsock/include/nsock_winconfig.h
nmap/nsock/nsock.vcxproj
nmap/nsock/src/engine_epoll.c
nmap/nsock/src/engine_kqueue.c
nmap/nsock/src/engine_poll.c
nmap/nsock/src/engine_select.c
nmap/nsock/src/nsock_connect.c
nmap/nsock/src/nsock_core.c
nmap/nsock/src/nsock_engines.c
nmap/nsock/src/nsock_internal.h
Modified: nmap/nbase/nbase_misc.c
============================================================
==================
--- nmap/nbase/nbase_misc.c (original)
+++ nmap/nbase/nbase_misc.c Mon Aug 22 12:15:13 2016
@@ -257,7 +257,7 @@
/* WSASocket is just like socket, except that the sockets it creates are
inheritable by subprocesses (such as are created by CreateProcess),
while
those created by socket are not. */
- return WSASocket(af, style, protocol, NULL, 0, 0);
+ return WSASocket(af, style, protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
#else
return socket(af, style, protocol);
#endif
Modified: nmap/nsock/include/nsock_winconfig.h
============================================================
==================
--- nmap/nsock/include/nsock_winconfig.h (original)
+++ nmap/nsock/include/nsock_winconfig.h Mon Aug 22 12:15:13 2016
@@ -102,6 +102,7 @@
/* WSAPoll() isn't available before Vista */
#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
#define HAVE_POLL 1
+#define HAVE_IOCP 1
#endif
#endif /* NSOCK_WINCONFIG_H */
Modified: nmap/nsock/nsock.vcxproj
============================================================
==================
--- nmap/nsock/nsock.vcxproj (original)
+++ nmap/nsock/nsock.vcxproj Mon Aug 22 12:15:13 2016
@@ -186,6 +186,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\engine_epoll.c" />
+ <ClCompile Include="src\engine_iocp.c" />
<ClCompile Include="src\engine_kqueue.c" />
<ClCompile Include="src\engine_poll.c" />
<ClCompile Include="src\engine_select.c" />
Modified: nmap/nsock/src/engine_epoll.c
============================================================
==================
--- nmap/nsock/src/engine_epoll.c (original)
+++ nmap/nsock/src/engine_epoll.c Mon Aug 22 12:15:13 2016
@@ -85,11 +85,12 @@
/* --- ENGINE INTERFACE PROTOTYPES --- */
static int epoll_init(struct npool *nsp);
static void epoll_destroy(struct npool *nsp);
-static int epoll_iod_register(struct npool *nsp, struct niod *iod, int
ev);
+static int epoll_iod_register(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev);
static int epoll_iod_unregister(struct npool *nsp, struct niod *iod);
-static int epoll_iod_modify(struct npool *nsp, struct niod *iod, int
ev_set, int ev_clr);
+static int epoll_iod_modify(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev_set, int ev_clr);
static int epoll_loop(struct npool *nsp, int msec_timeout);
+extern struct io_operations posix_io_operations;
/* ---- ENGINE DEFINITION ---- */
struct io_engine engine_epoll = {
@@ -99,7 +100,8 @@
epoll_iod_register,
epoll_iod_unregister,
epoll_iod_modify,
- epoll_loop
+ epoll_loop,
+ &posix_io_operations
};
@@ -159,7 +161,7 @@
free(einfo);
}
-int epoll_iod_register(struct npool *nsp, struct niod *iod, int ev) {
+int epoll_iod_register(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev) {
int sd;
struct epoll_event epev;
struct epoll_engine_info *einfo = (struct epoll_engine_info
*)nsp->engine_data;
@@ -204,7 +206,7 @@
return 1;
}
-int epoll_iod_modify(struct npool *nsp, struct niod *iod, int ev_set, int
ev_clr) {
+int epoll_iod_modify(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev_set, int ev_clr) {
int sd;
struct epoll_event epev;
int new_events;
Modified: nmap/nsock/src/engine_kqueue.c
============================================================
==================
--- nmap/nsock/src/engine_kqueue.c (original)
+++ nmap/nsock/src/engine_kqueue.c Mon Aug 22 12:15:13 2016
@@ -78,11 +78,12 @@
/* --- ENGINE INTERFACE PROTOTYPES --- */
static int kqueue_init(struct npool *nsp);
static void kqueue_destroy(struct npool *nsp);
-static int kqueue_iod_register(struct npool *nsp, struct niod *iod, int
ev);
+static int kqueue_iod_register(struct npool *nsp, struct niod *iod,
struct nevent *nse, int ev);
static int kqueue_iod_unregister(struct npool *nsp, struct niod *iod);
-static int kqueue_iod_modify(struct npool *nsp, struct niod *iod, int
ev_set, int ev_clr);
+static int kqueue_iod_modify(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev_set, int ev_clr);
static int kqueue_loop(struct npool *nsp, int msec_timeout);
+extern struct io_operations posix_io_operations;
/* ---- ENGINE DEFINITION ---- */
struct io_engine engine_kqueue = {
@@ -92,7 +93,8 @@
kqueue_iod_register,
kqueue_iod_unregister,
kqueue_iod_modify,
- kqueue_loop
+ kqueue_loop,
+ &posix_io_operations
};
@@ -151,7 +153,7 @@
free(kinfo);
}
-int kqueue_iod_register(struct npool *nsp, struct niod *iod, int ev) {
+int kqueue_iod_register(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev) {
struct kqueue_engine_info *kinfo = (struct kqueue_engine_info
*)nsp->engine_data;
assert(!IOD_PROPGET(iod, IOD_REGISTERED));
@@ -185,7 +187,7 @@
#define EV_SETFLAG(_set, _ev) (((_set) & (_ev)) ? (EV_ADD|EV_ENABLE) :
(EV_ADD|EV_DISABLE))
-int kqueue_iod_modify(struct npool *nsp, struct niod *iod, int ev_set,
int ev_clr) {
+int kqueue_iod_modify(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev_set, int ev_clr) {
struct kevent kev[2];
int new_events, i;
struct kqueue_engine_info *kinfo = (struct kqueue_engine_info
*)nsp->engine_data;
Modified: nmap/nsock/src/engine_poll.c
============================================================
==================
--- nmap/nsock/src/engine_poll.c (original)
+++ nmap/nsock/src/engine_poll.c Mon Aug 22 12:15:13 2016
@@ -106,13 +106,14 @@
#define POLL_X_FLAGS (POLLERR | POLLHUP)
#endif /* POLLRDHUP */
+extern struct io_operations posix_io_operations;
/* --- ENGINE INTERFACE PROTOTYPES --- */
static int poll_init(struct npool *nsp);
static void poll_destroy(struct npool *nsp);
-static int poll_iod_register(struct npool *nsp, struct niod *iod, int ev);
+static int poll_iod_register(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev);
static int poll_iod_unregister(struct npool *nsp, struct niod *iod);
-static int poll_iod_modify(struct npool *nsp, struct niod *iod, int
ev_set, int ev_clr);
+static int poll_iod_modify(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev_set, int ev_clr);
static int poll_loop(struct npool *nsp, int msec_timeout);
@@ -124,7 +125,8 @@
poll_iod_register,
poll_iod_unregister,
poll_iod_modify,
- poll_loop
+ poll_loop,
+ &posix_io_operations
};
@@ -212,7 +214,7 @@
free(pinfo);
}
-int poll_iod_register(struct npool *nsp, struct niod *iod, int ev) {
+int poll_iod_register(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev) {
struct poll_engine_info *pinfo = (struct poll_engine_info
*)nsp->engine_data;
int sd;
@@ -265,7 +267,7 @@
return 1;
}
-int poll_iod_modify(struct npool *nsp, struct niod *iod, int ev_set, int
ev_clr) {
+int poll_iod_modify(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev_set, int ev_clr) {
int sd;
int new_events;
struct poll_engine_info *pinfo = (struct poll_engine_info
*)nsp->engine_data;
Modified: nmap/nsock/src/engine_select.c
============================================================
==================
--- nmap/nsock/src/engine_select.c (original)
+++ nmap/nsock/src/engine_select.c Mon Aug 22 12:15:13 2016
@@ -67,13 +67,15 @@
#include "nsock_pcap.h"
#endif
+extern struct io_operations posix_io_operations;
+
/* --- ENGINE INTERFACE PROTOTYPES --- */
static int select_init(struct npool *nsp);
static void select_destroy(struct npool *nsp);
-static int select_iod_register(struct npool *nsp, struct niod *iod, int
ev);
+static int select_iod_register(struct npool *nsp, struct niod *iod,
struct nevent *nse, int ev);
static int select_iod_unregister(struct npool *nsp, struct niod *iod);
-static int select_iod_modify(struct npool *nsp, struct niod *iod, int
ev_set, int ev_clr);
+static int select_iod_modify(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev_set, int ev_clr);
static int select_loop(struct npool *nsp, int msec_timeout);
@@ -85,7 +87,8 @@
select_iod_register,
select_iod_unregister,
select_iod_modify,
- select_loop
+ select_loop,
+ &posix_io_operations
};
@@ -153,11 +156,11 @@
free(nsp->engine_data);
}
-int select_iod_register(struct npool *nsp, struct niod *iod, int ev) {
+int select_iod_register(struct npool *nsp, struct niod *iod, struct
nevent *nse, int ev) {
assert(!IOD_PROPGET(iod, IOD_REGISTERED));
iod->watched_events = ev;
- select_iod_modify(nsp, iod, ev, EV_NONE);
+ select_iod_modify(nsp, iod, nse, ev, EV_NONE);
IOD_PROPSET(iod, IOD_REGISTERED);
return 1;
}
@@ -196,7 +199,7 @@
return 1;
}
-int select_iod_modify(struct npool *nsp, struct niod *iod, int ev_set,
int ev_clr) {
+int select_iod_modify(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev_set, int ev_clr) {
int sd;
struct select_engine_info *sinfo = (struct select_engine_info
*)nsp->engine_data;
Modified: nmap/nsock/src/nsock_connect.c
============================================================
==================
--- nmap/nsock/src/nsock_connect.c (original)
+++ nmap/nsock/src/nsock_connect.c Mon Aug 22 12:15:13 2016
@@ -253,7 +253,7 @@
memcpy(&iod->peer, ss, sslen);
iod->peerlen = sslen;
- if (connect(iod->sd, (struct sockaddr *)ss, sslen) == -1) {
+ if (ms->engine->io_operations->iod_connect(ms, iod->sd, (struct
sockaddr *)ss, sslen) == -1) {
int err = socket_errno();
if (proto == IPPROTO_UDP || (err != EINPROGRESS && err != EAGAIN)) {
Modified: nmap/nsock/src/nsock_core.c
============================================================
==================
--- nmap/nsock/src/nsock_core.c (original)
+++ nmap/nsock/src/nsock_core.c Mon Aug 22 12:15:13 2016
@@ -86,7 +86,6 @@
#include "nsock_pcap.h"
#endif
-
/* Nsock time of day -- we update this at least once per nsock_loop round
(and
* after most calls that are likely to block). Other nsock files should
grab
* this */
@@ -178,7 +177,7 @@
* If this counter reaches zero, the event won't be watched anymore by the
* IO engine for this IOD.
*/
-static void update_events(struct niod * iod, struct npool *ms, int
ev_inc, int ev_dec) {
+static void update_events(struct niod * iod, struct npool *ms, struct
nevent *nse, int ev_inc, int ev_dec) {
int setmask, clrmask, ev_temp;
/* Filter out events that belong to both sets. */
@@ -204,9 +203,9 @@
if (!IOD_PROPGET(iod, IOD_REGISTERED)) {
assert(clrmask == EV_NONE);
- nsock_engine_iod_register(ms, iod, setmask);
+ nsock_engine_iod_register(ms, iod, nse, setmask);
} else {
- nsock_engine_iod_modify(ms, iod, setmask, clrmask);
+ nsock_engine_iod_modify(ms, iod, nse, setmask, clrmask);
}
}
@@ -287,6 +286,7 @@
default:
fatal("Unknown event type (%d) for IOD #%lu\n", nse->type, iod->id);
}
+
return 0;
}
@@ -427,7 +427,7 @@
ev |= socket_count_read_dec(iod);
ev |= socket_count_write_dec(iod);
ev |= EV_EXCEPT;
- update_events(iod, ms, EV_NONE, ev);
+ update_events(iod, ms, nse, EV_NONE, ev);
}
#if HAVE_OPENSSL
@@ -446,7 +446,7 @@
int ev;
ev = socket_count_dec_ssl_desire(nse);
- update_events(iod, ms, EV_NONE, ev);
+ update_events(iod, ms, nse, EV_NONE, ev);
}
rc = SSL_connect(iod->ssl);
@@ -468,11 +468,11 @@
if (rc == -1 && sslerr == SSL_ERROR_WANT_READ) {
nse->sslinfo.ssl_desire = sslerr;
socket_count_read_inc(iod);
- update_events(iod, ms, EV_READ, EV_NONE);
+ update_events(iod, ms, nse, EV_READ, EV_NONE);
} else if (rc == -1 && sslerr == SSL_ERROR_WANT_WRITE) {
nse->sslinfo.ssl_desire = sslerr;
socket_count_write_inc(iod);
- update_events(iod, ms, EV_WRITE, EV_NONE);
+ update_events(iod, ms, nse, EV_WRITE, EV_NONE);
} else if (!(options & SSL_OP_NO_SSLv2)) {
int saved_ev;
@@ -488,7 +488,7 @@
close(iod->sd);
nsock_connect_internal(ms, nse, SOCK_STREAM, iod->lastproto,
&iod->peer,
iod->peerlen, nsock_iod_get_peerport(iod));
- nsock_engine_iod_register(ms, iod, saved_ev);
+ nsock_engine_iod_register(ms, iod, nse, saved_ev);
/* Use SSL_free here because SSL_clear keeps session info, which
* doesn't work when changing SSL versions (as we're clearly
trying to
@@ -501,7 +501,7 @@
SSL_set_options(iod->ssl, options | SSL_OP_NO_SSLv2);
socket_count_read_inc(nse->iod);
socket_count_write_inc(nse->iod);
- update_events(iod, ms, EV_READ|EV_WRITE, EV_NONE);
+ update_events(iod, ms, nse, EV_READ|EV_WRITE, EV_NONE);
nse->sslinfo.ssl_desire = SSL_ERROR_WANT_CONNECT;
} else {
nsock_log_info("EID %li %s",
@@ -543,10 +543,7 @@
res = SSL_write(iod->ssl, str, bytesleft);
else
#endif
- if (nse->writeinfo.dest.ss_family == AF_UNSPEC)
- res = send(nse->iod->sd, str, bytesleft, 0);
- else
- res = sendto(nse->iod->sd, str, bytesleft, 0, (struct sockaddr
*)&nse->writeinfo.dest, (int)nse->writeinfo.destlen);
+ res = ms->engine->io_operations->iod_write(ms, nse->iod->sd, str,
bytesleft, 0, (struct sockaddr *)&nse->writeinfo.dest,
(int)nse->writeinfo.destlen);
if (res == bytesleft) {
nse->event_done = 1;
nse->status = NSE_STATUS_SUCCESS;
@@ -562,14 +559,14 @@
evclr = socket_count_dec_ssl_desire(nse);
socket_count_read_inc(iod);
- update_events(iod, ms, EV_READ, evclr);
+ update_events(iod, ms, nse, EV_READ, evclr);
nse->sslinfo.ssl_desire = err;
} else if (err == SSL_ERROR_WANT_WRITE) {
int evclr;
evclr = socket_count_dec_ssl_desire(nse);
socket_count_write_inc(iod);
- update_events(iod, ms, EV_WRITE, evclr);
+ update_events(iod, ms, nse, EV_WRITE, evclr);
nse->sslinfo.ssl_desire = err;
} else {
/* Unexpected error */
@@ -601,7 +598,7 @@
else
#endif
ev |= socket_count_write_dec(nse->iod);
- update_events(nse->iod, ms, EV_NONE, ev);
+ update_events(nse->iod, ms, nse, EV_NONE, ev);
}
}
@@ -613,7 +610,7 @@
/* Returns -1 if an error, otherwise the number of newly written bytes */
static int do_actual_read(struct npool *ms, struct nevent *nse) {
- char buf[8192];
+ char buf[READ_BUFFER_SZ];
int buflen = 0;
struct niod *iod = nse->iod;
int err = 0;
@@ -627,9 +624,9 @@
do {
struct sockaddr_storage peer;
socklen_t peerlen;
-
peerlen = sizeof(peer);
- buflen = recvfrom(iod->sd, buf, sizeof(buf), 0, (struct sockaddr
*)&peer, &peerlen);
+
+ buflen = ms->engine->io_operations->iod_read(ms, iod->sd, buf,
sizeof(buf), 0, (struct sockaddr *)&peer, &peerlen);
/* Using recv() was failing, at least on UNIX, for non-network
sockets
* (i.e. stdin) in this case, a read() is done - as on ENOTSOCK we
may
@@ -712,14 +709,14 @@
evclr = socket_count_dec_ssl_desire(nse);
socket_count_read_inc(iod);
- update_events(iod, ms, EV_READ, evclr);
+ update_events(iod, ms, nse, EV_READ, evclr);
nse->sslinfo.ssl_desire = err;
} else if (err == SSL_ERROR_WANT_WRITE) {
int evclr;
evclr = socket_count_dec_ssl_desire(nse);
socket_count_write_inc(iod);
- update_events(iod, ms, EV_WRITE, evclr);
+ update_events(iod, ms, nse, EV_WRITE, evclr);
nse->sslinfo.ssl_desire = err;
} else {
/* Unexpected error */
@@ -820,7 +817,7 @@
else
#endif
ev |= socket_count_read_dec(nse->iod);
- update_events(nse->iod, ms, EV_NONE, ev);
+ update_events(nse->iod, ms, nse, EV_NONE, ev);
}
}
@@ -861,7 +858,7 @@
int ev;
ev = socket_count_readpcap_dec(iod);
- update_events(iod, ms, EV_NONE, ev);
+ update_events(iod, ms, nse, EV_NONE, ev);
}
}
@@ -1266,7 +1263,7 @@
assert(nse->iod->sd >= 0);
socket_count_read_inc(nse->iod);
socket_count_write_inc(nse->iod);
- update_events(nse->iod, nsp, EV_READ|EV_WRITE|EV_EXCEPT, EV_NONE);
+ update_events(nse->iod, nsp, nse, EV_READ|EV_WRITE|EV_EXCEPT,
EV_NONE);
}
iod_add_event(nse->iod, nse);
break;
@@ -1275,7 +1272,7 @@
if (!nse->event_done) {
assert(nse->iod->sd >= 0);
socket_count_read_inc(nse->iod);
- update_events(nse->iod, nsp, EV_READ, EV_NONE);
+ update_events(nse->iod, nsp, nse, EV_READ, EV_NONE);
#if HAVE_OPENSSL
if (nse->iod->ssl)
nse->sslinfo.ssl_desire = SSL_ERROR_WANT_READ;
@@ -1288,7 +1285,7 @@
if (!nse->event_done) {
assert(nse->iod->sd >= 0);
socket_count_write_inc(nse->iod);
- update_events(nse->iod, nsp, EV_WRITE, EV_NONE);
+ update_events(nse->iod, nsp, nse, EV_WRITE, EV_NONE);
#if HAVE_OPENSSL
if (nse->iod->ssl)
nse->sslinfo.ssl_desire = SSL_ERROR_WANT_WRITE;
@@ -1309,7 +1306,7 @@
if (mp->pcap_desc >= 0) { /* pcap descriptor present */
if (!nse->event_done) {
socket_count_readpcap_inc(nse->iod);
- update_events(nse->iod, nsp, EV_READ, EV_NONE);
+ update_events(nse->iod, nsp, nse, EV_READ, EV_NONE);
}
nsock_log_debug_all("PCAP NSE #%lu: Adding event to READ_EVENTS",
nse->id);
Modified: nmap/nsock/src/nsock_engines.c
============================================================
==================
--- nmap/nsock/src/nsock_engines.c (original)
+++ nmap/nsock/src/nsock_engines.c Mon Aug 22 12:15:13 2016
@@ -63,6 +63,13 @@
#include "nsock_internal.h"
+#if HAVE_IOCP
+ extern struct io_engine engine_iocp;
+ #define ENGINE_IOCP &engine_iocp,
+#else
+ #define ENGINE_IOCP
+#endif /* HAVE_IOCP */
+
#if HAVE_EPOLL
extern struct io_engine engine_epoll;
#define ENGINE_EPOLL &engine_epoll,
@@ -94,12 +101,34 @@
ENGINE_EPOLL
ENGINE_KQUEUE
ENGINE_POLL
+ ENGINE_IOCP
ENGINE_SELECT
NULL
};
static char *engine_hint;
+int posix_iod_connect(struct npool *nsp, int sockfd, const struct
sockaddr *addr, socklen_t addrlen) {
+ return connect(sockfd, addr, addrlen);
+}
+
+int posix_iod_read(struct npool *nsp, int sockfd, void *buf, size_t len,
int flags, struct sockaddr *src_addr, socklen_t *addrlen) {
+ return recvfrom(sockfd, (char *)buf, len, flags, src_addr, addrlen);
+}
+
+int posix_iod_write(struct npool *nsp, int sockfd, const void *buf,
size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
{
+ struct sockaddr_storage *dest = (struct sockaddr_storage *)dest_addr;
+ if (dest->ss_family == AF_UNSPEC)
+ return send(sockfd, (char *)buf, len, flags);
+ else
+ return sendto(sockfd, (char *)buf, len, flags, dest_addr, addrlen);
+}
+
+struct io_operations posix_io_operations = {
+ posix_iod_connect,
+ posix_iod_read,
+ posix_iod_write
+};
struct io_engine *get_io_engine(void) {
struct io_engine *engine = NULL;
@@ -145,6 +174,9 @@
const char *nsock_list_engines(void) {
return
+#if HAVE_IOCP
+ "iocp "
+#endif
#if HAVE_EPOLL
"epoll "
#endif
Modified: nmap/nsock/src/nsock_internal.h
============================================================
==================
--- nmap/nsock/src/nsock_internal.h (original)
+++ nmap/nsock/src/nsock_internal.h Mon Aug 22 12:15:13 2016
@@ -109,6 +109,7 @@
/* ------------------- CONSTANTS ------------------- */
+#define READ_BUFFER_SZ 8192
enum nsock_read_types {
NSOCK_READLINES,
@@ -360,8 +361,21 @@
* that other crap */
unsigned int event_done: 1;
unsigned int eof: 1;
+
+#if HAVE_IOCP
+ struct extended_overlapped *eov;
+#endif
};
+struct io_operations {
+ int(*iod_connect)(struct npool *nsp, int sockfd, const struct sockaddr
*addr, socklen_t addrlen);
+
+ int(*iod_read)(struct npool *nsp, int sockfd, void *buf, size_t len,
int flags,
+ struct sockaddr *src_addr, socklen_t *addrlen);
+
+ int(*iod_write)(struct npool *nsp, int sockfd, const void *buf, size_t
len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen);
+};
struct io_engine {
/* Human readable identifier for this engine. */
@@ -374,18 +388,21 @@
void (*destroy)(struct npool *nsp);
/* Register a new IOD to the engine */
- int (*iod_register)(struct npool *nsp, struct niod *iod, int ev);
+ int(*iod_register)(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev);
/* Remove a registered IOD */
- int (*iod_unregister)(struct npool *nsp, struct niod *iod);
+ int(*iod_unregister)(struct npool *nsp, struct niod *iod);
/* Modify events for a registered IOD.
* - ev_set represent the events to add
* - ev_clr represent the events to delete (if set) */
- int (*iod_modify)(struct npool *nsp, struct niod *iod, int ev_set, int
ev_clr);
+ int (*iod_modify)(struct npool *nsp, struct niod *iod, struct nevent
*nse, int ev_set, int ev_clr);
/* Main engine loop */
int (*loop)(struct npool *nsp, int msec_timeout);
+
+ /* I/O operations */
+ struct io_operations *io_operations;
};
/* ----------- NSOCK I/O ENGINE CONVENIENCE WRAPPERS ------------ */
@@ -398,16 +415,16 @@
return;
}
-static inline int nsock_engine_iod_register(struct npool *nsp, struct
niod *iod, int ev) {
- return nsp->engine->iod_register(nsp, iod, ev);
+static inline int nsock_engine_iod_register(struct npool *nsp, struct
niod *iod, struct nevent *nse, int ev) {
+ return nsp->engine->iod_register(nsp, iod, nse, ev);
}
static inline int nsock_engine_iod_unregister(struct npool *nsp, struct
niod *iod) {
return nsp->engine->iod_unregister(nsp, iod);
}
-static inline int nsock_engine_iod_modify(struct npool *nsp, struct niod
*iod, int ev_set, int ev_clr) {
- return nsp->engine->iod_modify(nsp, iod, ev_set, ev_clr);
+static inline int nsock_engine_iod_modify(struct npool *nsp, struct niod
*iod, struct nevent *nse, int ev_set, int ev_clr) {
+ return nsp->engine->iod_modify(nsp, iod, nse, ev_set, ev_clr);
}
static inline int nsock_engine_loop(struct npool *nsp, int msec_timeout) {
_______________________________________________
Sent through the svn mailing list
https://nmap.org/mailman/listinfo/svn
_______________________________________________ Sent through the dev mailing list https://nmap.org/mailman/listinfo/dev Archived at http://seclists.org/nmap-dev/
Current thread:
- Re: [nmap-svn] r36171 - in nmap: nbase nsock nsock/include nsock/src Daniel Miller (Aug 22)
- Re: [nmap-svn] r36171 - in nmap: nbase nsock nsock/include nsock/src Tudor-Emil COMAN (Aug 22)
- Re: [nmap-svn] r36171 - in nmap: nbase nsock nsock/include nsock/src Daniel Miller (Aug 22)
- Re: [nmap-svn] r36171 - in nmap: nbase nsock nsock/include nsock/src Tudor-Emil COMAN (Aug 22)
