GArray* wtap_file_get_nrb_for_new_file(wtap *wth) { guint nrb_count; wtap_block_t nrb_hdr_src, nrb_hdr_dest; GArray* nrb_hdrs; if ((wth == NULL || wth->nrb_hdrs == NULL) || (wth->nrb_hdrs->len == 0)) return NULL; nrb_hdrs = g_array_new(FALSE, FALSE, sizeof(wtap_block_t)); for (nrb_count = 0; nrb_count < wth->nrb_hdrs->len; nrb_count++) { nrb_hdr_src = g_array_index(wth->nrb_hdrs, wtap_block_t, nrb_count); nrb_hdr_dest = wtap_block_create(WTAP_BLOCK_NG_NRB); wtap_block_copy(nrb_hdr_dest, nrb_hdr_src); g_array_append_val(nrb_hdrs, nrb_hdr_dest); } return nrb_hdrs; }
GArray* wtap_file_get_shb_for_new_file(wtap *wth) { guint shb_count; wtap_block_t shb_hdr_src, shb_hdr_dest; GArray* shb_hdrs; if ((wth == NULL) || (wth->shb_hdrs == NULL) || (wth->shb_hdrs->len == 0)) return NULL; shb_hdrs = g_array_new(FALSE, FALSE, sizeof(wtap_block_t)); for (shb_count = 0; shb_count < wth->shb_hdrs->len; shb_count++) { shb_hdr_src = g_array_index(wth->shb_hdrs, wtap_block_t, shb_count); shb_hdr_dest = wtap_block_create(WTAP_BLOCK_NG_SECTION); wtap_block_copy(shb_hdr_dest, shb_hdr_src); g_array_append_val(shb_hdrs, shb_hdr_dest); } return shb_hdrs; }
/* adds IDB to merged file info, returns its index */ static guint add_idb_to_merged_file(wtapng_iface_descriptions_t *merged_idb_list, const wtap_block_t input_file_idb) { wtap_block_t idb = wtap_block_create(WTAP_BLOCK_IF_DESCR); wtapng_if_descr_mandatory_t* idb_mand; g_assert(merged_idb_list != NULL); g_assert(merged_idb_list->interface_data != NULL); g_assert(input_file_idb != NULL); wtap_block_copy(idb, input_file_idb); idb_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(idb); /* Don't copy filter or stat information */ idb_mand->num_stat_entries = 0; /* Number of ISB:s */ idb_mand->interface_statistics = NULL; g_array_append_val(merged_idb_list->interface_data, idb); return merged_idb_list->interface_data->len - 1; }
static void idb_copy_mand(wtap_block_t dest_block, wtap_block_t src_block) { guint j; wtap_block_t src_if_stats, dest_if_stats; wtapng_if_descr_mandatory_t *src_mand = (wtapng_if_descr_mandatory_t*)src_block->mandatory_data, *dest_mand = (wtapng_if_descr_mandatory_t*)dest_block->mandatory_data; /* Need special consideration for copying of the interface_statistics member */ if (dest_mand->num_stat_entries != 0) g_array_free(dest_mand->interface_statistics, TRUE); memcpy(dest_mand, src_mand, sizeof(wtapng_if_descr_mandatory_t)); if (src_mand->num_stat_entries != 0) { dest_mand->interface_statistics = g_array_new(FALSE, FALSE, sizeof(wtap_block_t)); for (j = 0; j < src_mand->num_stat_entries; j++) { src_if_stats = g_array_index(src_mand->interface_statistics, wtap_block_t, j); dest_if_stats = wtap_block_create(WTAP_BLOCK_IF_STATS); wtap_block_copy(dest_if_stats, src_if_stats); dest_mand->interface_statistics = g_array_append_val(dest_mand->interface_statistics, dest_if_stats); } } }
int exp_pdu_open(exp_pdu_t *exp_pdu_tap_data, int fd, char *comment) { int err; /* pcapng defs */ wtap_block_t shb_hdr; GArray *shb_hdrs = g_array_new(FALSE, FALSE, sizeof(wtap_block_t)); wtapng_iface_descriptions_t *idb_inf; wtap_block_t int_data; wtapng_if_descr_mandatory_t *int_data_mand; GString *os_info_str; gsize opt_len; gchar *opt_str; /* Create data for SHB */ os_info_str = g_string_new(""); get_os_version_info(os_info_str); shb_hdr = wtap_block_create(WTAP_BLOCK_NG_SECTION); /* options */ wtap_block_add_string_option(shb_hdr, OPT_COMMENT, comment, strlen(comment)); g_free(comment); /* * UTF-8 string containing the name of the operating system used to create * this section. */ opt_len = os_info_str->len; opt_str = g_string_free(os_info_str, FALSE); if (opt_str) { wtap_block_add_string_option(shb_hdr, OPT_SHB_OS, opt_str, opt_len); g_free(opt_str); } /* * UTF-8 string containing the name of the application used to create * this section. */ wtap_block_add_string_option_format(shb_hdr, OPT_SHB_USERAPPL, "Wireshark %s", get_ws_vcs_version_info()); /* Create fake IDB info */ idb_inf = g_new(wtapng_iface_descriptions_t,1); idb_inf->interface_data = g_array_new(FALSE, FALSE, sizeof(wtap_block_t)); /* create the fake interface data */ int_data = wtap_block_create(WTAP_BLOCK_IF_DESCR); int_data_mand = (wtapng_if_descr_mandatory_t*)wtap_block_get_mandatory_data(int_data); int_data_mand->wtap_encap = WTAP_ENCAP_WIRESHARK_UPPER_PDU; int_data_mand->time_units_per_second = 1000000000; /* default nanosecond resolution */ int_data_mand->snap_len = WTAP_MAX_PACKET_SIZE_STANDARD; wtap_block_add_string_option(int_data, OPT_IDB_NAME, "Fake IF, PDU->Export", strlen("Fake IF, PDU->Export")); wtap_block_add_uint8_option(int_data, OPT_IDB_TSRESOL, 9); g_array_append_val(idb_inf->interface_data, int_data); g_array_append_val(shb_hdrs, shb_hdr); /* Use a random name for the temporary import buffer */ exp_pdu_tap_data->wdh = wtap_dump_fdopen_ng(fd, WTAP_FILE_TYPE_SUBTYPE_PCAPNG, WTAP_ENCAP_WIRESHARK_UPPER_PDU, WTAP_MAX_PACKET_SIZE_STANDARD, FALSE, shb_hdrs, idb_inf, NULL, &err); if (exp_pdu_tap_data->wdh == NULL) { g_assert(err != 0); return err; } return 0; }