Speed up /undline similarly
- Change find_exact_conf_by_address() to work for dlines also. - Use find_exact_conf_by_address() to find the dline and abort immediately if there is no such dline. - When removing a permanent dline, remove the dline from the data structures instead of rehashing bans. - Convert alternative ways to write the same dline to the one in the found dline. (This was changed in unkline too.)
This commit is contained in:
parent
40a1d44606
commit
6f3a09ff67
2 changed files with 27 additions and 28 deletions
|
@ -63,7 +63,7 @@ DECLARE_MODULE_AV1(dline, NULL, NULL, dline_clist, NULL, NULL, "$Revision: 3225
|
||||||
|
|
||||||
static int valid_comment(char *comment);
|
static int valid_comment(char *comment);
|
||||||
static int flush_write(struct Client *, FILE *, char *, char *);
|
static int flush_write(struct Client *, FILE *, char *, char *);
|
||||||
static int remove_temp_dline(const char *);
|
static int remove_temp_dline(struct ConfItem *);
|
||||||
|
|
||||||
/* mo_dline()
|
/* mo_dline()
|
||||||
*
|
*
|
||||||
|
@ -258,6 +258,7 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha
|
||||||
char buf[BUFSIZE], buff[BUFSIZE], temppath[BUFSIZE], *p;
|
char buf[BUFSIZE], buff[BUFSIZE], temppath[BUFSIZE], *p;
|
||||||
const char *filename, *found_cidr;
|
const char *filename, *found_cidr;
|
||||||
const char *cidr;
|
const char *cidr;
|
||||||
|
struct ConfItem *aconf;
|
||||||
int pairme = NO, error_on_write = NO;
|
int pairme = NO, error_on_write = NO;
|
||||||
mode_t oldumask;
|
mode_t oldumask;
|
||||||
|
|
||||||
|
@ -278,15 +279,23 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(remove_temp_dline(cidr))
|
aconf = find_exact_conf_by_address(cidr, CONF_DLINE, NULL);
|
||||||
|
if(aconf == NULL)
|
||||||
|
{
|
||||||
|
sendto_one_notice(source_p, ":No D-Line for %s", cidr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
strlcpy(buf, aconf->host, sizeof buf);
|
||||||
|
if(remove_temp_dline(aconf))
|
||||||
{
|
{
|
||||||
sendto_one(source_p,
|
sendto_one(source_p,
|
||||||
":%s NOTICE %s :Un-dlined [%s] from temporary D-lines",
|
":%s NOTICE %s :Un-dlined [%s] from temporary D-lines",
|
||||||
me.name, parv[0], cidr);
|
me.name, parv[0], buf);
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||||
"%s has removed the temporary D-Line for: [%s]",
|
"%s has removed the temporary D-Line for: [%s]",
|
||||||
get_oper_name(source_p), cidr);
|
get_oper_name(source_p), buf);
|
||||||
ilog(L_KLINE, "UD %s %s", get_oper_name(source_p), cidr);
|
ilog(L_KLINE, "UD %s %s", get_oper_name(source_p), buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,7 +339,7 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(irccmp(found_cidr, cidr) == 0)
|
if(irccmp(found_cidr, aconf->host) == 0)
|
||||||
{
|
{
|
||||||
pairme++;
|
pairme++;
|
||||||
}
|
}
|
||||||
|
@ -355,8 +364,8 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha
|
||||||
}
|
}
|
||||||
else if(!pairme)
|
else if(!pairme)
|
||||||
{
|
{
|
||||||
sendto_one(source_p, ":%s NOTICE %s :No D-Line for %s",
|
sendto_one_notice(source_p, ":Cannot find D-Line for %s in file",
|
||||||
me.name, parv[0], cidr);
|
aconf->host);
|
||||||
|
|
||||||
if(temppath != NULL)
|
if(temppath != NULL)
|
||||||
(void) unlink(temppath);
|
(void) unlink(temppath);
|
||||||
|
@ -369,13 +378,13 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha
|
||||||
sendto_one_notice(source_p, ":Couldn't rename temp file, aborted");
|
sendto_one_notice(source_p, ":Couldn't rename temp file, aborted");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
rehash_bans(0);
|
|
||||||
|
|
||||||
|
sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed", me.name, parv[0], aconf->host);
|
||||||
sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed", me.name, parv[0], cidr);
|
|
||||||
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||||
"%s has removed the D-Line for: [%s]", get_oper_name(source_p), cidr);
|
"%s has removed the D-Line for: [%s]", get_oper_name(source_p), aconf->host);
|
||||||
ilog(L_KLINE, "UD %s %s", get_oper_name(source_p), cidr);
|
ilog(L_KLINE, "UD %s %s", get_oper_name(source_p), aconf->host);
|
||||||
|
|
||||||
|
delete_one_address_conf(aconf->host, aconf);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -435,30 +444,21 @@ flush_write(struct Client *source_p, FILE * out, char *buf, char *temppath)
|
||||||
|
|
||||||
/* remove_temp_dline()
|
/* remove_temp_dline()
|
||||||
*
|
*
|
||||||
* inputs - hostname to undline
|
* inputs - confitem to undline
|
||||||
* outputs -
|
* outputs -
|
||||||
* side effects - tries to undline anything that matches
|
* side effects - tries to undline anything that matches
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
remove_temp_dline(const char *host)
|
remove_temp_dline(struct ConfItem *aconf)
|
||||||
{
|
{
|
||||||
struct ConfItem *aconf;
|
|
||||||
dlink_node *ptr;
|
dlink_node *ptr;
|
||||||
struct irc_sockaddr_storage addr, caddr;
|
|
||||||
int bits, cbits;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
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_dlines[i].head)
|
DLINK_FOREACH(ptr, temp_dlines[i].head)
|
||||||
{
|
{
|
||||||
aconf = ptr->data;
|
if (aconf == ptr->data)
|
||||||
|
|
||||||
parse_netmask(aconf->host, (struct sockaddr *)&caddr, &cbits);
|
|
||||||
|
|
||||||
if(comp_with_mask_sock((struct sockaddr *)&addr, (struct sockaddr *)&caddr, bits) && bits == cbits)
|
|
||||||
{
|
{
|
||||||
dlinkDestroy(ptr, &temp_dlines[i]);
|
dlinkDestroy(ptr, &temp_dlines[i]);
|
||||||
delete_one_address_conf(aconf->host, aconf);
|
delete_one_address_conf(aconf->host, aconf);
|
||||||
|
|
|
@ -432,8 +432,7 @@ find_dline(struct sockaddr *addr, int aftype)
|
||||||
return find_conf_by_address(NULL, NULL, NULL, addr, CONF_DLINE | 1, aftype, NULL);
|
return find_conf_by_address(NULL, NULL, NULL, addr, CONF_DLINE | 1, aftype, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* void find_exact_conf_by_address(const char*, int, const char *,
|
/* void find_exact_conf_by_address(const char*, int, const char *)
|
||||||
* struct ConfItem *aconf)
|
|
||||||
* Input:
|
* Input:
|
||||||
* Output: ConfItem if found
|
* Output: ConfItem if found
|
||||||
* Side-effects: None
|
* Side-effects: None
|
||||||
|
@ -471,7 +470,7 @@ find_exact_conf_by_address(const char *address, int type, const char *username)
|
||||||
{
|
{
|
||||||
if (arec->type == type &&
|
if (arec->type == type &&
|
||||||
arec->masktype == masktype &&
|
arec->masktype == masktype &&
|
||||||
!irccmp(arec->username, username))
|
(arec->username == NULL || username == NULL ? arec->username == username : !irccmp(arec->username, username)))
|
||||||
{
|
{
|
||||||
if (masktype == HM_HOST)
|
if (masktype == HM_HOST)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue