IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   Unreal IRCd (https://www.ircforumlari.net/unreal-ircd/)
-   -   Adwords Hata Veriyor. (https://www.ircforumlari.net/unreal-ircd/169898-adwords-hata-veriyor.html)

feaRneveR 02 Ocak 2009 21:00

Adwords Hata Veriyor.
 
Unreal 3.2.7 Adwords Kuruyorum

-IRC.SohpetCet.Com- *** Notice -- Loading IRCd configuration ..
-
-IRC.SohpetCet.Com- *** Notice -- adwords.conf:1: loadmodule src/modules/adwords.so: failed to load: tmp/6DB1F2C4.adwords.so: undefined symbol: our_strcasestr
-
-IRC.SohpetCet.Com- *** Notice -- error: IRCd configuration failed to load

Bu Hatayı Veriyor Cıldırıcam Yardım Edin :)

WhiteKnight 02 Ocak 2009 23:21

Cevap: Adwords Hata Veriyor.
 
Kod:


/*
 * ==================================================================
 * Filename:            adwords.c
 * Description:          Anti-spam filtering
 * Written by:  AngryWolf <[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]>
 * Documentation:        adwords.txt (comes with the package)
 * ==================================================================
 * Note that this is a modified version of UnrealIRCd's built-in
 * badword system which was written by the UnrealIRCd Team. This
 * means that I copied & modified some codes from src/badwords.c and
 * src/conf.c (they come with the Unreal3.2 package).
 * ==================================================================
 */
#include "config.h"
#include "struct.h"
#include "common.h"
#include "sys.h"
#include "numeric.h"
#include "msg.h"
#include "channel.h"
#include <time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <io.h>
#endif
#include <fcntl.h>
#include "h.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif
#include "badwords.h"
extern void  sendto_one(aClient *to, char *pattern, ...);
extern void  sendto_serv_butone_token(aClient *one, char *prefix, char *command, char *token, char *pattern, ...);
// =================================================================
// Macros
// =================================================================
#define MSG_ADWORDS  "ADWORDS"
#define TOK_ADWORDS  "WO"
#define DEF_REGFLAGS  (REG_ICASE | REG_EXTENDED)
#define BACKREF_TOKEN  '\\'
#define IsAlpha(x)  ((((x) >= 65) && ((x) <= 90)) || (((x) >= 97 ) && ((x) <= 122)))
#define ircfree(x)  if (x) MyFree(x); x = NULL
#define ircstrdup(x,y)  if (x) MyFree(x); if (!y) x = NULL; else x = strdup(y)
#define DelHook(x)  if (x) HookDel(x); x = NULL
#define DelOverride(cmd, ovr) if (ovr && CommandExists(cmd)) CmdoverrideDel(ovr); ovr = NULL
#define DelCommand(x)  if (x) CommandDel(x); x = NULL
#define DelAdwordChannel(a) DelListItem(a, AdwordsChannel); FreeAdword(a);
#define DelAdwordMessage(a) DelListItem(a, AdwordsMessage); FreeAdword(a);
#define DelAdwordQuit(a) DelListItem(a, AdwordsQuit); FreeAdword(a);
#ifdef HOOKTYPE_PRE_LOCAL_PART
 #define DelAdwordPart(a) DelListItem(a, AdwordsPart); FreeAdword(a);
#endif
/* Default texts */
#define DEF_KILL_REASON  "User has been killed (Advertising)"
#define DEF_BAN_REASON  "User has been banned (Advertising)"
#define DEF_BLOCK_MSG  "Your message has been blocked (Advertising)"
#define DEF_WARNING_MSG  "Your message contains an advertisement, may have been censored"
/* Ban types */
#ifndef BAN_ACT_KILL
 #define NO_PLACE_HOST_BAN
 /* For backward compatibility */
 #define BAN_ACT_KILL  1
 #define BAN_ACT_KLINE  4
 #define BAN_ACT_ZLINE  5
 #define BAN_ACT_GLINE  6
 #define BAN_ACT_GZLINE  7
#else /* Unreal3.2-RC1 */
  #undef NO_PLACE_HOST_BAN
#endif
/* Message types */
#define MT_ALL  0
#define MT_PRIVMSG  1
#define MT_NOTICE  2
#define MT_CTCP  3
#define MT_NONCTCP  4
/* Command types */
#define CT_PRIVMSG  0
#define CT_NOTICE  1
#define CT_PART  2
#define CT_QUIT  3
/* User types */
#define UT_ALL  0
#define UT_REG  1
#define UT_NONREG  2
/* Word types */
#define WT_REGEX  0x1
#define WT_FAST  0x2
#define WT_FAST_L  0x4
#define WT_FAST_R  0x8
/* Notification methods */
#define NM_PRIVATE  0x00
#define NM_CHANNEL  0x01
// =================================================================
// Module header
// =================================================================
ModuleHeader MOD_HEADER(adwords)
  = {
 "adwords",
 "$Id: adwords.c,v 6.9 2004/07/02 15:31:52 angrywolf Exp $",
 "anti-spam filtering",
 "3.2-b8-1",
 NULL
    };
// =================================================================
// Type definitions
// =================================================================
typedef struct _adword Adword;
typedef struct _myconf MyConf;
typedef struct _chlist ChanList;
struct _adword
{
 Adword  *prev, *next;
 char  *word, *replace, *channel;
 u_short  type;
 u_int  notify:1, warn: 1, block:1, kill:1, ban:1;
 u_int  stoponmatch:1;
 u_int  msgtype:3, usertype:2;
 regex_t  *expr;
};
struct _myconf
{
 u_int  enable_adwords : 1;
 u_int  enable_notifications : 1;
 u_int  enable_bans : 1;
 u_int  enable_kills : 1;
 u_int  enable_blockings : 1;
 u_int  enable_warnings : 1;
 u_int  n_method : 1;
 u_int  require_mode_g : 1;
 int  ban_type: 4;
 long  ban_period;
 char  *channels;
 char  *kill_reason;
 char  *ban_reason;
 char  *block_message;
 char  *warning_message;
};
struct _chlist
{
 ChanList *prev, *next;
 char  *channel;
};
// =================================================================
// Function definitions & variable declarations
// =================================================================
extern ConfigEntry *config_find_entry(ConfigEntry *ce, char *name);
static Command  *AddCommand(Module *module, char *msg, char *token, iFP func);
static int  m_adwords(aClient *cptr, aClient *sptr, int parc, char *parv[]);
static int  cb_config_test(ConfigFile *, ConfigEntry *, int, int *);
static int  cb_config_run(ConfigFile *, ConfigEntry *, int);
static int  cb_config_rehash();
static char  *cb_privmsg(aClient *, aClient *, aClient *, char *, int);
static char  *cb_chanmsg(aClient *, aClient *, aChannel *, char *, int);
static char  *cb_quit(aClient *sptr, char *comment);
#ifdef HOOKTYPE_PRE_LOCAL_PART
static char  *cb_partmsg(aClient *sptr, aChannel *chptr, char *comment);
#endif
#ifndef HOOKTYPE_PRE_LOCAL_QUIT
static Cmdoverride *AddOverride(char *msg, iFP cb);
static int  override_quit(Cmdoverride *, aClient *, aClient *, int, char *[]);
#endif
static void  adwords_event_kill(char *name);
static void  stats_wordlist(aClient *sptr, Adword *wordlist, char wtype);
static char  *find_CmdType(u_int type);
static char  *find_BanType(int type);
#ifdef NO_PLACE_HOST_BAN
static char  *find_BanFlag(int type);
#endif
static char  find_MsgType(u_int type);
static char  find_WordFlag(u_int type);
static Hook  *HookConfTest, *HookConfRun, *HookConfRehash;
static Hook  *HookPrivMsg = NULL, *HookChanMsg = NULL;
#ifdef HOOKTYPE_PRE_LOCAL_PART
static Hook  *HookPrePart = NULL;
#endif
#ifdef HOOKTYPE_PRE_LOCAL_QUIT
static Hook  *HookPreQuit = NULL;
#endif
Adword  *AdwordsMessage = NULL, *AdwordsChannel = NULL, *AdwordsQuit = NULL;
#ifdef HOOKTYPE_PRE_LOCAL_PART
Adword  *AdwordsPart = NULL;
#endif
ConfigItem_except      *conf_exceptchan;
MyConf  myconf;
static char  nickbuf[NICKLEN+1];
Command  *CmdAdwords;
#ifndef HOOKTYPE_PRE_LOCAL_QUIT
Cmdoverride  *OvrQuit;
#endif
#ifndef STATIC_LINKING
static ModuleInfo *MyModInfo;
 #define MyMod  MyModInfo->handle
 #define SAVE_MODINFO MyModInfo = modinfo;
#else
 #define MyMod  NULL
 #define SAVE_MODINFO
#endif
// =================================================================
// Functions related to the Adword struct
// =================================================================
static void FreeAdword(Adword *a)
{
 MyFree(a->word);
 ircfree(a->replace);
 ircfree(a->channel);
 if (a->expr)
 {
  regfree(a->expr);
  MyFree(a->expr);
 }
 MyFree(a);
}
static Adword *adword_duplicate(Adword *a, int regflags)
{
 Adword *x;
 x = (Adword *) MyMalloc(sizeof(Adword));
        memcpy(x, a, sizeof(Adword));
 x->word = strdup(a->word);
 if (a->replace)
        x->replace = strdup(a->replace);
 if (a->channel)
        x->channel = strdup(a->channel);
 if (a->expr)
 {
  x->expr = (regex_t *) MyMallocEx(sizeof(regex_t));
  regcomp(x->expr, x->word, regflags);
 }
        return x;
}
static void AddExceptChan(char *mask)
{
        ConfigItem_except *e;
        e = (ConfigItem_except *) MyMallocEx(sizeof(ConfigItem_except));
        e->mask = strdup(mask);
        AddListItem(e, conf_exceptchan);
}
// =================================================================
// Functions related to loading/unloading configuration
// =================================================================
static void InitConf()
{
 memset(&myconf, 0, sizeof myconf);
 memset(&nickbuf, 0, sizeof nickbuf);
 myconf.ban_type  = BAN_ACT_KLINE;
 myconf.ban_period = 3600; /* 1h */
        conf_exceptchan        = NULL;
}
static void FreeConf()
{
 Adword  *a;
 ListStruct  *next;
        ConfigItem_except *e;
 /* myconf */
 if (myconf.channels)
  MyFree(myconf.channels);
 if (myconf.kill_reason)
  MyFree(myconf.kill_reason);
 if (myconf.ban_reason)
  MyFree(myconf.ban_reason);
 if (myconf.block_message)
  MyFree(myconf.block_message);
 if (myconf.warning_message)
  MyFree(myconf.warning_message);
 /* adwords */
 for (a = AdwordsChannel; a; a = (Adword *) next)
 {
  next = (ListStruct *) a->next;
  DelAdwordChannel(a);
 }
 for (a = AdwordsMessage; a; a = (Adword *) next)
 {
  next = (ListStruct *) a->next;
  DelAdwordMessage(a);
 }
 for (a = AdwordsQuit; a; a = (Adword *) next)
 {
  next = (ListStruct *) a->next;
  DelAdwordQuit(a);
 }
#ifdef HOOKTYPE_PRE_LOCAL_PART
 for (a = AdwordsPart; a; a = (Adword *) next)
 {
  next = (ListStruct *) a->next;
  DelAdwordPart(a);
 }
#endif
 /* channel exceptions */
        for (e = conf_exceptchan; e; e = (ConfigItem_except *) next)
        {
                next = (ListStruct *) e->next;
                DelListItem(e, conf_exceptchan);
                MyFree(e->mask);
                MyFree(e);
        }
}
// =================================================================
// Module functions
// =================================================================
DLLFUNC int MOD_TEST(adwords)(ModuleInfo *modinfo)
{
 SAVE_MODINFO
 HookConfTest = HookAddEx(modinfo->handle, HOOKTYPE_CONFIGTEST, cb_config_test);
 return MOD_SUCCESS;
}
DLLFUNC int MOD_INIT(adwords)(ModuleInfo *modinfo)
{
 SAVE_MODINFO
 InitConf();
 CmdAdwords = AddCommand(modinfo->handle, MSG_ADWORDS, TOK_ADWORDS, m_adwords);
 HookConfRun = HookAddEx(modinfo->handle, HOOKTYPE_CONFIGRUN, cb_config_run);
 HookConfRehash = HookAddEx(modinfo->handle, HOOKTYPE_REHASH, cb_config_rehash);
 if (!CmdAdwords)
  return MOD_FAILED;
 HookPrivMsg = HookAddPCharEx(modinfo->handle, HOOKTYPE_USERMSG, cb_privmsg);
 HookChanMsg = HookAddPCharEx(modinfo->handle, HOOKTYPE_CHANMSG, cb_chanmsg);
#ifdef HOOKTYPE_PRE_LOCAL_PART
 HookPrePart = HookAddPCharEx(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, cb_partmsg);
#endif
#ifdef HOOKTYPE_PRE_LOCAL_QUIT
 HookPreQuit = HookAddPCharEx(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, cb_quit);
#endif
 return MOD_SUCCESS;
}
DLLFUNC int MOD_LOAD(adwords)(int module_load)
{
#ifndef HOOKTYPE_PRE_LOCAL_QUIT
 if (!(OvrQuit = AddOverride("quit", override_quit)))
  return MOD_FAILED;
#endif
 return MOD_SUCCESS;
}
DLLFUNC int MOD_UNLOAD(adwords)(int module_unload)
{
 FreeConf();
#ifdef HOOKTYPE_PRE_LOCAL_PART
 DelHook(HookPrePart);
#endif
 DelHook(HookChanMsg);
 DelHook(HookPrivMsg);
 DelHook(HookConfRehash);
 DelHook(HookConfRun);
 DelHook(HookConfTest);
#ifndef HOOKTYPE_PRE_LOCAL_QUIT
 DelOverride("quit", OvrQuit);
#endif
 DelCommand(CmdAdwords);
 return MOD_SUCCESS;
}
// =================================================================
// Types
// =================================================================
static char *find_CmdType(u_int type)
{
 switch(type)
 {
  case CT_PRIVMSG: return "PRIVMSG";
  case CT_NOTICE:  return "NOTICE";
  case CT_PART:  return "PART";
  case CT_QUIT:  return "QUIT";
 }
 return "???";
}
static char find_MsgType(u_int type)
{
 switch(type)
 {
  case MT_ALL:  return 'a';
  case MT_PRIVMSG: return 'p';
  case MT_NOTICE:  return 'n';
  case MT_CTCP:  return 'C';
  case MT_NONCTCP: return 'N';
 }
 return '?';
}
static char find_WordFlag(u_int type)
{
 if (type & WT_FAST)
  return 'F';
 else if (type & WT_REGEX)
  return 'R';
 return '?';
}
static char find_UserType(u_int type)
{
 switch(type)
 {
  case UT_ALL:  return 'a';
  case UT_REG:  return 'r';
  case UT_NONREG:  return 'n';
 }
 return '?';
}
static char *find_BanType(int type)
{
 switch(type)
 {
  case BAN_ACT_KLINE:  return "kline";
  case BAN_ACT_GLINE:  return "gline";
  case BAN_ACT_ZLINE:  return "zline";
  case BAN_ACT_GZLINE:  return "gzline";
 }
 return "<none>";
}
#ifdef NO_PLACE_HOST_BAN
static char *find_BanFlag(int type)
{
 switch(type)
 {
  case BAN_ACT_KLINE:  return "k";
  case BAN_ACT_GLINE:  return "G";
  case BAN_ACT_ZLINE:  return "z";
  case BAN_ACT_GZLINE:  return "Z";
 }
 return NULL;
}
#endif
static char *make_optlist(Adword *a)
{
 static char buf[11];
 char *p = buf;
 if (a->notify)  *(p++) = 'n';
 if (a->warn)  *(p++) = 'w';
 if (a->block)  *(p++) = 'b';
 if (a->kill)  *(p++) = 'k';
 if (a->ban)  *(p++) = 'B';
 if (a->stoponmatch) *(p++) = 's';
 if (p == buf)  *(p++) = '*';
 *p = 0;
 return buf;
}
// =================================================================
// Misc stuff
// =================================================================
static Command *AddCommand(Module *module, char *msg, char *token, iFP func)
{
 Command *cmd;
 if (CommandExists(msg))
    {
                config_error("Command %s already exists", msg);
                return NULL;
    }
    if (CommandExists(token))
 {
                config_error("Token %s already exists", token);
                return NULL;
    }
 cmd = CommandAdd(module, msg, token, func, MAXPARA, 0);
#ifndef STATIC_LINKING
 if (ModuleGetError(module) != MODERR_NOERROR || !cmd)
#else
 if (!cmd)
#endif
 {
#ifndef STATIC_LINKING
  config_error("Error adding command %s: %s", msg,
  ModuleGetErrorStr(module));
#else
  config_error("Error adding command %s", msg);
#endif
  return NULL;
 }
 return cmd;
}
#ifndef HOOKTYPE_PRE_LOCAL_QUIT
static Cmdoverride *AddOverride(char *msg, iFP cb)
{
 Cmdoverride *ovr = CmdoverrideAdd(MyMod, msg, cb);
#ifndef STATIC_LINKING
        if (ModuleGetError(MyMod) != MODERR_NOERROR || !ovr)
#else
 if (!ovr)
#endif
 {
#ifndef STATIC_LINKING
  config_error("Error replacing command %s when loading module %s: %s",
  msg, MOD_HEADER(adwords).name, ModuleGetErrorStr(MyMod));
#else
  config_error("Error replacing command %s when loading module %s",
  msg, MOD_HEADER(adwords).name);
#endif
  return NULL;
 }
 return ovr;
}
#endif
static u_int check_type(char *word)
{
 /*
  * This code originally comes from src/s_conf.c,
  * with some modifications.
  */
 u_int  type = WT_FAST, fasttype = 0;
 char  *p;
 for (p = word; *p; p++)
 {
  /*
  * I use my own check for alphabetic characters.
  * The old one accepted character codes between
  * 65 and 123. That means ABCDEFGHIJKLMNOPQRSTU
  * WXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{ were
  * accepted. I don't want this.
  */
  if (!IsAlpha(*p))
  {
  if ((word == p) && (*p == '*'))
  {
    /* Asterisk at the left */
    fasttype |= WT_FAST_L;
    continue;
  }
  if ((p[1] == 0) && (*p == '*'))
  {
    /* Asterisk at the right */
    fasttype |= WT_FAST_R;
    continue;
  }
  type = WT_REGEX;
  break;
  }
 }
 if (type != WT_REGEX)
  type |= fasttype;
 return type;
}
static u_int check_regex(ConfigEntry *ce_word)
{
 /*
  * This code originally comes from src/s_conf.c,
  * with some modifications.
  */
 int  errorcode, errorbufsize;
 u_int  errors = 0;
 char  *errorbuf;
 regex_t  *expr;
 expr = (regex_t *) MyMallocEx(sizeof(regex_t));
 errorcode = regcomp(expr, ce_word->ce_vardata, DEF_REGFLAGS);
 if (errorcode > 0)
 {
  errorbufsize = regerror(errorcode, expr, NULL, 0)+1;
  errorbuf = MyMalloc(errorbufsize);
  regerror(errorcode, expr, errorbuf, errorbufsize);
  config_error("%s:%i: adwords::adword::%s contains an invalid regex: %s",
  ce_word->ce_fileptr->cf_filename,
  ce_word->ce_varlinenum,
  ce_word->ce_varname, errorbuf);
  errors++;
  MyFree(errorbuf);
 }
 regfree(expr);
 MyFree(expr);
 return errors;
}
static char *find_backref(char *string)
{
 char *p;
 for (p = string; *p; p++)
 {
  if (p[0] == BACKREF_TOKEN)
  {
  if (p != string && p[-1] == BACKREF_TOKEN)
    continue;
  if (p[1] >= '1' && p[1] <= '9')
    return p;
  }
 }
 return NULL;
}
static char *dump_fastword(u_int type, char *word)
{
 u_int  wlength;
 char  *wtmp, *p, *q;
 wlength = strlen(word) + 1;
 if (type & WT_FAST_L)
  wlength--;
 if (type & WT_FAST_R)
  wlength--;
 q = wtmp = (char *) MyMalloc(wlength);
 for (p = word; *p; p++)
  if (*p != '*')
  *(q++) = *p;
 *q = '\0';
 return wtmp;
}
// =================================================================
// Config file interfacing
// =================================================================
static int cb_config_rehash()
{
 FreeConf();
 InitConf();
 return 1;
}
static int cb_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs)
{
 ConfigEntry *ce_matchtype, *ce_word, *ce_replace, *cep, *cepp;
 int  errors = 0;
 u_int  matchtype;
 if (type != CONFIG_MAIN)
  return 0;
 if (!strcmp(ce->ce_varname, "adwords"))
 {
  for (cep = ce->ce_entries; cep; cep = cep->ce_next)
  {
  if (!cep->ce_varname)
  {
    config_error("%s:%i: blank adwords item",
    cep->ce_fileptr->cf_filename,
    cep->ce_varlinenum);
    errors++;
  }
  else if (!strcmp(cep->ce_varname, "enable"))
  {
    for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next)
    {
    if (!cepp->ce_varname)
    {
      config_error("%s:%i: blank adwords::enable item",
      cepp->ce_fileptr->cf_filename,
      cepp->ce_varlinenum);
      errors++;
      continue;
    }
    if (!strcmp(cepp->ce_varname, "adwords"))
      ;
    else if (!strcmp(cepp->ce_varname, "bans"))
      ;
    else if (!strcmp(cepp->ce_varname, "kills"))
      ;
    else if (!strcmp(cepp->ce_varname, "blockings"))
      ;
    else if (!strcmp(cepp->ce_varname, "notifications"))
      ;
    else if (!strcmp(cepp->ce_varname, "warnings"))
      ;
    else
    {
      config_error("%s:%i: unknown directive adwords::enable::%s",
      cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum,
      cepp->ce_varname);
      errors++;
    }
    }
  }
  else if (!cep->ce_vardata)
  {
    config_error("%s:%i: adwords::%s item without value",
    cep->ce_fileptr->cf_filename,
    cep->ce_varlinenum, cep->ce_varname);
    errors++;
  }
  else if (!strcmp(cep->ce_varname, "adword"))
  {
    matchtype = 0;
    if (!strcmp(cep->ce_vardata, "all"))
    ;
    else if (!strcmp(cep->ce_vardata, "message"))
    ;
    else if (!strcmp(cep->ce_vardata, "channel"))
    ;
    else if (!strcmp(cep->ce_vardata, "quit"))
    ;
#ifdef HOOKTYPE_PRE_LOCAL_PART
    else if (!strcmp(cep->ce_vardata, "part"))
    ;
#endif
    else
    {
    config_error("%s:%i: unknown adwords::adword type %s",
      cep->ce_fileptr->cf_filename, cep->ce_varlinenum,
      cep->ce_vardata);
    errors++;
    continue;
    }
    /* matchtype */
    if ((ce_matchtype = config_find_entry(cep->ce_entries, "matchtype")))
    {
    if (!ce_matchtype->ce_vardata)
    {
      config_error("%s:%i: adwords::adword::matchtype without contents",
      ce_matchtype->ce_fileptr->cf_filename,
      ce_matchtype->ce_varlinenum);
      errors++;
      continue;
    }
    if (!strcmp(ce_matchtype->ce_vardata, "regex"))
      matchtype = WT_REGEX;
    else if (!strcmp(ce_matchtype->ce_vardata, "fast"))
      matchtype = WT_FAST;
    else if (!strcmp(ce_matchtype->ce_vardata, "auto"))
      ;
    else
    {
      config_error("%s:%i: unknown adwords::adword::matchtype %s",
      ce_matchtype->ce_fileptr->cf_filename,
      ce_matchtype->ce_varlinenum,
      ce_matchtype->ce_vardata);
      errors++;
      continue;
    }
    }
    /* word */
    if (!(ce_word = config_find_entry(cep->ce_entries, "word")))
    {
    config_error("%s:%i: adwords::adword without word item",
      cep->ce_fileptr->cf_filename, cep->ce_varlinenum);
    errors++;
    continue;
    }
    else if (!ce_word->ce_vardata)
    {
    config_error("%s:%i: adwords::adword::word without contents",
      ce_word->ce_fileptr->cf_filename, ce_word->ce_varlinenum);
    errors++;
    continue;
    }
    else
    {
    u_int wordtype = check_type(ce_word->ce_vardata);
    if (!matchtype)
      ;
    else if (matchtype & WT_FAST)
    {
      if (wordtype & WT_REGEX)
      {
      config_error("%s:%i: adwords::adword::word contains invalid data (the fast badword replace system can do: \"blah\", \"*blah\", \"blah*\" and \"*blah*\", in all other cases use regex)",
        ce_word->ce_fileptr->cf_filename,
        ce_word->ce_varlinenum);
      errors++;
      }
    }
    else
      errors += check_regex(ce_word);
    if (errors)
      continue;
    }
    /* replace */
    if ((ce_replace = config_find_entry(ce->ce_entries, "replace")))
    {
    if (!ce_replace->ce_vardata)
    {
      config_error("%s:%i: adwords::adword::replace without contents",
      ce_replace->ce_fileptr->cf_filename,
      ce_replace->ce_varlinenum);
      errors++;
    }
    }
    for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next)
    {
    if (!cepp->ce_varname)
    {
      config_error("%s:%i: blank adwords::adword item",
      cepp->ce_fileptr->cf_filename,
      cepp->ce_varlinenum);
      errors++;
      continue;
    }
    if (!strcmp(cepp->ce_varname, "notify"))
      ;
    else if (!strcmp(cepp->ce_varname, "warn"))
      ;
    else if (!strcmp(cepp->ce_varname, "block"))
      ;
    else if (!strcmp(cepp->ce_varname, "kill"))
      ;
    else if (!strcmp(cepp->ce_varname, "ban"))
      ;
    else if (!strcmp(cepp->ce_varname, "stoponmatch"))
      ;
    else if (!cepp->ce_vardata)
    {
      config_error("%s:%i: adwords::adword::%s item without value",
      cepp->ce_fileptr->cf_filename,
      cepp->ce_varlinenum, cepp->ce_varname);
      errors++;
      continue;
    }
    else if (!strcmp(cepp->ce_varname, "matchtype"))
      ;
    else if (!strcmp(cepp->ce_varname, "word"))
      ;
    else if (!strcmp(cepp->ce_varname, "replace"))
      ;
    else if (!strcmp(cepp->ce_varname, "channel"))
      ;
    else if (!strcmp(cepp->ce_varname, "msgtype"))
    {
      if (!strcmp(cepp->ce_vardata, "all"))
      ;
      else if (!strcmp(cepp->ce_vardata, "privmsg"))
      ;
      else if (!strcmp(cepp->ce_vardata, "notice"))
      ;
      else if (!strcmp(cepp->ce_vardata, "ctcp"))
      ;
      else if (!strcmp(cepp->ce_vardata, "non-ctcp"))
      ;
      else
      {
      config_error("%s:%i: unknown adwords::adword::msgtype %s",
        cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum,
        cepp->ce_vardata);
      errors++;
      }
    }
    else if (!strcmp(cepp->ce_varname, "usertype"))
    {
      if (!strcmp(cepp->ce_vardata, "all"))
      ;
      else if (!strcmp(cepp->ce_vardata, "registered"))
      ;
      else if (!strcmp(cepp->ce_vardata, "non-registered"))
      ;
      else
      {
      config_error("%s:%i: unknown adwords::adword::usertype %s",
        cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum,
        cepp->ce_vardata);
      errors++;
      }
    }
    else
    {
      config_error("%s:%i: unknown directive adwords::adword::%s",
      cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum,
      cepp->ce_varname);
      errors++;
    }
    }
  }
  else if (!strcmp(cep->ce_varname, "notification-channels"))
    ;
  else if (!strcmp(cep->ce_varname, "notification-method"))
  {
    if (!strcmp(cep->ce_vardata, "channel"))
    ;
    else if (!strcmp(cep->ce_vardata, "private"))
    ;
    else
    {
    config_error("%s:%i: unknown notification method %s",
      cep->ce_fileptr->cf_filename, cep->ce_varlinenum,
      cep->ce_vardata);
    errors++;
    }
  }
  else if (!strcmp(cep->ce_varname, "require-mode-g"))
    ;
  else if (!strcmp(cep->ce_varname, "kill-reason"))
    ;
  else if (!strcmp(cep->ce_varname, "ban-reason"))
    ;
  else if (!strcmp(cep->ce_varname, "block-message"))
    ;
  else if (!strcmp(cep->ce_varname, "warning-message"))
    ;
  else if (!strcmp(cep->ce_varname, "ban-type"))
  {
    if (!strcmp(cep->ce_vardata, "kline"))
    ;
    else if (!strcmp(cep->ce_vardata, "gline"))
    ;
    else if (!strcmp(cep->ce_vardata, "zline"))
    ;
    else if (!strcmp(cep->ce_vardata, "gzline"))
    ;
    else
    {
    config_error("%s:%i: unknown ban type %s",
      cep->ce_fileptr->cf_filename, cep->ce_varlinenum,
      cep->ce_vardata);
    errors++;
    }
  }
  else if (!strcmp(cep->ce_varname, "ban-period"))
    ;
  else if (!strcmp(cep->ce_varname, "except"))
  {
    if (!strcmp(cep->ce_vardata, "channel"))
    {
    if (!config_find_entry(cep->ce_entries, "mask"))
    {
      config_error("%s:%i: adwords::except channel without mask item",
      cep->ce_fileptr->cf_filename, cep->ce_varlinenum);
      errors++;
      continue;
    }
    for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next)
    {
      if (!cepp->ce_vardata)
      {
      config_error("%s:%i: adwords::except channel item without contents",
        cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum);
      errors++;
      continue;
      }
      if (!strcmp(cepp->ce_varname, "mask"))
      ;
      else
      {
      config_error("%s:%i: unknown adwords::except channel directive %s",
        cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname);
      errors++;
      continue;
      }
    }
    }
  }
  else
  {
    config_error("%s:%i: unknown directive adwords::%s",
    cep->ce_fileptr->cf_filename, cep->ce_varlinenum,
    cep->ce_varname);
    errors++;
  }
  }
  *errs = errors;
  return errors ? -1 : 1;
 }
 else
  return 0;
}
static int cb_config_run(ConfigFile *cf, ConfigEntry *ce, int type)
{
 ConfigEntry *cep, *cepp;
 if (type != CONFIG_MAIN)
  return 0;
 if (!strcmp(ce->ce_varname, "adwords"))
 {
  for (cep = ce->ce_entries; cep; cep = cep->ce_next)
  {
  if (!strcmp(cep->ce_varname, "enable"))
  {
    for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next)
    {
    if (!strcmp(cepp->ce_varname, "adwords"))
      myconf.enable_adwords = config_checkval(cepp->ce_vardata, CFG_YESNO);
    else if (!strcmp(cepp->ce_varname, "bans"))
      myconf.enable_bans = config_checkval(cepp->ce_vardata, CFG_YESNO);
    else if (!strcmp(cepp->ce_varname, "kills"))
      myconf.enable_kills = config_checkval(cepp->ce_vardata, CFG_YESNO);
    else if (!strcmp(cepp->ce_varname, "blockings"))
      myconf.enable_blockings = config_checkval(cepp->ce_vardata, CFG_YESNO);
    else if (!strcmp(cepp->ce_varname, "notifications"))
      myconf.enable_notifications = config_checkval(cepp->ce_vardata, CFG_YESNO);
    else if (!strcmp(cepp->ce_varname, "warnings"))
      myconf.enable_warnings = config_checkval(cepp->ce_vardata, CFG_YESNO);
    }
  }
  else if (!strcmp(cep->ce_varname, "notification-channels"))
  {
    ircstrdup(myconf.channels, cep->ce_vardata);
  }
  else if (!strcmp(cep->ce_varname, "notification-method"))
  {
    if (!strcmp(cep->ce_vardata, "channel"))
    myconf.n_method = NM_CHANNEL;
    else if (!strcmp(cep->ce_vardata, "private"))
    myconf.n_method = NM_PRIVATE;
  }
  else if (!strcmp(cep->ce_varname, "kill-reason"))
  {
    if (strcmp(cep->ce_vardata, "no"))
    {
    ircstrdup(myconf.kill_reason, cep->ce_vardata);
    }
  }
  else if (!strcmp(cep->ce_varname, "ban-reason"))
  {
    if (strcmp(cep->ce_vardata, "no"))
    {
    ircstrdup(myconf.ban_reason, cep->ce_vardata);
    }
  }
  else if (!strcmp(cep->ce_varname, "block-message"))
  {
    if (strcmp(cep->ce_vardata, "no"))
    {
    ircstrdup(myconf.block_message, cep->ce_vardata);
    }
  }
  else if (!strcmp(cep->ce_varname, "warning-message"))
  {
    if (strcmp(cep->ce_vardata, "no"))
    {
    ircstrdup(myconf.warning_message, cep->ce_vardata);
    }
  }
  else if (!strcmp(cep->ce_varname, "require-mode-g"))
    myconf.require_mode_g = config_checkval(cep->ce_vardata, CFG_YESNO);
  else if (!strcmp(cep->ce_varname, "ban-period"))
    myconf.ban_period = config_checkval(cep->ce_vardata, CFG_TIME);
  else if (!strcmp(cep->ce_varname, "ban-type"))
  {
    if (!strcmp(cep->ce_vardata, "kline"))
    myconf.ban_type = BAN_ACT_KLINE;
    else if (!strcmp(cep->ce_vardata, "gline"))
    myconf.ban_type = BAN_ACT_GLINE;
    else if (!strcmp(cep->ce_vardata, "zline"))
    myconf.ban_type = BAN_ACT_ZLINE;
    else if (!strcmp(cep->ce_vardata, "gzline"))
    myconf.ban_type = BAN_ACT_GZLINE;
  }
  else if (!strcmp(cep->ce_varname, "except"))
  {
    if (!strcmp(cep->ce_vardata, "channel"))
    {
    for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next)
      if (!strcmp(cepp->ce_varname, "mask"))
      AddExceptChan(cepp->ce_vardata);
    }
  }
  else if (!strcmp(cep->ce_varname, "adword"))
  {
    ConfigEntry *ce_matchtype, *ce_word, *ce_block;
    Adword  *a;
    int  regflags;
    regflags = DEF_REGFLAGS;
    a = (Adword *) MyMallocEx(sizeof(Adword));
    /* block */
    if ((ce_block = config_find_entry(cep->ce_entries, "block")))
    {
    a->block = 1;
    regflags |= REG_NOSUB;
    }
    /* matchtype */
    if ((ce_matchtype = config_find_entry(cep->ce_entries, "matchtype")))
    {
    if (!strcmp(ce_matchtype->ce_vardata, "regex"))
      a->type = WT_REGEX;
    else if (!strcmp(ce_matchtype->ce_vardata, "fast"))
      a->type = WT_FAST;
    }
    /* word */
    if ((ce_word = config_find_entry(cep->ce_entries, "word")))
    {
    if (!a->type)
      a->type = check_type(ce_word->ce_vardata);
    if (a->type & WT_REGEX)
    {
      ircstrdup(a->word, ce_word->ce_vardata);
      a->expr = (regex_t *) MyMallocEx(sizeof(regex_t));
      regcomp(a->expr, a->word, regflags);
    }
    else
    {
      /* We have to do this twice (because of "matchtype fast") */
      a->type = check_type(ce_word->ce_vardata);
      a->word = dump_fastword(a->type, ce_word->ce_vardata);
    }
    }
    for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next)
    {
    if (!strcmp(cepp->ce_varname, "word"))
      ;
    else if (!strcmp(cepp->ce_varname, "block"))
      ;
    else if (!strcmp(cepp->ce_varname, "replace"))
    {
      ircstrdup(a->replace, cepp->ce_vardata);
    }
    else if (!strcmp(cepp->ce_varname, "channel"))
    {
      ircstrdup(a->channel, cepp->ce_vardata);
    }
    else if (!strcmp(cepp->ce_varname, "notify"))
      a->notify = 1;
    else if (!strcmp(cepp->ce_varname, "warn"))
      a->warn = 1;
    else if (!strcmp(cepp->ce_varname, "kill"))
      a->kill = 1;
    else if (!strcmp(cepp->ce_varname, "ban"))
      a->ban = 1;
    else if (!strcmp(cepp->ce_varname, "stoponmatch"))
      a->stoponmatch = 1;
    else if (!strcmp(cepp->ce_varname, "msgtype"))
    {
      if (!strcmp(cepp->ce_vardata, "all"))
      a->msgtype = MT_ALL;
      else if (!strcmp(cepp->ce_vardata, "privmsg"))
      a->msgtype = MT_PRIVMSG;
      else if (!strcmp(cepp->ce_vardata, "notice"))
      a->msgtype = MT_NOTICE;
      else if (!strcmp(cepp->ce_vardata, "ctcp"))
      a->msgtype = MT_CTCP;
      else if (!strcmp(cepp->ce_vardata, "non-ctcp"))
      a->msgtype = MT_NONCTCP;
    }
    else if (!strcmp(cepp->ce_varname, "usertype"))
    {
      if (!strcmp(cepp->ce_vardata, "all"))
      a->usertype = UT_ALL;
      else if (!strcmp(cepp->ce_vardata, "registered"))
      a->usertype = UT_REG;
      else if (!strcmp(cepp->ce_vardata, "non-registered"))
      a->usertype = UT_NONREG;
    }
    }
    if (!strcmp(cep->ce_vardata, "message"))
    {
    AddListItem(a, AdwordsMessage);
    }
    else if (!strcmp(cep->ce_vardata, "channel"))
    {
    AddListItem(a, AdwordsChannel);
    }
    else if (!strcmp(cep->ce_vardata, "quit"))
    {
    AddListItem(a, AdwordsQuit);
    }
#ifdef HOOKTYPE_PRE_LOCAL_PART
    else if (!strcmp(cep->ce_vardata, "part"))
    {
    AddListItem(a, AdwordsPart);
    }
#endif
    else if (!strcmp(cep->ce_vardata, "all"))
    {
    AddListItem(a, AdwordsMessage);
    AddListItem(adword_duplicate(a, regflags), AdwordsChannel);
    AddListItem(adword_duplicate(a, regflags), AdwordsQuit);
#ifdef HOOKTYPE_PRE_LOCAL_PART
    AddListItem(adword_duplicate(a, regflags), AdwordsPart);
#endif
    }
  }
  }
 }
 return 0;
}
static int cb_stats(aClient *sptr)
{
 sendto_one(sptr, ":%s %i %s :enable::adwords: %d",
  me.name, RPL_TEXT, sptr->name, myconf.enable_adwords);
 sendto_one(sptr, ":%s %i %s :enable::bans: %d",
  me.name, RPL_TEXT, sptr->name, myconf.enable_bans);
 sendto_one(sptr, ":%s %i %s :enable::kills: %d",
  me.name, RPL_TEXT, sptr->name, myconf.enable_kills);
 sendto_one(sptr, ":%s %i %s :enable::blockings: %d",
  me.name, RPL_TEXT, sptr->name, myconf.enable_blockings);
 sendto_one(sptr, ":%s %i %s :enable::notifications: %d",
  me.name, RPL_TEXT, sptr->name, myconf.enable_notifications);
 sendto_one(sptr, ":%s %i %s :enable::warnings: %d",
  me.name, RPL_TEXT, sptr->name, myconf.enable_warnings);
 sendto_one(sptr, ":%s %i %s :require-mode-g: %d",
  me.name, RPL_TEXT, sptr->name, myconf.require_mode_g);
 sendto_one(sptr, ":%s %i %s :notification-method: %s",
  me.name, RPL_TEXT, sptr->name, (myconf.n_method == NM_PRIVATE) ? "private" : (myconf.n_method == NM_CHANNEL) ? "channel" : "<unknown>");
 sendto_one(sptr, ":%s %i %s :notification-channels: %s",
  me.name, RPL_TEXT, sptr->name, myconf.channels ? myconf.channels : "<none>");
 sendto_one(sptr, ":%s %i %s :kill-reason: %s",
  me.name, RPL_TEXT, sptr->name, myconf.kill_reason ? myconf.kill_reason : DEF_KILL_REASON);
 sendto_one(sptr, ":%s %i %s :ban-reason: %s",
  me.name, RPL_TEXT, sptr->name, myconf.ban_reason ? myconf.ban_reason : DEF_BAN_REASON);
 sendto_one(sptr, ":%s %i %s :block-message: %s",
  me.name, RPL_TEXT, sptr->name, myconf.block_message ? myconf.block_message : DEF_BLOCK_MSG);
 sendto_one(sptr, ":%s %i %s :warning-message: %s",
  me.name, RPL_TEXT, sptr->name, myconf.warning_message ? myconf.warning_message : DEF_WARNING_MSG);
 sendto_one(sptr, ":%s %i %s :ban-type: %s",
  me.name, RPL_TEXT, sptr->name, find_BanType(myconf.ban_type));
 sendto_one(sptr, ":%s %i %s :ban-period: %s",
  me.name, RPL_TEXT, sptr->name, pretty_time_val(myconf.ban_period));
 sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'S');
 return 0;
}
#ifdef NO_PLACE_HOST_BAN
void ban_client(aClient *cptr, char *type, long period, char *reason)
{
 char hostip[128], mo[100], mo2[100];
 char *tkllayer[9] = {
  me.name, /*0  server.name */
  "+",  /*1  +|- */
  type,  /*2  ban type */
  "*",  /*3  user */
  NULL,  /*4  host */
  NULL,
  NULL,  /*6  expire_at */
  NULL,  /*7  set_at */
  NULL  /*8  reason */
 };
 strlcpy(hostip, Inet_ia2p(&cptr->ip), sizeof(hostip));
 tkllayer[4] = hostip;
 tkllayer[5] = me.name;
 ircsprintf(mo, "%li", period + TStime());
 ircsprintf(mo2, "%li", TStime());
 tkllayer[6] = mo;
 tkllayer[7] = mo2;
 tkllayer[8] = reason;
 m_tkl(&me, &me, 9, tkllayer);
 return;
}
#endif
/*
 * These stuffs are from src/badwords.c,
 * I modified them for my own purposes
 */
