diff --git a/docs/nmap.dtd b/docs/nmap.dtd index 4251d9308..0bfa426e8 100644 --- a/docs/nmap.dtd +++ b/docs/nmap.dtd @@ -161,9 +161,9 @@ - + - + 0">

The ports scanned but not shown below are in state:

- - diff --git a/output.cc b/output.cc index 3feb27c27..0b159c052 100644 --- a/output.cc +++ b/output.cc @@ -456,13 +456,13 @@ void printportoutput(Target *currenths, PortList *plist) { int istate; while ((istate = plist->nextIgnoredState(prevstate)) != PORT_UNKNOWN) { - log_write(LOG_XML, "\n", + log_write(LOG_XML, "\n", statenum2str(istate), plist->getStateCounts(istate)); + print_xml_state_summary(plist, istate); + log_write(LOG_XML, "\n"); prevstate = istate; } - print_xml_state_summary(plist); - if (numignoredports == plist->numports) { log_write(LOG_NORMAL|LOG_SKID|LOG_STDOUT, "%s %d scanned %s on %s %s ", diff --git a/portlist.cc b/portlist.cc index 68f8ffae3..84377d155 100644 --- a/portlist.cc +++ b/portlist.cc @@ -744,6 +744,7 @@ int PortList::setStateReason(u16 portno, u8 proto, reason_t reason, u8 ttl, u32 answer->reason.reason_id = reason; answer->reason.ip_addr.s_addr = ip_addr; answer->reason.ttl = ttl; + answer->reason.state = answer->state; setPortEntry(portno, proto, answer); return 0; } diff --git a/reason.cc b/reason.cc index ebfc1dd97..e17454f8f 100644 --- a/reason.cc +++ b/reason.cc @@ -250,7 +250,7 @@ static int update_state_summary(state_reason_summary_t *head, reason_t reason_id /* Converts Port objects and their corrosponsing state_reason structures into * state_reason_summary structures using update_state_summary */ -static unsigned int get_state_summary(state_reason_summary_t *head, PortList *Ports) { +static unsigned int get_state_summary(state_reason_summary_t *head, PortList *Ports, int state) { Port *current = NULL; state_reason_summary_t *reason; unsigned int total = 0; @@ -260,7 +260,7 @@ static unsigned int get_state_summary(state_reason_summary_t *head, PortList *Po return 0; reason = head; - while((current = Ports->nextPort(current, proto, 0)) != NULL) { + while((current = Ports->nextPort(current, proto, state)) != NULL) { if(Ports->isIgnoredState(current->state)) { total++; update_state_summary(reason, current->reason.reason_id); @@ -270,7 +270,7 @@ static unsigned int get_state_summary(state_reason_summary_t *head, PortList *Po } /* parse and sort reason summary for main print_* functions */ -static state_reason_summary_t *print_state_summary_internal(PortList *Ports) { +static state_reason_summary_t *print_state_summary_internal(PortList *Ports, int state) { state_reason_summary_t *reason_head; if((reason_head = (state_reason_summary_t *)malloc(sizeof(state_reason_summary_t))) == NULL) { @@ -280,7 +280,7 @@ static state_reason_summary_t *print_state_summary_internal(PortList *Ports) { state_reason_summary_init(reason_head); - if((get_state_summary(reason_head, Ports) < 1)) { + if((get_state_summary(reason_head, Ports, state) < 1)) { state_reason_summary_dinit(reason_head); return NULL; } @@ -316,7 +316,7 @@ void print_state_summary(PortList *Ports, unsigned short type) { char *separator = ", "; int states; - if((reason_head = print_state_summary_internal(Ports)) == NULL) + if((reason_head = print_state_summary_internal(Ports, 0)) == NULL) return; if(type == STATE_REASON_EMPTY) @@ -346,10 +346,10 @@ void print_state_summary(PortList *Ports, unsigned short type) { state_reason_summary_dinit(reason_head); } -void print_xml_state_summary(PortList *Ports) { +void print_xml_state_summary(PortList *Ports, int state) { state_reason_summary_t *reason_head, *currentr; - if((currentr = reason_head = print_state_summary_internal(Ports)) == NULL) + if((currentr = reason_head = print_state_summary_internal(Ports, state)) == NULL) return; while(currentr != NULL) { diff --git a/reason.h b/reason.h index 945382bd2..97763c7bc 100644 --- a/reason.h +++ b/reason.h @@ -119,6 +119,7 @@ typedef struct port_reason { reason_t reason_id; struct in_addr ip_addr; unsigned short ttl; + int state; } state_reason_t; /* used to calculate state reason summaries. @@ -173,7 +174,7 @@ const char *reason_str(reason_t reason_id, unsigned int number); /* Displays reason summary messages */ void print_state_summary(PortList *Ports, unsigned short type); -void print_xml_state_summary(PortList *Ports); +void print_xml_state_summary(PortList *Ports, int state); /* Build an output string based on reason and source ip address. * Uses static return value so previous values will be over