Speed up /unkline

- Use find_exact_conf_by_address() to find the kline and
  abort immediately if there is no such kline.
- When removing a permanent kline, remove the kline from
  the data structures instead of rehashing bans.
This commit is contained in:
Jilles Tjoelker 2007-11-29 00:12:51 +01:00
parent 4e0f14a0e8
commit 40a1d44606
1 changed files with 37 additions and 34 deletions

View File

@ -83,9 +83,9 @@ static int already_placed_kline(struct Client *, const char *, const char *, int
static void handle_remote_unkline(struct Client *source_p,
const char *user, const char *host);
static void remove_permkline_match(struct Client *, const char *, const char *);
static void remove_permkline_match(struct Client *, struct ConfItem *);
static int flush_write(struct Client *, FILE *, const char *, const char *);
static int remove_temp_kline(const char *, const char *);
static int remove_temp_kline(struct ConfItem *);
/* mo_kline()
*
@ -353,6 +353,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
char *host;
char splat[] = "*";
char *h = LOCAL_COPY(parv[1]);
struct ConfItem *aconf;
if(!IsOperUnkline(source_p))
{
@ -411,7 +412,14 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
cluster_generic(source_p, "UNKLINE", SHARED_UNKLINE, CAP_UNKLN,
"%s %s", user, host);
if(remove_temp_kline(user, host))
aconf = find_exact_conf_by_address(host, CONF_KILL, user);
if(aconf == NULL)
{
sendto_one_notice(source_p, ":No K-Line for %s@%s", user, host);
return 0;
}
if(remove_temp_kline(aconf))
{
sendto_one_notice(source_p, ":Un-klined [%s@%s] from temporary k-lines", user, host);
sendto_realops_snomask(SNO_GENERAL, L_ALL,
@ -422,7 +430,7 @@ mo_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
return 0;
}
remove_permkline_match(source_p, host, user);
remove_permkline_match(source_p, aconf);
return 0;
}
@ -465,11 +473,20 @@ me_unkline(struct Client *client_p, struct Client *source_p, int parc, const cha
static void
handle_remote_unkline(struct Client *source_p, const char *user, const char *host)
{
struct ConfItem *aconf;
if(!find_shared_conf(source_p->username, source_p->host,
source_p->servptr->name, SHARED_UNKLINE))
return;
if(remove_temp_kline(user, host))
aconf = find_exact_conf_by_address(host, CONF_KILL, user);
if(aconf == NULL)
{
sendto_one_notice(source_p, ":No K-Line for %s@%s", user, host);
return;
}
if(remove_temp_kline(aconf))
{
sendto_one_notice(source_p,
":Un-klined [%s@%s] from temporary k-lines",
@ -484,7 +501,7 @@ handle_remote_unkline(struct Client *source_p, const char *user, const char *hos
return;
}
remove_permkline_match(source_p, host, user);
remove_permkline_match(source_p, aconf);
}
/* apply_kline()
@ -739,7 +756,7 @@ already_placed_kline(struct Client *source_p, const char *luser, const char *lho
* hunts for a permanent kline, and removes it.
*/
static void
remove_permkline_match(struct Client *source_p, const char *host, const char *user)
remove_permkline_match(struct Client *source_p, struct ConfItem *aconf)
{
FILE *in, *out;
int pairme = 0;
@ -748,9 +765,13 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
char matchbuf[BUFSIZE];
char temppath[BUFSIZE];
const char *filename;
const char *host, *user;
mode_t oldumask;
int matchlen;
host = aconf->host;
user = aconf->user;
ircsnprintf(temppath, sizeof(temppath),
"%s.tmp", ConfigFileEntry.klinefile);
@ -820,7 +841,7 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
}
else if(!pairme)
{
sendto_one_notice(source_p, ":No K-Line for %s@%s",
sendto_one_notice(source_p, ":Cannot find K-Line for %s@%s in file",
user, host);
if(temppath != NULL)
@ -834,7 +855,6 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
sendto_one_notice(source_p, ":Couldn't rename temp file, aborted");
return;
}
rehash_bans(0);
sendto_one_notice(source_p, ":K-Line for [%s@%s] is removed",
user, host);
@ -845,6 +865,9 @@ remove_permkline_match(struct Client *source_p, const char *host, const char *us
ilog(L_KLINE, "UK %s %s %s",
get_oper_name(source_p), user, host);
delete_one_address_conf(aconf->host, aconf);
return;
}
@ -890,43 +913,23 @@ flush_write(struct Client *source_p, FILE * out, const char *buf, const char *te
* side effects - tries to unkline anything that matches
*/
static int
remove_temp_kline(const char *user, const char *host)
remove_temp_kline(struct ConfItem *aconf)
{
struct ConfItem *aconf;
dlink_node *ptr;
struct irc_sockaddr_storage addr, caddr;
int bits, cbits;
int mtype, ktype;
int i;
mtype = parse_netmask(host, (struct sockaddr *)&addr, &bits);
for (i = 0; i < LAST_TEMP_TYPE; i++)
{
DLINK_FOREACH(ptr, temp_klines[i].head)
{
aconf = ptr->data;
ktype = parse_netmask(aconf->host, (struct sockaddr *)&caddr, &cbits);
if(ktype != mtype || (user && irccmp(user, aconf->user)))
continue;
if(ktype == HM_HOST)
if (aconf == ptr->data)
{
if(irccmp(aconf->host, host))
continue;
}
else if(bits != cbits ||
!comp_with_mask_sock((struct sockaddr *)&addr,
(struct sockaddr *)&caddr, bits))
continue;
dlinkDestroy(ptr, &temp_klines[i]);
delete_one_address_conf(aconf->host, aconf);
return YES;
}
}
}
return NO;
}