X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/c98390004f4f14cd8215302d77313f81e2546e22..55bb399f79289b68e9d25db15c60463502d4c2dc:/modules/m_links.c diff --git a/modules/m_links.c b/modules/m_links.c index 295baa6..bc28ad8 100644 --- a/modules/m_links.c +++ b/modules/m_links.c @@ -26,7 +26,7 @@ #include "stdinc.h" #include "client.h" -#include "irc_string.h" +#include "match.h" #include "ircd.h" #include "numeric.h" #include "s_serv.h" @@ -40,6 +40,7 @@ static int m_links(struct Client *, struct Client *, int, const char **); static int mo_links(struct Client *, struct Client *, int, const char **); +static char * clean_string(char *dest, const unsigned char *src, size_t len); struct Message links_msgtab = { "LINKS", 0, 0, 0, MFLG_SLOW, @@ -58,10 +59,8 @@ DECLARE_MODULE_AV1(links, NULL, NULL, links_clist, links_hlist, NULL, "$Revision /* * m_links - LINKS message handler - * parv[0] = sender prefix * parv[1] = servername mask * or - * parv[0] = sender prefix * parv[1] = server to query * parv[2] = servername mask */ @@ -84,10 +83,12 @@ mo_links(struct Client *client_p, struct Client *source_p, int parc, const char char clean_mask[2 * HOSTLEN + 4]; hook_data hd; - dlink_node *ptr; + rb_dlink_node *ptr; if(parc > 2) { + if(strlen(parv[2]) > HOSTLEN) + return 0; if(hunt_server(client_p, source_p, ":%s LINKS %s :%s", 1, parc, parv) != HUNTED_ISME) return 0; @@ -107,7 +108,7 @@ mo_links(struct Client *client_p, struct Client *source_p, int parc, const char call_hook(doing_links_hook, &hd); - DLINK_FOREACH(ptr, global_serv_list.head) + RB_DLINK_FOREACH(ptr, global_serv_list.head) { target_p = ptr->data; @@ -129,3 +130,38 @@ mo_links(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } +static char * +clean_string(char *dest, const unsigned char *src, size_t len) +{ + char *d = dest; + s_assert(0 != dest); + s_assert(0 != src); + + if(dest == NULL || src == NULL) + return NULL; + + while (*src && (len > 1)) + { + if(*src & 0x80) /* if high bit is set */ + { + *d++ = '.'; + --len; + if(len <= 1) + break; + } + else if(!IsPrint(*src)) /* if NOT printable */ + { + *d++ = '^'; + --len; + if(len <= 1) + break; + *d++ = 0x40 + *src; /* turn it into a printable */ + } + else + *d++ = *src; + ++src; + --len; + } + *d = '\0'; + return dest; +}