/* * Make a copy of a block. */ void wtap_block_copy(wtap_block_t dest_block, wtap_block_t src_block) { guint i; wtap_option_t *src_opt; wtap_opttype_t *opttype; /* * Copy the mandatory data. */ if (dest_block->info->copy_mand != NULL) dest_block->info->copy_mand(dest_block, src_block); /* Copy the options. For now, don't remove any options that are in destination * but not source. */ for (i = 0; i < src_block->options->len; i++) { src_opt = &g_array_index(src_block->options, wtap_option_t, i); opttype = &g_array_index(src_block->info->options, wtap_opttype_t, src_opt->option_id); switch(opttype->data_type) { case WTAP_OPTTYPE_UINT8: wtap_block_add_uint8_option(dest_block, src_opt->option_id, src_opt->value.uint8val); break; case WTAP_OPTTYPE_UINT64: wtap_block_add_uint64_option(dest_block, src_opt->option_id, src_opt->value.uint64val); break; case WTAP_OPTTYPE_IPv4: wtap_block_add_ipv4_option(dest_block, src_opt->option_id, src_opt->value.ipv4val); break; case WTAP_OPTTYPE_IPv6: wtap_block_add_ipv6_option(dest_block, src_opt->option_id, &src_opt->value.ipv6val); break; case WTAP_OPTTYPE_STRING: wtap_block_add_string_option(dest_block, src_opt->option_id, src_opt->value.stringval, strlen(src_opt->value.stringval)); break; case WTAP_OPTTYPE_CUSTOM: wtap_block_add_custom_option(dest_block, src_opt->option_id, src_opt->value.customval.data, src_opt->value.customval.size); break; } } }
wtap_opttype_return_val wtap_block_set_string_option_value(wtap_block_t block, guint option_id, const char *value, size_t value_length) { wtap_opttype_return_val ret; wtap_optval_t *optval; ret = wtap_block_get_option_common(block, option_id, WTAP_OPTTYPE_STRING, &optval); if (ret != WTAP_OPTTYPE_SUCCESS) { if (ret == WTAP_OPTTYPE_NOT_FOUND) { /* * There's no instance to set, so just try to create a new one * with the value. */ return wtap_block_add_string_option(block, option_id, value, value_length); } /* Otherwise fail. */ return ret; } g_free(optval->stringval); optval->stringval = g_strndup(value, value_length); return WTAP_OPTTYPE_SUCCESS; }
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; }