Rewrite dns command

- Cross platform
- Doesn't depend on external tools
This commit is contained in:
TingPing
2014-01-08 01:32:28 -05:00
parent 9cba22c38a
commit 20d26aea94
13 changed files with 65 additions and 562 deletions

View File

@@ -417,8 +417,6 @@ const struct prefs vars[] =
{"dcc_stall_timeout", P_OFFINT (hex_dcc_stall_timeout), TYPE_INT},
{"dcc_timeout", P_OFFINT (hex_dcc_timeout), TYPE_INT},
{"dnsprogram", P_OFFSET (hex_dnsprogram), TYPE_STR},
{"flood_ctcp_num", P_OFFINT (hex_flood_ctcp_num), TYPE_INT},
{"flood_ctcp_time", P_OFFINT (hex_flood_ctcp_time), TYPE_INT},
{"flood_msg_num", P_OFFINT (hex_flood_msg_num), TYPE_INT},
@@ -875,7 +873,6 @@ load_default_config(void)
strcpy (prefs.hex_dcc_dir, g_build_filename (g_get_home_dir (), "Downloads", NULL));
}
#endif
strcpy (prefs.hex_dnsprogram, "host");
strcpy (prefs.hex_gui_ulist_doubleclick, "QUERY %s");
strcpy (prefs.hex_input_command_char, "/");
strcpy (prefs.hex_irc_logmask, g_build_filename ("%n", "%c.log", NULL));

View File

@@ -318,7 +318,6 @@ struct hexchatprefs
char hex_dcc_completed_dir[PATHLEN + 1];
char hex_dcc_dir[PATHLEN + 1];
char hex_dcc_ip[DOMAINLEN + 1];
char hex_dnsprogram[72];
char hex_gui_ulist_doubleclick[256];
char hex_input_command_char[4];
char hex_irc_extra_hilight[300];

View File

@@ -33,6 +33,8 @@
#define WANTDNS
#include "inet.h"
#include <gio/gio.h>
#include "hexchat.h"
#include "util.h"
#include "ignore.h"
@@ -1270,20 +1272,71 @@ inbound_next_nick (session *sess, char *nick, int error,
}
}
static void
dns_addr_callback (GResolver *resolver, GAsyncResult *result, session *sess)
{
gchar *addr;
g_return_if_fail (is_session(sess));
addr = g_resolver_lookup_by_address_finish (resolver, result, NULL);
if (addr)
PrintTextf (sess, _("Resolved to %s"), addr);
else
PrintText (sess, _("Not found"));
}
static void
dns_name_callback (GResolver *resolver, GAsyncResult *result, session *sess)
{
GList* addrs;
gchar* addr;
GList* list;
g_return_if_fail (is_session (sess));
addrs = g_resolver_lookup_by_name_finish (resolver, result, NULL);
if (addrs)
{
PrintText (sess, _("Resolved to:"));
for (list = g_list_first (addrs); list; list = g_list_next (list))
{
addr = g_inet_address_to_string (list->data);
PrintTextf (sess, " %s", addr);
}
g_resolver_free_addresses (addrs);
}
else
PrintText (sess, _("Not found"));
}
void
do_dns (session *sess, char *nick, char *host,
const message_tags_data *tags_data)
const message_tags_data *tags_data)
{
GResolver *res = g_resolver_get_default ();
GInetAddress *addr;
char *po;
char tbuf[1024];
po = strrchr (host, '@');
if (po)
host = po + 1;
EMIT_SIGNAL_TIMESTAMP (XP_TE_RESOLVINGUSER, sess, nick, host, NULL, NULL, 0,
tags_data->timestamp);
snprintf (tbuf, sizeof (tbuf), "exec -d %s %s", prefs.hex_dnsprogram, host);
handle_command (sess, tbuf, FALSE);
if (nick)
EMIT_SIGNAL_TIMESTAMP (XP_TE_RESOLVINGUSER, sess, nick, host, NULL, NULL, 0,
tags_data->timestamp);
PrintTextf (sess, _("Looking up %s..."), host);
addr = g_inet_address_new_from_string (host);
if (addr)
g_resolver_lookup_by_address_async (res, addr, NULL, dns_addr_callback, sess);
else
g_resolver_lookup_by_name_async (res, host, NULL, dns_name_callback, sess);
}
static void

View File

@@ -1414,21 +1414,17 @@ cmd_discon (struct session *sess, char *tbuf, char *word[], char *word_eol[])
static int
cmd_dns (struct session *sess, char *tbuf, char *word[], char *word_eol[])
{
#ifdef WIN32
PrintText (sess, "DNS is not implemented in Windows.\n");
return TRUE;
#else
char *nick = word[2];
struct User *user;
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
if (*nick)
{
if (strchr (nick, '.') == NULL)
user = userlist_find (sess, nick);
if (user)
{
user = userlist_find (sess, nick);
if (user && user->hostname)
if (user->hostname)
{
message_tags_data no_tags = MESSAGE_TAGS_DATA_INIT;
do_dns (sess, user->nick, user->hostname, &no_tags);
} else
{
@@ -1437,13 +1433,11 @@ cmd_dns (struct session *sess, char *tbuf, char *word[], char *word_eol[])
}
} else
{
snprintf (tbuf, TBUFSIZE, "exec -d %s %s", prefs.hex_dnsprogram, nick);
handle_command (sess, tbuf, FALSE);
do_dns (sess, NULL, nick, &no_tags);
}
return TRUE;
}
return FALSE;
#endif
}
static int
@@ -3904,7 +3898,7 @@ const struct commands xc_cmds[] = {
{"DEVOICE", cmd_devoice, 1, 1, 1,
N_("DEVOICE <nick>, removes voice status from the nick on the current channel (needs chanop)")},
{"DISCON", cmd_discon, 0, 0, 1, N_("DISCON, Disconnects from server")},
{"DNS", cmd_dns, 0, 0, 1, N_("DNS <nick|host|ip>, Finds a users IP number")},
{"DNS", cmd_dns, 0, 0, 1, N_("DNS <nick|host|ip>, Resolves an IP or hostname")},
{"ECHO", cmd_echo, 0, 0, 1, N_("ECHO <text>, Prints text locally")},
#ifndef WIN32
{"EXEC", cmd_exec, 0, 0, 1,

View File

@@ -491,7 +491,6 @@ plugin_auto_load (session *sess)
/* a long list of bundled plugins that should be loaded automatically,
* user plugins should go to <config>, leave Program Files alone! */
for_files (HEXCHATLIBDIR, "hcchecksum.dll", plugin_auto_load_cb);
for_files (HEXCHATLIBDIR, "hcdns.dll", plugin_auto_load_cb);
for_files (HEXCHATLIBDIR, "hcdoat.dll", plugin_auto_load_cb);
for_files (HEXCHATLIBDIR, "hcexec.dll", plugin_auto_load_cb);
for_files (HEXCHATLIBDIR, "hcfishlim.dll", plugin_auto_load_cb);