mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-03-13 17:20:21 +00:00
Rewrite dns command
- Cross platform - Doesn't depend on external tools
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user