2002-03-19 Joseph Bongaarts <foxxe@wtfs.net>
+ * 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.
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*[]);
#define STARTTARGETS 10
#define RESERVEDTARGETS 12
-#endif /* INCLUDED_ircd_defs_h */
+#define MAP_CACHE_TIME 604800
+#endif /* INCLUDED_ircd_defs_h */
#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);
#include "s_user.h"
#include "send.h"
#include "struct.h"
+#include "map.h"
#include <assert.h>
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)
{
}
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;
-}
else
ret = 0;
-#ifdef HEAD_IN_SAND_MAP
+#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS)
map_update(cptr);
#endif
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
#include <stdio.h>
#include <string.h>
-#ifdef HEAD_IN_SAND_MAP
+#if defined(HEAD_IN_SAND_MAP) || defined(HEAD_IN_SAND_LINKS)
static struct Map *MapList = 0;
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;
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;
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)
{
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)
}
}
-#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)
{
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
},
{
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
}