static char *sky_strcasestr(char *haystack, char *needle)
{
 int i;
 int nlength = strlen (needle);
 int hlength = strlen (haystack);
 if (nlength > hlength) return NULL;
 if (hlength <= 0) return NULL;
 if (nlength <= 0) return haystack;
 for (i = 0; i <= (hlength - nlength); i++) {
  if (strncasecmp (haystack + i, needle, nlength) == 0)
  return haystack + i;
 }
 return NULL;
}
inline int my_fast_badword_match(Adword *adword, char *line)
{
  char *p;
 int bwlen = strlen(adword->word);
 if ((adword->type & WT_FAST_L) && (adword->type & WT_FAST_R))
  return (sky_strcasestr(line, adword->word) ? 1 : 0);
 p = line;
 while((p = sky_strcasestr(p, adword->word)))
 {
  if (!(adword->type & WT_FAST_L))
  {
  if ((p != line) && isalnum(*(p - 1)))
    goto next;
  }
  if (!(adword->type & WT_FAST_R))
  {
  if (isalnum(*(p + bwlen)))
    goto next;
  }
  return 1;
next:
  p += bwlen;
 }
 return 0;
}
/*
 * This code comes from src/badwords.c (fast_badword_replace
 * which was written by Syzop), I modified it a bit.
 * (Also made speed optimizations.)
 */
