static void display_functions(std::ostream & out, model_core const & md, bool partial) { unsigned sz = md.get_num_functions(); for (unsigned i = 0; i < sz; i++) { func_decl * f = md.get_function(i); display_function(out, md, f, partial); } }
int display_src_node_info(const int type, const unsigned int bridge_id, const unsigned int ip_addr, const unsigned int layer7_id, void (*display_function)(struct user_stat_entry *)) { struct user_stat_msg request; struct respond_message respond_msg; int sock; int size = sizeof(struct respond_message); struct sockaddr_nl remote; DEBUGP("%s:begin bridge_id=[%u],ip_addr=[%u.%u.%u.%u],layer7_id=[%u]\n",__FUNCTION__,bridge_id,NIPQUAD(ip_addr),layer7_id); if(layer7_id < 0 || layer7_id > 65535) { //perror("input layer7 id is invalid\n"); return -1; } request.bridge_id = bridge_id; request.addr = ip_addr; request.layer7_id = layer7_id; sock = _do_command(type, &request); if(sock == -1) return -1; printf("{\"data\":["); while(1) { socklen_t remote_addr_len = sizeof(struct sockaddr_nl); int recv_len = recvfrom(sock, &respond_msg, size, 0, (struct sockaddr*)&remote, &remote_addr_len); if(recv_len == -1){ //perror("recvmsg error\n"); break; } if(recv_len == 0){ break; } if(respond_msg.nlhdr.nlmsg_type < NET_STAT_PROTOCOL_SUM_OK || respond_msg.nlhdr.nlmsg_type > NET_STAT_ERROR_INFO) { break; } if(respond_msg.nlhdr.nlmsg_type == NET_STAT_NULL_INFO) break; int size = (respond_msg.nlhdr.nlmsg_len - sizeof(struct nlmsghdr)) / sizeof(struct user_stat_entry); int i = 0; for(i = 0; i < size; i++){ struct user_stat_entry * node = &respond_msg.account_entry[i]; if(node == NULL) break; if(node->src_ip == 0 && node->layer7_name[0] == '\0' && node->layer7_id == 0) break; if(display_function) display_function(node); } } printf("],\"iserror\":0,\"msg\":\"\"}"); close(sock); DEBUGP("%s:finish\n",__FUNCTION__); return 0; }