From 1110a5d3d27947066b4ba846a0d80c6b573d6ca0 Mon Sep 17 00:00:00 2001 From: Joseph Bongaarts Date: Tue, 19 Mar 2002 22:03:36 +0000 Subject: [PATCH] Author: Ghostwolf Log message: Made links behave like map, so it is also more useful with HEAD_IN_SAND_LINKS defined. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@681 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 15 ++++++++++++ include/handlers.h | 1 - include/ircd_defs.h | 3 ++- include/map.h | 10 ++++++-- ircd/m_links.c | 59 ++++++++++----------------------------------- ircd/m_server.c | 4 +-- ircd/map.c | 48 +++++++++++++++++++++++++++++++++--- ircd/parse.c | 4 +-- ircd/s_misc.c | 2 +- 9 files changed, 88 insertions(+), 58 deletions(-) diff --git a/ChangeLog b/ChangeLog index ba18638..e50c78b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 2002-03-19 Joseph Bongaarts + * ircd/m_links.c: Make /links behave like /map for head_in_sand. + cleaned up excess code. + + * ircd/map.c: Added map_dump_links_head_in_sand() Made changes in + map_add() and map_update() for links changes. + + * include/map.h: Added info and prot to struct Map + + * include/ircd_defs.h: Added MAP_CACHE_TIME for length of time + servers are cached in MapList + + * ircd/s_misc.c: changed #ifdef for map_update() + + * ircd/m_server.c: changed #ifdef for map_update() + * include/ircd_policy.h: added NO_HEAD_IN_SAND for easier removal of hiding features. diff --git a/include/handlers.h b/include/handlers.h index 1058cfb..e65ab88 100644 --- a/include/handlers.h +++ b/include/handlers.h @@ -187,7 +187,6 @@ extern int ms_join(struct Client*, struct Client*, int, char*[]); extern int ms_jupe(struct Client*, struct Client*, int, char*[]); extern int ms_kick(struct Client*, struct Client*, int, char*[]); extern int ms_kill(struct Client*, struct Client*, int, char*[]); -extern int ms_links(struct Client*, struct Client*, int, char*[]); extern int ms_lusers(struct Client*, struct Client*, int, char*[]); extern int ms_mode(struct Client*, struct Client*, int, char*[]); extern int ms_motd(struct Client*, struct Client*, int, char*[]); diff --git a/include/ircd_defs.h b/include/ircd_defs.h index 492c49e..04b9074 100644 --- a/include/ircd_defs.h +++ b/include/ircd_defs.h @@ -115,5 +115,6 @@ #define STARTTARGETS 10 #define RESERVEDTARGETS 12 -#endif /* INCLUDED_ircd_defs_h */ +#define MAP_CACHE_TIME 604800 +#endif /* INCLUDED_ircd_defs_h */ diff --git a/include/map.h b/include/map.h index 08db3e3..91d1a55 100644 --- a/include/map.h +++ b/include/map.h @@ -31,19 +31,25 @@ #define INCLUDED_sys_types_h #endif -#ifdef HEAD_IN_SAND_MAP +#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS) struct Map { time_t lasttime; unsigned int maxclients; char name[HOSTLEN+1]; + char info[REALLEN+1]; + unsigned short prot; struct Map *next; struct Map *prev; }; extern void map_update(struct Client *server); +#endif /* defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS) */ +#ifdef HEAD_IN_SAND_LINKS +extern void map_dump_links_head_in_sand(struct Client *sptr, char *mask); +#endif /* HEAD_IN_SAND_LINKS */ +#ifdef HEAD_IN_SAND_MAP extern void map_dump_head_in_sand(struct Client *cptr); - #endif /* HEAD_IN_SAND_MAP */ extern void map_dump(struct Client *cptr, struct Client *server, char *mask, int prompt_length); diff --git a/ircd/m_links.c b/ircd/m_links.c index 5c23c1a..60cd7d3 100644 --- a/ircd/m_links.c +++ b/ircd/m_links.c @@ -94,6 +94,7 @@ #include "s_user.h" #include "send.h" #include "struct.h" +#include "map.h" #include @@ -112,7 +113,7 @@ int m_links(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char *mask; - struct Client *acptr; + struct Client *acptr = 0; if (parc > 2) { @@ -136,62 +137,28 @@ int m_links(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) } send_reply(sptr, RPL_ENDOFLINKS, BadPtr(mask) ? "*" : mask); + return 0; } #ifdef HEAD_IN_SAND_LINKS -int m_links_redirect(struct Client* cptr, struct Client* sptr, int parc, - char* parv[]) +int m_links_redirect(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { - if (parc > 2) return send_reply(cptr, ERR_NOPRIVILEGES); - send_reply(sptr, RPL_ENDOFLINKS, parc < 2 ? "*" : parv[1]); - sendcmdto_one(&me, CMD_NOTICE, sptr, "%C :%s", sptr, - "/LINKS has been disabled, from CFV-165. Visit " URL_SERVERS ); + map_dump_links_head_in_sand(sptr, parv[1]); + + send_reply(sptr, RPL_ENDOFLINKS, BadPtr(parv[1]) ? "*" : parv[1]); + return 0; } -#endif -/* - * ms_links - server message handler - * - * parv[0] = sender prefix - * parv[1] = servername mask - * - * or - * - * parv[0] = sender prefix - * parv[1] = server to query - * parv[2] = servername mask - */ -int ms_links(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) -{ - char *mask; - struct Client *acptr; +#endif HEAD_IN_SAND_LINKS + + + + - if (parc > 2) - { - if (hunt_server_cmd(sptr, CMD_LINKS, cptr, 1, "%C :%s", 1, parc, parv) != - HUNTED_ISME) - return 0; - mask = parv[2]; - } - else - mask = parc < 2 ? 0 : parv[1]; - for (acptr = GlobalClientList, collapse(mask); acptr; acptr = cli_next(acptr)) - { - if (!IsServer(acptr) && !IsMe(acptr)) - continue; - if (!BadPtr(mask) && match(mask, cli_name(acptr))) - continue; - send_reply(sptr, RPL_LINKS, cli_name(acptr), cli_name(cli_serv(acptr)->up), - cli_hopcount(acptr), cli_serv(acptr)->prot, - ((cli_info(acptr))[0] ? cli_info(acptr) : "(Unknown Location)")); - } - send_reply(sptr, RPL_ENDOFLINKS, BadPtr(mask) ? "*" : mask); - return 0; -} diff --git a/ircd/m_server.c b/ircd/m_server.c index 12ecf47..78c8a95 100644 --- a/ircd/m_server.c +++ b/ircd/m_server.c @@ -639,7 +639,7 @@ int mr_server(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) else ret = 0; -#ifdef HEAD_IN_SAND_MAP +#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS) map_update(cptr); #endif @@ -1077,7 +1077,7 @@ int ms_server(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) Count_newremoteserver(UserStats); add_client_to_list(acptr); hAddClient(acptr); -#ifdef HEAD_IN_SAND_MAP +#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS) map_update(acptr); #endif diff --git a/ircd/map.c b/ircd/map.c index ea8d147..77119ff 100644 --- a/ircd/map.c +++ b/ircd/map.c @@ -49,7 +49,7 @@ #include #include -#ifdef HEAD_IN_SAND_MAP +#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS) static struct Map *MapList = 0; @@ -64,6 +64,8 @@ static void map_add(struct Client *server) map->lasttime = TStime(); strcpy(map->name, cli_name(server)); + strcpy(map->info, cli_info(server)); + map->prot = Protocol(server); map->maxclients = cli_serv(server)->clients; map->prev = 0; @@ -108,6 +110,8 @@ void map_update(struct Client *cptr) if(!ircd_strcmp(cli_name(cptr), map->name)) { map->lasttime = TStime(); + map->prot = Protocol(cptr); + strcpy(map->info, cli_info(cptr)); if(map->maxclients < cli_serv(cptr)->clients) map->maxclients = cli_serv(cptr)->clients; break; @@ -129,6 +133,9 @@ void map_update(struct Client *cptr) if(!map) map_add(cptr); } +#endif /* HEAD_IN_SAND_MAP || HEAD_IN_SAND_LINKS*/ + +#ifdef HEAD_IN_SAND_MAP void map_dump_head_in_sand(struct Client *cptr) { @@ -144,7 +151,7 @@ void map_dump_head_in_sand(struct Client *cptr) smap = map->next; /* Don't show servers we haven't seen in more than a week */ - if(map->lasttime < TStime() - 604800) + if(map->lasttime < TStime() - MAP_CACHE_TIME) { acptr = FindServer(map->name); if(!acptr) @@ -159,7 +166,42 @@ void map_dump_head_in_sand(struct Client *cptr) } } -#endif /* HEAD_IN_SAND_MAP */ +#endif /* HEAD_IN_SAND_MAP */ + +#ifdef HEAD_IN_SAND_LINKS +void map_dump_links_head_in_sand(struct Client *sptr, char *mask) +{ + struct Map *link = 0; + struct Map *slink = 0; + struct Client *acptr = 0; + + collapse(mask); + + for(link = MapList; link; link = slink) + { + slink = link->next; + + if(link->lasttime < TStime() - MAP_CACHE_TIME) + { + acptr = FindServer(link->name); + if(!acptr) + { + map_remove(link); + continue; + } + else + map_update(acptr); + } + if (!BadPtr(mask) && match(mask, link->name)) + continue; + send_reply(sptr, RPL_LINKS, link->name, cli_name(&me), 1, link->prot, + link->info); + } + /* don't forget to send me */ + send_reply(sptr, RPL_LINKS, cli_name(&me), cli_name(&me), 0, Protocol(&me), + cli_info(&me)); +} +#endif /* HEAD_IN_SAND_LINKS */ void map_dump(struct Client *cptr, struct Client *server, char *mask, int prompt_length) { diff --git a/ircd/parse.c b/ircd/parse.c index 7cde630..d5cd49d 100644 --- a/ircd/parse.c +++ b/ircd/parse.c @@ -404,9 +404,9 @@ struct Message msgtab[] = { 0, MAXPARA, MFLG_SLOW, 0, /* UNREG, CLIENT, SERVER, OPER, SERVICE */ #ifdef HEAD_IN_SAND_LINKS - { m_unregistered, m_links_redirect, ms_links, m_links, m_ignore } + { m_unregistered, m_links_redirect, m_links, m_links, m_ignore } #else - { m_unregistered, m_links, ms_links, m_links, m_ignore } + { m_unregistered, m_links, m_links, m_links, m_ignore } #endif }, { diff --git a/ircd/s_misc.c b/ircd/s_misc.c index 1344f86..89a960d 100644 --- a/ircd/s_misc.c +++ b/ircd/s_misc.c @@ -477,7 +477,7 @@ int exit_client(struct Client *cptr, /* Connection being handled by sendto_opmask_butone(0, SNO_NETWORK, "Net break: %C %C (%s)", cli_serv(victim)->up, victim, comment); -#ifdef HEAD_IN_SAND_MAP +#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS) map_update(victim); #endif } -- 2.20.1