inline int my_fast_badword_replace(Adword *adword, char *line, char *buf, int max)
{
 char *searchw = adword->word, *replacew = adword->replace;
 char *pold = line, *pnew = buf;
 char *poldx = line;
 char *startw, *endw;
 char *c_eol = buf + max - 1;
 int replacen, searchn;
 int cleaned = 0;
 replacen = strlen(replacew);
 searchn = strlen(searchw);
 while (1)
 {
  pold = sky_strcasestr(pold, searchw);
  if (!pold)
  break;
  cleaned = 1;
  startw = pold;
  if (pold > line)
  {
  while (isalnum(*startw) && (startw != line))
    startw--;
  if (!isalnum(*startw))
    startw++;
  }
  if (!(adword->type & WT_FAST_L) && (pold != startw))
  {
  pold++;
  continue;
  }
  for (endw = pold; ((*endw != '\0') && (isalnum(*endw))); endw++);
  if (!(adword->type & WT_FAST_R) && (pold+searchn != endw))
  {
  pold++;
  continue;
  }
  if (poldx != startw)
  {
  int tmp_n = startw - poldx;
  if (pnew + tmp_n >= c_eol)
  {
    memcpy(pnew, poldx, c_eol - pnew);
    *c_eol = '\0';
    return 1;
  }
  memcpy(pnew, poldx, tmp_n);
  pnew += tmp_n;
  }
  if (replacen)
  {
  if ((pnew + replacen) >= c_eol) {
    memcpy(pnew, replacew, c_eol - pnew);
    *c_eol = '\0';
    return 1;
  }
  memcpy(pnew, replacew, replacen);
  pnew += replacen;
  }
  poldx = pold = endw;
 }
 if (*poldx)
 {
  strncpy(pnew, poldx, c_eol - pnew);
  *c_eol = '\0';
 }
 else
  *pnew = '\0';
 return cleaned;
}
/*
 * adword_checkmsg
 * ===============
 *
 * The badword checking stuff was copied from src/badwords.c,
 * I modified it a lot.
 */
