static int run_pig_run(const char *signatures, const char *targets, const char *timeout, const char *single_test, const char *gw_addr, const char *nt_mask, const char *loiface) { int timeo = 10000; pigsty_entry_ctx *pigsty = NULL; size_t signatures_count = 0, addr_count = 0; pigsty_entry_ctx *signature = NULL, *sp = NULL; pig_target_addr_ctx *addr = NULL, *addr_p = NULL; pig_hwaddr_ctx *hwaddr = NULL; int sockfd = -1; int retval = 0; unsigned int nt_mask_addr[4] = { 0, 0, 0, 0 }; unsigned char *gw_hwaddr = NULL, *temp = NULL; in_addr_t gw_in_addr = 0; if (timeout != NULL) { timeo = atoi(timeout); } timeo = timeo * 1000; if (!should_be_quiet) { printf("pig INFO: starting up pig engine...\n\n"); } sockfd = init_raw_socket(loiface); if (sockfd == -1) { printf("pig PANIC: unable to create the socket.\npig ERROR: aborted.\n"); return 1; } pigsty = load_signatures(signatures); if (pigsty == NULL) { printf("pig ERROR: aborted.\n"); deinit_raw_socket(sockfd); return 1; } if (targets != NULL) { if (!should_be_quiet) { printf("\npig INFO: parsing the supplied targets...\n"); printf("pig INFO: all targets were parsed.\n"); } addr = parse_targets(targets); } if (is_targets_option_required(pigsty) && addr == NULL) { printf("pig PANIC: --targets option is required by some loaded signatures.\n"); deinit_raw_socket(sockfd); del_pigsty_entry(pigsty); return 1; } signatures_count = get_pigsty_entry_count(pigsty); if (!should_be_quiet) { printf("\npig INFO: done (%d signature(s) read).\n\n", signatures_count); } if (nt_mask == NULL) { printf("\npig PANIC: --net-mask option is required.\n"); deinit_raw_socket(sockfd); del_pigsty_entry(pigsty); return 1; } // WARN(Santiago): by now IPv4 only. if (verify_ipv4_addr(nt_mask) == 0) { printf("pig PANIC: --net-mask has an invalid ip address.\n"); deinit_raw_socket(sockfd); del_pigsty_entry(pigsty); return 1; } nt_mask_addr[0] = htonl(inet_addr(nt_mask)); if (gw_addr != NULL && loiface != NULL) { gw_in_addr = inet_addr(gw_addr); temp = get_mac_by_addr(gw_in_addr, loiface, 2); if (!should_be_quiet && temp != NULL) { gw_hwaddr = mac2byte(temp, strlen(temp)); printf("pig INFO: the gateway's physical address is \"%s\"...\n" "pig INFO: the local interface is \"%s\"...\n" "pig INFO: the network mask is \"%s\"...\n\n", temp, loiface, nt_mask); free(temp); } } if (gw_hwaddr != NULL) { signature = get_pigsty_entry_by_index(rand() % signatures_count, pigsty); if (single_test == NULL) { while (!should_exit) { if (signature == NULL) { continue; // WARN(Santiago): It should never happen. However... Sometimes... The World tends to be a rather weird place. } if (oink(signature, &hwaddr, addr, sockfd, gw_hwaddr, nt_mask_addr, loiface) != -1) { if (!should_be_quiet) { printf("pig INFO: a packet based on signature \"%s\" was sent.\n", signature->signature_name); } usleep(timeo); } signature = get_pigsty_entry_by_index(rand() % signatures_count, pigsty); } } else { retval = (oink(signature, &hwaddr, addr, sockfd, gw_hwaddr, nt_mask_addr, loiface) != -1 ? 0 : 1); if (retval == 0) { if (!should_be_quiet) { printf("pig INFO: a packet based on signature \"%s\" was sent.\n", signature->signature_name); } } } free(gw_hwaddr); } else { printf("\npig PANIC: unable to get the gateway's physical address.\n"); } del_pigsty_entry(pigsty); del_pig_target_addr(addr); del_pig_hwaddr(hwaddr); deinit_raw_socket(sockfd); return retval; }
CUTE_TEST_CASE(pigsty_entry_ctx_tests) pigsty_entry_ctx *pigsty = NULL, *p; pigsty = add_signature_to_pigsty_entry(pigsty, "oink"); pigsty = add_signature_to_pigsty_entry(pigsty, "roc!"); CUTE_CHECK("pigsty == NULL", pigsty != NULL); CUTE_CHECK("pigsty->signature_name != oink", strcmp(pigsty->signature_name, "oink") == 0); CUTE_CHECK("pigsty->next == NULL", pigsty->next != NULL); CUTE_CHECK("pigsty->next->signature_name != roc!", strcmp(pigsty->next->signature_name, "roc!") == 0); CUTE_CHECK("pigsty->next->next != NULL", pigsty->next->next == NULL); p = get_pigsty_entry_signature_name("oink", pigsty); CUTE_CHECK("p == NULL", p != NULL); CUTE_CHECK("p->signature_name != oink", strcmp(p->signature_name, "oink") == 0); p = get_pigsty_entry_signature_name("not-added", pigsty); CUTE_CHECK("p != NULL", p == NULL); CUTE_CHECK("get_pigsty_entry_count() != 2", get_pigsty_entry_count(pigsty) == 2); p = get_pigsty_entry_by_index(1, pigsty); CUTE_CHECK("p == NULL", p != NULL); CUTE_CHECK("p->signature_name != roc!", strcmp(p->signature_name, "roc!") == 0); p = get_pigsty_entry_by_index(-1, pigsty); CUTE_CHECK("p != NULL", p == NULL); del_pigsty_entry(pigsty); CUTE_TEST_CASE_END CUTE_TEST_CASE(pigsty_conf_set_ctx_tests) pigsty_entry_ctx *pigsty = NULL; pigsty_conf_set_ctx *cp = NULL; pigsty = add_signature_to_pigsty_entry(pigsty, "oink"); CUTE_CHECK("pigsty == NULL", pigsty != NULL); char *data = "abc"; pigsty->conf = add_conf_to_pigsty_conf_set(pigsty->conf, kIpv4_version, data, strlen(data)); pigsty->conf = add_conf_to_pigsty_conf_set(pigsty->conf, kIpv4_tos, "xyz.", 4);