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 + -
显示快捷键?