#define SendNotice_channel \
  sendto_channel_butone(&me, &me, chptr, \
  ":%s PRIVMSG %s :[\2Adword\2] (%s:%s%s%s): %s", \
                me.name, chptr->chname, from->name, \
  cmd, to ? ":" : "", to ? to : "", str)
#define SendNotice_private \
  sendto_serv_butone_token(NULL, me.name, MSG_GLOBOPS, TOK_GLOBOPS, \
  "[\2Adword\2] (%s:%s%s%s): %s", \
                from->name, cmd, \
  to ? ":" : "", to ? to : "", str); \
  sendto_failops_whoare_opers( \
  "[\2Adword\2] (%s:%s%s%s): %s", \
                from->name, cmd, \
  to ? ":" : "", to ? to : "", str)
static char *adword_checkmsg(aClient *cptr, aClient *from, char *to, char *str, u_int cmdtype, Adword *wordlist)
{
 static regmatch_t pmatch[10];
 static char  cleanstr[4096], buf[4096];
 char  *ptr, *ptr2, *backref;
 int  matchlen = 0, stringlen, cleaned = 0;
 u_int  notify = 0, warn = 0, kill = 0;
 u_int  block = 0, ban = 0, ctcp, i;
 ChanList  *channels = NULL, *ch;
 Adword  *a;
 ListStruct  *next;
 if (!myconf.enable_adwords || !wordlist)
  return str;
 if (!MyConnect(from) || !IsPerson(from) || IsAnOper(from))
  return str;
 stringlen = strlcpy(cleanstr, StripControlCodes(str), sizeof cleanstr);
 /* Check for adwords */
 for (a = wordlist; a; a = a->next)
 {
  /* 1. Some conditions before matching */
  if (a->usertype == UT_REG && !IsRegNick(from))
  continue;
  if (a->usertype == UT_NONREG && IsRegNick(from))
  continue;
  if (cmdtype == CT_PRIVMSG || cmdtype == CT_NOTICE)
  {
  if (a->msgtype == MT_NOTICE && cmdtype != CT_NOTICE)
    continue;
  if (a->msgtype == MT_PRIVMSG && cmdtype == CT_NOTICE)
    continue;
  ctcp = (*str == '\001' && str[strlen(str)-1] == '\001');
  if (a->msgtype == MT_CTCP && !ctcp)
    continue;
  if (a->msgtype == MT_NONCTCP && ctcp)
    continue;
  }
  /* 2. Now try to match this word */
  if (a->type & WT_REGEX)
  {
  if (regexec(a->expr, cleanstr, 0, NULL, 0))
    continue;
  }
  else
  {
  if (!my_fast_badword_match(a, cleanstr))
    continue;
  }
  /* 3. Check certain things if matched */
  notify |= a->notify;
  warn |= a->warn;
  kill |= a->kill;
  ban |= a->ban;
  block |= a->block;
  if (myconf.enable_notifications &&
      (myconf.n_method == NM_CHANNEL) && notify && a->channel)
  {
  ch = (ChanList *) MyMallocEx(sizeof(ChanList));
  ch->channel = a->channel;
  AddListItem(ch, channels);
  }
  /* 4. Do the replaces if needed */
  if (a->replace && !block)
  {
  buf[0] = 0;
  if (a->type & WT_REGEX)
  {
    ptr = cleanstr;
    if (!find_backref(a->replace))
    {
    while (!regexec(a->expr, ptr, 1, pmatch, 0))
    {
      if (pmatch[0].rm_so == -1)
      break;
      cleaned = 1;
      matchlen += pmatch[0].rm_eo - pmatch[0].rm_so;
      strlncat(buf, ptr, sizeof buf, pmatch[0].rm_so);
      strlcat(buf, a->replace, sizeof buf);
      ptr += pmatch[0].rm_eo;
    }
    }
    else
    {
    while (!regexec(a->expr, ptr, 10, pmatch, 0))
    {
      if (pmatch[0].rm_so == -1)
      break;
      cleaned = 1;
      matchlen += pmatch[0].rm_eo - pmatch[0].rm_so;
      strlncat(buf, ptr, sizeof buf, pmatch[0].rm_so);
      ptr2 = a->replace;
      for (backref = find_backref(ptr2); backref; backref = find_backref(ptr2))
      {
      i = backref[1] - '0';
      strlncat(buf, ptr2, sizeof buf, backref - ptr2);
      if (pmatch[i].rm_so != -1)
        strlncat(buf, ptr + pmatch[i].rm_so, sizeof buf,
        pmatch[i].rm_eo - pmatch[i].rm_so);
      ptr2 = backref + 2;
      }
      strlcat(buf, ptr2, sizeof buf);
      ptr += pmatch[0].rm_eo;
    }
    }
    strlcat(buf, ptr, sizeof buf);
    strcpy(cleanstr, buf);
    if (matchlen == stringlen)
    break;
  }
  else
  {
    cleaned |= my_fast_badword_replace(a, cleanstr, buf, 512);
    strcpy(cleanstr, buf);
  }
  }
  /* 5. Post-checkings */
  if (a->stoponmatch)
  break;
 }
 /* Do other actions */
 if (myconf.enable_notifications && notify)
 {
  char *cmd = find_CmdType(cmdtype);
  if (myconf.n_method == NM_CHANNEL)
  {
  char  *tmp, *name, *p = NULL;
  aChannel *chptr;
  if (myconf.channels)
  {
    tmp = strdup(myconf.channels);
        for (name = strtoken(&p, tmp, ","); name; name = strtoken(&p, NULL, ","))
                if ((chptr = find_channel(name, NullChn)) != NullChn)
      SendNotice_channel;
    MyFree(tmp);
  }
  for (ch = channels; ch; ch = (ChanList *) next)
  {
    next = (ListStruct *) ch->next;
              if ((chptr = find_channel(ch->channel, NullChn)) != NullChn)
    SendNotice_channel;
    DelListItem(ch, channels);
    MyFree(ch);
  }
  }
  else
  {
  SendNotice_private;
  }
 }
 if (myconf.enable_bans && ban)
 {
#ifndef NO_PLACE_HOST_BAN
  place_host_ban(from, myconf.ban_type,
    myconf.ban_reason ? myconf.ban_reason
    : DEF_BAN_REASON,
    myconf.ban_period);
#else
  char *bantype;
  if ((bantype = find_BanFlag(myconf.ban_type)))
  ban_client(from, bantype, myconf.ban_period,
    myconf.ban_reason ? myconf.ban_reason
    : DEF_BAN_REASON);
#endif
 }
 else if ((cmdtype != CT_QUIT) && myconf.enable_kills && kill)
 {
  /*
  * Can't find a better solution for killing a user due to an adword;
  * using the Event system seems to be working. The problem actually
  * is we shouldn't kill a user more than one time (fe. when ppl use
  * multiple targets in a PRIVMSG/NOTICE).
  */
  strcpy(nickbuf, from->name);
  EventAdd("adwords_kill", 0, 1, &adwords_event_kill, nickbuf);
 }
 else if (myconf.enable_warnings && warn)
 {
  if (myconf.enable_blockings && block)
  sendto_one(from, ":%s NOTICE %s :%s",
    me.name, from->name, myconf.block_message ?
    myconf.block_message : DEF_BLOCK_MSG);
  else
  sendto_one(from, ":%s NOTICE %s :%s",
    me.name, from->name, myconf.warning_message ?
    myconf.warning_message : DEF_WARNING_MSG);
 }
 cleanstr[511] = '\0'; /* cutoff, just to be sure */
 return (myconf.enable_blockings && block) ?
  NULL : cleaned ? cleanstr : str;
}
 
/*
 * cb_privmsg
 * ==========
 *
 * from: who is sending the message
 * to:  who will receive it
 * str:  message text
 * notice: tells whether it's a notice or privmsg
 */
static char *cb_privmsg(aClient *cptr, aClient *from, aClient *to, char *str, int notice)
{
 if (!IsClient(from) || IsULine(from) || IsULine(to)
    || (myconf.require_mode_g && !IsFilteringWords(to)))
  return str;
 return adword_checkmsg(cptr, from, to->name, str,
  notice ? CT_NOTICE : CT_PRIVMSG, AdwordsMessage);
}
/*
 * cb_chanmsg
 * ==========
 *
 * from: who is sending the message
 * to:  the channel where it will be sent to
 * str:  message text
 * notice: tells whether it's a notice or privmsg
 */
static char *cb_chanmsg(aClient *cptr, aClient *from, aChannel *to, char *str, int notice)
{
 ConfigItem_except *e;
 if (!IsClient(from) || IsULine(from) || (myconf.require_mode_g
    && !(to->mode.mode & EXTMODE_STRIPBADWORDS)))
  return str;
 for (e = conf_exceptchan; e; e = (ConfigItem_except *) e->next)
  if (!match(e->mask, to->chname))
  return str;
 return adword_checkmsg(cptr, from, to->chname, str,
  notice? CT_NOTICE : CT_PRIVMSG, AdwordsChannel);
}
/*
 * cb_quit
 * =======
 *
 * sptr: who is sending the message
 * comment: message text
 */
static char *cb_quit(aClient *sptr, char *comment)
{
 Membership *lp;
 if (IsULine(sptr))
  return comment;
 if (myconf.require_mode_g)
 {
  u_int strip = 0;
  for (lp = sptr->user->channel; lp; lp = lp->next)
      if (lp->chptr->mode.mode & EXTMODE_STRIPBADWORDS)
  {
    strip = 1;
    break;
  }
  if (!strip)
  return comment;
 }
 return adword_checkmsg(sptr, sptr, NULL, comment,
  CT_QUIT, AdwordsQuit);
}
#ifndef HOOKTYPE_PRE_LOCAL_QUIT
/* ugly */
int override_quit(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[])
{
 char *ocomment = (parc > 1 && parv[1]) ? parv[1] : parv[0];
 static char comment[TOPICLEN + 1];
 Membership *lp;
 if (!IsServer(cptr) && IsPerson(sptr))
 {
#ifdef STRIPBADWORDS
  int blocked = 0;
#endif
  char *s = comment;
  if (STATIC_QUIT)
  {
  return exit_client(cptr, sptr, sptr, STATIC_QUIT);
  }
  if (!prefix_quit || strcmp(prefix_quit, "no"))
  s = ircsprintf(comment, "%s ",
        BadPtr(prefix_quit) ? "Quit:" : prefix_quit);
#ifdef STRIPBADWORDS
  ocomment = (char *)stripbadwords_quit(ocomment, &blocked);
  if (blocked)
  ocomment = parv[0];
#endif
  ocomment = cb_quit(sptr, ocomment);
  if (!ocomment)
  ocomment = parv[0];
  if (!IsAnOper(sptr) && ANTI_SPAM_QUIT_MSG_TIME)
  if (sptr->firsttime+ANTI_SPAM_QUIT_MSG_TIME > TStime())
    ocomment = parv[0];
  /* Strip color codes if any channel is +S, use nick as reason if +c. */
  if (IsPerson(sptr) && (strchr(ocomment, '\003')))
  {
  unsigned char filtertype = 0; /* 1=filter, 2=block, highest wins. */
  for (lp = sptr->user->channel; lp; lp = lp->next)
  {
    if (lp->chptr->mode.mode & MODE_NOCOLOR)
    {
    filtertype = 2;
    break;
    }
    if (lp->chptr->mode.mode & MODE_STRIP)
    {
    if (!filtertype)
      filtertype = 1;
    }
  }
  if (filtertype == 1)
  {
    ocomment = StripColors(ocomment);
    if (*ocomment == '\0')
    ocomment = parv[0];
  } else
  if (filtertype == 2)
    ocomment = parv[0];
  } /* (strip color codes) */
  strncpy(s, ocomment, TOPICLEN - (s - comment));
  comment[TOPICLEN] = '\0';
  return exit_client(cptr, sptr, sptr, comment);
 }
 else
 {
  return exit_client(cptr, sptr, sptr, ocomment);
 }
}
#endif
#ifdef HOOKTYPE_PRE_LOCAL_PART
/*
 * cb_partmsg
 * ==========
 *
 * sptr: who is sending the message
 * chptr: the channel where it will be sent to
 * comment: message text
 */
