portreasons.cc
来自「Ubuntu packages of security software。 相」· CC 代码 · 共 389 行 · 第 1/2 页
CC
389 行
qsize = insize; while (psize > 0 || (qsize > 0 && q)) { if (psize == 0) { e = q; q = q->next; qsize--; } else if (qsize == 0 || !q) { e = p; p = p->next; psize--; } else if (q->count<p->count) { e = p; p = p->next; psize--; } else { e = q; q = q->next; qsize--; } if (tail) { tail->next = e; } else { list = e; } tail = e; } p = q; } if (!tail) return NULL; tail->next = NULL; if (nmerges <= 1) return list; insize *= 2; }}/* Builds and aggregates reason state summary messages */static int update_state_summary(state_reason_summary_t *head, reason_t reason_id) { state_reason_summary_t *tmp = head; if(tmp == NULL) return -1; while(1) { if(tmp->reason_id == reason_id) { tmp->count++; return 0; } if(tmp->next == NULL) { if((tmp->next = (state_reason_summary_t *)malloc(sizeof(state_reason_summary_t))) == NULL) { perror("malloc() -> Cannot allocate state reason structures"); return -1; } tmp = tmp->next; break; } tmp = tmp->next; } state_reason_summary_init(tmp); tmp->reason_id = reason_id; tmp->count = 1; return 0;}/* 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, int state) { Port *current = NULL; state_reason_summary_t *reason; unsigned int total = 0; unsigned short proto = (o.ipprotscan) ? IPPROTO_IP : TCPANDUDP; if(head == NULL) return 0; reason = head; while((current = Ports->nextPort(current, proto, state)) != NULL) { if(Ports->isIgnoredState(current->state)) { total++; update_state_summary(reason, current->reason.reason_id); } } return total;}/* parse and sort reason summary for main print_* functions */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) { perror("malloc() -> Cannot allocate state reason structures"); return NULL; } state_reason_summary_init(reason_head); if((get_state_summary(reason_head, Ports, state) < 1)) { state_reason_summary_dinit(reason_head); return NULL; } if((reason_head = reason_sort(reason_head)) == NULL) return NULL; return reason_head;}/* looks up reason_id's and returns with the plural or singular * string representation. If 'number' is equal to 1 then the * singular is used, otherwise the plural */const char *reason_str(reason_t reason_code, unsigned int number) { if(reason_code > ER_MAX) return "unknown"; if(number == 1) return reason_text[reason_code]; else return reason_pl_text[reason_code];}void state_reason_init(state_reason_t *reason) { reason->reason_id = ER_UNKNOWN; reason->ip_addr.s_addr = 0; reason->ttl = 0;}/* Main external interface to converting, building, sorting and * printing plain-text state reason summaries */void print_state_summary(PortList *Ports, unsigned short type) { state_reason_summary_t *reason_head, *currentr; bool first_time = true; char *separator = ", "; int states; if((reason_head = print_state_summary_internal(Ports, 0)) == NULL) return; if(type == STATE_REASON_EMPTY) log_write(LOG_PLAIN, " because of"); else if(type == STATE_REASON_FULL) log_write(LOG_PLAIN, "Reason:"); else assert(0); states = state_summary_size(reason_head); currentr = reason_head; while(currentr != NULL) { if(states == 1 && (!first_time)) separator = " and "; if(currentr->count > 0) { log_write(LOG_PLAIN, "%s%d %s", (first_time) ? " " : separator, currentr->count, reason_str(currentr->reason_id, currentr->count)); first_time = false; } states--; currentr = currentr->next; } if(type == STATE_REASON_FULL) log_write(LOG_PLAIN, "\n"); state_reason_summary_dinit(reason_head);}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, state)) == NULL) return; while(currentr != NULL) { if(currentr->count > 0) log_write(LOG_XML, "<extrareasons reason=\"%s\" count=\"%d\"/>\n", reason_str(currentr->reason_id, currentr->count), currentr->count); currentr = currentr->next; } state_reason_summary_dinit(reason_head);}/* converts target into reason message for ping scans. Uses a static * buffer so new values overwrite old values */char *target_reason_str(Target *t) { static char reason[128]; memset(reason,'\0', 128); assert(t->reason.reason_id != ER_NORESPONSE); Snprintf(reason, 128, ", received %s",reason_str(t->reason.reason_id, SINGULAR)); return reason;}/* Build an output string based on reason and source ip address. * uses a static return value so previous values will be over * written by subsequent calls */char *port_reason_str(state_reason_t r) { static char reason[128]; memset(reason,'\0', 128); Snprintf(reason, 128, "%s%s%s", reason_str(r.reason_id, SINGULAR), (r.ip_addr.s_addr==0)?"":" from ", (r.ip_addr.s_addr==0)?"":inet_ntoa(r.ip_addr)); return reason; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?