1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-15 04:09:01 +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:
henri
2012-12-15 10:59:30 +00:00
parent 26816736b5
commit 809f1eda68
31 changed files with 563 additions and 330 deletions

View File

@@ -1,5 +1,10 @@
# 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
reported by Dhiru Kholia. [David Fifield]

View File

@@ -157,12 +157,11 @@ void FPNetworkControl::init(const char *ifname, devtype iftype) {
/* Create a new nsock pool */
if ((this->nsp = nsp_new(NULL)) == NULL)
fatal("Unable to obtain an Nsock pool");
nsp_setdevice(nsp, o.device);
/* Set Trace level */
if (o.packetTrace()) {
nsp_settrace(this->nsp, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
}
nsock_set_log_function(this->nsp, nmap_nsock_stderr_logger);
nmap_adjust_loglevel(this->nsp, o.packetTrace());
nsp_setdevice(nsp, o.device);
/* Allow broadcast addresses */
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
* transmissions or packet captures). */
void FPNetworkControl::handle_events() {
nmap_adjust_loglevel(nsp, o.packetTrace());
nsock_loop(nsp, 50);
}

View File

@@ -112,6 +112,7 @@
<ClCompile Include="nbase_str.c" />
<ClCompile Include="nbase_time.c" />
<ClCompile Include="nbase_winunix.c" />
<ClCompile Include="snprintf.c" />
<ClCompile Include="strcasecmp.c" />
</ItemGroup>
<ItemGroup>

View File

@@ -132,7 +132,7 @@
#define HAVE_GETNAMEINFO 1
#define HAVE_SNPRINTF 1
#define HAVE_VASPRINTF 1
// #undef HAVE_VASPRINTF
#define HAVE_VSNPRINTF 1
typedef unsigned __int8 uint8_t;

View File

@@ -492,9 +492,14 @@ int ncat_connect(void)
if ((mypool = nsp_new(NULL)) == NULL)
bye("Failed to create nsock_pool.");
if (o.debug > 1)
/* A trace level of 1 still gives you an awful lot. */
nsp_settrace(mypool, stderr, 1, nsock_gettimeofday());
if (o.debug >= 6)
nsock_set_loglevel(mypool, NSOCK_LOG_DBG_ALL);
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. */
nsp_setbroadcast(mypool, 1);

View File

@@ -1164,7 +1164,6 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
int timeout;
char *tpname;
int i;
bool lasttrace = false;
char spmobuf[1024];
// 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)
fatal("Unable to create nsock pool in %s()", __func__);
nsp_setdevice(dnspool, o.device);
if ((lasttrace = o.packetTrace()))
nsp_settrace(dnspool, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
nsock_set_log_function(dnspool, nmap_nsock_stderr_logger);
nmap_adjust_loglevel(dnspool, o.packetTrace());
nsp_setdevice(dnspool, o.device);
connect_dns_servers();
@@ -1231,12 +1231,8 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
if (total_reqs <= 0) break;
/* Because this can change with runtime interaction */
if (o.packetTrace() != lasttrace) {
lasttrace = !lasttrace;
if (lasttrace)
nsp_settrace(dnspool, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
else nsp_settrace(dnspool, NULL, 0, o.getStartTime());
}
nmap_adjust_loglevel(dnspool, o.packetTrace());
nsock_loop(dnspool, timeout);
}

View File

@@ -1420,9 +1420,9 @@ int EchoServer::start() {
/* Set nsock trace level */
gettimeofday(&now, NULL);
if( o.getDebugging() == DBG_5 )
nsp_settrace(nsp, NULL, 1 , &now);
nsock_set_loglevel(nsp, NSOCK_LOG_INFO);
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 */
if ((pcap_nsi = nsi_new(nsp, NULL)) == NULL)

View File

@@ -129,9 +129,9 @@ int ProbeMode::init_nsock(){
/* Set nsock trace level */
gettimeofday(&now, NULL);
if( o.getDebugging() == DBG_5)
nsp_settrace(nsp, NULL, 1 , &now);
nsock_set_loglevel(nsp, NSOCK_LOG_INFO);
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 */
nsock_init=true;
}

View File

@@ -80,8 +80,14 @@ static nsock_pool new_pool (lua_State *L)
{
nsock_pool nsp = nsp_new(NULL);
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_setbroadcast(nsp, true);
nspp = (nsock_pool *) lua_newuserdata(L, sizeof(nsock_pool));
*nspp = nsp;
lua_newtable(L);
@@ -408,6 +414,7 @@ static int l_loop (lua_State *L)
socket_unlock(L); /* clean up old socket locks */
nmap_adjust_loglevel(nsp, o.scriptTrace());
if (nsock_loop(nsp, tout) == NSOCK_LOOP_ERROR)
return luaL_error(L, "a fatal error occurred in nsock_loop");
return 0;
@@ -1077,8 +1084,6 @@ LUALIB_API int luaopen_nsock (lua_State *L)
nse_nsock_init_ssl_cert(L);
#endif
if (o.scriptTrace())
nsp_settrace(nsp, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
#if HAVE_OPENSSL
/* Value speed over security in SSL connections. */
nsp_ssl_init_max_speed(nsp);

View File

@@ -75,6 +75,8 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#else
#include <winsock2.h> /* for struct timeval... */
#endif
#if HAVE_SYS_UN_H
@@ -130,6 +132,35 @@ typedef void *nsock_ssl_ctx;
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 ------------------- */
/* 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. */
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
* event is created, and the event itself is included in callbacks
*

View File

@@ -195,6 +195,7 @@
<ClCompile Include="src\nsock_engines.c" />
<ClCompile Include="src\nsock_event.c" />
<ClCompile Include="src\nsock_iod.c" />
<ClCompile Include="src\nsock_log.c" />
<ClCompile Include="src\nsock_pcap.c" />
<ClCompile Include="src\nsock_pool.c" />
<ClCompile Include="src\nsock_read.c" />
@@ -209,6 +210,7 @@
<ClInclude Include="src\netutils.h" />
<ClInclude Include="include\nsock.h" />
<ClInclude Include="src\nsock_internal.h" />
<ClInclude Include="src\nsock_log.h" />
<ClInclude Include="src\nsock_pcap.h" />
<ClInclude Include="src\nsock_ssl.h" />
<ClInclude Include="include\nsock_winconfig.h" />

View File

@@ -27,11 +27,11 @@ NBASEDIR=@NBASEDIR@
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:
$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@

View File

@@ -65,6 +65,7 @@
#include <errno.h>
#include "nsock_internal.h"
#include "nsock_log.h"
#if HAVE_PCAP
#include "nsock_pcap.h"
@@ -260,8 +261,7 @@ int epoll_loop(mspool *nsp, int msec_timeout) {
}
do {
if (nsp->tracelevel > 6)
nsock_trace(nsp, "wait_for_events");
nsock_log_debug_all(nsp, "wait_for_events");
if (nsp->next_ev.tv_sec == 0)
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 */
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;
return -1;
}

View File

@@ -67,6 +67,7 @@
#include <errno.h>
#include "nsock_internal.h"
#include "nsock_log.h"
#if HAVE_PCAP
#include "nsock_pcap.h"
@@ -236,8 +237,7 @@ int kqueue_loop(mspool *nsp, int msec_timeout) {
}
do {
if (nsp->tracelevel > 6)
nsock_trace(nsp, "wait_for_events");
nsock_log_debug_all(nsp, "wait_for_events");
if (nsp->next_ev.tv_sec == 0)
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 */
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;
return -1;
}

View File

@@ -77,6 +77,7 @@
#endif /* ^WIN32 */
#include "nsock_internal.h"
#include "nsock_log.h"
#if HAVE_PCAP
#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 ... */
do {
if (nsp->tracelevel > 6)
nsock_trace(nsp, "wait_for_events");
nsock_log_debug_all(nsp, "wait_for_events");
if (nsp->next_ev.tv_sec == 0)
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 */
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;
return -1;
}

View File

@@ -62,6 +62,7 @@
#include <errno.h>
#include "nsock_internal.h"
#include "nsock_log.h"
#if HAVE_PCAP
#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 ... */
do {
if (nsp->tracelevel > 6)
nsock_trace(nsp, "wait_for_events");
nsock_log_debug_all(nsp, "wait_for_events");
if (nsp->next_ev.tv_sec == 0)
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 */
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;
return -1;
}

View File

@@ -57,6 +57,7 @@
#include "nsock.h"
#include "nsock_internal.h"
#include "nsock_log.h"
#include "netutils.h"
#include <sys/types.h>
@@ -85,7 +86,6 @@ 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));
if (bind(iod->sd, (struct sockaddr *)&iod->local, (int) iod->locallen) == -1) {
if (ms->tracelevel > 0) {
const char *addrstr = NULL;
#if HAVE_SYS_UN_H
if (iod->local.ss_family == AF_UNIX)
@@ -94,32 +94,25 @@ static int nsock_make_socket(mspool *ms, msiod *iod, int family, int type, int p
#endif
addrstr = inet_ntop_ez(&iod->local, iod->locallen);
nsock_trace(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
}
nsock_log_error(ms, "Bind to %s failed (IOD #%li)", addrstr, iod->id);
}
}
if (iod->ipoptslen && family == AF_INET) {
if (setsockopt(iod->sd, IPPROTO_IP, IP_OPTIONS, (const char *)iod->ipopts, iod->ipoptslen) == -1) {
if (ms->tracelevel > 0)
nsock_trace(ms, "Setting of IP options failed (IOD #%li)", iod->id);
}
if (setsockopt(iod->sd, IPPROTO_IP, IP_OPTIONS, (const char *)iod->ipopts, iod->ipoptslen) == -1)
nsock_log_error(ms, "Setting of IP options failed (IOD #%li)", iod->id);
}
if (ms->device) {
errno = 0;
if (!socket_bindtodevice(iod->sd, ms->device)) {
if ((errno != EPERM && ms->tracelevel > 0) || ms->tracelevel > 5)
nsock_trace(ms, "Setting of SO_BINDTODEVICE failed (IOD #%li)", iod->id);
if (errno != EPERM)
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 (setsockopt(iod->sd, SOL_SOCKET, SO_BROADCAST, (const char *)&(ms->broadcast), sizeof(int)) == -1) {
if (ms->tracelevel > 0)
nsock_trace(ms, "Setting of SO_BROADCAST failed (IOD #%li)", iod->id);
nsock_log_error(ms, "Setting of SO_BROADCAST failed (IOD #%li)", iod->id);
}
}
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);
if (ms->tracelevel > 0)
nsock_trace(ms, "UDP unconnected socket (IOD #%li)", nsi->id);
nsock_log_info(ms, "UDP unconnected socket (IOD #%li)", nsi->id);
if (nsock_make_socket(ms, nsi, af, SOCK_DGRAM, IPPROTO_UDP) == -1)
return -1;
@@ -209,8 +201,7 @@ 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);
assert(nse);
if (ms->tracelevel > 0)
nsock_trace(ms, "UNIX domain socket (STREAM) connection requested to %s (IOD #%li) EID %li",
nsock_log_info(ms, "UNIX domain socket (STREAM) connection requested to %s (IOD #%li) EID %li",
get_unixsock_path(ss), nsi->id, nse->id);
nsock_connect_internal(ms, nse, SOCK_STREAM, 0, ss, sslen, 0);
@@ -236,8 +227,7 @@ nsock_event_id nsock_connect_unixsock_datagram(nsock_pool nsp, nsock_iod nsiod,
nse = msevent_new(ms, NSE_TYPE_CONNECT, nsi, -1, handler, userdata);
assert(nse);
if (ms->tracelevel > 0)
nsock_trace(ms, "UNIX domain socket (DGRAM) connection requested to %s (IOD #%li) EID %li",
nsock_log_info(ms, "UNIX domain socket (DGRAM) connection requested to %s (IOD #%li) EID %li",
get_unixsock_path(ss), nsi->id, nse->id);
nsock_connect_internal(ms, nse, SOCK_DGRAM, 0, ss, sslen, 0);
@@ -266,8 +256,7 @@ 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);
assert(nse);
if (ms->tracelevel > 0)
nsock_trace(ms, "TCP connection requested to %s:%hu (IOD #%li) EID %li",
nsock_log_info(ms, "TCP connection requested to %s:%hu (IOD #%li) EID %li",
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
/* Do the actual connect() */
@@ -295,8 +284,7 @@ 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);
assert(nse);
if (ms->tracelevel > 0)
nsock_trace(ms, "SCTP association requested to %s:%hu (IOD #%li) EID %li",
nsock_log_info(ms, "SCTP association requested to %s:%hu (IOD #%li) EID %li",
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
/* Do the actual connect() */
@@ -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. */
nsi_set_ssl_session(nsi, (SSL_SESSION *)ssl_session);
if (ms->tracelevel > 0)
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"), nsi->id, nse->id);
nsock_log_info(ms, "SSL connection requested to %s:%hu/%s (IOD #%li) EID %li",
inet_ntop_ez(ss, sslen), port, (proto == IPPROTO_TCP ? "tcp" : "sctp"),
nsi->id, nse->id);
/* Do the actual connect() */
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. */
nsi_set_ssl_session(nsi, (SSL_SESSION *)ssl_session);
if (ms->tracelevel > 0)
nsock_trace(ms, "SSL reconnection requested (IOD #%li) EID %li", nsi->id, nse->id);
nsock_log_info(ms, "SSL reconnection requested (IOD #%li) EID %li",
nsi->id, nse->id);
/* Do the actual connect() */
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);
assert(nse);
if (ms->tracelevel > 0)
nsock_trace(ms, "UDP connection requested to %s:%hu (IOD #%li) EID %li", inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
nsock_log_info(ms, "UDP connection requested to %s:%hu (IOD #%li) EID %li",
inet_ntop_ez(ss, sslen), port, nsi->id, nse->id);
nsock_connect_internal(ms, nse, SOCK_DGRAM, IPPROTO_UDP, ss, sslen, port);
nsp_add_event(ms, nse);

View File

@@ -59,6 +59,7 @@
#include "nsock_internal.h"
#include "gh_list.h"
#include "filespace.h"
#include "nsock_log.h"
#include <assert.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) {
rc = SSL_set_session(iod->ssl, iod->ssl_session);
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 */
}
@@ -446,8 +447,7 @@ void handle_connect_result(mspool *ms, msevent *nse, enum nse_status status) {
if (nsi_ssl_post_connect_verify(iod)) {
nse->status = NSE_STATUS_SUCCESS;
} else {
if (ms->tracelevel > 0)
nsock_trace(ms, "certificate verification error for EID %li: %s",
nsock_log_error(ms, "certificate verification error for EID %li: %s",
nse->id, ERR_error_string(ERR_get_error(), NULL));
nse->status = NSE_STATUS_ERROR;
}
@@ -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
* SSL_OP_NO_SSLv2. Never downgrade a NO_SSLv2 connection to one that
* might use SSLv2. */
if (ms->tracelevel > 0)
nsock_trace(ms, "EID %li reconnecting with SSL_OP_NO_SSLv2", nse->id);
nsock_log_info(ms, "EID %li reconnecting with SSL_OP_NO_SSLv2", nse->id);
saved_ev = iod->watched_events;
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);
nse->sslinfo.ssl_desire = SSL_ERROR_WANT_CONNECT;
} else {
if (ms->tracelevel > 0)
nsock_trace(ms, "EID %li %s", nse->id, ERR_error_string(ERR_get_error(), NULL));
nsock_log_info(ms, "EID %li %s",
nse->id, ERR_error_string(ERR_get_error(), NULL));
nse->event_done = 1;
nse->status = NSE_STATUS_ERROR;
nse->errnum = EIO;
@@ -706,8 +705,7 @@ static int do_actual_read(mspool *ms, msevent *nse) {
nse->event_done = 1;
nse->status = NSE_STATUS_ERROR;
nse->errnum = EIO;
if (ms->tracelevel > 2)
nsock_trace(ms, "SSL_read() failed for reason %s on NSI %li",
nsock_log_info(ms, "SSL_read() failed for reason %s on NSI %li",
ERR_reason_error_string(err), iod->id);
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);
msecs_left = msec_timeout;
if (ms->tracelevel > 2) {
if (msec_timeout >= 0)
nsock_trace(ms, "nsock_loop() started (timeout=%dms). %d events pending",
nsock_log_debug(ms, "nsock_loop() started (timeout=%dms). %d events pending",
msec_timeout, ms->events_pending);
else
nsock_trace(ms, "nsock_loop() started (no timeout). %d events pending",
nsock_log_debug(ms, "nsock_loop() started (no timeout). %d events pending",
ms->events_pending);
}
while (1) {
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;
#endif
if (nsp->tracelevel > 7)
nsock_trace(nsp, "Processing event %lu", nse->id);
nsock_log_debug_all(nsp, "Processing event %lu", nse->id);
if (!nse->event_done) {
switch(nse->type) {
@@ -989,8 +984,7 @@ void process_event(mspool *nsp, gh_list *evlist, msevent *nse, int ev) {
#if HAVE_PCAP
case NSE_TYPE_PCAP_READ:{
if (nsp->tracelevel > 5)
nsock_trace(nsp, "PCAP iterating %lu", nse->id);
nsock_log_debug_all(nsp, "PCAP iterating %lu", nse->id);
if (ev & EV_READ) {
/* buffer empty? check it! */
@@ -1017,14 +1011,12 @@ void process_event(mspool *nsp, gh_list *evlist, msevent *nse, int ev) {
update_first_events(nse);
gh_list_remove(&nsp->pcap_read_events, nse);
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from PCAP_READ_EVENTS", nse->id);
nsock_log_debug_all(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) {
update_first_events(nse);
gh_list_remove(&nsp->read_events, nse);
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
}
#endif
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)
assert(nse->iod->ssl != NULL);
if (nsp->tracelevel > 8)
nsock_trace(nsp, "NSE #%lu: Sending event", nse->id);
nsock_log_debug_all(nsp, "NSE #%lu: Sending event", nse->id);
/* WooHoo! The event is ready to be sent */
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,
* etc. */
void nsp_add_event(mspool *nsp, msevent *nse) {
if (nsp->tracelevel > 5)
nsock_trace(nsp, "NSE #%lu: Adding event", nse->id);
nsock_log_debug(nsp, "NSE #%lu: Adding event", nse->id);
/* First lets do the event-type independent stuff, starting with timeouts */
if (nse->event_done) {
@@ -1211,20 +1201,17 @@ void nsp_add_event(mspool *nsp, msevent *nse) {
socket_count_readpcap_inc(nse->iod);
update_events(nse->iod, nsp, EV_READ, EV_NONE);
}
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Adding event to READ_EVENTS", nse->id);
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Adding event to READ_EVENTS", nse->id);
#if PCAP_BSD_SELECT_HACK
/* when using BSD hack we must do pcap_next() after select().
* Let's insert this pcap to bot queues, to selectable and nonselectable.
* This will result in doing pcap_next_ex() just before select() */
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
#endif
} else {
/* pcap isn't selectable. Add it to pcap-specific queue. */
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Adding event to PCAP_READ_EVENTS", nse->id);
}
iod_add_event(nse->iod, nse);
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
* function writes out tracing data about the event if necessary */
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 errstr[256];
if (ms->tracelevel == 0)
if (ms->loglevel > NSOCK_LOG_INFO)
return;
nsi = nse->iod;
@@ -1274,7 +1247,7 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
switch(nse->type) {
case NSE_TYPE_CONNECT:
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),
errstr, nse->id, get_peeraddr_string(nsi));
break;
@@ -1282,17 +1255,17 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
case NSE_TYPE_READ:
if (nse->status != NSE_STATUS_SUCCESS) {
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),
errstr, nse->id, get_peeraddr_string(nsi));
} 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),
errstr, nse->id);
}
} else {
str = nse_readbuf(nse, &strlength);
if (ms->tracelevel > 1 && strlength < 80) {
if (strlength < 80) {
memcpy(displaystr, ": ", 2);
memcpy(displaystr + 2, str, strlength);
displaystr[2 + strlength] = '\0';
@@ -1302,12 +1275,12 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
}
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->id, get_peeraddr_string(nsi),
nse_eof(nse)? "[EOF]" : "", strlength, displaystr);
} 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->id, nse_eof(nse)? "[EOF]" : "", strlength, displaystr);
}
@@ -1315,20 +1288,20 @@ void nsock_trace_handler_callback(mspool *ms, msevent *nse) {
break;
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->id, get_peeraddr_string(nsi));
break;
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->id);
break;
#if HAVE_PCAP
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),
errstr, nse->id);
break;

View File

@@ -60,6 +60,7 @@
/* $Id$ */
#include "nsock_internal.h"
#include "nsock_log.h"
#include "gh_list.h"
#if HAVE_PCAP
@@ -187,9 +188,7 @@ int nsock_event_cancel(nsock_pool ms_pool, nsock_event_id id, int notify ) {
assert(nsp);
type = get_event_id_type(id);
if (nsp->tracelevel > 0) {
nsock_trace(nsp, "Event #%li (type %s) cancelled", id, nse_type2str(type));
}
nsock_log_info(nsp, "Event #%li (type %s) cancelled", id, nse_type2str(type));
/* First we figure out what list it is in */
switch(type) {
@@ -258,8 +257,7 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
return 0;
}
if (nsp->tracelevel > 0)
nsock_trace(nsp, "msevent_cancel on event #%li (type %s)", nse->id, nse_type2str(nse->type));
nsock_log_info(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
* cancelling it */
@@ -295,14 +293,12 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
update_first_events(nse);
gh_list_remove_elem(event_list, elem);
if (nsp->tracelevel > 8)
nsock_trace(nsp, "NSE #%lu: Removing event from list", nse->id);
nsock_log_debug_all(nsp, "NSE #%lu: Removing event from list", nse->id);
#if HAVE_PCAP
#if PCAP_BSD_SELECT_HACK
if (nse->type == NSE_TYPE_PCAP_READ) {
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: CANCEL TEST pcap=%p read=%p curr=%p sd=%i",
nsock_log_debug_all(nsp, "PCAP NSE #%lu: CANCEL TEST pcap=%p read=%p curr=%p sd=%i",
nse->id, &nsp->pcap_read_events, &nsp->read_events,
event_list,((mspcap *)nse->iod->pcap)->pcap_desc);
@@ -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 from pcap_read_events */
gh_list_remove(&nsp->pcap_read_events, nse);
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from PCAP_READ_EVENTS", nse->id);
nsock_log_debug_all(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) {
@@ -323,8 +318,7 @@ int msevent_cancel(mspool *nsp, msevent *nse, gh_list *event_list, gh_list_elem
* So unlink event from read_events */
gh_list_remove(&nsp->read_events, nse);
if (nsp->tracelevel > 8)
nsock_trace(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
nsock_log_debug_all(nsp, "PCAP NSE #%lu: Removing event from READ_EVENTS", nse->id);
}
}
#endif
@@ -446,12 +440,10 @@ msevent *msevent_new(mspool *nsp, enum nse_type type, msiod *msiod, int timeout_
nse->userdata = userdata;
nse->time_created = nsock_tod;
if (nsp->tracelevel > 3) {
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
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;
}
@@ -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 */
void msevent_delete(mspool *nsp, msevent *nse) {
if (nsp->tracelevel > 3) {
if (nse->iod == NULL)
nsock_trace(nsp, "msevent_delete (IOD #NULL) (EID #%li)", nse->id);
nsock_log_debug(nsp, "msevent_delete (IOD #NULL) (EID #%li)", nse->id);
else
nsock_trace(nsp, "msevent_delete (IOD #%li) (EID #%li)", nse->iod->id, nse->id);
}
nsock_log_debug(nsp, "msevent_delete (IOD #%li) (EID #%li)", nse->iod->id, nse->id);
/* First free the IOBuf inside it if neccessary */
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 (nse->type == NSE_TYPE_PCAP_READ) {
fs_free(&nse->iobuf);
if (nsp->tracelevel > 5)
nsock_trace(nsp, "PCAP removed %lu",nse->id);
nsock_log_debug_all(nsp, "PCAP removed %lu", nse->id);
}
#endif

View File

@@ -199,12 +199,9 @@ typedef struct {
* error (errnum fashion) */
int errnum;
/* Trace/debug level - set by nsp_settrace. If positive, trace logs are
* printted to tracefile. */
int tracelevel;
FILE *tracefile;
/* This time is subtracted from the current time for trace reports */
struct timeval tracebasetime;
/* Logging information. */
nsock_logger_t logger;
nsock_loglevel_t loglevel;
/* If true, new sockets will have SO_BROADCAST set */
int broadcast;

View File

@@ -60,6 +60,7 @@
#include "nsock.h"
#include "nsock_internal.h"
#include "nsock_log.h"
#include "gh_list.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 */
nsi->entry_in_nsp_active_iods = gh_list_append(&nsp->active_iods, nsi);
if (nsp->tracelevel > 1)
nsock_trace(nsp, "nsi_new (IOD #%lu)", nsi->id);
nsock_log_info(nsp, "nsi_new (IOD #%lu)", nsi->id);
return (nsock_iod)nsi;
}
@@ -175,8 +175,7 @@ void nsi_delete(nsock_iod nsockiod, int pending_response) {
return;
}
if (nsi->nsp->tracelevel > 1)
nsock_trace(nsi->nsp, "nsi_delete (IOD #%lu)", nsi->id);
nsock_log_info(nsi->nsp, "nsi_delete (IOD #%lu)", nsi->id);
if (nsi->events_pending > 0) {
/* shit -- they killed the msiod while an event was still pending on it.
@@ -232,9 +231,7 @@ void nsi_delete(nsock_iod nsockiod, int pending_response) {
#endif
if (SSL_shutdown(nsi->ssl) == -1) {
if (nsi->nsp->tracelevel > 1)
nsock_trace(nsi->nsp, "nsi_delete: SSL shutdown failed (%s) on NSI %li",
nsock_log_info(nsi->nsp, "nsi_delete: SSL shutdown failed (%s) on NSI %li",
ERR_reason_error_string(SSL_get_error(nsi->ssl, -1)), nsi->id);
}

120
nsock/src/nsock_log.c Normal file
View 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
View 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 */

View File

@@ -58,6 +58,7 @@
#include "nsock.h"
#include "nsock_internal.h"
#include "nsock_log.h"
#include <limits.h>
#if HAVE_SYS_IOCTL_H
@@ -133,8 +134,7 @@ char* nsock_pcap_open(nsock_pool nsp, nsock_iod nsiod, const char *pcap_device,
}
va_end(ap);
if (ms->tracelevel > 0)
nsock_trace(ms,
nsock_log_info(ms,
"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);
@@ -221,22 +221,28 @@ char* nsock_pcap_open(nsock_pool nsp, nsock_iod nsiod, const char *pcap_device,
pcap_device, err0r);
}
if (ms->tracelevel > 0)
nsock_trace(ms, "PCAP created successfully on device '%s' (pcap_desc=%i bsd_hack=%i to_valid=%i l3_offset=%i) (IOD #%li)",
if (ms->loglevel <= NSOCK_LOG_INFO) {
#if PCAP_BSD_SELECT_HACK
int bsd_select_hack = 1;
#else
int bsd_select_hack = 0;
#endif
#if PCAP_RECV_TIMEVAL_VALID
int recv_timeval_valid = 1;
#else
int recv_timeval_valid = 0;
#endif
nsock_log_info(ms, "PCAP created successfully on device '%s'"
" (pcap_desc=%i bsd_hack=%i to_valid=%i l3_offset=%i) (IOD #%li)",
pcap_device,
mp->pcap_desc,
#if PCAP_BSD_SELECT_HACK
1,
#else
0,
#endif
#if PCAP_RECV_TIMEVAL_VALID
1,
#else
0,
#endif
bsd_select_hack,
recv_timeval_valid,
mp->l3_offset,
nsi->id);
}
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);
assert(nse);
if (ms->tracelevel > 0)
nsock_trace(ms, "Pcap read request from IOD #%li EID %li",
nsi->id, nse->id);
nsock_log_info(ms, "Pcap read request from IOD #%li EID %li", nsi->id, nse->id);
nsp_add_event(ms, nse);
@@ -363,8 +367,7 @@ int do_actual_pcap_read(msevent *nse) {
memset(&npp, 0, sizeof(nsock_pcap));
if (nse->iod->nsp->tracelevel > 2)
nsock_trace(nse->iod->nsp, "PCAP do_actual_pcap_read TEST (IOD #%li) (EID #%li)",
nsock_log_debug_all(nse->iod->nsp, "PCAP do_actual_pcap_read TEST (IOD #%li) (EID #%li)",
nse->iod->id, nse->id);
assert( FILESPACE_LENGTH(&(nse->iobuf)) == 0 );
@@ -387,8 +390,7 @@ int do_actual_pcap_read(msevent *nse) {
n = (nsock_pcap *)FILESPACE_STR(&(nse->iobuf));
n->packet = (unsigned char *)FILESPACE_STR(&(nse->iobuf)) + sizeof(npp);
if (nse->iod->nsp->tracelevel > 2)
nsock_trace(nse->iod->nsp, "PCAP do_actual_pcap_read READ (IOD #%li) (EID #%li) size=%i",
nsock_log_debug_all(nse->iod->nsp, "PCAP do_actual_pcap_read READ (IOD #%li) (EID #%li) size=%i",
nse->iod->id, nse->id, pkt_header->caplen);
return(1);

View File

@@ -59,6 +59,7 @@
/* $Id$ */
#include "nsock_internal.h"
#include "nsock_log.h"
#include "gh_list.h"
#include "netutils.h"
@@ -117,29 +118,6 @@ void *nsp_getud(nsock_pool nsp) {
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)
* 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 */
@@ -171,7 +149,9 @@ nsock_pool nsp_new(void *userdata) {
memset(nsp, 0, sizeof(*nsp));
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++;

View File

@@ -57,6 +57,7 @@
/* $Id$ */
#include "nsock_internal.h"
#include "nsock_log.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);
assert(nse);
if (ms->tracelevel > 0) {
if (nsi->peerlen > 0)
nsock_trace(ms, "Read request for %d lines from IOD #%li [%s] EID %li",
nlines, nsi->id, get_peeraddr_string(nsi),
nse->id);
nsock_log_info(ms, "Read request for %d lines from IOD #%li [%s] EID %li",
nlines, nsi->id, get_peeraddr_string(nsi), nse->id);
else
nsock_trace(ms, "Read request for %d lines from IOD #%li (peer unspecified) EID %li",
nsock_log_info(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.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);
assert(nse);
if (ms->tracelevel > 0) {
if (nsi->peerlen > 0)
nsock_trace(ms, "Read request for %d bytes from IOD #%li [%s] EID %li",
nbytes, nsi->id, get_peeraddr_string(nsi),
nse->id);
nsock_log_info(ms, "Read request for %d bytes from IOD #%li [%s] EID %li",
nbytes, nsi->id, get_peeraddr_string(nsi), nse->id);
else
nsock_trace(ms, "Read request for %d bytes from IOD #%li (peer unspecified) EID %li",
nsock_log_info(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.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);
assert(nse);
if (ms->tracelevel > 0) {
if (nsi->peerlen > 0)
nsock_trace(ms, "Read request from IOD #%li [%s] (timeout: %dms) EID %li",
nsi->id, get_peeraddr_string(nsi),
timeout_msecs, nse->id);
nsock_log_info(ms, "Read request from IOD #%li [%s] (timeout: %dms) EID %li",
nsi->id, get_peeraddr_string(nsi), timeout_msecs, nse->id);
else
nsock_trace(ms, "Read request from IOD #%li (peer unspecified) (timeout: %dms) EID %li",
nsock_log_info(ms, "Read request from IOD #%li (peer unspecified) (timeout: %dms) EID %li",
nsi->id, timeout_msecs, nse->id);
}
nse->readinfo.read_type = NSOCK_READ;

View File

@@ -57,6 +57,7 @@
/* $Id$ */
#include "nsock_internal.h"
#include "nsock_log.h"
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);
assert(nse);
if (nsp->tracelevel > 0)
nsock_trace(nsp, "Timer created - %dms from now. EID %li", timeout_msecs, nse->id);
nsock_log_info(nsp, "Timer created - %dms from now. EID %li", timeout_msecs,
nse->id);
nsp_add_event(nsp, nse);

View File

@@ -58,6 +58,7 @@
#include "nsock.h"
#include "nsock_internal.h"
#include "nsock_log.h"
#include "netutils.h"
#include <nbase.h>
@@ -104,8 +105,7 @@ nsock_event_id nsock_sendto(nsock_pool ms_pool, nsock_iod ms_iod, nsock_ev_handl
if (datalen < 0)
datalen = (int) strlen(data);
if (nsp->tracelevel > 0) {
if (nsp->tracelevel > 1 && datalen < 80) {
if (nsp->loglevel == NSOCK_LOG_DBG_ALL && datalen < 80) {
memcpy(displaystr, ": ", 2);
memcpy(displaystr + 2, data, datalen);
displaystr[2 + datalen] = '\0';
@@ -113,11 +113,8 @@ nsock_event_id nsock_sendto(nsock_pool ms_pool, nsock_iod ms_iod, nsock_ev_handl
} else {
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);
@@ -145,21 +142,20 @@ nsock_event_id nsock_write(nsock_pool ms_pool, nsock_iod ms_iod,
if (datalen < 0)
datalen = (int)strlen(data);
if (nsp->tracelevel > 0) {
if (nsp->tracelevel > 1 && datalen < 80) {
if (nsp->loglevel == NSOCK_LOG_DBG_ALL && datalen < 80) {
memcpy(displaystr, ": ", 2);
memcpy(displaystr + 2, data, datalen);
displaystr[2 + datalen] = '\0';
replacenonprintable(displaystr + 2, datalen, '.');
} else displaystr[0] = '\0';
if (nsi->peerlen > 0)
nsock_trace(nsp, "Write request for %d bytes to IOD #%li EID %li [%s]%s", datalen, 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", datalen,
nsi->id, nse->id, displaystr);
} else {
displaystr[0] = '\0';
}
if (nsi->peerlen > 0)
nsock_log_debug(nsp, "Write request for %d bytes to IOD #%li EID %li [%s]%s",
datalen, 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",
datalen, nsi->id, nse->id, displaystr);
fscat(&nse->iobuf, data, datalen);
@@ -217,8 +213,7 @@ nsock_event_id nsock_printf(nsock_pool ms_pool, nsock_iod ms_iod,
}
}
if (nsp->tracelevel > 0) {
if (nsp->tracelevel > 1 && nse->status != NSE_STATUS_ERROR && strlength < 80) {
if (nsp->loglevel == NSOCK_LOG_DBG_ALL && nse->status != NSE_STATUS_ERROR && strlength < 80) {
memcpy(displaystr, ": ", 2);
memcpy(displaystr + 2, buf2, strlength);
displaystr[2 + strlength] = '\0';
@@ -227,13 +222,11 @@ nsock_event_id nsock_printf(nsock_pool ms_pool, nsock_iod ms_iod,
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);
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_trace(nsp, "Write request for %d bytes to IOD #%li EID %li (peer unspecified)%s", strlength,
nsi->id, nse->id, displaystr);
}
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)
free(buf2);

View File

@@ -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);
}

View File

@@ -134,6 +134,7 @@
#include "portlist.h"
#include "nmap.h"
#include "global_structures.h"
#include <nsock.h>
#include <string>
@@ -252,4 +253,8 @@ void printfinaloutput();
were found. */
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 */

View File

@@ -2077,9 +2077,10 @@ static int scanThroughTunnel(nsock_pool nsp, nsock_iod nsi, ServiceGroup *SG,
}
/* 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 */
if (keyWasPressed()) {
nmap_adjust_loglevel(nsp, o.versionTrace());
SG->SPM->printStats(SG->services_finished.size() /
((double)SG->services_remaining.size() + SG->services_in_progress.size() +
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);
considerPrintingStats(SG);
considerPrintingStats(nsp, SG);
if (nsi) {
nsi_delete(nsi, NSOCK_PENDING_SILENT);
@@ -2677,11 +2678,10 @@ int service_scan(std::vector<Target *> &Targets) {
if ((nsp = nsp_new(SG)) == NULL) {
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_settrace(nsp, NULL, NSOCK_TRACE_LEVEL, o.getStartTime());
}
nsp_setdevice(nsp, o.device);
#if HAVE_OPENSSL
/* We don't care about connection security in version detection. */