static char *cb_partmsg(aClient *sptr, aChannel *chptr, char *comment)
{
 ConfigItem_except      *e;
 if (!comment)
  return NULL;
 if (IsULine(sptr) || (myconf.require_mode_g && !(chptr->mode.mode & EXTMODE_STRIPBADWORDS)))
  return comment;
 for (e = conf_exceptchan; e; e = (ConfigItem_except *) e->next)
  if (!match(e->mask, chptr->chname))
  return comment;
 return adword_checkmsg(sptr, sptr, chptr->chname, comment, CT_PART, AdwordsPart);
}
#endif
 
/*
 * m_adwords
 * =========
 *
 * parv[0]: sender prefix
 * parv[1]: option
 * parv[2]: value (optional)
 *
 */
static int m_adwords(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
        ConfigItem_except *e = NULL;
 if (!MyConnect(sptr) || !IsPerson(sptr) || !IsAnOper(sptr))
 {
  sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
  return -1;
 }
 if (parc < 2 || BadPtr(parv[1]))
 {
  sendto_one(sptr, ":%s NOTICE %s :Usage:",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :    /adwords <option>",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :Options:",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :    message: shows you the adword message block list",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :    channel: shows you the adword channel block list",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :    quit: shows you the adword quit block list",
  me.name, sptr->name);
#ifdef HOOKTYPE_PRE_LOCAL_PART
  sendto_one(sptr, ":%s NOTICE %s :    part: shows you the adword part block list",
  me.name, sptr->name);
#endif
  sendto_one(sptr, ":%s NOTICE %s :    all: shows you all the adword block list",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :    exceptions: shows you the except channel mask list",
  me.name, sptr->name);
  sendto_one(sptr, ":%s NOTICE %s :    config: displays adwords configuration",
  me.name, sptr->name);
  return 0;
 }
 if (!strcasecmp(parv[1], "message"))
 {
  stats_wordlist(sptr, AdwordsMessage, 'M');
  sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, parv[0], 'a');
 }
 else if (!strcasecmp(parv[1], "channel"))
 {
  stats_wordlist(sptr, AdwordsChannel, 'C');
  sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, parv[0], 'a');
 }
 else if (!strcasecmp(parv[1], "quit"))
 {
  stats_wordlist(sptr, AdwordsQuit, 'Q');
  sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, parv[0], 'a');
 }
