Add an add_hosts_file routine that adds a "hosts" path to an array and

use it in tshark.c instead of read_hosts_file. This lets us use "-H"
multiple times. Make read_hosts_file static.

svn path=/trunk/; revision=46273
This commit is contained in:
Gerald Combs 2012-11-29 00:32:39 +00:00
parent 40a2218110
commit bd19dcd8bf
5 changed files with 56 additions and 17 deletions

View File

@ -433,7 +433,7 @@ Print the version and options and exits.
=item -H E<lt>input hosts fileE<gt>
Read a list of entries from a "hosts" file, which will then be written
to a capture file. Implies B<-W n>.
to a capture file. Implies B<-W n>. Can be called multiple times.
The "hosts" file format is documented at
L<http://en.wikipedia.org/wiki/Hosts_(file)>.

View File

@ -277,6 +277,7 @@ static gboolean new_resolved_objects = FALSE;
static struct addrinfo *addrinfo_list = NULL; /* IPv4 and IPv6 */
static struct addrinfo *addrinfo_list_last = NULL;
static GPtrArray* extra_hosts_files = NULL;
static hashether_t *add_eth_name(const guint8 *addr, const gchar *name);
static void add_serv_port_cb(const guint32 port);
@ -2009,7 +2010,7 @@ ipxnet_addr_lookup(const gchar *name, gboolean *success)
} /* ipxnet_addr_lookup */
gboolean
static gboolean
read_hosts_file (const char *hostspath)
{
FILE *hf;
@ -2075,6 +2076,36 @@ read_hosts_file (const char *hostspath)
return TRUE;
} /* read_hosts_file */
gboolean
add_hosts_file (const char *hosts_file)
{
FILE *hf;
gboolean found = FALSE;
guint i;
if (!hosts_file)
return FALSE;
if ((hf = ws_fopen(hosts_file, "r")) == NULL)
return FALSE;
if (!extra_hosts_files)
extra_hosts_files = g_ptr_array_new();
for (i = 0; i < extra_hosts_files->len; i++) {
if (strcmp(hosts_file, (const char *) g_ptr_array_index(extra_hosts_files, i)) == 0)
found = TRUE;
}
if (!found) {
g_ptr_array_add(extra_hosts_files, g_strdup(hosts_file));
if (addrinfo_list) {
return read_hosts_file (hosts_file);
}
}
return TRUE;
}
gboolean
add_ip_name_from_string (const char *addr, const char *name)
{
@ -2425,6 +2456,7 @@ void
host_name_lookup_init(void) {
char *hostspath;
struct addrinfo *ai;
guint i;
#ifdef HAVE_GNU_ADNS
#ifdef _WIN32
@ -2522,6 +2554,12 @@ host_name_lookup_init(void) {
#endif /* HAVE_GNU_ADNS */
#endif /* HAVE_C_ARES */
if(extra_hosts_files && !gbl_resolv_flags.load_hosts_file_from_profile_only){
for (i = 0; i < extra_hosts_files->len; i++) {
read_hosts_file((const char *) g_ptr_array_index(extra_hosts_files, i));
}
}
subnet_name_lookup_init();
}

View File

@ -214,8 +214,16 @@ extern void add_ipv4_name(const guint addr, const gchar *name);
/* adds a hostname/IPv6 in the hash table */
extern void add_ipv6_name(const struct e_in6_addr *addr, const gchar *name);
/* read a "hosts" file and add its entries to the IPv4 & IPv6 hash tables */
extern gboolean read_hosts_file (const char *hostspath);
/** Add an additional "hosts" file for IPv4 and IPv6 name resolution.
*
* The file can be added before host_name_lookup_init() is called and
* will be re-read each time host_name_lookup_init() is called.
*
* @param hostspath Absolute path to the hosts file.
*
* @return TRUE if the hosts file can be read.
*/
extern gboolean add_hosts_file (const char *hosts_file);
/* adds a hostname in the hash table */
extern gboolean add_ip_name_from_string (const char *addr, const char *name);

View File

@ -11,6 +11,7 @@
EXPORTS
abs_time_secs_to_str
abs_time_to_str
add_hosts_file
add_new_data_source
add_ip_name_from_string
add_ipv4_name
@ -905,7 +906,6 @@ range_copy
range_empty
range_foreach
ranges_are_equal
read_hosts_file
read_keytab_file
read_keytab_file_from_preferences
read_prefs

View File

@ -889,7 +889,6 @@ main(int argc, char *argv[])
volatile int out_file_type = WTAP_FILE_PCAP;
#endif
volatile gboolean out_file_name_res = FALSE;
gchar *hosts_file = NULL;
gchar *volatile cf_name = NULL;
gchar *rfilter = NULL;
#ifdef HAVE_PCAP_OPEN_DEAD
@ -1277,7 +1276,11 @@ main(int argc, char *argv[])
}
break;
case 'H': /* Read address to name mappings from a hosts file */
hosts_file = optarg;
if (! add_hosts_file(optarg))
{
cmdarg_err("Can't read host entries from \"%s\"", optarg);
return 1;
}
out_file_name_res = TRUE;
break;
@ -1842,16 +1845,6 @@ main(int argc, char *argv[])
g_assert_not_reached();
}
/* Read in the hosts file after cf_open() (which calls init_dissection()
* which resets the name database).
*/
if (hosts_file) {
if (! read_hosts_file(hosts_file)) {
cmdarg_err("Can't read host entries from \"%s\"", hosts_file);
return 1;
}
}
/* Process the packets in the file */
TRY {
#ifdef HAVE_LIBPCAP