X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/e3354945168e45e49cc0716349d44837eef96db1..ea51635c016b132b4674468ab06b503d4fac74cd:/modules/m_whowas.c diff --git a/modules/m_whowas.c b/modules/m_whowas.c index 807f84a5..1566f402 100644 --- a/modules/m_whowas.c +++ b/modules/m_whowas.c @@ -20,16 +20,13 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA - * - * $Id: m_whowas.c 1717 2006-07-04 14:41:11Z jilles $ */ #include "stdinc.h" #include "whowas.h" #include "client.h" -#include "common.h" #include "hash.h" -#include "irc_string.h" +#include "match.h" #include "ircd.h" #include "ircd_defs.h" #include "numeric.h" @@ -40,42 +37,51 @@ #include "msg.h" #include "parse.h" #include "modules.h" +#include "s_newconf.h" + +static const char whowas_desc[] = + "Provides the WHOWAS command to display information on a disconnected user"; -static int m_whowas(struct Client *, struct Client *, int, const char **); +static void m_whowas(struct MsgBuf *, struct Client *, struct Client *, int, const char **); struct Message whowas_msgtab = { - "WHOWAS", 0, 0, 0, MFLG_SLOW, - {mg_unreg, {m_whowas, 2}, mg_ignore, mg_ignore, mg_ignore, {m_whowas, 2}} + "WHOWAS", 0, 0, 0, 0, + {mg_unreg, {m_whowas, 2}, {m_whowas, 4}, mg_ignore, mg_ignore, {m_whowas, 2}} }; mapi_clist_av1 whowas_clist[] = { &whowas_msgtab, NULL }; -DECLARE_MODULE_AV1(whowas, NULL, NULL, whowas_clist, NULL, NULL, "$Revision: 1717 $"); + +DECLARE_MODULE_AV2(whowas, NULL, NULL, whowas_clist, NULL, NULL, NULL, NULL, whowas_desc); /* ** m_whowas -** parv[0] = sender prefix ** parv[1] = nickname queried */ -static int -m_whowas(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) -{ - struct Whowas *temp; +static void +m_whowas(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +{ + rb_dlink_list *whowas_list; + rb_dlink_node *ptr; int cur = 0; - int max = -1, found = 0; + int max = -1; char *p; const char *nick; + char tbuf[26]; + long sendq_limit; static time_t last_used = 0L; - if(!IsOper(source_p)) + if(MyClient(source_p) && !IsOperGeneral(source_p)) { - if((last_used + ConfigFileEntry.pace_wait_simple) > rb_current_time()) + if(last_used + (parc > 3 ? ConfigFileEntry.pace_wait : + ConfigFileEntry.pace_wait_simple + ) > rb_current_time()) { sendto_one(source_p, form_str(RPL_LOAD2HI), me.name, source_p->name, "WHOWAS"); - sendto_one(source_p, form_str(RPL_ENDOFWHOWAS), - me.name, source_p->name, parv[1]); - return 0; + sendto_one_numeric(source_p, RPL_ENDOFWHOWAS, form_str(RPL_ENDOFWHOWAS), + parv[1]); + return; } else last_used = rb_current_time(); @@ -85,52 +91,62 @@ m_whowas(struct Client *client_p, struct Client *source_p, int parc, const char if(parc > 2) max = atoi(parv[2]); -#if 0 if(parc > 3) if(hunt_server(client_p, source_p, ":%s WHOWAS %s %s :%s", 3, parc, parv)) - return 0; -#endif + return; + + if(!MyClient(source_p) && (max <= 0 || max > 20)) + max = 20; if((p = strchr(parv[1], ','))) *p = '\0'; nick = parv[1]; - temp = WHOWASHASH[hash_whowas_name(nick)]; - found = 0; - for (; temp; temp = temp->next) + sendq_limit = get_sendq(client_p) * 9 / 10; + whowas_list = whowas_get_list(nick); + + if(whowas_list == NULL) + { + sendto_one_numeric(source_p, ERR_WASNOSUCHNICK, form_str(ERR_WASNOSUCHNICK), nick); + sendto_one_numeric(source_p, RPL_ENDOFWHOWAS, form_str(RPL_ENDOFWHOWAS), parv[1]); + return; + } + + RB_DLINK_FOREACH(ptr, whowas_list->head) { - if(!irccmp(nick, temp->name)) + struct Whowas *temp = ptr->data; + if(cur > 0 && rb_linebuf_len(&client_p->localClient->buf_sendq) > sendq_limit) { - sendto_one(source_p, form_str(RPL_WHOWASUSER), - me.name, source_p->name, temp->name, - temp->username, temp->hostname, temp->realname); - if (MyOper(source_p) && !EmptyString(temp->sockhost)) -#if 0 - sendto_one(source_p, form_str(RPL_WHOWASREAL), - me.name, source_p->name, temp->name, - "", temp->sockhost); -#else - sendto_one_numeric(source_p, RPL_WHOISACTUALLY, - form_str(RPL_WHOISACTUALLY), - temp->name, temp->sockhost); -#endif - sendto_one_numeric(source_p, RPL_WHOISSERVER, - form_str(RPL_WHOISSERVER), - temp->name, temp->servername, - myctime(temp->logoff)); - cur++; - found++; + sendto_one(source_p, form_str(ERR_TOOMANYMATCHES), + me.name, source_p->name, "WHOWAS"); + break; } + + sendto_one(source_p, form_str(RPL_WHOWASUSER), + me.name, source_p->name, temp->name, + temp->username, temp->hostname, temp->realname); + if (!EmptyString(temp->sockhost) && + strcmp(temp->sockhost, "0") && + show_ip_whowas(temp, source_p)) + sendto_one_numeric(source_p, RPL_WHOISACTUALLY, + form_str(RPL_WHOISACTUALLY), + temp->name, temp->sockhost); + + if (!EmptyString(temp->suser)) + sendto_one_numeric(source_p, RPL_WHOISLOGGEDIN, + "%s %s :was logged in as", + temp->name, temp->suser); + + sendto_one_numeric(source_p, RPL_WHOISSERVER, + form_str(RPL_WHOISSERVER), + temp->name, temp->servername, + rb_ctime(temp->logoff, tbuf, sizeof(tbuf))); + + cur++; if(max > 0 && cur >= max) break; } - if(!found) - sendto_one(source_p, form_str(ERR_WASNOSUCHNICK), - me.name, source_p->name, nick); - - sendto_one(source_p, form_str(RPL_ENDOFWHOWAS), - me.name, source_p->name, parv[1]); - return 0; + sendto_one_numeric(source_p, RPL_ENDOFWHOWAS, form_str(RPL_ENDOFWHOWAS), parv[1]); }