1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-06 04:31:29 +00:00

Merge r17202:17298 from /nmap-exp/david/nmap-xml. This brings in

structured XML output, automatic closing of XML elements on error, and
inclusion of error messages in XML output.
This commit is contained in:
david
2010-04-14 01:05:51 +00:00
parent 62955f75e6
commit 859ef5ecaf
14 changed files with 1059 additions and 431 deletions

View File

@@ -92,6 +92,7 @@
#include "nmap_error.h"
#include "output.h"
#include "NmapOps.h"
#include "xml.h"
extern NmapOps o;
@@ -99,8 +100,15 @@ extern NmapOps o;
#include <windows.h>
#endif /* WIN32 */
void fatal(const char *fmt, ...) {
time_t timep;
struct timeval tv;
va_list ap;
gettimeofday(&tv, NULL);
timep = time(NULL);
va_start(ap, fmt);
log_vwrite(LOG_STDERR, fmt, ap);
va_end(ap);
@@ -110,6 +118,37 @@ void fatal(const char *fmt, ...) {
va_end(ap);
}
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, "\nQUITTING!\n");
if (!xml_root_written())
xml_start_tag("nmaprun");
/* Close all open XML elements but one. */
while (xml_depth() > 1) {
xml_end_tag();
xml_newline();
}
if (xml_depth() == 1) {
char errbuf[1024];
va_start(ap, fmt);
Vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
va_end(ap);
xml_start_tag("runstats");
print_xml_finished_open(timep, &tv);
xml_attribute("exit", "error");
xml_attribute("errormsg", "%s", errbuf);
xml_close_empty_tag();
print_xml_hosts();
xml_newline();
xml_end_tag(); /* runstats */
xml_newline();
xml_end_tag(); /* nmaprun */
xml_newline();
}
exit(1);
}
@@ -129,72 +168,93 @@ void error(const char *fmt, ...) {
return;
}
void pfatal(const char *err, ...) {
#ifdef WIN32
int lasterror =0;
char *errstr = NULL;
#endif
void pfatal(const char *fmt, ...) {
time_t timep;
struct timeval tv;
va_list ap;
va_start(ap, err);
log_vwrite(LOG_STDERR, err, ap);
int error_number;
char errbuf[1024], *strerror_s;
#ifdef WIN32
error_number = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error_number, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &strerror_s, 0, NULL);
#else
error_number = errno;
strerror_s = strerror(error_number);
#endif
gettimeofday(&tv, NULL);
timep = time(NULL);
va_start(ap, fmt);
Vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
va_end(ap);
if (o.log_errors) {
va_start(ap, err);
log_vwrite(LOG_NORMAL, err, ap);
va_end(ap);
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, "%s: %s (%d)\n",
errbuf, strerror_s, error_number);
if (!xml_root_written())
xml_start_tag("nmaprun");
/* Close all open XML elements but one. */
while (xml_depth() > 1) {
xml_end_tag();
xml_newline();
}
if (xml_depth() == 1) {
xml_start_tag("runstats");
print_xml_finished_open(timep, &tv);
xml_attribute("exit", "error");
xml_attribute("errormsg", "%s: %s (%d)", errbuf, strerror_s, error_number);
xml_close_empty_tag();
print_xml_hosts();
xml_newline();
xml_end_tag(); /* runstats */
xml_newline();
xml_end_tag(); /* nmaprun */
xml_newline();
}
#ifdef WIN32
lasterror = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, lasterror, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &errstr, 0, NULL);
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, ": %s (%d)\n",
errstr, lasterror);
HeapFree(GetProcessHeap(), 0, errstr);
#else
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, ": %s (%d)\n",
strerror(errno), errno);
#endif /* WIN32 perror() compatability switch */
HeapFree(GetProcessHeap(), 0, strerror_s);
#endif
if (o.log_errors) log_flush(LOG_NORMAL);
fflush(stderr);
exit(1);
}
/* This function is the Nmap version of perror. It is just copy and
pasted from pfatal(), except the exit has been replaced with a
return. */
void gh_perror(const char *err, ...) {
#ifdef WIN32
int lasterror =0;
char *errstr = NULL;
#endif
/* This function is the Nmap version of perror. It is like pfatal, but it
doesn't write to XML and it only returns, doesn't exit. */
void gh_perror(const char *fmt, ...) {
va_list ap;
va_start(ap, err);
log_vwrite(LOG_STDERR, err, ap);
va_end(ap);
if (o.log_errors) {
va_start(ap, err);
log_vwrite(LOG_NORMAL, err, ap);
va_end(ap);
}
int error_number;
char *strerror_s;
#ifdef WIN32
lasterror = GetLastError();
error_number = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, lasterror, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &errstr, 0, NULL);
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, ": %s (%d)\n",
errstr, lasterror);
HeapFree(GetProcessHeap(), 0, errstr);
NULL, error_number, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &strerror_s, 0, NULL);
#else
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, ": %s (%d)\n",
strerror(errno), errno);
#endif /* WIN32 perror() compatability switch */
error_number = errno;
strerror_s = strerror(error_number);
#endif
va_start(ap, fmt);
log_vwrite(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, fmt, ap);
va_end(ap);
log_write(o.log_errors? LOG_NORMAL|LOG_STDERR : LOG_STDERR, ": %s (%d)\n",
strerror_s, error_number);
#ifdef WIN32
HeapFree(GetProcessHeap(), 0, strerror_s);
#endif
if (o.log_errors) log_flush(LOG_NORMAL);
fflush(stderr);
return;