#ifdef HOOKTYPE_PRE_LOCAL_PART
 else if (!strcasecmp(parv[1], "part"))
 {
  stats_wordlist(sptr, AdwordsPart, 'P');
  sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, parv[0], 'a');
 }
#endif
 else if (!strcasecmp(parv[1], "all"))
 {
  stats_wordlist(sptr, AdwordsMessage, 'M');
  stats_wordlist(sptr, AdwordsChannel, 'C');
  stats_wordlist(sptr, AdwordsQuit, 'Q');
#ifdef HOOKTYPE_PRE_LOCAL_PART
  stats_wordlist(sptr, AdwordsPart, 'P');
#endif
  sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, parv[0], 'a');
 }
        else if (!strcasecmp(parv[1], "exceptions"))
        {
                for (e = conf_exceptchan; e; e = (ConfigItem_except *) e->next)
                        sendto_one(sptr, ":%s %i %s :m %s",
                                me.name, RPL_TEXT, sptr->name, e->mask);
                sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, parv[0], 'm');
        }
 else if (!strcasecmp(parv[1], "config"))
  cb_stats(sptr);
 else
 {
  sendto_one(sptr, ":%s NOTICE %s :Unknown option %s."
  " Valid options are: message | channel | all | exceptions | config",
  me.name, sptr->name, parv[1]);
  return -1;
 }
 return 0;
}
static void stats_wordlist(aClient *sptr, Adword *wordlist, char wtype)
{
 Adword *a;
 for (a = wordlist; a; a = (Adword *) a->next)
  sendto_one(sptr, ":%s %i %s :a %c %c %c %c %s %s%s%s" "%s%s" "%s%s",
  me.name, RPL_TEXT, sptr->name,
  wtype,
  find_WordFlag(a->type),
  find_MsgType(a->msgtype),
  find_UserType(a->usertype),
  make_optlist(a),
  a->type & WT_FAST_L ? "*" : "",
  a->word,
  a->type & WT_FAST_R ? "*" : "",
  a->replace ? " " : "",
  a->replace ? a->replace : "",
  a->channel ? " " : "",
  a->channel ? a->channel : "");
}
static void adwords_event_kill(char *name)
{
 aClient *cptr;
 if ((cptr = find_person(name, NULL)))
  exit_client(cptr, cptr, &me,
  myconf.kill_reason ? myconf.kill_reason : DEF_KILL_REASON);
}

Bunu kurun.

5on3r 03 Ocak 2009 16:48

Cevap: Adwords Hata Veriyor.
 
Modulunde Bozuk Olaßılır Unrealınde.
Unreal3.2.7 Cıkaralım en Kotu Surumlerden Bırıdır . ßenım Şahsi Gorusum . ßence Unreal3.2.3 Kurup Aynı Modulu Kurarsan Calısma Ihtımalı Vardır . ama oto Kurulum Adreslerı de var 1 tıkla Modul fılan Bırakmıor Hepsını Kuruor kendı Sen Sadece BakIorsun :)

Sorunun duzelmesse Pm At Yardımcı Olurum

İyi Çalısmalar

WhiteKnight 03 Ocak 2009 17:12

Cevap: Adwords Hata Veriyor.
 
Hatayı yazmış orada Unreal ile bir alakası yok. Sanırım 3.2.6'dan sonraki sürümlerde bu hatayı veriyordu. Düzelttiler sonra modülü. En son sürümü kullanmak her zaman iyidir.

GemLik 03 Ocak 2009 21:32

Cevap: Adwords Hata Veriyor.
 
Alıntı:

WhiteKnight Nickli Üyeden Alıntı (Mesaj 615755)
Hatayı yazmış orada Unreal ile bir alakası yok. Sanırım 3.2.6'dan sonraki sürümlerde bu hatayı veriyordu. Düzelttiler sonra modülü. En son sürümü kullanmak her zaman iyidir.

arkadaşın dediği gibi Unreal3.2.3 için ayrı ve Unreal3.2.5 ve üzeri versionlar için ayrı modul vardır adwords da

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

buradaki modulu deneyin. işinizi görecektir.

feaRneveR 04 Ocak 2009 16:06

Cevap: Adwords Hata Veriyor.
 
GemLikLi saol dostum fakat senin modulu kurunca da server kapanıyor kendiliğnden ? Anlamadım

WhiteKnight 04 Ocak 2009 18:20

Cevap: Adwords Hata Veriyor.
 
.conf dosyasını kontrol et. Hata vardır.

feaRneveR 04 Ocak 2009 20:43

Cevap: Adwords Hata Veriyor.
 
unrealircd.conf da
include "adwords.conf";

reklam.conf da
loadmodule "src/modules/adwords.so";

var.. gerisi işte adwords ayarlanmıs. bunda ne gibi bir hata var. biliyorsanız söyleyin bilmiyorsanız yok confu kontrol et. ws diye bos konusmayın

WhiteKnight 04 Ocak 2009 21:56

Cevap: Adwords Hata Veriyor.
 
Alıntı:

feaRneveR Nickli Üyeden Alıntı (Mesaj 616447)

unrealircd.conf da
include "adwords.conf";

reklam.conf da
loadmodule "src/modules/adwords.so";

Nasıl yani?

Bunları demedik heralde. adwords.conf hata vardır dedik. Görmedende birşey diyemem heralde.

Ben Unreal3.2.7'de kurdum hiç kapanma felanda olmadı.

Diablo 04 Ocak 2009 23:11

Cevap: Adwords Hata Veriyor.
 
Alıntı:

feaRneveR Nickli Üyeden Alıntı (Mesaj 616333)
GemLikLi saol dostum fakat senin modulu kurunca da server kapanıyor kendiliğnden ? Anlamadım

büyük ihtimal kurulu chansno modulden veya türkçe çeviricilerin tabiriyle rapor.c bilgi.c adında geçer.bu modul kurulu ise kaldırıp tekrar denemen gerekir.

Alıntı:

5on3r Nickli Üyeden Alıntı (Mesaj 615724)
Modulunde Bozuk Olaßılır Unrealınde.
Unreal3.2.7 Cıkaralım en Kotu Surumlerden Bırıdır . ßenım Şahsi Gorusum . ßence Unreal3.2.3 Kurup Aynı Modulu Kurarsan Calısma Ihtımalı Vardır . ama oto Kurulum Adreslerı de var 1 tıkla Modul fılan Bırakmıor Hepsını Kuruor kendı Sen Sadece BakIorsun :)

Bu arkadaş unrealden çok anlıyorki bu kadar emin konuşuyor.her ne program olursa olsun yeni bir version cıkarıyorsa eskisinde eksilik olduğunu anladığından ve yeniliklerden dolayı kullanıcıların faydalanmasını sağlamak amacıyla çıkarırlar.

Günümüzde her eline 30 tl geçen birileri anlamadan etmeden sunucu açıyor ve sonrasını herkes biliyor.Shell işi yapan kişilerde eskiden kalma Unreal3.2.3 versionunu forumlardan editleyip bu gibi yeni arkadaslara kuruyorlar.Neden 3.2.3 ? bana göre struct ve extern lerin angrywolf'un modullerine uygun olmasından dolayı ve bu modullerinden yeni versiona göre güncel olmamasından dolayı herkes bu versionu kullanmaktadır. 29 Aralık 2008 tarihinde 3.2.8 versionu rc1(Release Candidate 1) olarak teste sunuldu yakın zamanda stable olarak olarak sürüme sunulacak.eğer yeni sürümler kullanmak isteyipde modullerden dolayı hata alıyorsanız bu başlık altında modulu ve hangi unrealircd versionun hata verdiğini belirtirseniz elimden geldiğince yardımcı olmaya çalışacağım.


Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 14:59.

Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2024 IRCForumlari.Net