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

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