mirror of
https://github.com/nmap/nmap.git
synced 2025-12-15 12:19:02 +00:00
Merged nsock-logging from nmap-exp/henri/nsock-logging/
Reworked the logging infrastructure to make it more flexible and consistent. Updated nmap, nping and ncat accordingly. Nsock log level can now be adjusted at runtime by pressing d/D in nmap.
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
# Nmap Changelog ($Id$); -*-text-*-
|
# Nmap Changelog ($Id$); -*-text-*-
|
||||||
|
|
||||||
|
o [Nsock] Reworked the logging infrastructure to make it more flexible
|
||||||
|
and consistent. Updated nmap, nping and ncat accordingly. Nsock log level
|
||||||
|
can now be adjusted at runtime by pressing d/D in nmap.
|
||||||
|
[Henri Doreau, David Fifield]
|
||||||
|
|
||||||
o [NSE] Fixed scripts using unconnected UDP sockets. The bug was
|
o [NSE] Fixed scripts using unconnected UDP sockets. The bug was
|
||||||
reported by Dhiru Kholia. [David Fifield]
|
reported by Dhiru Kholia. [David Fifield]
|
||||||
|
|
||||||
|
|||||||
10
FPEngine.cc
10
FPEngine.cc
@@ -157,12 +157,11 @@ void FPNetworkControl::init(const char *ifname, devtype iftype) {
|
|||||||
/* Create a new nsock pool */
|
/* Create a new nsock pool */
|
||||||
if ((this->nsp = nsp_new(NULL)) == NULL)
|
if ((this->nsp = nsp_new(NULL)) == NULL)
|
||||||
fatal("Unable to obtain an Nsock pool");
|
fatal("Unable to obtain an Nsock pool");
|
||||||
nsp_setdevice(nsp, o.device);
|
|
||||||
|
|
||||||
/* Set Trace level */
|
nsock_set_log_function(this->nsp, nmap_nsock_stderr_logger);
|
||||||
if (o.packetTrace()) {
|
nmap_adjust_loglevel(this->nsp, o.packetTrace());
|
||||||
nsp_settrace(this->nsp, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
|
|
||||||
}
|
nsp_setdevice(nsp, o.device);
|
||||||
|
|
||||||
/* Allow broadcast addresses */
|
/* Allow broadcast addresses */
|
||||||
nsp_setbroadcast(this->nsp, 1);
|
nsp_setbroadcast(this->nsp, 1);
|
||||||
@@ -384,6 +383,7 @@ int FPNetworkControl::setup_sniffer(const char *iface, const char *bpf_filter) {
|
|||||||
/* This method makes the controller process pending events (like packet
|
/* This method makes the controller process pending events (like packet
|
||||||
* transmissions or packet captures). */
|
* transmissions or packet captures). */
|
||||||
void FPNetworkControl::handle_events() {
|
void FPNetworkControl::handle_events() {
|
||||||
|
nmap_adjust_loglevel(nsp, o.packetTrace());
|
||||||
nsock_loop(nsp, 50);
|
nsock_loop(nsp, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,6 +112,7 @@
|
|||||||
<ClCompile Include="nbase_str.c" />
|
<ClCompile Include="nbase_str.c" />
|
||||||
<ClCompile Include="nbase_time.c" />
|
<ClCompile Include="nbase_time.c" />
|
||||||
<ClCompile Include="nbase_winunix.c" />
|
<ClCompile Include="nbase_winunix.c" />
|
||||||
|
<ClCompile Include="snprintf.c" />
|
||||||
<ClCompile Include="strcasecmp.c" />
|
<ClCompile Include="strcasecmp.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -132,7 +132,7 @@
|
|||||||
#define HAVE_GETNAMEINFO 1
|
#define HAVE_GETNAMEINFO 1
|
||||||
|
|
||||||
#define HAVE_SNPRINTF 1
|
#define HAVE_SNPRINTF 1
|
||||||
#define HAVE_VASPRINTF 1
|
// #undef HAVE_VASPRINTF
|
||||||
#define HAVE_VSNPRINTF 1
|
#define HAVE_VSNPRINTF 1
|
||||||
|
|
||||||
typedef unsigned __int8 uint8_t;
|
typedef unsigned __int8 uint8_t;
|
||||||
|
|||||||
@@ -492,9 +492,14 @@ int ncat_connect(void)
|
|||||||
if ((mypool = nsp_new(NULL)) == NULL)
|
if ((mypool = nsp_new(NULL)) == NULL)
|
||||||
bye("Failed to create nsock_pool.");
|
bye("Failed to create nsock_pool.");
|
||||||
|
|
||||||
if (o.debug > 1)
|
if (o.debug >= 6)
|
||||||
/* A trace level of 1 still gives you an awful lot. */
|
nsock_set_loglevel(mypool, NSOCK_LOG_DBG_ALL);
|
||||||
nsp_settrace(mypool, stderr, 1, nsock_gettimeofday());
|
else if (o.debug >= 3)
|
||||||
|
nsock_set_loglevel(mypool, NSOCK_LOG_DBG);
|
||||||
|
else if (o.debug >= 1)
|
||||||
|
nsock_set_loglevel(mypool, NSOCK_LOG_INFO);
|
||||||
|
else
|
||||||
|
nsock_set_loglevel(mypool, NSOCK_LOG_ERROR);
|
||||||
|
|
||||||
/* Allow connections to broadcast addresses. */
|
/* Allow connections to broadcast addresses. */
|
||||||
nsp_setbroadcast(mypool, 1);
|
nsp_setbroadcast(mypool, 1);
|
||||||
|
|||||||
16
nmap_dns.cc
16
nmap_dns.cc
@@ -1164,7 +1164,6 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
|
|||||||
int timeout;
|
int timeout;
|
||||||
char *tpname;
|
char *tpname;
|
||||||
int i;
|
int i;
|
||||||
bool lasttrace = false;
|
|
||||||
char spmobuf[1024];
|
char spmobuf[1024];
|
||||||
|
|
||||||
// If necessary, set up the dns server list
|
// If necessary, set up the dns server list
|
||||||
@@ -1209,10 +1208,11 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
|
|||||||
|
|
||||||
if ((dnspool = nsp_new(NULL)) == NULL)
|
if ((dnspool = nsp_new(NULL)) == NULL)
|
||||||
fatal("Unable to create nsock pool in %s()", __func__);
|
fatal("Unable to create nsock pool in %s()", __func__);
|
||||||
nsp_setdevice(dnspool, o.device);
|
|
||||||
|
|
||||||
if ((lasttrace = o.packetTrace()))
|
nsock_set_log_function(dnspool, nmap_nsock_stderr_logger);
|
||||||
nsp_settrace(dnspool, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
|
nmap_adjust_loglevel(dnspool, o.packetTrace());
|
||||||
|
|
||||||
|
nsp_setdevice(dnspool, o.device);
|
||||||
|
|
||||||
connect_dns_servers();
|
connect_dns_servers();
|
||||||
|
|
||||||
@@ -1231,12 +1231,8 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
|
|||||||
if (total_reqs <= 0) break;
|
if (total_reqs <= 0) break;
|
||||||
|
|
||||||
/* Because this can change with runtime interaction */
|
/* Because this can change with runtime interaction */
|
||||||
if (o.packetTrace() != lasttrace) {
|
nmap_adjust_loglevel(dnspool, o.packetTrace());
|
||||||
lasttrace = !lasttrace;
|
|
||||||
if (lasttrace)
|
|
||||||
nsp_settrace(dnspool, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
|
|
||||||
else nsp_settrace(dnspool, NULL, 0, o.getStartTime());
|
|
||||||
}
|
|
||||||
nsock_loop(dnspool, timeout);
|
nsock_loop(dnspool, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1419,10 +1419,10 @@ int EchoServer::start() {
|
|||||||
|
|
||||||
/* Set nsock trace level */
|
/* Set nsock trace level */
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
if( o.getDebugging() == DBG_5)
|
if( o.getDebugging() == DBG_5 )
|
||||||
nsp_settrace(nsp, NULL, 1 , &now);
|
nsock_set_loglevel(nsp, NSOCK_LOG_INFO);
|
||||||
else if( o.getDebugging() > DBG_5 )
|
else if( o.getDebugging() > DBG_5 )
|
||||||
nsp_settrace(nsp, NULL, 10 , &now);
|
nsock_set_loglevel(nsp, NSOCK_LOG_DBG_ALL);
|
||||||
|
|
||||||
/* Create new IOD for pcap */
|
/* Create new IOD for pcap */
|
||||||
if ((pcap_nsi = nsi_new(nsp, NULL)) == NULL)
|
if ((pcap_nsi = nsi_new(nsp, NULL)) == NULL)
|
||||||
|
|||||||
@@ -129,9 +129,9 @@ int ProbeMode::init_nsock(){
|
|||||||
/* Set nsock trace level */
|
/* Set nsock trace level */
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
if( o.getDebugging() == DBG_5)
|
if( o.getDebugging() == DBG_5)
|
||||||
nsp_settrace(nsp, NULL, 1 , &now);
|
nsock_set_loglevel(nsp, NSOCK_LOG_INFO);
|
||||||
else if( o.getDebugging() > DBG_5 )
|
else if( o.getDebugging() > DBG_5 )
|
||||||
nsp_settrace(nsp, NULL, 10 , &now);
|
nsock_set_loglevel(nsp, NSOCK_LOG_DBG_ALL);
|
||||||
/* Flag it as already inited so we don't do it again */
|
/* Flag it as already inited so we don't do it again */
|
||||||
nsock_init=true;
|
nsock_init=true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,8 +80,14 @@ static nsock_pool new_pool (lua_State *L)
|
|||||||
{
|
{
|
||||||
nsock_pool nsp = nsp_new(NULL);
|
nsock_pool nsp = nsp_new(NULL);
|
||||||
nsock_pool *nspp;
|
nsock_pool *nspp;
|
||||||
|
|
||||||
|
/* configure logging */
|
||||||
|
nsock_set_log_function(nsp, nmap_nsock_stderr_logger);
|
||||||
|
nmap_adjust_loglevel(nsp, o.scriptTrace());
|
||||||
|
|
||||||
nsp_setdevice(nsp, o.device);
|
nsp_setdevice(nsp, o.device);
|
||||||
nsp_setbroadcast(nsp, true);
|
nsp_setbroadcast(nsp, true);
|
||||||
|
|
||||||
nspp = (nsock_pool *) lua_newuserdata(L, sizeof(nsock_pool));
|
nspp = (nsock_pool *) lua_newuserdata(L, sizeof(nsock_pool));
|
||||||
*nspp = nsp;
|
*nspp = nsp;
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
@@ -408,6 +414,7 @@ static int l_loop (lua_State *L)
|
|||||||
|
|
||||||
socket_unlock(L); /* clean up old socket locks */
|
socket_unlock(L); /* clean up old socket locks */
|
||||||
|
|
||||||
|
nmap_adjust_loglevel(nsp, o.scriptTrace());
|
||||||
if (nsock_loop(nsp, tout) == NSOCK_LOOP_ERROR)
|
if (nsock_loop(nsp, tout) == NSOCK_LOOP_ERROR)
|
||||||
return luaL_error(L, "a fatal error occurred in nsock_loop");
|
return luaL_error(L, "a fatal error occurred in nsock_loop");
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1077,8 +1084,6 @@ LUALIB_API int luaopen_nsock (lua_State *L)
|
|||||||
nse_nsock_init_ssl_cert(L);
|
nse_nsock_init_ssl_cert(L);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (o.scriptTrace())
|
|
||||||
nsp_settrace(nsp, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
|
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
/* Value speed over security in SSL connections. */
|
/* Value speed over security in SSL connections. */
|
||||||
nsp_ssl_init_max_speed(nsp);
|
nsp_ssl_init_max_speed(nsp);
|
||||||
|
|||||||
@@ -75,6 +75,8 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#else
|
||||||
|
#include <winsock2.h> /* for struct timeval... */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_SYS_UN_H
|
#if HAVE_SYS_UN_H
|
||||||
@@ -130,6 +132,35 @@ typedef void *nsock_ssl_ctx;
|
|||||||
typedef void *nsock_ssl;
|
typedef void *nsock_ssl;
|
||||||
|
|
||||||
|
|
||||||
|
/* Logging-related data structures */
|
||||||
|
typedef enum {
|
||||||
|
NSOCK_LOG_DBG_ALL,
|
||||||
|
NSOCK_LOG_DBG,
|
||||||
|
NSOCK_LOG_INFO,
|
||||||
|
NSOCK_LOG_ERROR
|
||||||
|
} nsock_loglevel_t;
|
||||||
|
|
||||||
|
struct nsock_log_rec {
|
||||||
|
/* Message emission time */
|
||||||
|
struct timeval time;
|
||||||
|
/* Message log level */
|
||||||
|
nsock_loglevel_t level;
|
||||||
|
/* Source file */
|
||||||
|
const char *file;
|
||||||
|
/* Statement line in nsock source */
|
||||||
|
int line;
|
||||||
|
/* Function that emitted the message */
|
||||||
|
const char *func;
|
||||||
|
/* Actual log message */
|
||||||
|
char *msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Nsock logging function. This function receives all nsock log records whose
|
||||||
|
* level is greater than or equal to nsp loglevel. The rec structure is
|
||||||
|
* allocated and freed by nsock. */
|
||||||
|
typedef void (*nsock_logger_t)(nsock_pool nsp, const struct nsock_log_rec *rec);
|
||||||
|
|
||||||
|
|
||||||
/* ------------------- PROTOTYPES ------------------- */
|
/* ------------------- PROTOTYPES ------------------- */
|
||||||
|
|
||||||
/* Here is the all important looping function that tells the event
|
/* Here is the all important looping function that tells the event
|
||||||
@@ -232,6 +263,14 @@ nsock_pool nsp_new(void *userdata);
|
|||||||
* all outstanding iods are deleted. */
|
* all outstanding iods are deleted. */
|
||||||
void nsp_delete(nsock_pool nsp);
|
void nsp_delete(nsock_pool nsp);
|
||||||
|
|
||||||
|
/* Logging subsystem: set custom logging function.
|
||||||
|
* (See nsock_logger_t type definition). */
|
||||||
|
void nsock_set_log_function(nsock_pool nsp, nsock_logger_t logger);
|
||||||
|
|
||||||
|
nsock_loglevel_t nsock_get_loglevel(nsock_pool nsp);
|
||||||
|
void nsock_set_loglevel(nsock_pool nsp, nsock_loglevel_t loglevel);
|
||||||
|
|
||||||
|
|
||||||
/* nsock_event handles a single event. Its ID is generally returned when the
|
/* nsock_event handles a single event. Its ID is generally returned when the
|
||||||
* event is created, and the event itself is included in callbacks
|
* event is created, and the event itself is included in callbacks
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -195,6 +195,7 @@
|
|||||||
<ClCompile Include="src\nsock_engines.c" />
|
<ClCompile Include="src\nsock_engines.c" />
|
||||||
<ClCompile Include="src\nsock_event.c" />
|
<ClCompile Include="src\nsock_event.c" />
|
||||||
<ClCompile Include="src\nsock_iod.c" />
|
<ClCompile Include="src\nsock_iod.c" />
|
||||||
|
<ClCompile Include="src\nsock_log.c" />
|
||||||
<ClCompile Include="src\nsock_pcap.c" />
|
<ClCompile Include="src\nsock_pcap.c" />
|
||||||
<ClCompile Include="src\nsock_pool.c" />
|
<ClCompile Include="src\nsock_pool.c" />
|
||||||
<ClCompile Include="src\nsock_read.c" />
|
<ClCompile Include="src\nsock_read.c" />
|
||||||
@@ -209,6 +210,7 @@
|
|||||||
<ClInclude Include="src\netutils.h" />
|
<ClInclude Include="src\netutils.h" />
|
||||||
<ClInclude Include="include\nsock.h" />
|
<ClInclude Include="include\nsock.h" />
|
||||||
<ClInclude Include="src\nsock_internal.h" />
|
<ClInclude Include="src\nsock_internal.h" />
|
||||||
|
<ClInclude Include="src\nsock_log.h" />
|
||||||
<ClInclude Include="src\nsock_pcap.h" />
|
<ClInclude Include="src\nsock_pcap.h" />
|
||||||
<ClInclude Include="src\nsock_ssl.h" />
|
<ClInclude Include="src\nsock_ssl.h" />
|
||||||
<ClInclude Include="include\nsock_winconfig.h" />
|
<ClInclude Include="include\nsock_winconfig.h" />
|
||||||
@@ -222,4 +224,4 @@
|
|||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -27,11 +27,11 @@ NBASEDIR=@NBASEDIR@
|
|||||||
|
|
||||||
TARGET = libnsock.a
|
TARGET = libnsock.a
|
||||||
|
|
||||||
SRCS = error.c filespace.c gh_list.c nsock_connect.c nsock_core.c nsock_iod.c nsock_read.c nsock_timers.c nsock_write.c nsock_ssl.c nsock_event.c nsock_pool.c netutils.c nsock_pcap.c nsock_engines.c engine_select.c engine_epoll.c engine_kqueue.c engine_poll.c @COMPAT_SRCS@
|
SRCS = error.c filespace.c gh_list.c nsock_connect.c nsock_core.c nsock_iod.c nsock_read.c nsock_timers.c nsock_write.c nsock_ssl.c nsock_event.c nsock_pool.c netutils.c nsock_pcap.c nsock_engines.c engine_select.c engine_epoll.c engine_kqueue.c engine_poll.c nsock_log.c @COMPAT_SRCS@
|
||||||
|
|
||||||
OBJS = error.o filespace.o gh_list.o nsock_connect.o nsock_core.o nsock_iod.o nsock_read.o nsock_timers.o nsock_write.o nsock_ssl.o nsock_event.o nsock_pool.o netutils.o nsock_pcap.o nsock_engines.o engine_select.o engine_epoll.o engine_kqueue.o engine_poll.o @COMPAT_OBJS@
|
OBJS = error.o filespace.o gh_list.o nsock_connect.o nsock_core.o nsock_iod.o nsock_read.o nsock_timers.o nsock_write.o nsock_ssl.o nsock_event.o nsock_pool.o netutils.o nsock_pcap.o nsock_engines.o engine_select.o engine_epoll.o engine_kqueue.o engine_poll.o nsock_log.o @COMPAT_OBJS@
|
||||||
|
|
||||||
DEPS = error.h filespace.h gh_list.h nsock_internal.h netutils.h nsock_pcap.h ../include/nsock.h $(NBASEDIR)/libnbase.a
|
DEPS = error.h filespace.h gh_list.h nsock_internal.h netutils.h nsock_pcap.h nsock_log.h ../include/nsock.h $(NBASEDIR)/libnbase.a
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
|
||||||
|
|||||||
@@ -65,6 +65,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
#include "nsock_pcap.h"
|
#include "nsock_pcap.h"
|
||||||
@@ -260,8 +261,7 @@ int epoll_loop(mspool *nsp, int msec_timeout) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (nsp->tracelevel > 6)
|
nsock_log_debug_all(nsp, "wait_for_events");
|
||||||
nsock_trace(nsp, "wait_for_events");
|
|
||||||
|
|
||||||
if (nsp->next_ev.tv_sec == 0)
|
if (nsp->next_ev.tv_sec == 0)
|
||||||
event_msecs = -1; /* None of the events specified a timeout */
|
event_msecs = -1; /* None of the events specified a timeout */
|
||||||
@@ -305,7 +305,7 @@ int epoll_loop(mspool *nsp, int msec_timeout) {
|
|||||||
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
||||||
|
|
||||||
if (results_left == -1 && sock_err != EINTR) {
|
if (results_left == -1 && sock_err != EINTR) {
|
||||||
nsock_trace(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
nsock_log_error(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
||||||
nsp->errnum = sock_err;
|
nsp->errnum = sock_err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
#include "nsock_pcap.h"
|
#include "nsock_pcap.h"
|
||||||
@@ -236,8 +237,7 @@ int kqueue_loop(mspool *nsp, int msec_timeout) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (nsp->tracelevel > 6)
|
nsock_log_debug_all(nsp, "wait_for_events");
|
||||||
nsock_trace(nsp, "wait_for_events");
|
|
||||||
|
|
||||||
if (nsp->next_ev.tv_sec == 0)
|
if (nsp->next_ev.tv_sec == 0)
|
||||||
event_msecs = -1; /* None of the events specified a timeout */
|
event_msecs = -1; /* None of the events specified a timeout */
|
||||||
@@ -287,7 +287,7 @@ int kqueue_loop(mspool *nsp, int msec_timeout) {
|
|||||||
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
||||||
|
|
||||||
if (results_left == -1 && sock_err != EINTR) {
|
if (results_left == -1 && sock_err != EINTR) {
|
||||||
nsock_trace(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
nsock_log_error(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
||||||
nsp->errnum = sock_err;
|
nsp->errnum = sock_err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,7 @@
|
|||||||
#endif /* ^WIN32 */
|
#endif /* ^WIN32 */
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
#include "nsock_pcap.h"
|
#include "nsock_pcap.h"
|
||||||
@@ -310,8 +311,7 @@ int poll_loop(mspool *nsp, int msec_timeout) {
|
|||||||
return 0; /* No need to wait on 0 events ... */
|
return 0; /* No need to wait on 0 events ... */
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (nsp->tracelevel > 6)
|
nsock_log_debug_all(nsp, "wait_for_events");
|
||||||
nsock_trace(nsp, "wait_for_events");
|
|
||||||
|
|
||||||
if (nsp->next_ev.tv_sec == 0)
|
if (nsp->next_ev.tv_sec == 0)
|
||||||
event_msecs = -1; /* None of the events specified a timeout */
|
event_msecs = -1; /* None of the events specified a timeout */
|
||||||
@@ -355,7 +355,7 @@ int poll_loop(mspool *nsp, int msec_timeout) {
|
|||||||
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
||||||
|
|
||||||
if (results_left == -1 && sock_err != EINTR) {
|
if (results_left == -1 && sock_err != EINTR) {
|
||||||
nsock_trace(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
nsock_log_error(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
||||||
nsp->errnum = sock_err;
|
nsp->errnum = sock_err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
#include "nsock_pcap.h"
|
#include "nsock_pcap.h"
|
||||||
@@ -281,8 +282,7 @@ int select_loop(mspool *nsp, int msec_timeout) {
|
|||||||
return 0; /* No need to wait on 0 events ... */
|
return 0; /* No need to wait on 0 events ... */
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (nsp->tracelevel > 6)
|
nsock_log_debug_all(nsp, "wait_for_events");
|
||||||
nsock_trace(nsp, "wait_for_events");
|
|
||||||
|
|
||||||
if (nsp->next_ev.tv_sec == 0)
|
if (nsp->next_ev.tv_sec == 0)
|
||||||
event_msecs = -1; /* None of the events specified a timeout */
|
event_msecs = -1; /* None of the events specified a timeout */
|
||||||
@@ -343,7 +343,7 @@ int select_loop(mspool *nsp, int msec_timeout) {
|
|||||||
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
} while (results_left == -1 && sock_err == EINTR); /* repeat only if signal occurred */
|
||||||
|
|
||||||
if (results_left == -1 && sock_err != EINTR) {
|
if (results_left == -1 && sock_err != EINTR) {
|
||||||
nsock_trace(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
nsock_log_error(nsp, "nsock_loop error %d: %s", sock_err, socket_strerror(sock_err));
|
||||||
nsp->errnum = sock_err;
|
nsp->errnum = sock_err;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
|
|
||||||
#include "nsock.h"
|
#include "nsock.h"
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
#include "netutils.h"
|
#include "netutils.h"
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -85,41 +86,33 @@ static int nsock_make_socket(mspool *ms, msiod *iod, int family, int type, int p
|
|||||||
|
|
||||||
setsockopt(iod->sd, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one));
|
setsockopt(iod->sd, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one));
|
||||||
if (bind(iod->sd, (struct sockaddr *)&iod->local, (int) iod->locallen) == -1) {
|
if (bind(iod->sd, (struct sockaddr *)&iod->local, (int) iod->locallen) == -1) {
|
||||||
if (ms->tracelevel > 0) {
|
const char *addrstr = NULL;
|
||||||
const char *addrstr = NULL;
|
|
||||||
#if HAVE_SYS_UN_H
|
#if HAVE_SYS_UN_H
|
||||||
if (iod->local.ss_family == AF_UNIX)
|
if (iod->local.ss_family == AF_UNIX)
|
||||||
addrstr = get_unixsock_path(&iod->local);
|
addrstr = get_unixsock_path(&iod->local);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
addrstr = inet_ntop_ez(&iod->local, iod->locallen);
|
addrstr = inet_ntop_ez(&iod->local, iod->locallen);
|
||||||
|
|
||||||
nsock_trace(ms, "Bind to %s failed (IOD #%li)", addrstr, iod->id);
|
nsock_log_error(ms, "Bind to %s failed (IOD #%li)", addrstr, iod->id);
|
||||||
#if HAVE_SYS_UN_H
|
|
||||||
/* Failure to bind an AF_UNIX socket is an unrecoverable error. */
|
|
||||||
if (iod->local.ss_family == AF_UNIX)
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (iod->ipoptslen && family == AF_INET) {
|
if (iod->ipoptslen && family == AF_INET) {
|
||||||
if (setsockopt(iod->sd, IPPROTO_IP, IP_OPTIONS, (const char *)iod->ipopts, iod->ipoptslen) == -1) {
|
if (setsockopt(iod->sd, IPPROTO_IP, IP_OPTIONS, (const char *)iod->ipopts, iod->ipoptslen) == -1)
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_error(ms, "Setting of IP options failed (IOD #%li)", iod->id);
|
||||||
nsock_trace(ms, "Setting of IP options failed (IOD #%li)", iod->id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (ms->device) {
|
if (ms->device) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (!socket_bindtodevice(iod->sd, ms->device)) {
|
if (!socket_bindtodevice(iod->sd, ms->device)) {
|
||||||
if ((errno != EPERM && ms->tracelevel > 0) || ms->tracelevel > 5)
|
if (errno != EPERM)
|
||||||
nsock_trace(ms, "Setting of SO_BINDTODEVICE failed (IOD #%li)", iod->id);
|
nsock_log_error(ms, "Setting of SO_BINDTODEVICE failed (IOD #%li)", iod->id);
|
||||||
|
else
|
||||||
|
nsock_log_debug_all(ms, "Setting of SO_BINDTODEVICE failed (IOD #%li)", iod->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ms->broadcast) {
|
if (ms->broadcast) {
|
||||||
if (setsockopt(iod->sd, SOL_SOCKET, SO_BROADCAST, (const char *)&(ms->broadcast), sizeof(int)) == -1) {
|
if (setsockopt(iod->sd, SOL_SOCKET, SO_BROADCAST, (const char *)&(ms->broadcast), sizeof(int)) == -1) {
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_error(ms, "Setting of SO_BROADCAST failed (IOD #%li)", iod->id);
|
||||||
nsock_trace(ms, "Setting of SO_BROADCAST failed (IOD #%li)", iod->id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return iod->sd;
|
return iod->sd;
|
||||||
@@ -131,8 +124,7 @@ int nsock_setup_udp(nsock_pool nsp, nsock_iod ms_iod, int af) {
|
|||||||
|
|
||||||
assert(nsi->state == NSIOD_STATE_INITIAL || nsi->state == NSIOD_STATE_UNKNOWN);
|
assert(nsi->state == NSIOD_STATE_INITIAL || nsi->state == NSIOD_STATE_UNKNOWN);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "UDP unconnected socket (IOD #%li)", nsi->id);
|
||||||
nsock_trace(ms, "UDP unconnected socket (IOD #%li)", nsi->id);
|
|
||||||
|
|
||||||
if (nsock_make_socket(ms, nsi, af, SOCK_DGRAM, IPPROTO_UDP) == -1)
|
if (nsock_make_socket(ms, nsi, af, SOCK_DGRAM, IPPROTO_UDP) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -209,9 +201,8 @@ nsock_event_id nsock_connect_unixsock_stream(nsock_pool nsp, nsock_iod nsiod, ns
|
|||||||
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "UNIX domain socket (STREAM) connection requested to %s (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "UNIX domain socket (STREAM) connection requested to %s (IOD #%li) EID %li",
|
get_unixsock_path(ss), nsi->id, nse->id);
|
||||||
get_unixsock_path(ss), nsi->id, nse->id);
|
|
||||||
|
|
||||||
nsock_connect_internal(ms, nse, SOCK_STREAM, 0, ss, sslen, 0);
|
nsock_connect_internal(ms, nse, SOCK_STREAM, 0, ss, sslen, 0);
|
||||||
nsp_add_event(ms, nse);
|
nsp_add_event(ms, nse);
|
||||||
@@ -236,9 +227,8 @@ nsock_event_id nsock_connect_unixsock_datagram(nsock_pool nsp, nsock_iod nsiod,
|
|||||||
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, -1, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, -1, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "UNIX domain socket (DGRAM) connection requested to %s (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "UNIX domain socket (DGRAM) connection requested to %s (IOD #%li) EID %li",
|
get_unixsock_path(ss), nsi->id, nse->id);
|
||||||
get_unixsock_path(ss), nsi->id, nse->id);
|
|
||||||
|
|
||||||
nsock_connect_internal(ms, nse, SOCK_DGRAM, 0, ss, sslen, 0);
|
nsock_connect_internal(ms, nse, SOCK_DGRAM, 0, ss, sslen, 0);
|
||||||
nsp_add_event(ms, nse);
|
nsp_add_event(ms, nse);
|
||||||
@@ -266,9 +256,8 @@ nsock_event_id nsock_connect_tcp(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_hand
|
|||||||
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "TCP connection requested to %s:%hu (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "TCP connection requested to %s:%hu (IOD #%li) EID %li",
|
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
|
||||||
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
|
|
||||||
|
|
||||||
/* Do the actual connect() */
|
/* Do the actual connect() */
|
||||||
nsock_connect_internal(ms, nse, SOCK_STREAM, IPPROTO_TCP, ss, sslen, port);
|
nsock_connect_internal(ms, nse, SOCK_STREAM, IPPROTO_TCP, ss, sslen, port);
|
||||||
@@ -295,9 +284,8 @@ nsock_event_id nsock_connect_sctp(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_han
|
|||||||
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "SCTP association requested to %s:%hu (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "SCTP association requested to %s:%hu (IOD #%li) EID %li",
|
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
|
||||||
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
|
|
||||||
|
|
||||||
/* Do the actual connect() */
|
/* Do the actual connect() */
|
||||||
nsock_connect_internal(ms, nse, SOCK_STREAM, IPPROTO_SCTP, ss, sslen, port);
|
nsock_connect_internal(ms, nse, SOCK_STREAM, IPPROTO_SCTP, ss, sslen, port);
|
||||||
@@ -337,9 +325,9 @@ nsock_event_id nsock_connect_ssl(nsock_pool nsp, nsock_iod nsiod, nsock_ev_handl
|
|||||||
/* Set our SSL_SESSION so we can benefit from session-id reuse. */
|
/* Set our SSL_SESSION so we can benefit from session-id reuse. */
|
||||||
nsi_set_ssl_session(nsi, (SSL_SESSION *)ssl_session);
|
nsi_set_ssl_session(nsi, (SSL_SESSION *)ssl_session);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "SSL connection requested to %s:%hu/%s (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "SSL connection requested to %s:%hu/%s (IOD #%li) EID %li",
|
inet_ntop_ez(ss, sslen), port, (proto == IPPROTO_TCP ? "tcp" : "sctp"),
|
||||||
inet_ntop_ez(ss, sslen), port, (proto == IPPROTO_TCP ? "tcp" : "sctp"), nsi->id, nse->id);
|
nsi->id, nse->id);
|
||||||
|
|
||||||
/* Do the actual connect() */
|
/* Do the actual connect() */
|
||||||
nsock_connect_internal(ms, nse, SOCK_STREAM, proto, ss, sslen, port);
|
nsock_connect_internal(ms, nse, SOCK_STREAM, proto, ss, sslen, port);
|
||||||
@@ -373,8 +361,8 @@ nsock_event_id nsock_reconnect_ssl(nsock_pool nsp, nsock_iod nsiod, nsock_ev_han
|
|||||||
/* Set our SSL_SESSION so we can benefit from session-id reuse. */
|
/* Set our SSL_SESSION so we can benefit from session-id reuse. */
|
||||||
nsi_set_ssl_session(nsi, (SSL_SESSION *)ssl_session);
|
nsi_set_ssl_session(nsi, (SSL_SESSION *)ssl_session);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "SSL reconnection requested (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "SSL reconnection requested (IOD #%li) EID %li", nsi->id, nse->id);
|
nsi->id, nse->id);
|
||||||
|
|
||||||
/* Do the actual connect() */
|
/* Do the actual connect() */
|
||||||
nse->event_done = 0;
|
nse->event_done = 0;
|
||||||
@@ -412,8 +400,8 @@ nsock_event_id nsock_connect_udp(nsock_pool nsp, nsock_iod nsiod, nsock_ev_handl
|
|||||||
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, -1, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, -1, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "UDP connection requested to %s:%hu (IOD #%li) EID %li",
|
||||||
nsock_trace(ms, "UDP connection requested to %s:%hu (IOD #%li) EID %li", inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
|
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
|
||||||
|
|
||||||
nsock_connect_internal(ms, nse, SOCK_DGRAM, IPPROTO_UDP, ss, sslen, port);
|
nsock_connect_internal(ms, nse, SOCK_DGRAM, IPPROTO_UDP, ss, sslen, port);
|
||||||
nsp_add_event(ms, nse);
|
nsp_add_event(ms, nse);
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
#include "gh_list.h"
|
#include "gh_list.h"
|
||||||
#include "filespace.h"
|
#include "filespace.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#if HAVE_ERRNO_H
|
#if HAVE_ERRNO_H
|
||||||
@@ -425,7 +426,7 @@ void handle_connect_result(mspool *ms, msevent *nse, enum nse_status status) {
|
|||||||
if (iod->ssl_session) {
|
if (iod->ssl_session) {
|
||||||
rc = SSL_set_session(iod->ssl, iod->ssl_session);
|
rc = SSL_set_session(iod->ssl, iod->ssl_session);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
fprintf(stderr, "Uh-oh: SSL_set_session() failed - please tell Fyodor\n");
|
nsock_log_error(ms, "Uh-oh: SSL_set_session() failed - please tell nmap-dev@insecure.org\n");
|
||||||
iod->ssl_session = NULL; /* No need for this any more */
|
iod->ssl_session = NULL; /* No need for this any more */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,9 +447,8 @@ void handle_connect_result(mspool *ms, msevent *nse, enum nse_status status) {
|
|||||||
if (nsi_ssl_post_connect_verify(iod)) {
|
if (nsi_ssl_post_connect_verify(iod)) {
|
||||||
nse->status = NSE_STATUS_SUCCESS;
|
nse->status = NSE_STATUS_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_error(ms, "certificate verification error for EID %li: %s",
|
||||||
nsock_trace(ms, "certificate verification error for EID %li: %s",
|
nse->id, ERR_error_string(ERR_get_error(), NULL));
|
||||||
nse->id, ERR_error_string(ERR_get_error(), NULL));
|
|
||||||
nse->status = NSE_STATUS_ERROR;
|
nse->status = NSE_STATUS_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -471,8 +471,7 @@ void handle_connect_result(mspool *ms, msevent *nse, enum nse_status status) {
|
|||||||
* was initialized with nsp_ssl_init_max_speed. Try reconnecting with
|
* was initialized with nsp_ssl_init_max_speed. Try reconnecting with
|
||||||
* SSL_OP_NO_SSLv2. Never downgrade a NO_SSLv2 connection to one that
|
* SSL_OP_NO_SSLv2. Never downgrade a NO_SSLv2 connection to one that
|
||||||
* might use SSLv2. */
|
* might use SSLv2. */
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "EID %li reconnecting with SSL_OP_NO_SSLv2", nse->id);
|
||||||
nsock_trace(ms, "EID %li reconnecting with SSL_OP_NO_SSLv2", nse->id);
|
|
||||||
|
|
||||||
saved_ev = iod->watched_events;
|
saved_ev = iod->watched_events;
|
||||||
ms->engine->iod_unregister(ms, iod);
|
ms->engine->iod_unregister(ms, iod);
|
||||||
@@ -490,8 +489,8 @@ void handle_connect_result(mspool *ms, msevent *nse, enum nse_status status) {
|
|||||||
update_events(iod, ms, EV_READ|EV_WRITE, EV_NONE);
|
update_events(iod, ms, EV_READ|EV_WRITE, EV_NONE);
|
||||||
nse->sslinfo.ssl_desire = SSL_ERROR_WANT_CONNECT;
|
nse->sslinfo.ssl_desire = SSL_ERROR_WANT_CONNECT;
|
||||||
} else {
|
} else {
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "EID %li %s",
|
||||||
nsock_trace(ms, "EID %li %s", nse->id, ERR_error_string(ERR_get_error(), NULL));
|
nse->id, ERR_error_string(ERR_get_error(), NULL));
|
||||||
nse->event_done = 1;
|
nse->event_done = 1;
|
||||||
nse->status = NSE_STATUS_ERROR;
|
nse->status = NSE_STATUS_ERROR;
|
||||||
nse->errnum = EIO;
|
nse->errnum = EIO;
|
||||||
@@ -706,9 +705,8 @@ static int do_actual_read(mspool *ms, msevent *nse) {
|
|||||||
nse->event_done = 1;
|
nse->event_done = 1;
|
||||||
nse->status = NSE_STATUS_ERROR;
|
nse->status = NSE_STATUS_ERROR;
|
||||||
nse->errnum = EIO;
|
nse->errnum = EIO;
|
||||||
if (ms->tracelevel > 2)
|
nsock_log_info(ms, "SSL_read() failed for reason %s on NSI %li",
|
||||||
nsock_trace(ms, "SSL_read() failed for reason %s on NSI %li",
|
ERR_reason_error_string(err), iod->id);
|
||||||
ERR_reason_error_string(err), iod->id);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -884,14 +882,12 @@ enum nsock_loopstatus nsock_loop(nsock_pool nsp, int msec_timeout) {
|
|||||||
TIMEVAL_MSEC_ADD(loop_timeout, nsock_tod, msec_timeout);
|
TIMEVAL_MSEC_ADD(loop_timeout, nsock_tod, msec_timeout);
|
||||||
msecs_left = msec_timeout;
|
msecs_left = msec_timeout;
|
||||||
|
|
||||||
if (ms->tracelevel > 2) {
|
if (msec_timeout >= 0)
|
||||||
if (msec_timeout >= 0)
|
nsock_log_debug(ms, "nsock_loop() started (timeout=%dms). %d events pending",
|
||||||
nsock_trace(ms, "nsock_loop() started (timeout=%dms). %d events pending",
|
msec_timeout, ms->events_pending);
|
||||||
msec_timeout, ms->events_pending);
|
else
|
||||||
else
|
nsock_log_debug(ms, "nsock_loop() started (no timeout). %d events pending",
|
||||||
nsock_trace(ms, "nsock_loop() started (no timeout). %d events pending",
|
ms->events_pending);
|
||||||
ms->events_pending);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (ms->quit) {
|
if (ms->quit) {
|
||||||
@@ -935,8 +931,7 @@ void process_event(mspool *nsp, gh_list *evlist, msevent *nse, int ev) {
|
|||||||
int desire_r = 0, desire_w = 0;
|
int desire_r = 0, desire_w = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (nsp->tracelevel > 7)
|
nsock_log_debug_all(nsp, "Processing event %lu", nse->id);
|
||||||
nsock_trace(nsp, "Processing event %lu", nse->id);
|
|
||||||
|
|
||||||
if (!nse->event_done) {
|
if (!nse->event_done) {
|
||||||
switch(nse->type) {
|
switch(nse->type) {
|
||||||
@@ -989,8 +984,7 @@ void process_event(mspool *nsp, gh_list *evlist, msevent *nse, int ev) {
|
|||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
case NSE_TYPE_PCAP_READ:{
|
case NSE_TYPE_PCAP_READ:{
|
||||||
if (nsp->tracelevel > 5)
|
nsock_log_debug_all(nsp, "PCAP iterating %lu", nse->id);
|
||||||
nsock_trace(nsp, "PCAP iterating %lu", nse->id);
|
|
||||||
|
|
||||||
if (ev & EV_READ) {
|
if (ev & EV_READ) {
|
||||||
/* buffer empty? check it! */
|
/* buffer empty? check it! */
|
||||||
@@ -1017,14 +1011,12 @@ void process_event(mspool *nsp, gh_list *evlist, msevent *nse, int ev) {
|
|||||||
update_first_events(nse);
|
update_first_events(nse);
|
||||||
gh_list_remove(&nsp->pcap_read_events, nse);
|
gh_list_remove(&nsp->pcap_read_events, nse);
|
||||||
|
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Removing event from PCAP_READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from PCAP_READ_EVENTS", nse->id);
|
|
||||||
}
|
}
|
||||||
if (((mspcap *)nse->iod->pcap)->pcap_desc >= 0 && nse->event_done && evlist == &nsp->pcap_read_events) {
|
if (((mspcap *)nse->iod->pcap)->pcap_desc >= 0 && nse->event_done && evlist == &nsp->pcap_read_events) {
|
||||||
update_first_events(nse);
|
update_first_events(nse);
|
||||||
gh_list_remove(&nsp->read_events, nse);
|
gh_list_remove(&nsp->read_events, nse);
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -1040,8 +1032,7 @@ void process_event(mspool *nsp, gh_list *evlist, msevent *nse, int ev) {
|
|||||||
if (nse->type == NSE_TYPE_CONNECT_SSL && nse->status == NSE_STATUS_SUCCESS)
|
if (nse->type == NSE_TYPE_CONNECT_SSL && nse->status == NSE_STATUS_SUCCESS)
|
||||||
assert(nse->iod->ssl != NULL);
|
assert(nse->iod->ssl != NULL);
|
||||||
|
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "NSE #%lu: Sending event", nse->id);
|
||||||
nsock_trace(nsp, "NSE #%lu: Sending event", nse->id);
|
|
||||||
|
|
||||||
/* WooHoo! The event is ready to be sent */
|
/* WooHoo! The event is ready to be sent */
|
||||||
msevent_dispatch_and_delete(nsp, nse, 1);
|
msevent_dispatch_and_delete(nsp, nse, 1);
|
||||||
@@ -1141,8 +1132,7 @@ const struct timeval *nsock_gettimeofday() {
|
|||||||
* adjusting the descriptor select/poll lists, registering the timeout value,
|
* adjusting the descriptor select/poll lists, registering the timeout value,
|
||||||
* etc. */
|
* etc. */
|
||||||
void nsp_add_event(mspool *nsp, msevent *nse) {
|
void nsp_add_event(mspool *nsp, msevent *nse) {
|
||||||
if (nsp->tracelevel > 5)
|
nsock_log_debug(nsp, "NSE #%lu: Adding event", nse->id);
|
||||||
nsock_trace(nsp, "NSE #%lu: Adding event", nse->id);
|
|
||||||
|
|
||||||
/* First lets do the event-type independent stuff, starting with timeouts */
|
/* First lets do the event-type independent stuff, starting with timeouts */
|
||||||
if (nse->event_done) {
|
if (nse->event_done) {
|
||||||
@@ -1211,20 +1201,17 @@ void nsp_add_event(mspool *nsp, msevent *nse) {
|
|||||||
socket_count_readpcap_inc(nse->iod);
|
socket_count_readpcap_inc(nse->iod);
|
||||||
update_events(nse->iod, nsp, EV_READ, EV_NONE);
|
update_events(nse->iod, nsp, EV_READ, EV_NONE);
|
||||||
}
|
}
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Adding event to READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Adding event to READ_EVENTS", nse->id);
|
|
||||||
|
|
||||||
#if PCAP_BSD_SELECT_HACK
|
#if PCAP_BSD_SELECT_HACK
|
||||||
/* when using BSD hack we must do pcap_next() after select().
|
/* when using BSD hack we must do pcap_next() after select().
|
||||||
* Let's insert this pcap to bot queues, to selectable and nonselectable.
|
* Let's insert this pcap to bot queues, to selectable and nonselectable.
|
||||||
* This will result in doing pcap_next_ex() just before select() */
|
* This will result in doing pcap_next_ex() just before select() */
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* pcap isn't selectable. Add it to pcap-specific queue. */
|
/* pcap isn't selectable. Add it to pcap-specific queue. */
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
|
|
||||||
}
|
}
|
||||||
iod_add_event(nse->iod, nse);
|
iod_add_event(nse->iod, nse);
|
||||||
break;
|
break;
|
||||||
@@ -1237,20 +1224,6 @@ void nsp_add_event(mspool *nsp, msevent *nse) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsock_trace(mspool *ms, char *fmt, ...) {
|
|
||||||
va_list ap;
|
|
||||||
int elapsed_time_ms;
|
|
||||||
|
|
||||||
assert(ms->tracefile != NULL);
|
|
||||||
elapsed_time_ms = TIMEVAL_MSEC_SUBTRACT(nsock_tod, ms->tracebasetime);
|
|
||||||
va_start(ap, fmt);
|
|
||||||
fflush(ms->tracefile);
|
|
||||||
fprintf(ms->tracefile, "NSOCK (%.4fs) ", elapsed_time_ms / 1000.0);
|
|
||||||
vfprintf(ms->tracefile, fmt, ap);
|
|
||||||
fprintf(ms->tracefile, "\n");
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* An event has been completed and the handler is about to be called. This
|
/* An event has been completed and the handler is about to be called. This
|
||||||
* function writes out tracing data about the event if necessary */
|
* function writes out tracing data about the event if necessary */
|
||||||
void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
|
void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
|
||||||
@@ -1260,7 +1233,7 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
|
|||||||
char displaystr[256];
|
char displaystr[256];
|
||||||
char errstr[256];
|
char errstr[256];
|
||||||
|
|
||||||
if (ms->tracelevel == 0)
|
if (ms->loglevel > NSOCK_LOG_INFO)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nsi = nse->iod;
|
nsi = nse->iod;
|
||||||
@@ -1274,25 +1247,25 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
|
|||||||
switch(nse->type) {
|
switch(nse->type) {
|
||||||
case NSE_TYPE_CONNECT:
|
case NSE_TYPE_CONNECT:
|
||||||
case NSE_TYPE_CONNECT_SSL:
|
case NSE_TYPE_CONNECT_SSL:
|
||||||
nsock_trace(ms, "Callback: %s %s %sfor EID %li [%s]",
|
nsock_log_info(ms, "Callback: %s %s %sfor EID %li [%s]",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status),
|
nse_type2str(nse->type), nse_status2str(nse->status),
|
||||||
errstr, nse->id, get_peeraddr_string(nsi));
|
errstr, nse->id, get_peeraddr_string(nsi));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NSE_TYPE_READ:
|
case NSE_TYPE_READ:
|
||||||
if (nse->status != NSE_STATUS_SUCCESS) {
|
if (nse->status != NSE_STATUS_SUCCESS) {
|
||||||
if (nsi->peerlen > 0) {
|
if (nsi->peerlen > 0) {
|
||||||
nsock_trace(ms, "Callback: %s %s %sfor EID %li [%s]",
|
nsock_log_info(ms, "Callback: %s %s %sfor EID %li [%s]",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status),
|
nse_type2str(nse->type), nse_status2str(nse->status),
|
||||||
errstr, nse->id, get_peeraddr_string(nsi));
|
errstr, nse->id, get_peeraddr_string(nsi));
|
||||||
} else {
|
} else {
|
||||||
nsock_trace(ms, "Callback: %s %s %sfor EID %li (peer unspecified)",
|
nsock_log_info(ms, "Callback: %s %s %sfor EID %li (peer unspecified)",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status),
|
nse_type2str(nse->type), nse_status2str(nse->status),
|
||||||
errstr, nse->id);
|
errstr, nse->id);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
str = nse_readbuf(nse, &strlength);
|
str = nse_readbuf(nse, &strlength);
|
||||||
if (ms->tracelevel > 1 && strlength < 80) {
|
if (strlength < 80) {
|
||||||
memcpy(displaystr, ": ", 2);
|
memcpy(displaystr, ": ", 2);
|
||||||
memcpy(displaystr + 2, str, strlength);
|
memcpy(displaystr + 2, str, strlength);
|
||||||
displaystr[2 + strlength] = '\0';
|
displaystr[2 + strlength] = '\0';
|
||||||
@@ -1302,35 +1275,35 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (nsi->peerlen > 0) {
|
if (nsi->peerlen > 0) {
|
||||||
nsock_trace(ms, "Callback: %s %s for EID %li [%s] %s(%d bytes)%s",
|
nsock_log_info(ms, "Callback: %s %s for EID %li [%s] %s(%d bytes)%s",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status),
|
nse_type2str(nse->type), nse_status2str(nse->status),
|
||||||
nse->id, get_peeraddr_string(nsi),
|
nse->id, get_peeraddr_string(nsi),
|
||||||
nse_eof(nse)? "[EOF]" : "", strlength, displaystr);
|
nse_eof(nse)? "[EOF]" : "", strlength, displaystr);
|
||||||
} else {
|
} else {
|
||||||
nsock_trace(ms, "Callback %s %s for EID %li (peer unspecified) %s(%d bytes)%s",
|
nsock_log_info(ms, "Callback %s %s for EID %li (peer unspecified) %s(%d bytes)%s",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status),
|
nse_type2str(nse->type), nse_status2str(nse->status),
|
||||||
nse->id, nse_eof(nse)? "[EOF]" : "", strlength, displaystr);
|
nse->id, nse_eof(nse)? "[EOF]" : "", strlength, displaystr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NSE_TYPE_WRITE:
|
case NSE_TYPE_WRITE:
|
||||||
nsock_trace(ms, "Callback: %s %s %sfor EID %li [%s]",
|
nsock_log_info(ms, "Callback: %s %s %sfor EID %li [%s]",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status), errstr,
|
nse_type2str(nse->type), nse_status2str(nse->status), errstr,
|
||||||
nse->id, get_peeraddr_string(nsi));
|
nse->id, get_peeraddr_string(nsi));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NSE_TYPE_TIMER:
|
case NSE_TYPE_TIMER:
|
||||||
nsock_trace(ms, "Callback: %s %s %sfor EID %li",
|
nsock_log_info(ms, "Callback: %s %s %sfor EID %li",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status), errstr,
|
nse_type2str(nse->type), nse_status2str(nse->status), errstr,
|
||||||
nse->id);
|
nse->id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
case NSE_TYPE_PCAP_READ:
|
case NSE_TYPE_PCAP_READ:
|
||||||
nsock_trace(ms, "Callback: %s %s %sfor EID %li ",
|
nsock_log_info(ms, "Callback: %s %s %sfor EID %li ",
|
||||||
nse_type2str(nse->type), nse_status2str(nse->status),
|
nse_type2str(nse->type), nse_status2str(nse->status),
|
||||||
errstr, nse->id);
|
errstr, nse->id);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
#include "gh_list.h"
|
#include "gh_list.h"
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
@@ -187,9 +188,7 @@ int nsock_event_cancel(nsock_pool ms_pool, nsock_event_id id, int notify ) {
|
|||||||
assert(nsp);
|
assert(nsp);
|
||||||
|
|
||||||
type = get_event_id_type(id);
|
type = get_event_id_type(id);
|
||||||
if (nsp->tracelevel > 0) {
|
nsock_log_info(nsp, "Event #%li (type %s) cancelled", id, nse_type2str(type));
|
||||||
nsock_trace(nsp, "Event #%li (type %s) cancelled", id, nse_type2str(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* First we figure out what list it is in */
|
/* First we figure out what list it is in */
|
||||||
switch(type) {
|
switch(type) {
|
||||||
@@ -258,8 +257,7 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nsp->tracelevel > 0)
|
nsock_log_info(nsp, "msevent_cancel on event #%li (type %s)", nse->id, nse_type2str(nse->type));
|
||||||
nsock_trace(nsp, "msevent_cancel on event #%li (type %s)", nse->id, nse_type2str(nse->type));
|
|
||||||
|
|
||||||
/* Now that we found the event... we go through the motions of cleanly
|
/* Now that we found the event... we go through the motions of cleanly
|
||||||
* cancelling it */
|
* cancelling it */
|
||||||
@@ -295,16 +293,14 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
|
|||||||
update_first_events(nse);
|
update_first_events(nse);
|
||||||
gh_list_remove_elem(event_list, elem);
|
gh_list_remove_elem(event_list, elem);
|
||||||
|
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "NSE #%lu: Removing event from list", nse->id);
|
||||||
nsock_trace(nsp, "NSE #%lu: Removing event from list", nse->id);
|
|
||||||
|
|
||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
#if PCAP_BSD_SELECT_HACK
|
#if PCAP_BSD_SELECT_HACK
|
||||||
if (nse->type == NSE_TYPE_PCAP_READ) {
|
if (nse->type == NSE_TYPE_PCAP_READ) {
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: CANCEL TEST pcap=%p read=%p curr=%p sd=%i",
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: CANCEL TEST pcap=%p read=%p curr=%p sd=%i",
|
nse->id, &nsp->pcap_read_events, &nsp->read_events,
|
||||||
nse->id, &nsp->pcap_read_events, &nsp->read_events,
|
event_list,((mspcap *)nse->iod->pcap)->pcap_desc);
|
||||||
event_list,((mspcap *)nse->iod->pcap)->pcap_desc);
|
|
||||||
|
|
||||||
/* If event occurred, and we're in BSD_HACK mode, then this event was added to
|
/* If event occurred, and we're in BSD_HACK mode, then this event was added to
|
||||||
* two queues. read_event and pcap_read_event Of course we should
|
* two queues. read_event and pcap_read_event Of course we should
|
||||||
@@ -314,8 +310,7 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
|
|||||||
/* event is done, list is read_events and we're in BSD_HACK mode. So unlink
|
/* event is done, list is read_events and we're in BSD_HACK mode. So unlink
|
||||||
* event from pcap_read_events */
|
* event from pcap_read_events */
|
||||||
gh_list_remove(&nsp->pcap_read_events, nse);
|
gh_list_remove(&nsp->pcap_read_events, nse);
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Removing event from PCAP_READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from PCAP_READ_EVENTS", nse->id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((mspcap *)nse->iod->pcap)->pcap_desc >= 0 && event_list == &nsp->pcap_read_events) {
|
if (((mspcap *)nse->iod->pcap)->pcap_desc >= 0 && event_list == &nsp->pcap_read_events) {
|
||||||
@@ -323,8 +318,7 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
|
|||||||
* So unlink event from read_events */
|
* So unlink event from read_events */
|
||||||
gh_list_remove(&nsp->read_events, nse);
|
gh_list_remove(&nsp->read_events, nse);
|
||||||
|
|
||||||
if (nsp->tracelevel > 8)
|
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
|
||||||
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -446,12 +440,10 @@ msevent *msevent_new(mspool *nsp, enum nse_type type, msiod *msiod, int timeout_
|
|||||||
nse->userdata = userdata;
|
nse->userdata = userdata;
|
||||||
nse->time_created = nsock_tod;
|
nse->time_created = nsock_tod;
|
||||||
|
|
||||||
if (nsp->tracelevel > 3) {
|
|
||||||
if (nse->iod == NULL)
|
if (nse->iod == NULL)
|
||||||
nsock_trace(nsp, "msevent_new (IOD #NULL) (EID #%li)", nse->id);
|
nsock_log_debug(nsp, "msevent_new (IOD #NULL) (EID #%li)", nse->id);
|
||||||
else
|
else
|
||||||
nsock_trace(nsp, "msevent_new (IOD #%li) (EID #%li)", nse->iod->id, nse->id);
|
nsock_log_debug(nsp, "msevent_new (IOD #%li) (EID #%li)", nse->iod->id, nse->id);
|
||||||
}
|
|
||||||
return nse;
|
return nse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,12 +453,10 @@ msevent *msevent_new(mspool *nsp, enum nse_type type, msiod *msiod, int timeout_
|
|||||||
* remember to do this if you call msevent_delete() directly */
|
* remember to do this if you call msevent_delete() directly */
|
||||||
void msevent_delete(mspool *nsp, msevent *nse) {
|
void msevent_delete(mspool *nsp, msevent *nse) {
|
||||||
|
|
||||||
if (nsp->tracelevel > 3) {
|
if (nse->iod == NULL)
|
||||||
if (nse->iod == NULL)
|
nsock_log_debug(nsp, "msevent_delete (IOD #NULL) (EID #%li)", nse->id);
|
||||||
nsock_trace(nsp, "msevent_delete (IOD #NULL) (EID #%li)", nse->id);
|
else
|
||||||
else
|
nsock_log_debug(nsp, "msevent_delete (IOD #%li) (EID #%li)", nse->iod->id, nse->id);
|
||||||
nsock_trace(nsp, "msevent_delete (IOD #%li) (EID #%li)", nse->iod->id, nse->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* First free the IOBuf inside it if neccessary */
|
/* First free the IOBuf inside it if neccessary */
|
||||||
if (nse->type == NSE_TYPE_READ || nse->type == NSE_TYPE_WRITE) {
|
if (nse->type == NSE_TYPE_READ || nse->type == NSE_TYPE_WRITE) {
|
||||||
@@ -475,8 +465,7 @@ void msevent_delete(mspool *nsp, msevent *nse) {
|
|||||||
#if HAVE_PCAP
|
#if HAVE_PCAP
|
||||||
if (nse->type == NSE_TYPE_PCAP_READ) {
|
if (nse->type == NSE_TYPE_PCAP_READ) {
|
||||||
fs_free(&nse->iobuf);
|
fs_free(&nse->iobuf);
|
||||||
if (nsp->tracelevel > 5)
|
nsock_log_debug_all(nsp, "PCAP removed %lu", nse->id);
|
||||||
nsock_trace(nsp, "PCAP removed %lu",nse->id);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -199,12 +199,9 @@ typedef struct {
|
|||||||
* error (errnum fashion) */
|
* error (errnum fashion) */
|
||||||
int errnum;
|
int errnum;
|
||||||
|
|
||||||
/* Trace/debug level - set by nsp_settrace. If positive, trace logs are
|
/* Logging information. */
|
||||||
* printted to tracefile. */
|
nsock_logger_t logger;
|
||||||
int tracelevel;
|
nsock_loglevel_t loglevel;
|
||||||
FILE *tracefile;
|
|
||||||
/* This time is subtracted from the current time for trace reports */
|
|
||||||
struct timeval tracebasetime;
|
|
||||||
|
|
||||||
/* If true, new sockets will have SO_BROADCAST set */
|
/* If true, new sockets will have SO_BROADCAST set */
|
||||||
int broadcast;
|
int broadcast;
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
|
|
||||||
#include "nsock.h"
|
#include "nsock.h"
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
#include "gh_list.h"
|
#include "gh_list.h"
|
||||||
#include "netutils.h"
|
#include "netutils.h"
|
||||||
|
|
||||||
@@ -143,8 +144,7 @@ nsock_iod nsi_new2(nsock_pool nsockp, int sd, void *userdata) {
|
|||||||
/* The nsp keeps track of active msiods so it can delete them if it is deleted */
|
/* The nsp keeps track of active msiods so it can delete them if it is deleted */
|
||||||
nsi->entry_in_nsp_active_iods = gh_list_append(&nsp->active_iods, nsi);
|
nsi->entry_in_nsp_active_iods = gh_list_append(&nsp->active_iods, nsi);
|
||||||
|
|
||||||
if (nsp->tracelevel > 1)
|
nsock_log_info(nsp, "nsi_new (IOD #%lu)", nsi->id);
|
||||||
nsock_trace(nsp, "nsi_new (IOD #%lu)", nsi->id);
|
|
||||||
|
|
||||||
return (nsock_iod)nsi;
|
return (nsock_iod)nsi;
|
||||||
}
|
}
|
||||||
@@ -175,8 +175,7 @@ void nsi_delete(nsock_iod nsockiod, int pending_response) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nsi->nsp->tracelevel > 1)
|
nsock_log_info(nsi->nsp, "nsi_delete (IOD #%lu)", nsi->id);
|
||||||
nsock_trace(nsi->nsp, "nsi_delete (IOD #%lu)", nsi->id);
|
|
||||||
|
|
||||||
if (nsi->events_pending > 0) {
|
if (nsi->events_pending > 0) {
|
||||||
/* shit -- they killed the msiod while an event was still pending on it.
|
/* shit -- they killed the msiod while an event was still pending on it.
|
||||||
@@ -232,10 +231,8 @@ void nsi_delete(nsock_iod nsockiod, int pending_response) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (SSL_shutdown(nsi->ssl) == -1) {
|
if (SSL_shutdown(nsi->ssl) == -1) {
|
||||||
|
nsock_log_info(nsi->nsp, "nsi_delete: SSL shutdown failed (%s) on NSI %li",
|
||||||
if (nsi->nsp->tracelevel > 1)
|
ERR_reason_error_string(SSL_get_error(nsi->ssl, -1)), nsi->id);
|
||||||
nsock_trace(nsi->nsp, "nsi_delete: SSL shutdown failed (%s) on NSI %li",
|
|
||||||
ERR_reason_error_string(SSL_get_error(nsi->ssl, -1)), nsi->id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* I don't really care if the SSL_shutdown() succeeded politely. I could
|
/* I don't really care if the SSL_shutdown() succeeded politely. I could
|
||||||
|
|||||||
120
nsock/src/nsock_log.c
Normal file
120
nsock/src/nsock_log.c
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* nsock_log.c -- nsock logging infrastructure. *
|
||||||
|
* *
|
||||||
|
***********************IMPORTANT NSOCK LICENSE TERMS***********************
|
||||||
|
* *
|
||||||
|
* The nsock parallel socket event library is (C) 1999-2012 Insecure.Com *
|
||||||
|
* LLC This library is free software; you may redistribute and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License as *
|
||||||
|
* published by the Free Software Foundation; Version 2. This guarantees *
|
||||||
|
* your right to use, modify, and redistribute this software under certain *
|
||||||
|
* conditions. If this license is unacceptable to you, Insecure.Com LLC *
|
||||||
|
* may be willing to sell alternative licenses (contact *
|
||||||
|
* sales@insecure.com ). *
|
||||||
|
* *
|
||||||
|
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||||
|
* permission to link the code of this program with any version of the *
|
||||||
|
* OpenSSL library which is distributed under a license identical to that *
|
||||||
|
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||||
|
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||||
|
* respects for all of the code used other than OpenSSL. If you modify *
|
||||||
|
* this file, you may extend this exception to your version of the file, *
|
||||||
|
* but you are not obligated to do so. *
|
||||||
|
* *
|
||||||
|
* If you received these files with a written license agreement stating *
|
||||||
|
* terms other than the (GPL) terms above, then that alternative license *
|
||||||
|
* agreement takes precedence over this comment. *
|
||||||
|
* *
|
||||||
|
* Source is provided to this software because we believe users have a *
|
||||||
|
* right to know exactly what a program is going to do before they run it. *
|
||||||
|
* This also allows you to audit the software for security holes (none *
|
||||||
|
* have been found so far). *
|
||||||
|
* *
|
||||||
|
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||||
|
* and add new features. You are highly encouraged to send your changes *
|
||||||
|
* to the dev@nmap.org mailing list for possible incorporation into the *
|
||||||
|
* main distribution. By sending these changes to Fyodor or one of the *
|
||||||
|
* Insecure.Org development mailing lists, or checking them into the Nmap *
|
||||||
|
* source code repository, it is understood (unless you specify otherwise) *
|
||||||
|
* that you are offering the Nmap Project (Insecure.Com LLC) the *
|
||||||
|
* unlimited, non-exclusive right to reuse, modify, and relicense the *
|
||||||
|
* code. Nmap will always be available Open Source, but this is important *
|
||||||
|
* because the inability to relicense code has caused devastating problems *
|
||||||
|
* for other Free Software projects (such as KDE and NASM). We also *
|
||||||
|
* occasionally relicense the code to third parties as discussed above. *
|
||||||
|
* If you wish to specify special license conditions of your *
|
||||||
|
* contributions, just say so when you send them. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, but *
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||||
|
* General Public License v2.0 for more details *
|
||||||
|
* (http://www.gnu.org/licenses/gpl-2.0.html). *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
|
extern struct timeval nsock_tod;
|
||||||
|
|
||||||
|
|
||||||
|
void nsock_set_log_function(nsock_pool nsp, nsock_logger_t logger) {
|
||||||
|
mspool *ms = (mspool *)nsp;
|
||||||
|
|
||||||
|
ms->logger = logger;
|
||||||
|
nsock_log_debug(ms, "Registered external logging function: %p", logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
nsock_loglevel_t nsock_get_loglevel(nsock_pool nsp) {
|
||||||
|
mspool *ms = (mspool *)nsp;
|
||||||
|
|
||||||
|
return ms->loglevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nsock_set_loglevel(nsock_pool nsp, nsock_loglevel_t loglevel) {
|
||||||
|
mspool *ms = (mspool *)nsp;
|
||||||
|
|
||||||
|
ms->loglevel = loglevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nsock_stderr_logger(nsock_pool nsp, const struct nsock_log_rec *rec) {
|
||||||
|
fprintf(stderr, "libnsock %s(): %s\n", rec->func, rec->msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __nsock_log_internal(nsock_pool nsp, nsock_loglevel_t loglevel,
|
||||||
|
const char *file, int line, const char *func,
|
||||||
|
const char *format, ...) {
|
||||||
|
struct nsock_log_rec rec;
|
||||||
|
va_list args;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
va_start(args, format);
|
||||||
|
|
||||||
|
rec.level = loglevel;
|
||||||
|
rec.time = nsock_tod;
|
||||||
|
rec.file = file;
|
||||||
|
rec.line = line;
|
||||||
|
rec.func = func;
|
||||||
|
|
||||||
|
rc = vasprintf(&rec.msg, format, args);
|
||||||
|
if (rc >= 0) {
|
||||||
|
mspool *ms = (mspool *)nsp;
|
||||||
|
|
||||||
|
ms->logger(nsp, &rec);
|
||||||
|
free(rec.msg);
|
||||||
|
}
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
103
nsock/src/nsock_log.h
Normal file
103
nsock/src/nsock_log.h
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* nsock_log.c -- nsock logging infrastructure. *
|
||||||
|
* *
|
||||||
|
***********************IMPORTANT NSOCK LICENSE TERMS***********************
|
||||||
|
* *
|
||||||
|
* The nsock parallel socket event library is (C) 1999-2012 Insecure.Com *
|
||||||
|
* LLC This library is free software; you may redistribute and/or *
|
||||||
|
* modify it under the terms of the GNU General Public License as *
|
||||||
|
* published by the Free Software Foundation; Version 2. This guarantees *
|
||||||
|
* your right to use, modify, and redistribute this software under certain *
|
||||||
|
* conditions. If this license is unacceptable to you, Insecure.Com LLC *
|
||||||
|
* may be willing to sell alternative licenses (contact *
|
||||||
|
* sales@insecure.com ). *
|
||||||
|
* *
|
||||||
|
* As a special exception to the GPL terms, Insecure.Com LLC grants *
|
||||||
|
* permission to link the code of this program with any version of the *
|
||||||
|
* OpenSSL library which is distributed under a license identical to that *
|
||||||
|
* listed in the included docs/licenses/OpenSSL.txt file, and distribute *
|
||||||
|
* linked combinations including the two. You must obey the GNU GPL in all *
|
||||||
|
* respects for all of the code used other than OpenSSL. If you modify *
|
||||||
|
* this file, you may extend this exception to your version of the file, *
|
||||||
|
* but you are not obligated to do so. *
|
||||||
|
* *
|
||||||
|
* If you received these files with a written license agreement stating *
|
||||||
|
* terms other than the (GPL) terms above, then that alternative license *
|
||||||
|
* agreement takes precedence over this comment. *
|
||||||
|
* *
|
||||||
|
* Source is provided to this software because we believe users have a *
|
||||||
|
* right to know exactly what a program is going to do before they run it. *
|
||||||
|
* This also allows you to audit the software for security holes (none *
|
||||||
|
* have been found so far). *
|
||||||
|
* *
|
||||||
|
* Source code also allows you to port Nmap to new platforms, fix bugs, *
|
||||||
|
* and add new features. You are highly encouraged to send your changes *
|
||||||
|
* to the dev@nmap.org mailing list for possible incorporation into the *
|
||||||
|
* main distribution. By sending these changes to Fyodor or one of the *
|
||||||
|
* Insecure.Org development mailing lists, or checking them into the Nmap *
|
||||||
|
* source code repository, it is understood (unless you specify otherwise) *
|
||||||
|
* that you are offering the Nmap Project (Insecure.Com LLC) the *
|
||||||
|
* unlimited, non-exclusive right to reuse, modify, and relicense the *
|
||||||
|
* code. Nmap will always be available Open Source, but this is important *
|
||||||
|
* because the inability to relicense code has caused devastating problems *
|
||||||
|
* for other Free Software projects (such as KDE and NASM). We also *
|
||||||
|
* occasionally relicense the code to third parties as discussed above. *
|
||||||
|
* If you wish to specify special license conditions of your *
|
||||||
|
* contributions, just say so when you send them. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, but *
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
||||||
|
* General Public License v2.0 for more details *
|
||||||
|
* (http://www.gnu.org/licenses/gpl-2.0.html). *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NSOCK_LOG_H
|
||||||
|
#define NSOCK_LOG_H
|
||||||
|
|
||||||
|
#include "nsock.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define NSOCK_LOG_WRAP(nsp, lvl, ...) \
|
||||||
|
do { \
|
||||||
|
if ((nsp)->logger && (lvl) >= (nsp)->loglevel) { \
|
||||||
|
__nsock_log_internal((nsp), (lvl), __FILE__, __LINE__, __func__, __VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
/* -- Internal logging macros -- */
|
||||||
|
/**
|
||||||
|
* Most detailed debug messages, like allocating or moving objects.
|
||||||
|
*/
|
||||||
|
#define nsock_log_debug_all(nsp, ...) NSOCK_LOG_WRAP(nsp, NSOCK_LOG_DBG_ALL, __VA_ARGS__)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detailed debug messages, describing internal operations.
|
||||||
|
*/
|
||||||
|
#define nsock_log_debug(nsp, ...) NSOCK_LOG_WRAP(nsp, NSOCK_LOG_DBG, __VA_ARGS__)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* High level debug messages, describing top level operations and external
|
||||||
|
* requests.
|
||||||
|
*/
|
||||||
|
#define nsock_log_info(nsp, ...) NSOCK_LOG_WRAP(nsp, NSOCK_LOG_INFO, __VA_ARGS__)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error messages.
|
||||||
|
*/
|
||||||
|
#define nsock_log_error(nsp, ...) NSOCK_LOG_WRAP(nsp, NSOCK_LOG_ERROR, __VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
|
void __nsock_log_internal(nsock_pool nsp, nsock_loglevel_t loglevel,
|
||||||
|
const char *file, int line, const char *func,
|
||||||
|
const char *format, ...);
|
||||||
|
|
||||||
|
void nsock_stderr_logger(nsock_pool nsp, const struct nsock_log_rec *rec);
|
||||||
|
|
||||||
|
#endif /* NSOCK_LOG_H */
|
||||||
|
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
|
|
||||||
#include "nsock.h"
|
#include "nsock.h"
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#if HAVE_SYS_IOCTL_H
|
#if HAVE_SYS_IOCTL_H
|
||||||
@@ -133,10 +134,9 @@ char* nsock_pcap_open(nsock_pool nsp, nsock_iod nsiod, const char *pcap_device,
|
|||||||
}
|
}
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms,
|
||||||
nsock_trace(ms,
|
"PCAP requested on device '%s' with berkeley filter '%s' (promisc=%i snaplen=%i to_ms=%i) (IOD #%li)",
|
||||||
"PCAP requested on device '%s' with berkeley filter '%s' (promisc=%i snaplen=%i to_ms=%i) (IOD #%li)",
|
pcap_device,bpf, promisc, snaplen, to_ms, nsi->id);
|
||||||
pcap_device,bpf, promisc, snaplen, to_ms, nsi->id);
|
|
||||||
|
|
||||||
failed = 0;
|
failed = 0;
|
||||||
do {
|
do {
|
||||||
@@ -221,22 +221,28 @@ char* nsock_pcap_open(nsock_pool nsp, nsock_iod nsiod, const char *pcap_device,
|
|||||||
pcap_device, err0r);
|
pcap_device, err0r);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
if (ms->loglevel <= NSOCK_LOG_INFO) {
|
||||||
nsock_trace(ms, "PCAP created successfully on device '%s' (pcap_desc=%i bsd_hack=%i to_valid=%i l3_offset=%i) (IOD #%li)",
|
#if PCAP_BSD_SELECT_HACK
|
||||||
pcap_device,
|
int bsd_select_hack = 1;
|
||||||
mp->pcap_desc,
|
#else
|
||||||
#if PCAP_BSD_SELECT_HACK
|
int bsd_select_hack = 0;
|
||||||
1,
|
#endif
|
||||||
#else
|
|
||||||
0,
|
#if PCAP_RECV_TIMEVAL_VALID
|
||||||
#endif
|
int recv_timeval_valid = 1;
|
||||||
#if PCAP_RECV_TIMEVAL_VALID
|
#else
|
||||||
1,
|
int recv_timeval_valid = 0;
|
||||||
#else
|
#endif
|
||||||
0,
|
|
||||||
#endif
|
nsock_log_info(ms, "PCAP created successfully on device '%s'"
|
||||||
mp->l3_offset,
|
" (pcap_desc=%i bsd_hack=%i to_valid=%i l3_offset=%i) (IOD #%li)",
|
||||||
nsi->id);
|
pcap_device,
|
||||||
|
mp->pcap_desc,
|
||||||
|
bsd_select_hack,
|
||||||
|
recv_timeval_valid,
|
||||||
|
mp->l3_offset,
|
||||||
|
nsi->id);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -343,9 +349,7 @@ nsock_event_id nsock_pcap_read_packet(nsock_pool nsp, nsock_iod nsiod,
|
|||||||
nse = msevent_new(ms, NSE_TYPE_PCAP_READ, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_PCAP_READ, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0)
|
nsock_log_info(ms, "Pcap read request from IOD #%li EID %li", nsi->id, nse->id);
|
||||||
nsock_trace(ms, "Pcap read request from IOD #%li EID %li",
|
|
||||||
nsi->id, nse->id);
|
|
||||||
|
|
||||||
nsp_add_event(ms, nse);
|
nsp_add_event(ms, nse);
|
||||||
|
|
||||||
@@ -363,9 +367,8 @@ int do_actual_pcap_read(msevent *nse) {
|
|||||||
|
|
||||||
memset(&npp, 0, sizeof(nsock_pcap));
|
memset(&npp, 0, sizeof(nsock_pcap));
|
||||||
|
|
||||||
if (nse->iod->nsp->tracelevel > 2)
|
nsock_log_debug_all(nse->iod->nsp, "PCAP do_actual_pcap_read TEST (IOD #%li) (EID #%li)",
|
||||||
nsock_trace(nse->iod->nsp, "PCAP do_actual_pcap_read TEST (IOD #%li) (EID #%li)",
|
nse->iod->id, nse->id);
|
||||||
nse->iod->id, nse->id);
|
|
||||||
|
|
||||||
assert( FILESPACE_LENGTH(&(nse->iobuf)) == 0 );
|
assert( FILESPACE_LENGTH(&(nse->iobuf)) == 0 );
|
||||||
|
|
||||||
@@ -387,9 +390,8 @@ int do_actual_pcap_read(msevent *nse) {
|
|||||||
n = (nsock_pcap *)FILESPACE_STR(&(nse->iobuf));
|
n = (nsock_pcap *)FILESPACE_STR(&(nse->iobuf));
|
||||||
n->packet = (unsigned char *)FILESPACE_STR(&(nse->iobuf)) + sizeof(npp);
|
n->packet = (unsigned char *)FILESPACE_STR(&(nse->iobuf)) + sizeof(npp);
|
||||||
|
|
||||||
if (nse->iod->nsp->tracelevel > 2)
|
nsock_log_debug_all(nse->iod->nsp, "PCAP do_actual_pcap_read READ (IOD #%li) (EID #%li) size=%i",
|
||||||
nsock_trace(nse->iod->nsp, "PCAP do_actual_pcap_read READ (IOD #%li) (EID #%li) size=%i",
|
nse->iod->id, nse->id, pkt_header->caplen);
|
||||||
nse->iod->id, nse->id, pkt_header->caplen);
|
|
||||||
return(1);
|
return(1);
|
||||||
|
|
||||||
case 0: /* timeout */
|
case 0: /* timeout */
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
#include "gh_list.h"
|
#include "gh_list.h"
|
||||||
#include "netutils.h"
|
#include "netutils.h"
|
||||||
|
|
||||||
@@ -117,29 +118,6 @@ void *nsp_getud(nsock_pool nsp) {
|
|||||||
return mt->userdata;
|
return mt->userdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets a trace/debug level and stream. A level of 0 (the default) turns
|
|
||||||
* tracing off, while higher numbers are more verbose. If the stream given is
|
|
||||||
* NULL, it defaults to stdout. This is generally only used for debugging
|
|
||||||
* purposes. A level of 1 or 2 is usually sufficient, but 10 will ensure you get
|
|
||||||
* everything. The basetime can be NULL to print trace lines with the current
|
|
||||||
* time, otherwise the difference between the current time and basetime will be
|
|
||||||
* used (the time program execution starts would be a good candidate) */
|
|
||||||
void nsp_settrace(nsock_pool nsp, FILE *file, int level, const struct timeval *basetime) {
|
|
||||||
mspool *mt = (mspool *)nsp;
|
|
||||||
|
|
||||||
if (file == NULL)
|
|
||||||
mt->tracefile = stdout;
|
|
||||||
else
|
|
||||||
mt->tracefile = file;
|
|
||||||
|
|
||||||
mt->tracelevel = level;
|
|
||||||
|
|
||||||
if (!basetime)
|
|
||||||
memset(&mt->tracebasetime, 0, sizeof(struct timeval));
|
|
||||||
else
|
|
||||||
mt->tracebasetime = *basetime;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Turns on or off broadcast support on new sockets. Default is off (0, false)
|
/* Turns on or off broadcast support on new sockets. Default is off (0, false)
|
||||||
* set in nsp_new(). Any non-zero (true) value sets SO_BROADCAST on all new
|
* set in nsp_new(). Any non-zero (true) value sets SO_BROADCAST on all new
|
||||||
* sockets (value of optval will be used directly in the setsockopt() call */
|
* sockets (value of optval will be used directly in the setsockopt() call */
|
||||||
@@ -171,7 +149,9 @@ nsock_pool nsp_new(void *userdata) {
|
|||||||
memset(nsp, 0, sizeof(*nsp));
|
memset(nsp, 0, sizeof(*nsp));
|
||||||
|
|
||||||
gettimeofday(&nsock_tod, NULL);
|
gettimeofday(&nsock_tod, NULL);
|
||||||
nsp_settrace(nsp, NULL, 0, NULL);
|
|
||||||
|
nsp->loglevel = NSOCK_LOG_ERROR;
|
||||||
|
nsp->logger = (nsock_logger_t)nsock_stderr_logger;
|
||||||
|
|
||||||
nsp->id = nsp_next_id++;
|
nsp->id = nsp_next_id++;
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
#include "netutils.h"
|
#include "netutils.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -74,15 +75,12 @@ nsock_event_id nsock_readlines(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_handle
|
|||||||
nse = msevent_new(ms, NSE_TYPE_READ, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_READ, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0) {
|
if (nsi->peerlen > 0)
|
||||||
if (nsi->peerlen > 0)
|
nsock_log_info(ms, "Read request for %d lines from IOD #%li [%s] EID %li",
|
||||||
nsock_trace(ms, "Read request for %d lines from IOD #%li [%s] EID %li",
|
nlines, nsi->id, get_peeraddr_string(nsi), nse->id);
|
||||||
nlines, nsi->id, get_peeraddr_string(nsi),
|
else
|
||||||
nse->id);
|
nsock_log_info(ms, "Read request for %d lines from IOD #%li (peer unspecified) EID %li",
|
||||||
else
|
nlines, nsi->id, nse->id);
|
||||||
nsock_trace(ms, "Read request for %d lines from IOD #%li (peer unspecified) EID %li",
|
|
||||||
nlines, nsi->id, nse->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
nse->readinfo.read_type = NSOCK_READLINES;
|
nse->readinfo.read_type = NSOCK_READLINES;
|
||||||
nse->readinfo.num = nlines;
|
nse->readinfo.num = nlines;
|
||||||
@@ -103,15 +101,12 @@ nsock_event_id nsock_readbytes(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_handle
|
|||||||
nse = msevent_new(ms, NSE_TYPE_READ, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_READ, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0) {
|
if (nsi->peerlen > 0)
|
||||||
if (nsi->peerlen > 0)
|
nsock_log_info(ms, "Read request for %d bytes from IOD #%li [%s] EID %li",
|
||||||
nsock_trace(ms, "Read request for %d bytes from IOD #%li [%s] EID %li",
|
nbytes, nsi->id, get_peeraddr_string(nsi), nse->id);
|
||||||
nbytes, nsi->id, get_peeraddr_string(nsi),
|
else
|
||||||
nse->id);
|
nsock_log_info(ms, "Read request for %d bytes from IOD #%li (peer unspecified) EID %li",
|
||||||
else
|
nbytes, nsi->id, nse->id);
|
||||||
nsock_trace(ms, "Read request for %d bytes from IOD #%li (peer unspecified) EID %li",
|
|
||||||
nbytes, nsi->id, nse->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
nse->readinfo.read_type = NSOCK_READBYTES;
|
nse->readinfo.read_type = NSOCK_READBYTES;
|
||||||
nse->readinfo.num = nbytes;
|
nse->readinfo.num = nbytes;
|
||||||
@@ -132,15 +127,12 @@ nsock_event_id nsock_read(nsock_pool nsp, nsock_iod ms_iod, nsock_ev_handler han
|
|||||||
nse = msevent_new(ms, NSE_TYPE_READ, nsi, timeout_msecs, handler, userdata);
|
nse = msevent_new(ms, NSE_TYPE_READ, nsi, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (ms->tracelevel > 0) {
|
if (nsi->peerlen > 0)
|
||||||
if (nsi->peerlen > 0)
|
nsock_log_info(ms, "Read request from IOD #%li [%s] (timeout: %dms) EID %li",
|
||||||
nsock_trace(ms, "Read request from IOD #%li [%s] (timeout: %dms) EID %li",
|
nsi->id, get_peeraddr_string(nsi), timeout_msecs, nse->id);
|
||||||
nsi->id, get_peeraddr_string(nsi),
|
else
|
||||||
timeout_msecs, nse->id);
|
nsock_log_info(ms, "Read request from IOD #%li (peer unspecified) (timeout: %dms) EID %li",
|
||||||
else
|
nsi->id, timeout_msecs, nse->id);
|
||||||
nsock_trace(ms, "Read request from IOD #%li (peer unspecified) (timeout: %dms) EID %li",
|
|
||||||
nsi->id, timeout_msecs, nse->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
nse->readinfo.read_type = NSOCK_READ;
|
nse->readinfo.read_type = NSOCK_READ;
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
|
|
||||||
extern struct timeval nsock_tod;
|
extern struct timeval nsock_tod;
|
||||||
|
|
||||||
@@ -70,8 +71,8 @@ nsock_event_id nsock_timer_create(nsock_pool ms_pool, nsock_ev_handler handler,
|
|||||||
nse = msevent_new(nsp, NSE_TYPE_TIMER, NULL, timeout_msecs, handler, userdata);
|
nse = msevent_new(nsp, NSE_TYPE_TIMER, NULL, timeout_msecs, handler, userdata);
|
||||||
assert(nse);
|
assert(nse);
|
||||||
|
|
||||||
if (nsp->tracelevel > 0)
|
nsock_log_info(nsp, "Timer created - %dms from now. EID %li", timeout_msecs,
|
||||||
nsock_trace(nsp, "Timer created - %dms from now. EID %li", timeout_msecs, nse->id);
|
nse->id);
|
||||||
|
|
||||||
nsp_add_event(nsp, nse);
|
nsp_add_event(nsp, nse);
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@
|
|||||||
|
|
||||||
#include "nsock.h"
|
#include "nsock.h"
|
||||||
#include "nsock_internal.h"
|
#include "nsock_internal.h"
|
||||||
|
#include "nsock_log.h"
|
||||||
#include "netutils.h"
|
#include "netutils.h"
|
||||||
|
|
||||||
#include <nbase.h>
|
#include <nbase.h>
|
||||||
@@ -104,20 +105,16 @@ nsock_event_id nsock_sendto(nsock_pool ms_pool, nsock_iod ms_iod, nsock_ev_handl
|
|||||||
if (datalen < 0)
|
if (datalen < 0)
|
||||||
datalen = (int) strlen(data);
|
datalen = (int) strlen(data);
|
||||||
|
|
||||||
if (nsp->tracelevel > 0) {
|
if (nsp->loglevel == NSOCK_LOG_DBG_ALL && datalen < 80) {
|
||||||
if (nsp->tracelevel > 1 && datalen < 80) {
|
memcpy(displaystr, ": ", 2);
|
||||||
memcpy(displaystr, ": ", 2);
|
memcpy(displaystr + 2, data, datalen);
|
||||||
memcpy(displaystr + 2, data, datalen);
|
displaystr[2 + datalen] = '\0';
|
||||||
displaystr[2 + datalen] = '\0';
|
replacenonprintable(displaystr + 2, datalen, '.');
|
||||||
replacenonprintable(displaystr + 2, datalen, '.');
|
} else {
|
||||||
} else {
|
displaystr[0] = '\0';
|
||||||
displaystr[0] = '\0';
|
|
||||||
}
|
|
||||||
nsock_trace(nsp, "Sendto request for %d bytes to IOD #%li EID %li [%s]%s",
|
|
||||||
datalen, nsi->id, nse->id,
|
|
||||||
get_peeraddr_string(nse->iod),
|
|
||||||
displaystr);
|
|
||||||
}
|
}
|
||||||
|
nsock_log_debug(nsp, "Sendto request for %d bytes to IOD #%li EID %li [%s]%s",
|
||||||
|
datalen, nsi->id, nse->id, get_peeraddr_string(nse->iod), displaystr);
|
||||||
|
|
||||||
fscat(&nse->iobuf, data, datalen);
|
fscat(&nse->iobuf, data, datalen);
|
||||||
|
|
||||||
@@ -143,23 +140,22 @@ nsock_event_id nsock_write(nsock_pool ms_pool, nsock_iod ms_iod,
|
|||||||
nse->writeinfo.dest.ss_family = AF_UNSPEC;
|
nse->writeinfo.dest.ss_family = AF_UNSPEC;
|
||||||
|
|
||||||
if (datalen < 0)
|
if (datalen < 0)
|
||||||
datalen = (int) strlen(data);
|
datalen = (int)strlen(data);
|
||||||
|
|
||||||
if (nsp->tracelevel > 0) {
|
if (nsp->loglevel == NSOCK_LOG_DBG_ALL && datalen < 80) {
|
||||||
if (nsp->tracelevel > 1 && datalen < 80) {
|
|
||||||
memcpy(displaystr, ": ", 2);
|
memcpy(displaystr, ": ", 2);
|
||||||
memcpy(displaystr + 2, data, datalen);
|
memcpy(displaystr + 2, data, datalen);
|
||||||
displaystr[2 + datalen] = '\0';
|
displaystr[2 + datalen] = '\0';
|
||||||
replacenonprintable(displaystr + 2, datalen, '.');
|
replacenonprintable(displaystr + 2, datalen, '.');
|
||||||
} else displaystr[0] = '\0';
|
} else {
|
||||||
|
displaystr[0] = '\0';
|
||||||
|
}
|
||||||
if (nsi->peerlen > 0)
|
if (nsi->peerlen > 0)
|
||||||
nsock_trace(nsp, "Write request for %d bytes to IOD #%li EID %li [%s]%s", datalen, nsi->id,
|
nsock_log_debug(nsp, "Write request for %d bytes to IOD #%li EID %li [%s]%s",
|
||||||
nse->id, get_peeraddr_string(nsi),
|
datalen, nsi->id, nse->id, get_peeraddr_string(nsi), displaystr);
|
||||||
displaystr);
|
|
||||||
else
|
else
|
||||||
nsock_trace(nsp, "Write request for %d bytes to IOD #%li EID %li (peer unspecified)%s", datalen,
|
nsock_log_debug(nsp, "Write request for %d bytes to IOD #%li EID %li (peer unspecified)%s",
|
||||||
nsi->id, nse->id, displaystr);
|
datalen, nsi->id, nse->id, displaystr);
|
||||||
}
|
|
||||||
|
|
||||||
fscat(&nse->iobuf, data, datalen);
|
fscat(&nse->iobuf, data, datalen);
|
||||||
|
|
||||||
@@ -217,23 +213,20 @@ nsock_event_id nsock_printf(nsock_pool ms_pool, nsock_iod ms_iod,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nsp->tracelevel > 0) {
|
if (nsp->loglevel == NSOCK_LOG_DBG_ALL && nse->status != NSE_STATUS_ERROR && strlength < 80) {
|
||||||
if (nsp->tracelevel > 1 && nse->status != NSE_STATUS_ERROR && strlength < 80) {
|
memcpy(displaystr, ": ", 2);
|
||||||
memcpy(displaystr, ": ", 2);
|
memcpy(displaystr + 2, buf2, strlength);
|
||||||
memcpy(displaystr + 2, buf2, strlength);
|
displaystr[2 + strlength] = '\0';
|
||||||
displaystr[2 + strlength] = '\0';
|
replacenonprintable(displaystr + 2, strlength, '.');
|
||||||
replacenonprintable(displaystr + 2, strlength, '.');
|
} else {
|
||||||
} else {
|
displaystr[0] = '\0';
|
||||||
displaystr[0] = '\0';
|
|
||||||
}
|
|
||||||
if (nsi->peerlen > 0)
|
|
||||||
nsock_trace(nsp, "Write request for %d bytes to IOD #%li EID %li [%s]%s", strlength, nsi->id,
|
|
||||||
nse->id, get_peeraddr_string(nsi),
|
|
||||||
displaystr);
|
|
||||||
else
|
|
||||||
nsock_trace(nsp, "Write request for %d bytes to IOD #%li EID %li (peer unspecified)%s", strlength,
|
|
||||||
nsi->id, nse->id, displaystr);
|
|
||||||
}
|
}
|
||||||
|
if (nsi->peerlen > 0)
|
||||||
|
nsock_log_debug(nsp, "Write request for %d bytes to IOD #%li EID %li [%s]%s",
|
||||||
|
strlength, nsi->id, nse->id, get_peeraddr_string(nsi), displaystr);
|
||||||
|
else
|
||||||
|
nsock_log_debug(nsp, "Write request for %d bytes to IOD #%li EID %li (peer unspecified)%s",
|
||||||
|
strlength, nsi->id, nse->id, displaystr);
|
||||||
|
|
||||||
if (buf2 != buf)
|
if (buf2 != buf)
|
||||||
free(buf2);
|
free(buf2);
|
||||||
|
|||||||
40
output.cc
40
output.cc
@@ -2617,3 +2617,43 @@ void printdatafilepaths() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *nslog2str(nsock_loglevel_t loglevel) {
|
||||||
|
switch(loglevel) {
|
||||||
|
case NSOCK_LOG_DBG_ALL:
|
||||||
|
return "DEBUG FULL";
|
||||||
|
case NSOCK_LOG_DBG:
|
||||||
|
return "DEBUG";
|
||||||
|
case NSOCK_LOG_INFO:
|
||||||
|
return "INFO";
|
||||||
|
case NSOCK_LOG_ERROR:
|
||||||
|
return "ERROR";
|
||||||
|
default:
|
||||||
|
return "???";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void nmap_adjust_loglevel(nsock_pool nsp, bool trace) {
|
||||||
|
nsock_loglevel_t nsock_loglevel;
|
||||||
|
|
||||||
|
if (o.debugging >= 7)
|
||||||
|
nsock_loglevel = NSOCK_LOG_DBG_ALL;
|
||||||
|
else if (o.debugging >= 4)
|
||||||
|
nsock_loglevel = NSOCK_LOG_DBG;
|
||||||
|
else if (trace || o.debugging >= 2)
|
||||||
|
nsock_loglevel = NSOCK_LOG_INFO;
|
||||||
|
else
|
||||||
|
nsock_loglevel = NSOCK_LOG_ERROR;
|
||||||
|
|
||||||
|
nsock_set_loglevel(nsp, nsock_loglevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nmap_nsock_stderr_logger(nsock_pool nsp, const struct nsock_log_rec *rec) {
|
||||||
|
int elapsed_time;
|
||||||
|
|
||||||
|
elapsed_time = TIMEVAL_MSEC_SUBTRACT(rec->time, *(o.getStartTime()));
|
||||||
|
|
||||||
|
log_write(LOG_STDERR, "NSOCK %s [%.4fs] %s(): %s\n", nslog2str(rec->level),
|
||||||
|
elapsed_time/1000.0, rec->func, rec->msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
5
output.h
5
output.h
@@ -134,6 +134,7 @@
|
|||||||
#include "portlist.h"
|
#include "portlist.h"
|
||||||
#include "nmap.h"
|
#include "nmap.h"
|
||||||
#include "global_structures.h"
|
#include "global_structures.h"
|
||||||
|
#include <nsock.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -252,4 +253,8 @@ void printfinaloutput();
|
|||||||
were found. */
|
were found. */
|
||||||
void printdatafilepaths();
|
void printdatafilepaths();
|
||||||
|
|
||||||
|
/* nsock logging interface */
|
||||||
|
void nmap_adjust_loglevel(nsock_pool nsp, bool trace);
|
||||||
|
void nmap_nsock_stderr_logger(nsock_pool nsp, const struct nsock_log_rec *rec);
|
||||||
|
|
||||||
#endif /* OUTPUT_H */
|
#endif /* OUTPUT_H */
|
||||||
|
|||||||
@@ -2077,9 +2077,10 @@ static int scanThroughTunnel(nsock_pool nsp, nsock_iod nsi, ServiceGroup *SG,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Prints completion estimates and the like when appropriate */
|
/* Prints completion estimates and the like when appropriate */
|
||||||
static void considerPrintingStats(ServiceGroup *SG) {
|
static void considerPrintingStats(nsock_pool nsp, ServiceGroup *SG) {
|
||||||
/* Check for status requests */
|
/* Check for status requests */
|
||||||
if (keyWasPressed()) {
|
if (keyWasPressed()) {
|
||||||
|
nmap_adjust_loglevel(nsp, o.versionTrace());
|
||||||
SG->SPM->printStats(SG->services_finished.size() /
|
SG->SPM->printStats(SG->services_finished.size() /
|
||||||
((double)SG->services_remaining.size() + SG->services_in_progress.size() +
|
((double)SG->services_remaining.size() + SG->services_in_progress.size() +
|
||||||
SG->services_finished.size()), nsock_gettimeofday());
|
SG->services_finished.size()), nsock_gettimeofday());
|
||||||
@@ -2148,7 +2149,7 @@ static void end_svcprobe(nsock_pool nsp, enum serviceprobestate probe_state, Ser
|
|||||||
|
|
||||||
SG->services_finished.push_back(svc);
|
SG->services_finished.push_back(svc);
|
||||||
|
|
||||||
considerPrintingStats(SG);
|
considerPrintingStats(nsp, SG);
|
||||||
|
|
||||||
if (nsi) {
|
if (nsi) {
|
||||||
nsi_delete(nsi, NSOCK_PENDING_SILENT);
|
nsi_delete(nsi, NSOCK_PENDING_SILENT);
|
||||||
@@ -2677,11 +2678,10 @@ int service_scan(std::vector<Target *> &Targets) {
|
|||||||
if ((nsp = nsp_new(SG)) == NULL) {
|
if ((nsp = nsp_new(SG)) == NULL) {
|
||||||
fatal("%s() failed to create new nsock pool.", __func__);
|
fatal("%s() failed to create new nsock pool.", __func__);
|
||||||
}
|
}
|
||||||
nsp_setdevice(nsp, o.device);
|
nsock_set_log_function(nsp, nmap_nsock_stderr_logger);
|
||||||
|
nmap_adjust_loglevel(nsp, o.versionTrace());
|
||||||
|
|
||||||
if (o.versionTrace()) {
|
nsp_setdevice(nsp, o.device);
|
||||||
nsp_settrace(nsp, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE_OPENSSL
|
#if HAVE_OPENSSL
|
||||||
/* We don't care about connection security in version detection. */
|
/* We don't care about connection security in version detection. */
|
||||||
|
|||||||
Reference in New Issue
Block a user