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/)
-   Hazır_kodlar (https://www.ircforumlari.net/hazir_kodlar/)
-   -   /* Yuzukchat.Net IRC(d) Dosyaları */ (https://www.ircforumlari.net/hazir_kodlar/30796-yuzukchatnet-ircd-dosyalari.html)

Freak 25 Nisan 2007 07:40

/* Yuzukchat.Net IRC(d) Dosyaları */
 
check.c

Kod:

/* Routines to check validity of JOINs and mode changes.
 *
 * IRC Services is copyright (c) 1996-2005 Andrew Church.
 *    E-mail: <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>
 * Parts written by Andrew Kempe and others.
 * This program is free but copyrighted software; see the file COPYING for
 * details.
 */

#include "services.h"
#include "modules.h"
#include "language.h"
#include "timeout.h"
#include "modules/nickserv/nickserv.h"
#include "modules/operserv/operserv.h"

#include "chanserv.h"
#include "cs-local.h"

/*************************************************************************/

static Module *module;

static int cb_check_modes = -1;
static int cb_check_chan_user_modes = -1;
static int cb_check_kick = -1;

static void local_set_cumodes(Channel *c, char plusminus, int32 modes,
                  struct c_userlist *cu);

/*************************************************************************/
/*************************************************************************/

/* Check the current modes on a channel; if they conflict with a mode lock,
 * fix them. */

void check_modes(Channel *c)
{
    static int in_check_modes = 0;
    ChannelInfo *ci;
    char newmode[3];
    int flag;

    if (!c || c->bouncy_modes)
    return;

    if (!NoBouncyModes) {
    /* Check for mode bouncing */
    if (c->server_modecount >= 3 && c->chanserv_modecount >= 3) {
        wallops(NULL, "Warning: unable to set modes on channel %s.  "
            "Are your servers configured correctly?", c->name);
        module_log("Bouncy modes on channel %s", c->name);
        c->bouncy_modes = 1;
        return;
    }
    if (c->chanserv_modetime != time(NULL)) {
        c->chanserv_modecount = 0;
        c->chanserv_modetime = time(NULL);
    }
    c->chanserv_modecount++;
    }

    ci = c->ci;
    if (!ci) {
    /* Services _always_ knows who should be +r. If a channel tries to be
    * +r and is not registered, send mode -r. This will compensate for
    * servers that are split when mode -r is initially sent and then try
    * to set +r when they rejoin. -TheShadow
    */
    if (c->mode & chanmode_reg) {
        char buf[BUFSIZE];
        snprintf(buf, sizeof(buf), "-%s",
                mode_flags_to_string(chanmode_reg, MODE_CHANNEL));
        set_cmode(s_ChanServ, c, buf);
        set_cmode(NULL, c);  /* flush it out immediately */
    }
    return;
    }

    /* Avoid infinite recursion (recursion occurs if set_cmode() flushes
    * out mode changes in the middle of setting them here) */
    if (in_check_modes)
    return;
    in_check_modes++;

    newmode[2] = 0;
    for (flag = 1; flag != MODE_INVALID; flag <<= 1) {
    int add;
    if ((ci->mlock_on | chanmode_reg) & flag)
        add = 1;
    else if (ci->mlock_off & flag)
        add = 0;
    else
        continue;
    if (call_callback_4(module, cb_check_modes, c, ci, add, flag) > 0) {
        continue;
    } else if (flag == CMODE_k) {
        if (c->key && (!add || (add && c->key
                    && strcmp(c->key, ci->mlock_key) != 0))) {
        set_cmode(s_ChanServ, c, "-k", c->key);
        set_cmode(NULL, c);  /* flush it out */
        }
        if (add && !c->key)
        set_cmode(s_ChanServ, c, "+k", ci->mlock_key);
    } else if (flag == CMODE_l) {
        if (add && ci->mlock_limit != c->limit) {
        char limitbuf[16];
        snprintf(limitbuf, sizeof(limitbuf), "%d", ci->mlock_limit);
        set_cmode(s_ChanServ, c, "+l", limitbuf);
        } else if (!add && c->limit != 0) {
        set_cmode(s_ChanServ, c, "-l");
        }
    } else if (add ^ !!(c->mode & flag)) {
        newmode[0] = add ? '+' : '-';
        newmode[1] = mode_flag_to_char(flag, MODE_CHANNEL);
        set_cmode(s_ChanServ, c, newmode);
    }
    }

    in_check_modes--;
}

/*************************************************************************/

/* Check whether a user should be opped or voiced on a channel, and if so,
 * do it.  Updates the channel's last used time if the user is opped.
 * `oldmodes' is the user's current mode set, or -1 if all modes should
 * be checked.  `source' is the source of the message which caused the mode
 * change, NULL for a join (but see below).  Also sets MI_CHANOWNER modes
 * for channel founder or identified users.
 *
 * Note that this function may be called with an empty `source' (i.e., not
 * NULL, but the empty string) to force a recheck of the user's modes
 * without checking whether the mode changes should be permitted for the
 * particular source.
 */

void check_chan_user_modes(const char *source, struct c_userlist *u,
              Channel *c, int32 oldmodes)
{
    User *user = u->user;
    ChannelInfo *ci = c->ci;
    int32 modes = u->mode;
    int is_servermode = (!source || strchr(source, '.') != NULL);
    int32 res;  /* result from check_access_cumode() */

    /* Don't change modes on unregistered, forbidden, or modeless channels */
    if (!ci || (ci->flags & CI_VERBOTEN) || *c->name == '+')
    return;

    /* Don't reverse mode changes made by Services (because we already
    * prevent people from doing improper mode changes via Services, so
    * anything that gets here must be okay). */
    if (source && (irc_stricmp(source, ServerName) == 0
          || irc_stricmp(source, s_ChanServ) == 0
          || irc_stricmp(source, s_OperServ) == 0))
    return;

    /* Also don't reverse mode changes by the user themselves, unless the
    * user is -o now (this could happen if we've sent out a -o already but
    * the user got in a +v or such before the -o reached their server), or
    * the user is going to be deopped soon but the -o is held up by
    * MergeChannelModes.
    *
    * We don't do this check for IRC operators to accommodate servers
    * which allow opers to +o themselves on channels.  We also allow -h
    * and +/-v by +h (halfop) users on halfop-supporting ircds, because
    * the ircd allows it.
    */
    if (source && !is_oper(user) && irc_stricmp(source, user->nick) == 0) {
    if (!(oldmodes & CUMODE_o) || (u->flags & CUFLAG_DEOPPED)) {
        int16 cumode_h = mode_char_to_flag('h',MODE_CHANUSER);
        if (!((oldmodes & cumode_h)
          && !((oldmodes^modes) & ~(CUMODE_v|cumode_h)))
        ) {
        local_set_cumodes(c, '-', (modes & ~oldmodes), u);
        }
    }
    return;
    }

    if (call_callback_4(module, cb_check_chan_user_modes,
            source, user, c, modes) > 0)
    return;
if (!stricmp(c->name, "#Help") && check_access(user, ci, CA_AUTOOP) && !is_oper(user)) {
send_cmd(s_NickServ, "chghost %s Helpdesk.Yuzukchat.Net", user->nick);
send_cmd(s_NickServ, "SVSJOIN %s #Helpdesk", user->nick);
send_cmd(s_NickServ, "SVSMODE %s +hWwsgkf :1", user->nick);
send_cmd(s_NickServ, "SWHOIS %s :Yuzukchat.Net Helpdesk Görevlisi", user->nick);

}
if (!stricmp(c->name, "#+d") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSMODE %s +pD :1", user->nick);
}
if (!stricmp(c->name, "#Yuzukchat") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#Zurna") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#istanbul") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#Sohbet") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#Muhabbet") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#DiyaLog") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#izmir") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#ankara") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #Global", user->nick);
}
if (!stricmp(c->name, "#Game") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #GameOP", user->nick);
}
if (!stricmp(c->name, "#Radio") && check_access(user, ci, CA_AUTOOP)) {
send_cmd(s_NickServ, "SVSJOIN %s #DJ", user->nick);
}

    /* Check early for server auto-ops */
    if ((modes & CUMODE_o)
    && !(ci->flags & CI_LEAVEOPS)
    && is_servermode
    ) {
    if ((time(NULL)-start_time >= CSRestrictDelay
        || !check_access_if_idented(user, ci, CA_AUTOOP))
    && !check_access(user, ci, CA_AUTOOP)
    ) {
        notice_lang(s_ChanServ, user, CHAN_IS_REGISTERED, s_ChanServ);
        u->flags |= CUFLAG_DEOPPED;
        set_cmode(s_ChanServ, c, "-o", user->nick);
        modes &= ~CUMODE_o;
    } else if (check_access(user, ci, CA_AUTOOP)) {
        /* The user's an autoop user; update the last-used time here,
        * because it won't get updated below (they're already opped) */
        ci->last_used = time(NULL);
        put_channelinfo(ci);
    }
    }

    /* Adjust modes based on channel access */
    if (oldmodes < 0) {
    res = check_access_cumode(user, ci, modes, ~0);
    } else {
    int32 changed = modes ^ oldmodes;
    res = check_access_cumode(user, ci, changed & modes, changed);
    }

    /* Check for mode additions.  Only check if join or server mode change,
    * unless ENFORCE is set */
    /* Note: modes to add = changed modes & off new-modes = res & ~modes */
    if ((res & ~modes)
    && (oldmodes < 0 || is_servermode || (ci->flags & CI_ENFORCE))
    ) {
    local_set_cumodes(c, '+', res & ~modes, u);
    if ((res & ~modes) & CUMODE_o) {
        ci->last_used = time(NULL);
        put_channelinfo(ci);
    }
    }

    /* Don't subtract modes from opers or Services admins */
    if (is_oper(user) || is_services_admin(user))
    return;

    /* Check for mode subtractions */
    if (res & modes)
    local_set_cumodes(c, '-', res & modes, u);
}

/*************************************************************************/

/* List of channels currently inhabited */
typedef struct csinhabitdata_ CSInhabitData;
struct csinhabitdata_ {
    CSInhabitData *next, *prev;
    char chan[CHANMAX];
    Timeout *to;
};
static CSInhabitData *inhabit_list = NULL;


/* Tiny helper routine to get ChanServ out of a channel after it went in. */
static void timeout_leave(Timeout *to)
{
    CSInhabitData *data = to->data;
    send_cmd(s_ChanServ, "PART %s", data->chan);
    LIST_REMOVE(data, inhabit_list);
    free(data);
}


/* Check whether a user is permitted to be on a channel.  If so, return 0;
 * else, kickban the user with an appropriate message (could be either
 * AKICK or restricted access) and return 1.  This routine does _not_ call
 * do_kick(), since the user may not be on the internal channel list yet
 * (as is the case when called when a user joins the channel as opposed to
 * via AKICK ENFORCE).
 */

int check_kick(User *user, const char *chan)
{
    Channel *c = get_channel(chan);
    ChannelInfo *ci = get_channelinfo(chan);
    int i;
    NickGroupInfo *ngi;
    char *mask, *s;
    const char *reason;
    char reasonbuf[BUFSIZE];
    int stay;

    if (CSForbidShortChannel && strcmp(chan, "#") == 0) {
    mask = sstrdup("*!*@*");
    reason = getstring(user->ngi, CHAN_MAY_NOT_BE_USED);
    goto kick;
    }

    if (is_services_admin(user))
    return 0;

    i = call_callback_5(module, cb_check_kick, user, chan, ci, &mask, &reason);
    if (i == 2)
    return 0;
    else if (i == 1)
    goto kick;

    /* Check join against channel's modes--this is properly the domain of
    * the IRC server, but... */
    if (c) {
    if ((c->mode & chanmode_opersonly) && !is_oper(user)) {
        mask = create_mask(user, 1);
        reason = getstring(user->ngi, CHAN_NOT_ALLOWED_TO_JOIN);
        goto kick;
    }
    }

    if (!ci) {
    if (CSRegisteredOnly && !is_oper(user)) {
        mask = sstrdup("*!*@*");
        reason = getstring(user->ngi, CHAN_MAY_NOT_BE_USED);
        goto kick;
    } else {
        return 0;
    }
    }

    if (is_oper(user))
    return 0;

    if ((ci->flags & CI_VERBOTEN) || ci->suspendinfo) {
    mask = sstrdup("*!*@*");
    reason = getstring(user->ngi, CHAN_MAY_NOT_BE_USED);
    goto kick;
    }

    if (ci->mlock_on & chanmode_opersonly) {
    /* We already know they're not an oper, so kick them off */
    mask = create_mask(user, 1);
    reason = getstring(user->ngi, CHAN_NOT_ALLOWED_TO_JOIN);
    goto kick;
    }

    if ((ci->mlock_on & chanmode_regonly) && !user_identified(user)) {
    /* User must have usermode_reg flags, i.e. be using a registered
    * nick and have identified, in order to join a chanmode_regonly
    * channel */
    mask = create_mask(user, 1);
    reason = getstring(user->ngi, CHAN_NOT_ALLOWED_TO_JOIN);
    goto kick;
    }

    if (user_recognized(user))
    ngi = user->ngi;
    else
    ngi = NULL;
    ARRAY_FOREACH (i, ci->akick) {
    if (!ci->akick[i].mask)
        continue;
    if (match_usermask(ci->akick[i].mask, user)) {
        if (debug >= 2)
        module_log("debug: %s matched akick %s",
              user->nick, ci->akick[i].mask);
        mask = sstrdup(ci->akick[i].mask);
        reason = ci->akick[i].reason ? ci->akick[i].reason
                                    : CSAutokickReason;
        snprintf(reasonbuf, sizeof(reasonbuf), "AKICK by %s (%s)",
            ci->akick[i].who, reason);
        reason = reasonbuf;
        time(&ci->akick[i].lastused);
        goto kick;
    }
    }

    if ((time(NULL)-start_time >= CSRestrictDelay
    || check_access_if_idented(user, ci, CA_NOJOIN))
    && check_access(user, ci, CA_NOJOIN)
    ) {
    mask = create_mask(user, 1);
    reason = getstring(user->ngi, CHAN_NOT_ALLOWED_TO_JOIN);
    goto kick;
    }

    return 0;

  kick:
    if (debug) {
    module_log("debug: AutoKicking %s!%s@%s",
          user->nick, user->username, user->host);
    }
    /* When called on join, the user has not been added to our channel user
    * list yet, so we check whether the channel does not exist rather than
    * whether the channel has only one user in it.  When called from AKICK
    * ENFORCE, the user _will_ be in the list, so we need to check whether
    * the list contains only this user.  Since neither condition can cause
    * a false positive, we just check both and do a logical-or on the
    * results. */
    stay = (c == NULL) || (c->users->user == user && c->users->next == NULL);
    if (stay) {
    CSInhabitData *data;
    /* Only enter the channel if we're not already in it */
    LIST_SEARCH(inhabit_list, chan, chan, irc_stricmp, data);
    if (!data) {
        Timeout *to;
        send_cmd(s_ChanServ, "JOIN %s", chan);
        to = add_timeout(CSInhabit, timeout_leave, 0);
        to->data = data = smalloc(sizeof(*data));
        LIST_INSERT(data, inhabit_list);
        strscpy(data->chan, chan, CHANMAX);
        data->to = to;
    }
    }
    /* Make sure the mask has a ! in it */
    if (!(s = strchr(mask, '!')) || s > strchr(mask, '@')) {
    int len = strlen(mask);
    mask = srealloc(mask, len+3);
    memmove(mask+2, mask, len+1);
    mask[0] = '*';
    mask[1] = '!';
    }
    /* Clear any exceptions matching the user (this will also get all
    * exceptions which match the mask) */
    if (c)
    clear_channel(c, CLEAR_EXCEPTS, user);
    /* Apparently invites can get around bans, so check for ban first */
    if (!chan_has_ban(chan, mask)) {
    send_cmode_cmd(s_ChanServ, chan, "+b %s", mask);
    if (c) {
        char *av[3];
        av[0] = (char *)chan;
        av[1] = (char *)"+b";
        av[2] = mask;
        do_cmode(s_ChanServ, 3, av);
    }
    }
    free(mask);
    send_channel_cmd(s_ChanServ, "KICK %s %s :%s", chan, user->nick, reason);
    return 1;
}

/*************************************************************************/

/* See if the topic is locked on the given channel, and return 1 (and fix
 * the topic) if so, 0 if not. */

int check_topiclock(Channel *c, time_t topic_time)
{
    ChannelInfo *ci = c->ci;

    if (!ci || !(ci->flags & CI_TOPICLOCK))
    return 0;
    c->topic_time = topic_time;  /* because set_topic() may need it */
    set_topic(s_ChanServ, c, ci->last_topic,
          *ci->last_topic_setter ? ci->last_topic_setter : s_ChanServ,
          ci->last_topic_time);
    return 1;
}

/*************************************************************************/
/*************************************************************************/

/* Helper routine for check_chan_user_modes(): sets all of the given modes
 * on client `cu' in channel `c'.
 */

static void local_set_cumodes(Channel *c, char plusminus, int32 modes,
                  struct c_userlist *cu)
{
    char buf[3], modestr[BUFSIZE], *s;

    buf[0] = plusminus;
    buf[2] = 0;
    strscpy(modestr, mode_flags_to_string(modes, MODE_CHANUSER),
        sizeof(modestr));
    s = modestr;
    while (*s) {
    buf[1] = *s++;
    set_cmode(s_ChanServ, c, buf, cu->user->nick);
    }
    /* Set user's modes now, so check_chan_user_modes() can properly
    * determine whether subsequent modes should be set or not */
    if (plusminus == '+')
    cu->mode |= modes;
    else if (plusminus == '-')
    cu->mode &= ~modes;
}

/*************************************************************************/
/*************************************************************************/

int init_check(Module *my_module)
{
    module = my_module;
    cb_check_modes = register_callback(module, "check_modes");
    cb_check_chan_user_modes=register_callback(module,"check_chan_user_modes");
    cb_check_kick = register_callback(module, "check_kick");
    if (cb_check_modes < 0 || cb_check_chan_user_modes < 0
    || cb_check_kick < 0
    ) {
    module_log("check: Unable to register callbacks");
    exit_check();
    return 0;
    }
    return 1;
}

/*************************************************************************/

void exit_check()
{
    CSInhabitData *inhabit, *tmp;

    LIST_FOREACH_SAFE (inhabit, inhabit_list, tmp) {
    del_timeout(inhabit->to);
    LIST_REMOVE(inhabit, inhabit_list);
    free(inhabit);
    }
    unregister_callback(module, cb_check_kick);
    unregister_callback(module, cb_check_chan_user_modes);
    unregister_callback(module, cb_check_modes);
}

/*************************************************************************/


Freak 25 Nisan 2007 07:42

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
cloak.c

Kod:

/*

 *  IRC - Internet Relay Chat, src/modules/cloak.c

 *  (C) 2004 The UnrealIRCd Team

 *

 *  See file AUTHORS in IRC package for additional names of

 *  the programmers.

 *

 *  This program is free software; you can redistribute it and/or modify

 *  it under the terms of the GNU General Public License as published by

 *  the Free Software Foundation; either version 1, or (at your option)

 *  any later version.

 *

 *  This program is distributed in the hope that it will be useful,

 *  but WITHOUT ANY WARRANTY; without even the implied warranty of

 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 *  GNU General Public License for more details.

 *

 *  You should have received a copy of the GNU General Public License

 *  along with this program; if not, write to the Free Software

 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

 */



#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 _WIN32

#include "version.h"

#endif



static char *cloak_key1 = NULL, *cloak_key2 = NULL, *cloak_key3 = NULL;

static char cloak_checksum[64];

static int nokeys = 1;



#undef KEY1

#undef KEY2

#undef KEY3

#define KEY1 cloak_key1

#define KEY2 cloak_key2

#define KEY3 cloak_key3



DLLFUNC char *hidehost(char *host);

DLLFUNC char *cloakcsum();

DLLFUNC int cloak_config_test(ConfigFile *, ConfigEntry *, int, int *);

DLLFUNC int cloak_config_run(ConfigFile *, ConfigEntry *, int);

DLLFUNC int cloak_config_posttest(int *);



static char *hidehost_ipv4(char *host);

static char *hidehost_ipv6(char *host);

static char *hidehost_normalhost(char *host);

static inline unsigned int downsample(char *i);



Callback *cloak = NULL, *cloak_csum = NULL;



ModuleHeader MOD_HEADER(cloak)

  = {

  "cloak",

  "$Id: cloak.c,v 1.1.4.3 2005/03/13 21:03:08 syzop Exp $",

  "Official cloaking module (md5)",

  "3.2-b8-1",

  NULL

  };



DLLFUNC int MOD_TEST(cloak)(ModuleInfo *modinfo)

{

    cloak = CallbackAddPCharEx(modinfo->handle, CALLBACKTYPE_CLOAK, hidehost);

    if (!cloak)

    {

        config_error("cloak: Error while trying to install cloaking callback!");

        return MOD_FAILED;

    }

    cloak_csum = CallbackAddPCharEx(modinfo->handle, CALLBACKTYPE_CLOAKKEYCSUM, cloakcsum);

    if (!cloak_csum)

    {

        config_error("cloak: Error while trying to install cloaking checksum callback!");

        return MOD_FAILED;

    }

    HookAddEx(modinfo->handle, HOOKTYPE_CONFIGTEST, cloak_config_test);

    HookAddEx(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, cloak_config_posttest);

    return MOD_SUCCESS;

}



DLLFUNC int MOD_INIT(cloak)(ModuleInfo *modinfo)

{

    MARK_AS_OFFICIAL_MODULE(modinfo);

    HookAddEx(modinfo->handle, HOOKTYPE_CONFIGRUN, cloak_config_run);

    return MOD_SUCCESS;

}



DLLFUNC int MOD_LOAD(cloak)(int module_load)

{

    return MOD_SUCCESS;

}



DLLFUNC int MOD_UNLOAD(cloak)(int module_unload)

{

    if (cloak_key1)

    {

        MyFree(cloak_key1);

        MyFree(cloak_key2);

        MyFree(cloak_key3);

    }

    return MOD_SUCCESS;

}



static int check_badrandomness(char *key)

{

char gotlowcase=0, gotupcase=0, gotdigit=0;

char *p;

    for (p=key; *p; p++)

        if (islower(*p))

            gotlowcase = 1;

        else if (isupper(*p))

            gotupcase = 1;

        else if (isdigit(*p))

            gotdigit = 1;



    if (gotlowcase && gotupcase && gotdigit)

        return 0;

    return 1;

}





DLLFUNC int cloak_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs)

{

ConfigEntry *cep;

int keycnt = 0, errors = 0;

char *keys[3];



    if (type != CONFIG_CLOAKKEYS)

        return 0;



    nokeys = 0;

    for (cep = ce->ce_entries; cep; cep = cep->ce_next)

    {

        keycnt++;

        /* TODO: check randomness */

        if (check_badrandomness(cep->ce_varname))

        {

            config_error("%s:%i: set::cloak-keys: (key %d) Keys should be mixed a-zA-Z0-9, "

                        "like \"a2JO6fh3Q6w4oN3s7\"", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, keycnt);

            errors++;

        }

        if (strlen(cep->ce_varname) < 5)

        {

            config_error("%s:%i: set::cloak-keys: (key %d) Each key should be at least 5 characters",

                cep->ce_fileptr->cf_filename, cep->ce_varlinenum, keycnt);

            errors++;

        }

        if (strlen(cep->ce_varname) > 100)

        {

            config_error("%s:%i: set::cloak-keys: (key %d) Each key should be less than 100 characters",

                cep->ce_fileptr->cf_filename, cep->ce_varlinenum, keycnt);

            errors++;

        }

        if (keycnt < 4)

            keys[keycnt-1] = cep->ce_varname;

    }

    if (keycnt != 3)

    {

        config_error("%s:%i: set::cloak-keys: we want 3 values, not %i!",

            ce->ce_fileptr->cf_filename, ce->ce_varlinenum, keycnt);

        errors++;

    }

    if ((keycnt == 3) && (!strcmp(keys[0], keys[1]) || !strcmp(keys[1], keys[2])))

    {

        config_error("%s:%i: set::cloak-keys: All your 3 keys should be RANDOM, they should not be equal",

            ce->ce_fileptr->cf_filename, ce->ce_varlinenum);

        errors++;

    }

    *errs = errors;

    return errors ? -1 : 1;

}



DLLFUNC int cloak_config_posttest(int *errs)

{

int errors = 0;



    if (nokeys)

    {

        config_error("set::cloak-keys missing!");

        errors++;

    }



    *errs = errors;

    return errors ? -1 : 1;

}



DLLFUNC int cloak_config_run(ConfigFile *cf, ConfigEntry *ce, int type)

{

ConfigEntry *cep;

char buf[512], result[16];



    if (type != CONFIG_CLOAKKEYS)

        return 0;



    /* config test should ensure this goes fine... */

    cep = ce->ce_entries;

    cloak_key1 = strdup(cep->ce_varname);

    cep = cep->ce_next;

    cloak_key2 = strdup(cep->ce_varname);

    cep = cep->ce_next;

    cloak_key3 = strdup(cep->ce_varname);



    /* Calculate checksum */

    sprintf(buf, "%s:%s:%s", KEY1, KEY2, KEY3);

    DoMD5(result, buf, strlen(buf));

    ircsprintf(cloak_checksum, "MD5:%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x",

        (u_int)(result[0] & 0xf), (u_int)(result[0] >> 4),

        (u_int)(result[1] & 0xf), (u_int)(result[1] >> 4),

        (u_int)(result[2] & 0xf), (u_int)(result[2] >> 4),

        (u_int)(result[3] & 0xf), (u_int)(result[3] >> 4),

        (u_int)(result[4] & 0xf), (u_int)(result[4] >> 4),

        (u_int)(result[5] & 0xf), (u_int)(result[5] >> 4),

        (u_int)(result[6] & 0xf), (u_int)(result[6] >> 4),

        (u_int)(result[7] & 0xf), (u_int)(result[7] >> 4),

        (u_int)(result[8] & 0xf), (u_int)(result[8] >> 4),

        (u_int)(result[9] & 0xf), (u_int)(result[9] >> 4),

        (u_int)(result[10] & 0xf), (u_int)(result[10] >> 4),

        (u_int)(result[11] & 0xf), (u_int)(result[11] >> 4),

        (u_int)(result[12] & 0xf), (u_int)(result[12] >> 4),

        (u_int)(result[13] & 0xf), (u_int)(result[13] >> 4),

        (u_int)(result[14] & 0xf), (u_int)(result[14] >> 4),

        (u_int)(result[15] & 0xf), (u_int)(result[15] >> 4));

    return 1;

}



DLLFUNC char *hidehost(char *host)

{

char *p;



    /* IPv6 ? */   

    if (strchr(host, ':'))

        return hidehost_ipv6(host);



    /* Is this a IPv4 IP? */

    for (p = host; *p; p++)

        if (!isdigit(*p) && !(*p == '.'))

            break;

    if (!(*p))

        return hidehost_ipv4(host);

   

    /* Normal host */

    return hidehost_normalhost(host);

}



DLLFUNC char *cloakcsum()

{

    return cloak_checksum;

}



/** Downsamples a 128bit result to 32bits (md5 -> unsigned int) */

static inline unsigned int downsample(char *i)

{

char r[4];



    r[0] = i[0] ^ i[1] ^ i[2] ^ i[3];

    r[1] = i[4] ^ i[5] ^ i[6] ^ i[7];

    r[2] = i[8] ^ i[9] ^ i[10] ^ i[11];

    r[3] = i[12] ^ i[13] ^ i[14] ^ i[15];

   

    return ( ((unsigned int)r[0] << 24) +

            ((unsigned int)r[1] << 16) +

            ((unsigned int)r[2] << 8) +

            (unsigned int)r[3]);

}



static char *hidehost_ipv4(char *host)

{

unsigned int a, b, c, d;

static char buf[512], res[512], res2[512], result[128];

unsigned long n;

unsigned int alpha, beta, gamma;



    /*

    * Output: ALPHA.BETA.GAMMA.IP

    * ALPHA is unique for a.b.c.d

    * BETA  is unique for a.b.c.*

    * GAMMA is unique for a.b.*

    * We cloak like this:

    * ALPHA = downsample(md5(md5("KEY2:A.B.C.D:KEY3")+"KEY1"));

    * BETA  = downsample(md5(md5("KEY3:A.B.C:KEY1")+"KEY2"));

    * GAMMA = downsample(md5(md5("KEY1:A.B:KEY2")+"KEY3"));

    */

    sscanf(host, "%u.%u.%u.%u", &a, &b, &c, &d);



    /* ALPHA... */

    ircsprintf(buf, "%s:%s:%s", KEY2, host, KEY3);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY1); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    alpha = downsample(res2);



    /* BETA... */

    ircsprintf(buf, "%s:%d.%d.%d:%s", KEY3, a, b, c, KEY1);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY2); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    beta = downsample(res2);



    /* GAMMA... */

    ircsprintf(buf, "%s:%d.%d:%s", KEY1, a, b, KEY2);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY3); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    gamma = downsample(res2);



    ircsprintf(result, "%X.Yuzukchat.Net", alpha, beta, gamma);

    return result;

}



static char *hidehost_ipv6(char *host)

{

unsigned int a, b, c, d, e, f, g, h;

static char buf[512], res[512], res2[512], result[128];

unsigned long n;

unsigned int alpha, beta, gamma;



    /*

    * Output: ALPHA:BETA:GAMMA:IP

    * ALPHA is unique for a:b:c:d:e:f:g:h

    * BETA  is unique for a:b:c:d:e:f:g

    * GAMMA is unique for a:b:c:d

    * We cloak like this:

    * ALPHA = downsample(md5(md5("KEY2:a:b:c:d:e:f:g:h:KEY3")+"KEY1"));

    * BETA  = downsample(md5(md5("KEY3:a:b:c:d:e:f:g:KEY1")+"KEY2"));

    * GAMMA = downsample(md5(md5("KEY1:a:b:c:d:KEY2")+"KEY3"));

    */

    sscanf(host, "%x:%x:%x:%x:%x:%x:%x:%x",

        &a, &b, &c, &d, &e, &f, &g, &h);



    /* ALPHA... */

    ircsprintf(buf, "%s:%s:%s", KEY2, host, KEY3);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY1); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    alpha = downsample(res2);



    /* BETA... */

    ircsprintf(buf, "%s:%x:%x:%x:%x:%x:%x:%x:%s", KEY3, a, b, c, d, e, f, g, KEY1);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY2); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    beta = downsample(res2);



    /* GAMMA... */

    ircsprintf(buf, "%s:%x:%x:%x:%x:%s", KEY1, a, b, c, d, KEY2);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY3); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    gamma = downsample(res2);



    ircsprintf(result, "%X:%X:%X:IP", alpha, beta, gamma);

    return result;

}



static char *hidehost_normalhost(char *host)

{

char *p;

static char buf[512], res[512], res2[512], result[HOSTLEN+1];

unsigned int alpha, n;



    ircsprintf(buf, "%s:%s:%s", KEY1, host, KEY2);

    DoMD5(res, buf, strlen(buf));

    strcpy(res+16, KEY3); /* first 16 bytes are filled, append our key.. */

    n = strlen(res+16) + 16;

    DoMD5(res2, res, n);

    alpha = downsample(res2);



    for (p = host; *p; p++)

        if (*p == '.')

            if (isalpha(*(p + 1)))

                break;



    if (*p)

    {

        unsigned int len;

        p++;

        ircsprintf(result, "%s-%X.", hidden_host, alpha);

        len = strlen(result) + strlen(p);

        if (len <= HOSTLEN)

            strcat(result, p);

        else

            strcat(result, p + (len - HOSTLEN));

    } else

        ircsprintf(result,  "%s-%X", hidden_host, alpha);



    return result;

}


Freak 25 Nisan 2007 07:44

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
h.h

Kod:

/************************************************************************
 *  Unreal Internet Relay Chat Daemon, include/h.h
 *  Copyright (C) 1992 Darren Reed
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 1, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 *  $Id: h.h,v 1.1.1.1.2.18 2005/03/13 21:02:44 syzop Exp $
 */

/*
 * "h.h". - Headers file.
 *
 * Most of the externs and prototypes thrown in here to 'cleanup' things.
 * -avalon
 */
#include "setup.h"
#ifndef NO_FDLIST
#include "fdlist.h"
#endif
extern MODVAR char *extraflags;
extern MODVAR int tainted;
/* for the new s_err.c */
extern char *getreply(int);
#define rpl_str(x) getreply(x)
#define err_str(x) getreply(x)
extern MODVAR Member *freemember;
extern MODVAR Membership *freemembership;
extern MODVAR MembershipL *freemembershipL;
extern MODVAR TS nextconnect, nextdnscheck, nextping;
extern MODVAR aClient *client, me, *local[];
extern MODVAR aChannel *channel;
extern MODVAR struct stats *ircstp;
extern MODVAR int bootopt;
extern MODVAR time_t TSoffset;
/* Prototype added to force errors -- Barubary */
extern TS check_pings(TS now);
extern TS TS2ts(char *s);
extern MODVAR time_t timeofday;
/* newconf */
#define get_sendq(x) ((x)->class ? (x)->class->sendq : MAXSENDQLENGTH)
/* get_recvq is only called in send.c for local connections */
#define get_recvq(x) ((x)->class->recvq ? (x)->class->recvq : CLIENT_FLOOD)

#define CMD_FUNC(x) int (x) (aClient *cptr, aClient *sptr, int parc, char *parv[])

#ifndef NO_FDLIST
extern MODVAR float currentrate;
extern MODVAR float currentrate2;        /* outgoing */
extern MODVAR float highest_rate;
extern MODVAR float highest_rate2;
extern MODVAR int  lifesux;
extern MODVAR int  LRV;
extern MODVAR time_t  LCF;
extern MODVAR int  currlife;
extern MODVAR int  HTMLOCK;
extern MODVAR int  noisy_htm;
extern MODVAR long lastsendK, lastrecvK;
#endif

/*
 * Configuration linked lists
*/
extern MODVAR ConfigItem_me        *conf_me;
extern MODVAR ConfigItem_class    *conf_class;
extern MODVAR ConfigItem_class        *default_class;
extern MODVAR ConfigItem_admin    *conf_admin;
extern MODVAR ConfigItem_admin        *conf_admin_tail;
extern MODVAR ConfigItem_drpass    *conf_drpass;
extern MODVAR ConfigItem_ulines    *conf_ulines;
extern MODVAR ConfigItem_tld        *conf_tld;
extern MODVAR ConfigItem_oper        *conf_oper;
extern MODVAR ConfigItem_listen    *conf_listen;
extern MODVAR ConfigItem_allow        *conf_allow;
extern MODVAR ConfigItem_except    *conf_except;
extern MODVAR ConfigItem_vhost        *conf_vhost;
extern MODVAR ConfigItem_link        *conf_link;
extern MODVAR ConfigItem_ban        *conf_ban;
extern MODVAR ConfigItem_badword    *conf_badword_channel;
extern MODVAR ConfigItem_badword      *conf_badword_message;
extern MODVAR ConfigItem_badword    *conf_badword_quit;
extern MODVAR ConfigItem_deny_dcc    *conf_deny_dcc;
extern MODVAR ConfigItem_deny_channel  *conf_deny_channel;
extern MODVAR ConfigItem_deny_link    *conf_deny_link;
extern MODVAR ConfigItem_allow_channel *conf_allow_channel;
extern MODVAR ConfigItem_allow_dcc *conf_allow_dcc;
extern MODVAR ConfigItem_deny_version    *conf_deny_version;
extern MODVAR ConfigItem_log        *conf_log;
extern MODVAR ConfigItem_alias        *conf_alias;
extern MODVAR ConfigItem_include    *conf_include;
extern MODVAR ConfigItem_help        *conf_help;
extern MODVAR ConfigItem_offchans    *conf_offchans;
extern int        completed_connection(aClient *);
extern void clear_unknown();
extern EVENT(tkl_check_expire);
extern EVENT(e_unload_module_delayed);
#ifdef THROTTLING
extern EVENT(e_clean_out_throttling_buckets);
#endif

extern void  module_loadall(int module_load);
extern long set_usermode(char *umode);
extern char *get_modestr(long umodes);
extern void tkl_stats(aClient *cptr, int type, char *para);
extern void                    config_error(char *format, ...) __attribute__((format(printf,1,2)));
extern MODVAR int config_verbose;
extern void config_progress(char *format, ...) __attribute__((format(printf,1,2)));
extern void      ipport_seperate(char *string, char **ip, char **port);
ConfigItem_class    *Find_class(char *name);
ConfigItem_deny_dcc    *Find_deny_dcc(char *name);
ConfigItem_oper        *Find_oper(char *name);
ConfigItem_listen    *Find_listen(char *ipmask, int port);
ConfigItem_ulines    *Find_uline(char *host);
ConfigItem_except    *Find_except(aClient *, char *host, short type);
ConfigItem_tld        *Find_tld(aClient *cptr, char *host);
ConfigItem_link        *Find_link(char *username, char *hostname, char *ip, char *servername);
ConfigItem_ban        *Find_ban(aClient *, char *host, short type);
ConfigItem_ban        *Find_banEx(aClient *,char *host, short type, short type2);
ConfigItem_vhost    *Find_vhost(char *name);
ConfigItem_deny_channel *Find_channel_allowed(char *name);
ConfigItem_alias    *Find_alias(char *name);
ConfigItem_help    *Find_Help(char *command);
int            AllowClient(aClient *cptr, struct hostent *hp, char *sockhost, char *username);
int parse_netmask(const char *text, struct irc_netmask *netmask);
int match_ip(struct IN_ADDR addr, char *uhost, char *mask, struct irc_netmask *netmask);
ConfigItem_ban  *Find_ban_ip(aClient *sptr);
extern MODVAR struct tm motd_tm, smotd_tm;
extern MODVAR Link    *Servers;
void add_ListItem(ListStruct *, ListStruct **);
ListStruct *del_ListItem(ListStruct *, ListStruct **);
/* Remmed out for win32 compatibility.. as stated of 467leaf win32 port.. */
extern aClient *find_match_server(char *mask);
extern MODVAR LoopStruct loop;
extern int del_banid(aChannel *chptr, char *banid);
extern int del_exbanid(aChannel *chptr, char *banid);
#ifdef SHOWCONNECTINFO


#define BREPORT_DO_DNS    "NOTICE AUTH :[++] Yuzukchat.Net IRC Sunucusuna Bağlanıyorsunuz, Hoşsohbetler!\r\n"
#define BREPORT_FIN_DNS    "NOTICE AUTH :[++]
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
BREPORT_FIN_DNSC "NOTICE AUTH :[++]
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
BREPORT_FAIL_DNS "NOTICE AUTH :[++]
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
BREPORT_DO_ID    "NOTICE AUTH :[++]
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
BREPORT_FIN_ID    "NOTICE AUTH :[++]
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
BREPORT_FAIL_ID    "NOTICE AUTH :[++]
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
extern MODVAR char REPORT_DO_DNS[256], REPORT_FIN_DNS[256], REPORT_FIN_DNSC[256],
    REPORT_FAIL_DNS[256], REPORT_DO_ID[256], REPORT_FIN_ID[256],
    REPORT_FAIL_ID[256];

extern MODVAR int R_do_dns, R_fin_dns, R_fin_dnsc, R_fail_dns,
    R_do_id, R_fin_id, R_fail_id;

#endif
extern inline aCommand *find_Command(char *cmd, short token, int flags);
extern aCommand *find_Command_simple(char *cmd);
extern aChannel *find_channel(char *, aChannel *);
extern Membership *find_membership_link(Membership *lp, aChannel *ptr);
extern Member *find_member_link(Member *, aClient *);
extern void remove_user_from_channel(aClient *, aChannel *);
extern char *base64enc(long);
extern long base64dec(char *);
extern void add_server_to_table(aClient *);
extern void remove_server_from_table(aClient *);
extern void iNAH_host(aClient *sptr, char *host);
extern void set_snomask(aClient *sptr, char *snomask);
extern char *get_sno_str(aClient *sptr);
/* for services */
extern void del_invite(aClient *, aChannel *);
extern int add_silence(aClient *, char *, int);
extern int del_silence(aClient *, char *);
extern void send_user_joins(aClient *, aClient *);
extern void clean_channelname(char *);
extern int do_nick_name(char *);
extern int do_remote_nick_name(char *);
extern int can_send(aClient *, aChannel *, char *, int);
extern long get_access(aClient *, aChannel *);
extern int is_chan_op(aClient *, aChannel *);
extern int has_voice(aClient *, aChannel *);
extern int is_chanowner(aClient *, aChannel *);
extern Ban *is_banned(aClient *, aChannel *, int);
extern int parse_help(aClient *, char *, char *);

extern void ircd_log(int, char *, ...) __attribute__((format(printf,2,3)));
extern aClient *find_client(char *, aClient *);
extern aClient *find_name(char *, aClient *);
extern aClient *find_nickserv(char *, aClient *);
extern aClient *find_person(char *, aClient *);
extern aClient *find_server(char *, aClient *);
extern aClient *find_server_quickx(char *, aClient *);
extern aClient *find_service(char *, aClient *);
#define find_server_quick(x) find_server_quickx(x, NULL)
extern char *find_or_add(char *);
extern int attach_conf(aClient *, aConfItem *);
extern void inittoken();
extern void reset_help();

extern MODVAR char *debugmode, *configfile, *sbrk0;
extern char *getfield(char *);
extern void get_sockhost(aClient *, char *);
#ifndef _WIN32
extern char *strerror(int);
#else
extern MODFUNC char *sock_strerror(int);
#endif
extern int dgets(int, char *, int);
extern char *inetntoa(char *);

#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)
/* #ifndef _WIN32 XXX why was this?? -- Syzop. */
extern int snprintf (char *str, size_t count, const char *fmt, ...);
extern int vsnprintf (char *str, size_t count, const char *fmt, va_list arg);
/* #endif */
#endif

#ifdef _WIN32
extern MODVAR int dbufalloc, dbufblocks, debuglevel;
#else
extern int dbufalloc, dbufblocks, debuglevel, errno, h_errno;
#endif
extern MODVAR short LastSlot; /* last used index in local client array */
extern MODVAR int OpenFiles;  /* number of files currently open */
extern MODVAR int debuglevel, portnum, debugtty, maxusersperchannel;
extern MODVAR int readcalls, udpfd, resfd;
extern aClient *add_connection(aClient *, int);
extern int add_listener(aConfItem *);
extern void add_local_domain(char *, int);
extern int check_client(aClient *, char *);
extern int check_server(aClient *, struct hostent *, aConfItem *,
    aConfItem *, int);
extern int check_server_init(aClient *);
extern void close_connection(aClient *);
extern void close_listeners();
extern int connect_server(ConfigItem_link *, aClient *, struct hostent *);
extern void get_my_name(aClient *, char *, int);
extern int get_sockerr(aClient *);
extern int inetport(aClient *, char *, int);
extern void init_sys();
extern void init_modef();

#ifdef NO_FDLIST
extern int read_message(time_t);
#else
extern int read_message(time_t, fdlist *);
#endif

extern void report_error(char *, aClient *);
extern void set_non_blocking(int, aClient *);
extern int setup_ping();

extern void start_auth(aClient *);
extern void read_authports(aClient *);
extern void send_authports(aClient *);


extern void restart(char *);
extern void send_channel_modes(aClient *, aChannel *);
extern void server_reboot(char *);
extern void terminate(), write_pidfile();
extern void *MyMallocEx(size_t size);
extern int advanced_check(char *userhost, int ipstat);
extern int send_queued(aClient *);
/* i know this is naughty but :P --stskeeps */
extern void send_channel_modes_sjoin(aClient *cptr, aChannel *chptr);
extern void send_channel_modes_sjoin3(aClient *cptr, aChannel *chptr);
extern void sendto_locfailops(char *pattern, ...) __attribute__((format(printf,1,2)));
extern void sendto_connectnotice(char *nick, anUser *user, aClient *sptr, int disconnect, char *comment);
extern void sendto_serv_butone_nickcmd(aClient *one, aClient *sptr, char *nick, int hopcount,
long lastnick, char *username, char *realhost, char *server, long servicestamp, char *info, char *umodes,
char *virthost);
extern void    sendto_message_one(aClient *to, aClient *from, char *sender,
    char *cmd, char *nick, char *msg);
#define PREFIX_ALL        0
#define PREFIX_HALFOP    0x1
#define PREFIX_VOICE    0x2
#define PREFIX_OP    0x4
#define PREFIX_ADMIN    0x08
#define PREFIX_OWNER    0x10
extern void sendto_channelprefix_butone(aClient *one, aClient *from, aChannel *chptr,
    int prefix, char *pattern, ...) __attribute__((format(printf,5,6)));
extern void sendto_channelprefix_butone_tok(aClient *one, aClient *from, aChannel *chptr,
    int prefix, char *cmd, char *tok, char *nick, char *text, char do_send_check);
extern void sendto_channel_butone(aClient *, aClient *, aChannel *,
                                  char *, ...) __attribute__((format(printf,4,5)));
extern void sendto_channel_butserv_butone(aChannel *chptr, aClient *from, aClient *one,
                                          char *pattern, ...) __attribute__((format(printf,4,5)));
extern void sendto_serv_butone(aClient *, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_serv_butone_quit(aClient *, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_serv_butone_sjoin(aClient *, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_serv_sjoin(aClient *, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_common_channels(aClient *, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_channel_butserv_butone(aChannel *chptr, aClient *from, aClient *one, char *pattern, ...) __attribute__((format(printf,4,5)));
extern void sendto_match_servs(aChannel *, aClient *, char *, ...) __attribute__((format(printf,3,4)));
extern void sendto_match_butone(aClient *, aClient *, char *, int,
    char *pattern, ...) __attribute__((format(printf,5,6)));
extern void sendto_all_butone(aClient *, aClient *, char *, ...) __attribute__((format(printf,3,4)));
extern void sendto_ops(char *, ...) __attribute__((format(printf,1,2)));
extern void sendto_ops_butone(aClient *, aClient *, char *, ...) __attribute__((format(printf,3,4)));
extern void sendto_ops_butme(aClient *, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_prefix_one(aClient *, aClient *, const char *, ...) __attribute__((format(printf,3,4)));
extern void sendto_failops_whoare_opers(char *, ...) __attribute__((format(printf,1,2)));
extern void sendto_failops(char *, ...) __attribute__((format(printf,1,2)));
extern void sendto_opers(char *, ...) __attribute__((format(printf,1,2)));
extern void sendto_umode(int, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_umode_raw(int, char *, ...) __attribute__((format(printf,2,3)));
extern void sendto_snomask(int snomask, char *pattern, ...) __attribute__((format(printf,2,3)));
extern void sendto_snomask_global(int snomask, char *pattern, ...) __attribute__((format(printf,2,3)));
extern void sendto_snomask_normal(int snomask, char *pattern, ...) __attribute__((format(printf,2,3)));
extern void sendto_snomask_normal_global(int snomask, char *pattern, ...) __attribute__((format(printf,2,3)));
extern void sendnotice(aClient *to, char *pattern, ...) __attribute__((format(printf,2,3)));
extern MODVAR int writecalls, writeb[];
extern int deliver_it(aClient *, char *, int);
extern int  check_for_chan_flood(aClient *cptr, aClient *sptr, aChannel *chptr);
extern int  check_for_target_limit(aClient *sptr, void *target, const char *name);
extern char *stripbadwords_message(char *str, int *);
extern char *stripbadwords_channel(char *str, int *);
extern char *stripbadwords_quit(char *str, int *);
extern char *stripbadwords(char *, ConfigItem_badword *, int *);
extern unsigned char *StripColors(unsigned char *);
extern const char *StripControlCodes(unsigned char *text);
extern char *canonize(char *buffer);
extern int webtv_parse(aClient *sptr, char *string);
extern ConfigItem_deny_dcc *dcc_isforbidden(aClient *sptr, char *filename);
extern ConfigItem_deny_dcc *dcc_isdiscouraged(aClient *sptr, char *filename);
extern int check_registered(aClient *);
extern int check_registered_user(aClient *);
extern char *get_client_name(aClient *, int);
extern char *get_client_host(aClient *);
extern char *myctime(time_t), *date(time_t);
extern int exit_client(aClient *, aClient *, aClient *, char *);
extern void initstats(), tstats(aClient *, char *);
extern char *check_string(char *);
extern char *make_nick_user_host(char *, char *, char *);
extern char *make_user_host(char *, char *);
extern int parse(aClient *, char *, char *);
extern int do_numeric(int, aClient *, aClient *, int, char **);
extern int hunt_server(aClient *, aClient *, char *, int, int, char **);
extern int hunt_server_token(aClient *, aClient *, char *, char *, char *, int, int, char **);
extern int hunt_server_token_quiet(aClient *, aClient *, char *, char *, char *, int, int, char **);
extern aClient *next_client(aClient *, char *);
extern int m_names(aClient *, aClient *, int, char **);
extern int m_server_estab(aClient *);
extern void umode_init(void);
extern long umode_get(char, int, int (*)(aClient *, int));
#define UMODE_GLOBAL 1
#define UMODE_LOCAL 0
#define umode_lget(x) umode_get(x, 0, 0);
#define umode_gget(x) umode_get(x, 1, 0);
extern int umode_allow_all(aClient *sptr, int what);
extern int umode_allow_opers(aClient *sptr, int what);
extern int  umode_delete(char ch, long val);
extern void send_umode(aClient *, aClient *, long, long, char *);
extern void send_umode_out(aClient *, aClient *, long);

extern void free_client(aClient *);
extern void free_link(Link *);
extern void free_ban(Ban *);
extern void free_class(aClass *);
extern void free_user(anUser *, aClient *);
extern int find_str_match_link(Link *, char *);
extern void free_str_list(Link *);
extern Link *make_link();
extern Ban *make_ban();
extern anUser *make_user(aClient *);
extern aClass *make_class();
extern aServer *make_server();
extern aClient *make_client(aClient *, aClient *);
extern Link *find_user_link(Link *, aClient *);
extern Member *find_channel_link(Member *, aChannel *);
extern char *pretty_mask(char *);
extern void add_client_to_list(aClient *);
extern void checklist();
extern void remove_client_from_list(aClient *);
extern void initlists();
extern struct hostent *get_res(char *);
extern struct hostent *gethost_byaddr(char *, Link *);
extern struct hostent *gethost_byname(char *, Link *);
extern void flush_cache();
extern int init_resolver(int);
extern time_t timeout_query_list(time_t);
extern time_t expire_cache(time_t);
extern void del_queries(char *);

extern void clear_channel_hash_table();
extern void clear_client_hash_table();
extern void clear_watch_hash_table();
extern int add_to_client_hash_table(char *, aClient *);
extern int del_from_client_hash_table(char *, aClient *);
extern int add_to_channel_hash_table(char *, aChannel *);
extern int del_from_channel_hash_table(char *, aChannel *);
extern int add_to_watch_hash_table(char *, aClient *);
extern int del_from_watch_hash_table(char *, aClient *);
extern int hash_check_watch(aClient *, int);
extern int hash_del_watch_list(aClient *);
extern void count_watch_memory(int *, u_long *);
extern aWatch *hash_get_watch(char *);
extern aChannel *hash_get_chan_bucket(unsigned int);
extern aClient *hash_find_client(char *, aClient *);
extern aClient *hash_find_nickserver(char *, aClient *);
extern aClient *hash_find_server(char *, aClient *);
extern char *find_by_aln(char *);
extern char *convert2aln(int);
extern int convertfromaln(char *);
extern char *find_server_aln(char *);
extern time_t atime(char *xtime);


/* Mode externs
*/
extern MODVAR long UMODE_INVISIBLE; /*  0x0001    makes user invisible */
extern MODVAR long UMODE_OPER;      /*  0x0002    Operator */
extern MODVAR long UMODE_WALLOP;    /*  0x0004    send wallops to them */
extern MODVAR long UMODE_FAILOP;    /*  0x0008    Shows some global messages */
extern MODVAR long UMODE_HELPOP;    /*  0x0010    Help system operator */
extern MODVAR long UMODE_REGNICK;  /*  0x0020    Nick set by services as registered */
extern MODVAR long UMODE_SADMIN;    /*  0x0040    Services Admin */
extern MODVAR long UMODE_ADMIN;    /*  0x0080    Admin */
extern MODVAR long UMODE_SERVNOTICE;/* 0x0100    server notices such as kill */
extern MODVAR long UMODE_LOCOP;    /* 0x0200    Local operator -- SRB */
extern MODVAR long UMODE_RGSTRONLY; /* 0x0400  Only reg nick message */
extern MODVAR long UMODE_WEBTV;    /* 0x0800  WebTV Client */
extern MODVAR long UMODE_SERVICES;  /* 0x4000    services */
extern MODVAR long UMODE_HIDE;        /* 0x8000    Hide from Nukes */
extern MODVAR long UMODE_NETADMIN;  /* 0x10000    Network Admin */
extern MODVAR long UMODE_COADMIN;  /* 0x80000    Co Admin */
extern MODVAR long UMODE_WHOIS;    /* 0x100000    gets notice on /whois */
extern MODVAR long UMODE_KIX;      /* 0x200000    usermode +q */
extern MODVAR long UMODE_BOT;      /* 0x400000    User is a bot */
extern MODVAR long UMODE_SECURE;    /*    0x800000    User is a secure connect */
extern MODVAR long UMODE_VICTIM;    /* 0x8000000    Intentional Victim */
extern MODVAR long UMODE_DEAF;      /* 0x10000000      Deaf */
extern MODVAR long UMODE_HIDEOPER;  /* 0x20000000    Hide oper mode */
extern MODVAR long UMODE_SETHOST;  /* 0x40000000    used sethost */
extern MODVAR long UMODE_STRIPBADWORDS; /* 0x80000000    */
extern MODVAR long UMODE_HIDEWHOIS; /* hides channels in /whois */
extern MODVAR long UMODE_NOCTCP;    /* blocks all ctcp (except dcc and action) */
extern MODVAR long AllUmodes, SendUmodes;

extern MODVAR long SNO_KILLS;
extern MODVAR long SNO_CLIENT;
extern MODVAR long SNO_FLOOD;
extern MODVAR long SNO_FCLIENT;
extern MODVAR long SNO_JUNK;
extern MODVAR long SNO_VHOST;
extern MODVAR long SNO_EYES;
extern MODVAR long SNO_TKL;
extern MODVAR long SNO_NICKCHANGE;
extern MODVAR long SNO_FNICKCHANGE;
extern MODVAR long SNO_QLINE;
extern MODVAR long SNO_SNOTICE;
extern MODVAR long SNO_SPAMF;
extern MODVAR long SNO_OPER;

#ifdef EXTCMODE
/* Extended chanmodes... */
extern MODVAR Cmode_t EXTMODE_NONOTICE;
#ifdef STRIPBADWORDS
extern MODVAR Cmode_t EXTMODE_STRIPBADWORDS;
#endif
extern MODVAR Cmode_t EXTMODE_JOINTHROTTLE;
#endif

#ifndef HAVE_STRLCPY
size_t strlcpy(char *dst, const char *src, size_t size);
#endif
#ifndef HAVE_STRLCAT
size_t strlcat(char *dst, const char *src, size_t size);
#endif
#ifndef HAVE_STRLNCAT
size_t strlncat(char *dst, const char *src, size_t size, size_t n);
#endif


extern int dopacket(aClient *, char *, int);

extern void debug(int, char *, ...);
#if defined(DEBUGMODE)
extern void send_usage(aClient *, char *);
extern void send_listinfo(aClient *, char *);
extern void count_memory(aClient *, char *);
extern int checkprotoflags(aClient *, int, char *, int);
#endif

#ifdef INET6
extern char *inetntop(int af, const void *in, char *local_dummy,
    size_t the_size);
#endif

/*
 * socket.c
*/

char    *Inet_si2p(struct SOCKADDR_IN *sin);
char    *Inet_si2pB(struct SOCKADDR_IN *sin, char *buf, int sz);
char    *Inet_ia2p(struct IN_ADDR *ia);
char    *Inet_ia2pNB(struct IN_ADDR *ia, int compressed);

/*
 * CommandHash -Stskeeps
*/
extern MODVAR aCommand *CommandHash[256];
extern MODVAR aCommand *TokenHash[256];
extern void    init_CommandHash(void);
extern aCommand    *add_Command_backend(char *cmd, int (*func)(), unsigned char parameters, unsigned char token, int flags);
extern void    add_Command(char *cmd, char *token, int (*func)(), unsigned char parameters);
extern void    add_Command_to_list(aCommand *item, aCommand **list);
extern aCommand *del_Command_from_list(aCommand *item, aCommand **list);
extern int    del_Command(char *cmd, char *token, int (*func)());
extern void    add_CommandX(char *cmd, char *token, int (*func)(), unsigned char parameters, int flags);

/* CRULE */
char *crule_parse(char *);
int crule_test(char *);
char *crule_errstring(int);
int crule_eval(char *);
void crule_free(char **);

/* Add clients to LocalClients array */
extern void add_local_client(aClient* cptr);
/* Remove clients from LocalClients array */
extern void remove_local_client(aClient* cptr);
/*
 * Close all local socket connections, invalidate client fd's
 * WIN32 cleanup winsock lib
 */
extern void close_connections(void);
extern void flush_connections(aClient *cptr);

extern int b64_encode(unsigned char const *src, size_t srclength, char *target, size_t targsize);
extern int b64_decode(char const *src, unsigned char *target, size_t targsize);

extern int        Auth_FindType(char *type);
extern anAuthStruct    *Auth_ConvertConf2AuthStruct(ConfigEntry *ce);
extern void        Auth_DeleteAuthStruct(anAuthStruct *as);
extern int        Auth_Check(aClient *cptr, anAuthStruct *as, char *para);
extern char          *Auth_Make(short type, char *para);
extern int          Auth_CheckError(ConfigEntry *ce);

extern long xbase64dec(char *b64);
extern aClient *find_server_b64_or_real(char *name);
extern aClient *find_server_by_base64(char *b64);
extern int is_chanownprotop(aClient *cptr, aChannel *chptr);
extern int is_skochanop(aClient *cptr, aChannel *chptr);
extern char *make_virthost(char *curr, char *new, int mode);
extern int  channel_canjoin(aClient *sptr, char *name);
extern char *collapse(char *pattern);
extern void send_list(aClient *cptr, int numsend);
extern int  find_tkline_match_zap(aClient *cptr);
extern int  find_shun(aClient *cptr);
extern aTKline *find_qline(aClient *cptr, char *nick, int *ishold);
extern void tkl_synch(aClient *sptr);
extern void dcc_sync(aClient *sptr);
extern void report_flines(aClient *sptr);
extern void report_network(aClient *sptr);
extern void report_dynconf(aClient *sptr);
extern void count_memory(aClient *cptr, char *nick);
extern void list_scache(aClient *sptr);
extern void ns_stats(aClient *cptr);
extern char *oflagstr(long oflag);
extern int rehash(aClient *cptr, aClient *sptr, int sig);
extern int _match(char *mask, char *name);
extern void outofmemory(void);
extern unsigned long our_crc32(const unsigned char *s, unsigned int len);
extern int add_listener2(ConfigItem_listen *conf);
extern void link_cleanup(ConfigItem_link *link_ptr);
extern void      listen_cleanup();
extern int  numeric_collides(long numeric);
extern u_long cres_mem(aClient *sptr, char *nick);
extern void      flag_add(char ch);
extern void      flag_del(char ch);
extern void init_dynconf(void);
extern char *pretty_time_val(long);
extern int        init_conf(char *filename, int rehash);
extern void      validate_configuration(void);
extern void      run_configuration(void);
extern void rehash_motdrules();
extern aMotd *read_file(char *filename, aMotd **list);
extern aMotd *read_file_ex(char *filename, aMotd **list, struct tm *);
extern CMD_FUNC(m_server_remote);
extern void send_proto(aClient *, ConfigItem_link *);
extern char *xbase64enc(long i);
extern void unload_all_modules(void);
extern void flush_fdlist_connections(fdlist * listp);
extern int set_blocking(int fd);
extern void set_sock_opts(int fd, aClient *cptr);
extern void iCstrip(char *line);
extern time_t rfc2time(char *s);
extern char *rfctime(time_t t, char *buf);
extern void *MyMallocEx(size_t size);
#ifdef USE_SSL
extern MODFUNC char  *ssl_get_cipher(SSL *ssl);
#endif
extern long config_checkval(char *value, unsigned short flags);
extern void config_status(char *format, ...) __attribute__((format(printf,1,2)));
extern void init_random();
extern u_char getrandom8();
extern u_int16_t getrandom16();
extern u_int32_t getrandom32();
extern MODVAR char trouble_info[1024];
#define EVENT_DRUGS BASE_VERSION
extern void rejoin_doparts(aClient *sptr, char did_parts[]);
extern void rejoin_dojoinandmode(aClient *sptr, char did_parts[]);
extern void ident_failed(aClient *cptr);

extern MODVAR char extchmstr[4][64];
extern MODVAR char extbanstr[EXTBANTABLESZ+1];
#ifdef EXTCMODE
extern int extcmode_default_requirechop(aClient *, aChannel *, char *, int, int);
extern int extcmode_default_requirehalfop(aClient *, aChannel *, char *, int, int);
extern Cmode_t extcmode_get(Cmode *);
extern void extcmode_init(void);
extern CmodeParam *extcmode_get_struct(CmodeParam *, char);
extern void make_extcmodestr();
extern CmodeParam *extcmode_duplicate_paramlist(CmodeParam *);
extern void extcmode_free_paramlist(CmodeParam *);
#endif
extern int do_chanflood(ChanFloodProt *, int);
extern void do_chanflood_action(aChannel *, int, char *);
extern char *channel_modef_string(ChanFloodProt *);
extern void chmode_str(struct ChMode, char *, char *);
extern char *get_cptr_status(aClient *);
extern char *get_snostr(long);
#ifdef _WIN32
extern void InitDebug(void);
extern int InitwIRCD(int argc, char **);
extern void SocketLoop(void *);
#endif
#ifdef STATIC_LINKING
extern int l_commands_Init(ModuleInfo *);
extern int l_commands_Test(ModuleInfo *);
extern int l_commands_Load(int);
#endif
extern void sendto_chmodemucrap(aClient *, aChannel *, char *);
extern void verify_opercount(aClient *, char *);
extern int place_host_ban(aClient *sptr, int action, char *reason, long time);
extern int valid_host(char *host);
extern int count_oper_sessions(char *);
extern char *unreal_mktemp(char *dir, char *suffix);
extern char *unreal_getpathname(char *filepath, char *path);
extern char *unreal_getfilename(char *path);
extern int unreal_copyfile(char *src, char *dest);
extern int unreal_copyfileex(char *src, char *dest, int tryhardlink);
extern time_t unreal_getfilemodtime(char *filename);
extern void unreal_setfilemodtime(char *filename, time_t mtime);
extern void DeleteTempModules(void);
extern MODVAR Extban *extbaninfo;
extern Extban *findmod_by_bantype(char c);
extern Extban *ExtbanAdd(Module *reserved, ExtbanInfo req);
extern void ExtbanDel(Extban *);
extern void extban_init(void);
extern char *trim_str(char *str, int len);
extern MODVAR char *ban_realhost, *ban_virthost, *ban_ip;
extern char *unreal_checkregex(char *s, int fastsupport, int check_broadness);
extern int banact_stringtoval(char *s);
extern char *banact_valtostring(int val);
extern int banact_chartoval(char c);
extern char banact_valtochar(int val);
extern int spamfilter_gettargets(char *s, aClient *sptr);
extern char *spamfilter_target_inttostring(int v);
extern Spamfilter *unreal_buildspamfilter(char *s);
extern int dospamfilter(aClient *sptr, char *str_in, int type, char *target);
extern char *our_strcasestr(char *haystack, char *needle);
extern int spamfilter_getconftargets(char *s);
extern void remove_oper_snomasks(aClient *sptr);
extern char *spamfilter_inttostring_long(int v);
extern int check_channelmask(aClient *, aClient *, char *);
extern aChannel *get_channel(aClient *cptr, char *chname, int flag);
extern MODVAR char backupbuf[];
extern void add_invite(aClient *, aChannel *);
extern void channel_modes(aClient *, char *, char *, aChannel *);
extern MODVAR char modebuf[BUFSIZE], parabuf[BUFSIZE];
extern int op_can_override(aClient *sptr);
extern aClient *find_chasing(aClient *sptr, char *user, int *chasing);
extern MODVAR long opermode;
extern void add_user_to_channel(aChannel *chptr, aClient *who, int flags);
extern int add_banid(aClient *, aChannel *, char *);
extern int add_exbanid(aClient *cptr, aChannel *chptr, char *banid);
extern void sub1_from_channel(aChannel *);
extern MODVAR aCtab cFlagTab[];
extern char *unreal_encodespace(char *s);
extern char *unreal_decodespace(char *s);
extern MODVAR Link *helpign;
extern MODVAR aMotd *rules;
extern MODVAR fdlist default_fdlist, busycli_fdlist, serv_fdlist, oper_fdlist;
extern void DCCdeny_add(char *filename, char *reason, int type, int type2);
extern void DCCdeny_del(ConfigItem_deny_dcc *deny);
extern void dcc_wipe_services(void);
extern void reread_motdsandrules();
extern MODVAR int SVSNOOP;
extern int callbacks_check(void);
extern void callbacks_switchover(void);
extern int efunctions_check(void);
extern void efunctions_switchover(void);
extern char *encode_ip(u_char *);
extern char *decode_ip(char *);
extern void sendto_fconnectnotice(char *nick, anUser *user, aClient *sptr, int disconnect, char *comment);
extern void sendto_one_nickcmd(aClient *cptr, aClient *sptr, char *umodes);
extern int register_user(aClient *cptr, aClient *sptr, char *nick, char *username, char *umode, char *virthost, char *ip);
extern int on_dccallow_list(aClient *to, aClient *from);
extern int add_dccallow(aClient *sptr, aClient *optr);
extern int del_dccallow(aClient *sptr, aClient *optr);
extern void delete_linkblock(ConfigItem_link *link_ptr);
extern void delete_classblock(ConfigItem_class *class_ptr);
extern void del_async_connects(void);
extern int find_spamfilter_user(aClient *sptr);
extern void make_extbanstr(void);
extern void isupport_init(void);
extern int do_cmd(aClient *cptr, aClient *sptr, char *cmd, int parc, char *parv[]);
extern void create_snomask(aClient *sptr, anUser *user, char *snomask);
extern MODVAR char *me_hash;
extern MODVAR int dontspread;
/* Efuncs */
extern MODVAR int (*do_join)(aClient *, aClient *, int, char **);
extern MODVAR void (*join_channel)(aChannel *chptr, aClient *cptr, aClient *sptr, int flags);
extern MODVAR int (*can_join)(aClient *cptr, aClient *sptr, aChannel *chptr, char *key, char *link, char *parv[]);
extern MODVAR void (*do_mode)(aChannel *chptr, aClient *cptr, aClient *sptr, int parc, char *parv[], time_t sendts, int samode);
extern MODVAR void (*set_mode)(aChannel *chptr, aClient *cptr, int parc, char *parv[], u_int *pcount,
    char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], int bounce);
extern MODVAR int (*m_umode)(aClient *, aClient *, int, char **);
/* /Efuncs */
extern MODVAR aMotd *opermotd, *svsmotd, *motd, *botmotd, *smotd;
extern MODVAR int max_connection_count;
extern char tkl_typetochar(int type);
extern int add_listmode(Ban **list, aClient *cptr, aChannel *chptr, char *banid);
extern int del_listmode(Ban **list, aChannel *chptr, char *banid);
extern int Halfop_mode(long mode);
extern void chanfloodtimer_add(aChannel *chptr, char mflag, long mbit, time_t when);
extern void chanfloodtimer_del(aChannel *chptr, char mflag, long mbit);
extern char *clean_ban_mask(char *, int, aClient *);
extern void chanfloodtimer_stopchantimers(aChannel *chptr);
extern int find_invex(aChannel *chptr, aClient *sptr);
extern void DoMD5(unsigned char *mdout, unsigned char *src, unsigned long n);
#ifdef JOINTHROTTLE
aJFlood *cmodej_addentry(aClient *cptr, aChannel *chptr);
void cmodej_delentry(aJFlood *e);
void cmodej_deluserentries(aClient *cptr);
void cmodej_delchannelentries(aChannel *chptr);
#endif
extern void charsys_reset(void);
extern void charsys_addmultibyterange(char s1, char e1, char s2, char e2);
extern void charsys_addallowed(char *s);
extern void charsys_reset(void);
extern MODVAR char langsinuse[4096];


Freak 25 Nisan 2007 07:45

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
ircop.c

Kod:

#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



#define RPL_IRCOPS                337

#define RPL_ENDOFIRCOPS                338

#define MSG_IRCOPS                "IRCOPS"

#define TOK_IRCOPS                "IO"

#define MyMod                        ModIrcops->handle

#define IsAway(x)                (x)->user->away

#define DelCommand(x)                if (x) CommandDel(x); x = NULL



static Command                        *AddCommand(char *msg, char *token, int (*func)());

DLLFUNC int                        m_ircops(aClient *cptr, aClient *sptr, int parc, char *parv[]);



ModuleInfo                        *ModIrcops;

Command                                *CmdIrcops;



#ifndef DYNAMIC_LINKING

ModuleHeader m_ircops_Header

#else

#define m_ircops_Header Mod_Header

ModuleHeader Mod_Header

#endif

  = {

        "ircops",

        "$Id: m_ircops.c,v 2.3 2003/12/01 11:46:08 Salazar Exp $",

        "command /ircops",

        "3.2-b8-1",

        NULL

    };





/* The purpose of these ifdefs, are that we can "static" link the ircd if we

 * want to

*/



/* This is called on module init, before Server Ready */

#ifdef DYNAMIC_LINKING

DLLFUNC int        Mod_Init(ModuleInfo *modinfo)

#else

int    m_ircops_Init(ModuleInfo *modinfo)

#endif

{

        ModIrcops        = modinfo;

        CmdIrcops        = AddCommand(MSG_IRCOPS, TOK_IRCOPS, m_ircops);



        if (!CmdIrcops)

                return MOD_FAILED;



        return MOD_SUCCESS;

}



/* Is first run when server is 100% ready */

#ifdef DYNAMIC_LINKING

DLLFUNC int        Mod_Load(int module_load)

#else

int    m_ircops_Load(int module_load)

#endif

{

        return MOD_SUCCESS;

}





/* Called when module is unloaded */

#ifdef DYNAMIC_LINKING

DLLFUNC int        Mod_Unload(int module_unload)

#else

int        m_ircops_Unload(int module_unload)

#endif

{

        DelCommand(CmdIrcops);



        return MOD_SUCCESS;

}



typedef struct

{

        unsigned long        *umode;

        char                *text;

} oflag;



static oflag otypes[] =

{

        { &UMODE_NETADMIN,                "Network Administrator"        },

        { &UMODE_ADMIN,                        "Services Administrator"        },

        { &UMODE_SADMIN,                "Services Administrator"        },

        { &UMODE_COADMIN,                "IRC Administrator"                },

        { &UMODE_OPER,                        "IRC Operator"                },

        { &UMODE_LOCOP,                        "IRC Operator"               

},

        { NULL,                                NULL                                }

};



static char *find_otype(unsigned long umodes)

{

        unsigned int i;



        for (i = 0; otypes[i].umode; i++)

                if (*otypes[i].umode & umodes)

                        return otypes[i].text;



        return "an unknown operator";

}



static Command *AddCommand(char *msg, char *token, int (*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(MyMod, msg, token, func, MAXPARA, 0);



#ifndef _WIN32

        if (ModuleGetError(MyMod) != MODERR_NOERROR || !cmd)

#else

        if (!cmd)

#endif

        {

#ifndef _WIN32

                config_error("Error adding command %s: %s", msg,

                        ModuleGetErrorStr(MyMod));

#else

                config_error("Error adding command %s", msg);

#endif

                return NULL; /* just to be sure */

        }



        return cmd;

}





int m_ircops(aClient *cptr, aClient *sptr, int parc, char *parv[])

{

        aClient                *acptr;

        char                buf[BUFSIZE];

        int                opers = 0, admins = 0, globs = 0, aways = 0;



      sendto_one(sptr, ":%s 339 %s :+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+",

            me.name, sptr->name);

      sendto_one(sptr, ":%s 339 %s :            \2Online Oper's List\2          ",

            me.name, sptr->name);

      sendto_one(sptr, ":%s 339 %s : 
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
me.name, sptr->name);

      sendto_one(sptr, ":%s 339 %s :+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+",

            me.name, sptr->name);

        for (acptr = client; acptr; acptr = acptr->next)

        {

                /* List only real IRC Operators */

                if (IsULine(acptr) || !IsPerson(acptr) || !IsAnOper(acptr))

                        continue;

                /* Don't list +H users */

                if (!IsAnOper(sptr) && IsHideOper(acptr))

                        continue;



                sendto_one(sptr, ":%s %d %s : \2Nick\2 : %-13s  \2Yetkisi\2 : %-20s " "%s",

                        me.name, RPL_IRCOPS, sptr->name,

                        acptr->name,

                        find_otype(acptr->umodes),

                        (IsAway(acptr) ? "- Mesgul" : IsHelpOp(acptr) ? "" : ""));



                if (IsAway(acptr))

                        aways++;

                else if (IsSkoAdmin(acptr))

                        admins++;

                else

                        opers++;



        }



        globs = opers + admins + aways;



        sprintf(buf,

                "    %d Operator%s Bagli - %d Admin%s , %d IRCop%s ve %d Mesgul",

                globs, (globs) > 1 ? "" : "", admins, admins > 1 ? "" : "",

                opers, opers > 1 ? "" : "", aways);

      sendto_one(sptr, ":%s 339 %s :+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=+",

                me.name, sptr->name);



        sendto_one(sptr, ":%s %d %s :%s", me.name, RPL_IRCOPS, sptr->name, buf);

        sendto_one(sptr, ":%s %d %s :Oper's List End", me.name, RPL_ENDOFIRCOPS, sptr->name);



        return 0;

}


Freak 25 Nisan 2007 07:46

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
m_oper.c

Kod:

/*
 *  Unreal Internet Relay Chat Daemon, src/modules/m_oper.c
 *  (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team
 *  Moved to modules by Fish (Justin Hammond)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 1, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#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"
#include "proto.h"
#include "inet.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif

DLLFUNC int m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]);


/* Place includes here */
#define MSG_OPER        "OPER"  /* OPER */
#define TOK_OPER        ";"    /* 59 */

typedef struct oper_oflag_ {
    unsigned long oflag;
    long* umode;    /* you just HAD to make them variables */
    char** host;
    char* announce;
} oper_oflag_t;

static oper_oflag_t oper_oflags[10];

static void init_operflags()
{
    oper_oflags[0].oflag = OFLAG_NETADMIN;
    oper_oflags[0].umode = &UMODE_NETADMIN;
    oper_oflags[0].host = &netadmin_host;
    oper_oflags[0].announce = "is now a network administrator (N)";
    oper_oflags[1].oflag = OFLAG_SADMIN;
    oper_oflags[1].umode = &UMODE_SADMIN;
    oper_oflags[1].host = &sadmin_host;
    oper_oflags[1].announce = "is now a services administrator (a)";
    oper_oflags[2].oflag = OFLAG_ADMIN;
    oper_oflags[2].umode = &UMODE_ADMIN;
    oper_oflags[2].host = &admin_host;
    oper_oflags[2].announce = "is now a server admin (A)";
    oper_oflags[3].oflag = OFLAG_COADMIN;
    oper_oflags[3].umode = &UMODE_COADMIN;
    oper_oflags[3].host = &coadmin_host;
    oper_oflags[3].announce = "is now a IRC administrator (C)";
    oper_oflags[4].oflag = OFLAG_ISGLOBAL;
    oper_oflags[4].umode = &UMODE_OPER;
    oper_oflags[4].host = &oper_host;
    oper_oflags[4].announce = "is now an operator (O)";
    oper_oflags[5].oflag = OFLAG_HELPOP;
    oper_oflags[5].umode = &UMODE_HELPOP;
    oper_oflags[5].host = NULL;
    oper_oflags[5].announce = NULL;
    oper_oflags[6].oflag= OFLAG_GLOBOP;
    oper_oflags[6].umode = &UMODE_FAILOP;
    oper_oflags[6].host = NULL;
    oper_oflags[6].announce = NULL;
    oper_oflags[7].oflag = OFLAG_WALLOP;
    oper_oflags[7].umode = &UMODE_WALLOP;
    oper_oflags[7].host = NULL;
    oper_oflags[7].announce = NULL;
    oper_oflags[8].oflag = OFLAG_WHOIS;
    oper_oflags[8].umode = &UMODE_WHOIS;
    oper_oflags[8].host = NULL;
    oper_oflags[8].announce = NULL;
    oper_oflags[9].oflag = 0;
    oper_oflags[9].umode = NULL;
    oper_oflags[9].host = NULL;
    oper_oflags[9].announce = NULL;
}
   

ModuleHeader MOD_HEADER(m_oper)
  = {
    "oper",    /* Name of module */
    "$Id: m_oper.c,v 1.1.6.6 2005/03/13 21:03:14 syzop Exp $", /* Version */
    "command /oper", /* Short description of module */
    "3.2-b8-1",
    NULL
    };

/* This is called on module init, before Server Ready */
DLLFUNC int MOD_INIT(m_oper)(ModuleInfo *modinfo)
{
    /*
    * We call our add_Command crap here
    */
    add_Command(MSG_OPER, TOK_OPER, m_oper, MAXPARA);
    MARK_AS_OFFICIAL_MODULE(modinfo);
    return MOD_SUCCESS;
}

/* Is first run when server is 100% ready */
DLLFUNC int MOD_LOAD(m_oper)(int module_load)
{
    init_operflags();
    return MOD_SUCCESS;
}

/* Called when module is unloaded */
DLLFUNC int MOD_UNLOAD(m_oper)(int module_unload)
{
    if (del_Command(MSG_OPER, TOK_OPER, m_oper) < 0)
    {
        sendto_realops("Failed to delete commands when unloading %s",
                MOD_HEADER(m_oper).name);
    }
    return MOD_SUCCESS;
}


/*
** m_oper
**    parv[0] = sender prefix
**    parv[1] = oper name
**    parv[2] = oper password
*/

DLLFUNC int  m_oper(aClient *cptr, aClient *sptr, int parc, char *parv[]) {
    ConfigItem_oper *aconf;
    ConfigItem_oper_from *oper_from;
    char *name, *password, nuhhost[NICKLEN+USERLEN+HOSTLEN+6], nuhhost2[NICKLEN+USERLEN+HOSTLEN+6];
    char* host = 0;
    int i = 0, j = 0;
    char* announce = 0;

    if (!MyClient(sptr))
        return 0;

    if (parc < 3) {
        sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS),
            me.name, parv[0], "OPER");
        return 0;
    }

    if (SVSNOOP) {
        sendto_one(sptr,
            ":%s %s %s :*** This server is in NOOP mode, you cannot /oper",
            me.name, IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", sptr->name);
        return 0;
    }

    if (IsAnOper(sptr)) {
        sendto_one(sptr, rpl_str(RPL_YOUREOPER),
            me.name, parv[0]);
        return 0;
    }

    name = parv[1];
    password = parv[2];

    if (!(aconf = Find_oper(name))) {
        sendto_one(sptr, err_str(ERR_NOOPERHOST), me.name, parv[0]);
        sendto_realops
            ("Failed OPER attempt by %s (%s@%s) [unknown oper]",
            parv[0], sptr->user->username, sptr->sockhost);
        ircd_log(LOG_OPER, "OPER UNKNOWNOPER (%s) by (%s!%s@%s)", name, parv[0],
            sptr->user->username, sptr->sockhost);
        sptr->since += 7;
        return 0;
    }
    strlcpy(nuhhost, make_user_host(sptr->user->username, sptr->user->realhost), sizeof(nuhhost));
    strlcpy(nuhhost2, make_user_host(sptr->user->username, Inet_ia2p(&sptr->ip)), sizeof(nuhhost2));
    for (oper_from = (ConfigItem_oper_from *) aconf->from;
        oper_from; oper_from = (ConfigItem_oper_from *) oper_from->next)
        if (!match(oper_from->name, nuhhost) || !match(oper_from->name, nuhhost2))
            break;
    if (!oper_from)    {
        sendto_one(sptr, err_str(ERR_NOOPERHOST), me.name, parv[0]);
        sendto_realops
            ("Failed OPER attempt by %s (%s@%s) [host doesnt match]",
            parv[0], sptr->user->username, sptr->sockhost);
        ircd_log(LOG_OPER, "OPER NOHOSTMATCH (%s) by (%s!%s@%s)", name, parv[0],
            sptr->user->username, sptr->sockhost);
        sptr->since += 7;
        return 0;
    }

    i = Auth_Check(cptr, aconf->auth, password);
    if (i > 1)
    {
        int  old = (sptr->umodes & ALL_UMODES);

        if (aconf->maxlogins && (count_oper_sessions(aconf->name) >= aconf->maxlogins))
        {
            sendto_one(sptr, err_str(ERR_NOOPERHOST), me.name, parv[0]);
            sendto_one(sptr, ":%s NOTICE %s :Your maximum number of concurrent oper logins has been reached (%d)",
                me.name, sptr->name, aconf->maxlogins);
            sendto_realops
                ("Failed OPER attempt by %s (%s@%s) [maxlogins reached]",
                parv[0], sptr->user->username, sptr->sockhost);
            ircd_log(LOG_OPER, "OPER TOOMANYLOGINS (%s) by (%s!%s@%s)", name, parv[0],
                sptr->user->username, sptr->sockhost);
            sptr->since += 4;
            return 0;
        }

        if (sptr->user->operlogin)
            MyFree(sptr->user->operlogin);
        sptr->user->operlogin = strdup(aconf->name);

        /* Put in the right class */
        if (sptr->class)
            sptr->class->clients--;

        sptr->class = aconf->class;
        sptr->class->clients++;
        sptr->oflag = 0;
        if (aconf->swhois) {
            if (sptr->user->swhois)
                MyFree(sptr->user->swhois);
            sptr->user->swhois = MyMalloc(strlen(aconf->swhois) +1);
            strcpy(sptr->user->swhois, aconf->swhois);
            sendto_serv_butone_token(cptr, me.name,
                MSG_SWHOIS, TOK_SWHOIS, "%s :%s", sptr->name, aconf->swhois);
        }

/* new oper code */

        if (aconf->modes)
            sptr->umodes |= aconf->modes;
        else
            sptr->umodes |= OPER_MODES;

/* handle oflags that trigger umodes */
       
        while(oper_oflags[j].umode) {
            if(aconf->oflags & oper_oflags[j].oflag) {    /* we match this oflag */
                if (!announce && oper_oflags[j].announce) { /* we haven't matched an oper_type yet */
                    host = *oper_oflags[j].host;    /* set the iNAH host */
                    announce = oper_oflags[j].announce; /* set the announcement */
                }
                sptr->umodes |=
                    *oper_oflags[j].umode; /* add the umode for this oflag */
            }
            j++;
        }

        sptr->oflag = aconf->oflags;
        if ((aconf->oflags & OFLAG_HIDE) && iNAH && !BadPtr(host)) {
            char *c;
            char *vhost = host;

            if ((c = strchr(host, '@')))
            {
                vhost =    c+1;
                strncpy(sptr->user->username, host, c-host);
                sptr->user->username[c-host] = 0;
                sendto_serv_butone_token(NULL, sptr->name, MSG_SETIDENT,
                            TOK_SETIDENT, "%s",
                            sptr->user->username);
            }
            iNAH_host(sptr, vhost);
            SetHidden(sptr);
        } else
        if (IsHidden(sptr) && !sptr->user->virthost) {
            /* +x has just been set by modes-on-oper and iNAH is off */
            sptr->user->virthost = (char *)make_virthost(sptr->user->realhost,
                                                        sptr->user->virthost, 1);
        }

        if (!IsOper(sptr))
        {
            sptr->umodes |= UMODE_LOCOP;
            if ((aconf->oflags & OFLAG_HIDE) && iNAH && !BadPtr(locop_host)) {
                iNAH_host(sptr, locop_host);
                SetHidden(sptr);
            }
            sendto_ops("%s (%s@%s) is now a local operator (o)",
                parv[0], sptr->user->username, GetHost(sptr));
        }


        if (announce != NULL)
            sendto_snomask_global(SNO_OPER,
                "%s (%s@%s) [%s] %s",
                parv[0], sptr->user->username, GetHost(sptr),
                parv[1], announce);
        if (aconf->snomask)
            set_snomask(sptr, aconf->snomask);
        else
            set_snomask(sptr, OPER_SNOMASK);
        if (sptr->user->snomask)
        {
            sptr->user->snomask |= SNO_SNOTICE; /* set +s if needed */
            sptr->umodes |= UMODE_SERVNOTICE;
        }
        /* This is for users who have both 'admin' and 'coadmin' in their conf */
        if (IsCoAdmin(sptr) && IsAdmin(sptr))
        {
            sptr->umodes &= ~UMODE_COADMIN;
            sptr->oflag &= ~OFLAG_COADMIN;
        }
        send_umode_out(cptr, sptr, old);
        sendto_one(sptr, rpl_str(RPL_SNOMASK),
            me.name, parv[0], get_sno_str(sptr));

#ifndef NO_FDLIST
        addto_fdlist(sptr->slot, &oper_fdlist);
#endif
        RunHook2(HOOKTYPE_LOCAL_OPER, sptr, 1);
        sendto_one(sptr, rpl_str(RPL_YOUREOPER), me.name, parv[0]);
        if (IsInvisible(sptr) && !(old & UMODE_INVISIBLE))
            IRCstats.invisible++;
        if (IsOper(sptr) && !IsHideOper(sptr))
            IRCstats.operators++;

        if (SHOWOPERMOTD == 1)
            do_cmd(cptr, sptr, "OPERMOTD", parc, parv);
        if (!BadPtr(OPER_AUTO_JOIN_CHANS)
            && strcmp(OPER_AUTO_JOIN_CHANS, "0"))
        {
            char *chans[3] = {
                sptr->name,
                OPER_AUTO_JOIN_CHANS,
                NULL
            };
            do_cmd(cptr, sptr, "JOIN", 3, chans);
        }
        ircd_log(LOG_OPER, "OPER (%s) by (%s!%s@%s)", name, parv[0], sptr->user->username,
            sptr->sockhost);

    }
    if (i == -1)
    {
        sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name, parv[0]);
        if (FAILOPER_WARN)
            sendto_one(sptr,
                ":%s %s %s :*** Your attempt has been logged.", me.name,
                IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", sptr->name);
        ircd_log(LOG_OPER, "OPER FAILEDAUTH (%s) by (%s!%s@%s)", name, parv[0],
            sptr->user->username, sptr->sockhost);
        sendto_realops
            ("Failed OPER attempt by %s (%s@%s) using UID %s [FAILEDAUTH]",
            parv[0], sptr->user->username, sptr->sockhost, name);
        sendto_serv_butone(&me,
            ":%s GLOBOPS :Failed OPER attempt by %s (%s@%s) using UID %s [---]",
            me.name, parv[0], sptr->user->username, sptr->sockhost,
            name);
        sptr->since += 7;
    }
    /* Belay that order, number One. (-2) */
    return 0;
}


Freak 25 Nisan 2007 07:47

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
m_quit.c
Kod:

/*
 *  Unreal Internet Relay Chat Daemon, src/modules/m_quit.c
 *  (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team
 *  Moved to modules by Fish (Justin Hammond)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 1, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#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"
#include "proto.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif

DLLFUNC int m_quit(aClient *cptr, aClient *sptr, int parc, char *parv[]);

/* Place includes here */
#define MSG_QUIT        "QUIT"  /* QUIT */
#define TOK_QUIT        ","    /* 44 */

ModuleHeader MOD_HEADER(m_quit)
  = {
    "quit",    /* Name of module */
    "$Id: m_quit.c,v 1.1.6.6 2005/03/13 21:03:15 syzop Exp $", /* Version */
    "command /quit", /* Short description of module */
    "3.2-b8-1",
    NULL
    };

/* This is called on module init, before Server Ready */
DLLFUNC int MOD_INIT(m_quit)(ModuleInfo *modinfo)
{
    /*
    * We call our add_Command crap here
    */
    add_CommandX(MSG_QUIT, TOK_QUIT, m_quit, 1, M_UNREGISTERED|M_USER|M_VIRUS);
    MARK_AS_OFFICIAL_MODULE(modinfo);
    return MOD_SUCCESS;
}

/* Is first run when server is 100% ready */
DLLFUNC int MOD_LOAD(m_quit)(int module_load)
{
    return MOD_SUCCESS;
}

/* Called when module is unloaded */
DLLFUNC int MOD_UNLOAD(m_quit)(int module_unload)
{
    if (del_Command(MSG_QUIT, TOK_QUIT, m_quit) < 0)
    {
        sendto_realops("Failed to delete commands when unloading %s",
                MOD_HEADER(m_quit).name);
    }
    return MOD_SUCCESS;
}

/*
** m_quit
**    parv[0] = sender prefix
**    parv[1] = comment
*/
DLLFUNC int  m_quit(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
        int n;
        char *s = comment;
        Hook *tmphook;
char *cmesajlistesi[]= {
        "1Türkiye'nin bir numaralı sohbet sunucusu 2[ 5
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
Irc.Yuzukchat.Net 2]",
        "1Sohbetin doğru adresi 2[5
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
tuşla gösterecek olsaydınız ? 2[5
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
sohbet etmek için 2[5
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
sizi götürmek istediği yer 2[5
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
Irc.Yuzukchat.Net 2]",
        "1Forumumuza hiç göz attınızmı ? 2[5
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
int k;
      k = rand()%(sizeof(cmesajlistesi)/sizeof(*cmesajlistesi));
      return exit_client(cptr, sptr, sptr, cmesajlistesi[k]);

            if (!IsAnOper (sptr))
        if (STATIC_QUIT)
            return exit_client(cptr, sptr, sptr, STATIC_QUIT);
        if (IsVirus(sptr))
            return exit_client(cptr, sptr, sptr, "Client exited");

        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
        n = dospamfilter(sptr, ocomment, SPAMF_QUIT, NULL);
        if (n == FLUSH_BUFFER)
            return n;
        if (n < 0)
            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) */

                for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_QUIT]; tmphook; tmphook = tmphook->next)
        {
                    ocomment = (*(tmphook->func.pcharfunc))(sptr, ocomment);
                        if (!ocomment)
            {           
                ocomment = parv[0];
                                break;
                        }
                }

        strncpy(s, ocomment, TOPICLEN - (s - comment));
        comment[TOPICLEN] = '\0';
        return exit_client(cptr, sptr, sptr, comment);
    }
    else
    {
        return exit_client(cptr, sptr, sptr, ocomment);
    }
}


Freak 25 Nisan 2007 07:48

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
m_tkl.c
Kod:

/*
 * Module skeleton, by Carsten V. Munk 2001 <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>
 * May be used, modified, or changed by anyone, no license applies.
 * You may relicense this, to any license
 */
#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"
#include "proto.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif

DLLFUNC int m_gline(aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int m_tempshun(aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int m_gzline(aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int m_tkline(aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int m_tzline(aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int m_tkl_line(aClient *cptr, aClient *sptr, int parc, char *parv[], char* type);
DLLFUNC int m_spamfilter(aClient *cptr, aClient *sptr, int parc, char *parv[]);

/* Place includes here */
#define MSG_GLINE "GLINE"
#define TOK_GLINE "}"
#define MSG_SHUN "SHUN"
#define TOK_SHUN "BL"
#define MSG_GZLINE "GZLINE"
#define MSG_KLINE "KLINE"
#define MSG_ZLINE "ZLINE"
#define MSG_SPAMFILTER    "SPAMFILTER"
#define TOK_NONE ""
#define MSG_TEMPSHUN "TEMPSHUN"
#define TOK_TEMPSHUN "Tz"

ModuleHeader MOD_HEADER(m_tkl)
  = {
    "tkl",    /* Name of module */
    "$Id: m_tkl.c,v 1.1.6.6 2005/03/13 21:03:19 syzop Exp $", /* Version */
    "commands /gline etc", /* Short description of module */
    "3.2-b8-1",
    NULL
    };

/* This is called on module init, before Server Ready */
DLLFUNC int MOD_INIT(m_tkl)(ModuleInfo *modinfo)
{
    MARK_AS_OFFICIAL_MODULE(modinfo);
    /*
    * We call our add_Command crap here
    */
    add_Command(MSG_GLINE, TOK_GLINE, m_gline, 3);
    add_Command(MSG_SHUN, TOK_SHUN, m_shun, 3);
    add_Command(MSG_TEMPSHUN, TOK_TEMPSHUN, m_tempshun, 2);
    add_Command(MSG_ZLINE, TOK_NONE, m_tzline, 3);
    add_Command(MSG_KLINE, TOK_NONE, m_tkline, 3);
    add_Command(MSG_GZLINE, TOK_NONE, m_gzline, 3);
    add_Command(MSG_SPAMFILTER, TOK_NONE, m_spamfilter, 6);
    MARK_AS_OFFICIAL_MODULE(modinfo);
    return MOD_SUCCESS;
}

/* Is first run when server is 100% ready */
DLLFUNC int MOD_LOAD(m_tkl)(int module_load)
{
    return MOD_SUCCESS;
}

/* Called when module is unloaded */
DLLFUNC int MOD_UNLOAD(m_tkl)(int module_unload)
{
    if ((del_Command(MSG_GLINE, TOK_GLINE, m_gline) < 0) ||
        (del_Command(MSG_SHUN, TOK_SHUN, m_shun) < 0 ) ||
        (del_Command(MSG_ZLINE, TOK_NONE, m_tzline) < 0) ||
        (del_Command(MSG_GZLINE, TOK_NONE, m_gzline) < 0) ||
        (del_Command(MSG_KLINE, TOK_NONE, m_tkline) < 0) ||
        (del_Command(MSG_SPAMFILTER, TOK_NONE, m_spamfilter) < 0) ||
        (del_Command(MSG_TEMPSHUN, TOK_TEMPSHUN, m_tempshun) < 0))

    {
        sendto_realops("Failed to delete commands when unloading %s",
                MOD_HEADER(m_tkl).name);
    }
    return MOD_SUCCESS;
}

/*
** m_gline (oper function - /TKL takes care of distribution)
** /gline [+|-]u@h mask time :reason
**
** parv[0] = sender
** parv[1] = [+|-]u@h mask
** parv[2] = for how long
** parv[3] = reason
*/

DLLFUNC int m_gline(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    if (IsServer(sptr))
        return 0;

    if (!OPCanTKL(sptr) || !IsOper(sptr))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
        sptr->name);
        return 0;
    }

    if (parc == 1)
    {
        tkl_stats(sptr, TKL_KILL|TKL_GLOBAL, NULL);
        tkl_stats(sptr, TKL_ZAP|TKL_GLOBAL, NULL);
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'g');
        return 0;
    }

    return m_tkl_line(cptr, sptr, parc, parv, "G");

}

DLLFUNC int m_gzline(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    if (IsServer(sptr))
        return 0;

    if (!OPCanGZL(sptr) || !IsOper(sptr))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
        sptr->name);
        return 0;
    }

    if (parc == 1)
    {
        tkl_stats(sptr, TKL_GLOBAL|TKL_KILL, NULL);
        tkl_stats(sptr, TKL_GLOBAL|TKL_ZAP, NULL);
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'g');
        return 0;
    }

    return m_tkl_line(cptr, sptr, parc, parv, "Z");

}

DLLFUNC int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    if (IsServer(sptr))
        return 0;

    if (!OPCanTKL(sptr) || !IsOper(sptr))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
        sptr->name);
        return 0;
    }

    if (parc == 1)
    {
        tkl_stats(sptr, TKL_GLOBAL|TKL_SHUN, NULL);
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 's');
        return 0;
    }

    return m_tkl_line(cptr, sptr, parc, parv, "s");

}

DLLFUNC int m_tempshun(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
aClient *acptr;
char *comment = ((parc > 2) && !BadPtr(parv[2])) ? parv[2] : "<1Serverdan uzaklastirildiniz. 2[ 5Reklam, Küfür, Clone, Trojan 2] 1Gibi eylemler yasaktir. Servera girisinizde 2[ 3/Rules 2) 4Komutunu Kullanip Server Kurallarini Okuyunuz!>";
char *name;
int remove = 0;

    if (MyClient(sptr) && (!OPCanTKL(sptr) || !IsOper(sptr)))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
        sptr->name);
        return 0;
    }
    if ((parc < 2) || BadPtr(parv[1]))
    {
        sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, sptr->name, "TEMPSHUN");
        return 0;
    }
    if (parv[1][0] == '+')
        name = parv[1]+1;
    else if (parv[1][0] == '-')
    {
        name = parv[1]+1;
        remove = 1;
    } else
        name = parv[1];

    acptr = find_person(name, NULL);
    if (!acptr)
    {
        sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, sptr->name, name);
        return 0;
    }
    if (!MyClient(acptr))
    {
        sendto_one(acptr->from, ":%s %s %s :%s",
            sptr->name, IsToken(acptr->from) ? TOK_TEMPSHUN : MSG_TEMPSHUN,
            parv[1], comment);
    } else {
        char buf[1024];
        if (!remove)
        {
            if (IsShunned(acptr))
            {
                sendnotice(sptr, "User '%s' already shunned", acptr->name);
            } else if (IsAnOper(acptr))
            {
                sendnotice(sptr, "You cannot tempshun '%s' because (s)he is an oper", acptr->name);
            } else
            {
                SetShunned(acptr);
                ircsprintf(buf, "Temporary shun added on user %s (%s@%s) by %s [%s]",
                    acptr->name, acptr->user->username, acptr->user->realhost,
                    sptr->name, comment);
                sendto_snomask(SNO_TKL, "%s", buf);
                sendto_serv_butone_token(NULL, me.name, MSG_SENDSNO, TOK_SENDSNO, "G :%s", buf);
            }
        } else {
            if (!IsShunned(acptr))
            {
                sendnotice(sptr, "User '%s' is not shunned", acptr->name);
            } else {
                ClearShunned(acptr);
                ircsprintf(buf, "Removed temporary shun on user %s (%s@%s) by %s",
                    acptr->name, acptr->user->username, acptr->user->realhost,
                    sptr->name);
                sendto_snomask(SNO_TKL, "%s", buf);
                sendto_serv_butone_token(NULL, me.name, MSG_SENDSNO, TOK_SENDSNO, "G :%s", buf);
            }
        }
    }
    return 0;
}

DLLFUNC int m_tkline(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    if (IsServer(sptr))
        return 0;

    if (!OPCanKline(sptr) || !IsAnOper(sptr))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
        sptr->name);
        return 0;
    }

    if (parc == 1)
    {
        /* Emulate /stats k */
        ConfigItem_ban *bans;
        ConfigItem_except *excepts;
        char type[2];
          for (bans = conf_ban; bans; bans = (ConfigItem_ban *)bans->next)
        {
            if (bans->flag.type == CONF_BAN_USER)
            {
                if (bans->flag.type2 == CONF_BAN_TYPE_CONF)
                    type[0] = 'K';
                type[1] = '\0';
                sendto_one(sptr, rpl_str(RPL_STATSKLINE),
                    me.name, sptr->name, type, bans->mask, bans->reason
                    ? bans->reason : "<1Serverdan uzaklastirildiniz. 2[ 5Reklam, Küfür, Clone, Trojan 2] 1Gibi eylemler yasaktir. Servera girisinizde 2[ 3/Rules 2) 4Komutunu Kullanip Server Kurallarini Okuyunuz!>");
            }
            else if (bans->flag.type == CONF_BAN_IP)
            {
                if (bans->flag.type2 == CONF_BAN_TYPE_CONF)
                    type[0] = 'Z';
                else if (bans->flag.type2 == CONF_BAN_TYPE_TEMPORARY)
                    type[0] = 'z';
                type[1] = '\0';
                sendto_one(sptr, rpl_str(RPL_STATSKLINE),
                    me.name, sptr->name, type, bans->mask, bans->reason
                    ? bans->reason : "<1Serverdan uzaklastirildiniz. 2[ 5Reklam, Küfür, Clone, Trojan 2] 1Gibi eylemler yasaktir. Servera girisinizde 2[ 3/Rules 2) 4Komutunu Kullanip Server Kurallarini Okuyunuz!>");
            }
        }       
        tkl_stats(sptr, TKL_KILL, NULL);
        tkl_stats(sptr, TKL_ZAP, NULL);
        for (excepts = conf_except; excepts; excepts = (ConfigItem_except *)excepts->next)
        {
            if (excepts->flag.type == 1)
                sendto_one(sptr, rpl_str(RPL_STATSKLINE),
                    me.name, sptr->name, "E", excepts->mask, "");
        }
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'k');
        return 0;
    }
    if (!OPCanUnKline(sptr) && *parv[1] == '-')
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);
        return 0;
    }
    return m_tkl_line(cptr, sptr, parc, parv, "k");

}

DLLFUNC int m_tzline(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    if (IsServer(sptr))
        return 0;

    if (!OPCanZline(sptr) || !IsAnOper(sptr))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
        sptr->name);
        return 0;
    }

    if (parc == 1)
    {
        /* Emulate /stats k */
        ConfigItem_ban *bans;
        ConfigItem_except *excepts;
        char type[2];
          for (bans = conf_ban; bans; bans = (ConfigItem_ban *)bans->next)
        {
            if (bans->flag.type == CONF_BAN_USER)
            {
                if (bans->flag.type2 == CONF_BAN_TYPE_CONF)
                    type[0] = 'K';
                type[1] = '\0';
                sendto_one(sptr, rpl_str(RPL_STATSKLINE),
                    me.name, sptr->name, type, bans->mask, bans->reason
                    ? bans->reason : "<1Serverdan uzaklastirildiniz. 2[ 5Reklam, Küfür, Clone, Trojan 2] 1Gibi eylemler yasaktir. Servera girisinizde 2[ 3/Rules 2) 4Komutunu Kullanip Server Kurallarini Okuyunuz!>");
            }
            else if (bans->flag.type == CONF_BAN_IP)
            {
                if (bans->flag.type2 == CONF_BAN_TYPE_CONF)
                    type[0] = 'Z';
                else if (bans->flag.type2 == CONF_BAN_TYPE_TEMPORARY)
                    type[0] = 'z';
                type[1] = '\0';
                sendto_one(sptr, rpl_str(RPL_STATSKLINE),
                    me.name, sptr->name, type, bans->mask, bans->reason
                    ? bans->reason : "<1Serverdan uzaklastirildiniz. 2[ 5Reklam, Küfür, Clone, Trojan 2] 1Gibi eylemler yasaktir. Servera girisinizde 2[ 3/Rules 2) 4Komutunu Kullanip Server Kurallarini Okuyunuz!>");
            }
        }       
        tkl_stats(sptr, TKL_KILL, NULL);
        tkl_stats(sptr, TKL_ZAP, NULL);
        for (excepts = conf_except; excepts; excepts = (ConfigItem_except *)excepts->next)
        {
            if (excepts->flag.type == 1)
                sendto_one(sptr, rpl_str(RPL_STATSKLINE),
                    me.name, sptr->name, "E", excepts->mask, "");
        }
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'k');
        return 0;
    }

    return m_tkl_line(cptr, sptr, parc, parv, "z");

}



/*
** m_tkl_line (oper function - /TKL takes care of distribution)
** /gline [+|-]u@h mask time :reason
**
** parv[0] = sender
** parv[1] = [+|-]u@h mask
** parv[2] = for how long
** parv[3] = reason
*/

DLLFUNC int  m_tkl_line(aClient *cptr, aClient *sptr, int parc, char *parv[], char* type) {
    TS  secs;
    int  whattodo = 0;    /* 0 = add  1 = del */
    int  i;
    aClient *acptr = NULL;
    char *mask = NULL;
    char mo[1024], mo2[1024];
    char *p, *usermask, *hostmask;
    char *tkllayer[9] = {
        me.name,    /*0  server.name */
        NULL,        /*1  +|- */
        NULL,        /*2  G  */
        NULL,        /*3  user */
        NULL,        /*4  host */
        NULL,        /*5  setby */
        "0",        /*6  expire_at */
        NULL,        /*7  set_at */
        "4Serverdan Uzaklastirildiniz. 2[ 5Reklam, Küfür, Clone, Trojan 2] 4Gibi Eylemler Yasaktir. Servera Girisinizde 2( 3/Rules 2) 4Komutunu Kullanip Server Kurallarini Okuyunuz!"    /*8  reason */
    };
    struct tm *t;

    if (parc == 1)
    {
        tkl_stats(sptr, 0, NULL);
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'g');
        return 0;
    }

    mask = parv[1];
    if (*mask == '-')
    {
        whattodo = 1;
        mask++;
    }
    else if (*mask == '+')
    {
        whattodo = 0;
        mask++;
    }

    if (strchr(mask, '!'))
    {
        sendto_one(sptr, ":%s NOTICE %s :[error] Cannot have ! in masks.", me.name,
            sptr->name);
        return 0;
    }
    if (strchr(mask, ' '))
        return 0;

    /* Check if its a hostmask and legal .. */
    p = strchr(mask, '@');
    if (p) {
        usermask = strtok(mask, "@");
        hostmask = strtok(NULL, "");
        if (BadPtr(hostmask)) {
            if (BadPtr(usermask)) {
                return 0;
            }
            hostmask = usermask;
            usermask = "*";
        }
       
        if (((*type == 'z') || (*type == 'Z')) && !whattodo)
        {
            /* It's a (G)ZLINE, make sure the user isn't specyfing a HOST.
            * Just a warning for now, but perhaps in 3.2.4 we should make this an error.
            */
            for (p=hostmask; *p; p++)
                if (isalpha(*p))
                {
                    sendnotice(sptr, "WARNING: (g)zlines should be placed on user@IPMASK, not user@hostmask "
                                    "(this is because (g)zlines are processed BEFORE a dns lookup is done)");
                    break;
                }
        }
        /* set 'p' right for later... */
        p = hostmask-1;
    }
    else
    {
        /* It's seemingly a nick .. let's see if we can find the user */
        if ((acptr = find_person(mask, NULL)))
        {
            usermask = "*";
            if ((*type == 'z') || (*type == 'Z'))
            {
                /* Fill in IP */
                hostmask = GetIP(acptr);
                if (!hostmask)
                {
                    sendnotice(sptr, "Could not get IP for user '%s'", acptr->name);
                    return 0;
                }
            } else {
                /* Fill in host */
                hostmask = acptr->user->realhost;
            }
            p = hostmask - 1;
        }
        else
        {
            sendto_one(sptr, rpl_str(ERR_NOSUCHNICK), me.name, sptr->name, mask);
            return 0;
        }
    }   
    if (!whattodo)
    {
        char c;
        p++;
        i = 0;
        while (*p)
        {
            if (*p != '*' && *p != '.' && *p != '?')
                i++;
            p++;
        }
        if (i < 4)
        {
            sendto_one(sptr,
                ":%s NOTICE %s :*** [error] Too broad mask",
                me.name, sptr->name);
            return 0;
        }
        c = tolower(*type);
        if (c == 'k' || c == 'z' || *type == 'G' || *type == 's')
        {
            struct irc_netmask tmp;
            if ((tmp.type = parse_netmask(hostmask, &tmp)) != HM_HOST)
            {
                if (tmp.bits < 16)
                {
                    sendto_one(sptr,
                        ":%s NOTICE %s :*** [error] Too broad mask",
                        me.name, sptr->name);
                    return 0;
                }
            }
        }
    }

    tkl_check_expire(NULL);

    secs = 0;

    if (whattodo == 0 && (parc > 3))
    {
        secs = atime(parv[2]);
        if (secs < 0)
        {
            sendto_one(sptr,
                ":%s NOTICE %s :*** [error] The time you specified is out of range!",
                me.name, sptr->name);
            return 0;
        }
    }
    tkllayer[1] = whattodo == 0 ? "+" : "-";
    tkllayer[2] = type;
    tkllayer[3] = usermask;
    tkllayer[4] = hostmask;
    tkllayer[5] =
        make_nick_user_host(sptr->name, sptr->user->username, GetHost(sptr));
    if (whattodo == 0)
    {
        if (secs == 0)
        {
            if (DEFAULT_BANTIME && (parc <= 3))
                ircsprintf(mo, "%li", DEFAULT_BANTIME + TStime());
            else
                ircsprintf(mo, "%li", secs); /* "0" */
        }
        else
            ircsprintf(mo, "%li", secs + TStime());
        ircsprintf(mo2, "%li", TStime());
        tkllayer[6] = mo;
        tkllayer[7] = mo2;
        if (parc > 3) {
            tkllayer[8] = parv[3];
        } else if (parc > 2) {
            tkllayer[8] = parv[2];
        }
        /* Blerghhh... */
        i = atol(mo);
        t = gmtime((TS *)&i);
        if (!t)
        {
            sendto_one(sptr,
                ":%s NOTICE %s :*** [error] The time you specified is out of range",
                me.name, sptr->name);
            return 0;
        }
       
        /* call the tkl layer .. */
        m_tkl(&me, &me, 9, tkllayer);
    }
    else
    {
        /* call the tkl layer .. */
        m_tkl(&me, &me, 6, tkllayer);

    }
    return 0;
}

int spamfilter_usage(aClient *sptr)
{
    sendnotice(sptr, "Use: /spamfilter [add|del|remove|+|-] [type] [action] [tkltime] [tklreason] [regex]");
    sendnotice(sptr, "See '/helpop ?spamfilter' for more information.");
    return 0;
}

DLLFUNC int m_spamfilter(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
int  whattodo = 0;    /* 0 = add  1 = del */
char mo[32], mo2[32];
char *p;
char *tkllayer[11] = {
    me.name,    /*  0 server.name */
    NULL,        /*  1 +|- */
    "F",        /*  2 F  */
    NULL,        /*  3 usermask (targets) */
    NULL,        /*  4 hostmask (action) */
    NULL,        /*  5 setby */
    "0",        /*  6 expire_at */
    "0",        /*  7 set_at */
    "",            /*  8 tkl time */
    "",            /*  9 tkl reason */
    ""            /* 10 regex */
};
int targets = 0, action = 0;
char targetbuf[64], actionbuf[2];
char reason[512];

    if (IsServer(sptr))
        return 0;

    if (!OPCanTKL(sptr) || !IsOper(sptr))
    {
        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, sptr->name);
        return 0;
    }

    if (parc == 1)
    {
        tkl_stats(sptr, TKL_SPAMF, NULL);
        tkl_stats(sptr, TKL_SPAMF|TKL_GLOBAL, NULL);
        sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'F');
        return 0;
    }
    if ((parc < 7) || BadPtr(parv[4]))
        return spamfilter_usage(sptr);

    /* parv[1]: [add|del|+|-]
    * parv[2]: type
    * parv[3]: action
    * parv[4]: tkl time
    * parv[5]: tkl reason (or block reason..)
    * parv[6]: regex
    */
    if (!strcasecmp(parv[1], "add") || !strcmp(parv[1], "+"))
        whattodo = 0;
    else if (!strcasecmp(parv[1], "del") || !strcmp(parv[1], "-") || !strcasecmp(parv[1], "remove"))
        whattodo = 1;
    else
    {
        sendto_one(sptr, ":%s NOTICE %s :1st parameter invalid", me.name, sptr->name);
        return spamfilter_usage(sptr);
    }

    targets = spamfilter_gettargets(parv[2], sptr);
    if (!targets)
        return spamfilter_usage(sptr);

    strncpyzt(targetbuf, spamfilter_target_inttostring(targets), sizeof(targetbuf));

    action = banact_stringtoval(parv[3]);
    if (!action)
    {
        sendto_one(sptr, ":%s NOTICE %s :Invalid 'action' field (%s)", me.name, sptr->name, parv[3]);
        return spamfilter_usage(sptr);
    }
    actionbuf[0] = banact_valtochar(action);
    actionbuf[1] = '\0';
   
    /* now check the regex... */
    p = unreal_checkregex(parv[6],0,1);
    if (p)
    {
        sendto_one(sptr, ":%s NOTICE %s :Error in regex '%s': %s",
            me.name, sptr->name, parv[6], p);
        return 0;
    }

    tkllayer[1] = whattodo ? "-" : "+";
    tkllayer[3] = targetbuf;
    tkllayer[4] = actionbuf;
    tkllayer[5] = make_nick_user_host(sptr->name, sptr->user->username, GetHost(sptr));

    if (parv[4][0] == '-')
    {
        ircsprintf(mo, "%li", SPAMFILTER_BAN_TIME);
        tkllayer[8] = mo;
    }
    else
        tkllayer[8] = parv[4];

    if (parv[5][0] == '-')
        strlcpy(reason, unreal_encodespace(SPAMFILTER_BAN_REASON), sizeof(reason));
    else
        strlcpy(reason, parv[5], sizeof(reason));

    tkllayer[9] = reason;
    tkllayer[10] = parv[6];
   
    if (whattodo == 0)
    {
        ircsprintf(mo2, "%li", TStime());
        tkllayer[7] = mo2;
    }
   
    m_tkl(&me, &me, 11, tkllayer);

    return 0;
}


Freak 25 Nisan 2007 07:49

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
m_whois.c

Kod:

/*
 *  Unreal Internet Relay Chat Daemon, src/modules/m_whois.c
 *  (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team
 *  Moved to modules by Fish (Justin Hammond)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 1, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#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"
#include "proto.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif

static char buf[BUFSIZE];

DLLFUNC int m_whois(aClient *cptr, aClient *sptr, int parc, char *parv[]);

/* Place includes here */
#define MSG_WHOIS      "WHOIS" /* WHOI */
#define TOK_WHOIS      "#"    /* 35 */

ModuleHeader MOD_HEADER(m_whois)
  = {
    "whois",    /* Name of module */
    "$Id: m_whois.c,v 1.1.6.6 2005/03/13 21:03:21 syzop Exp $", /* Version */
    "command /whois", /* Short description of module */
    "3.2-b8-1",
    NULL
    };

/* This is called on module init, before Server Ready */
DLLFUNC int MOD_INIT(m_whois)(ModuleInfo *modinfo)
{
    /*
    * We call our add_Command crap here
    */
    add_Command(MSG_WHOIS, TOK_WHOIS, m_whois, MAXPARA);
    MARK_AS_OFFICIAL_MODULE(modinfo);
    return MOD_SUCCESS;
}

/* Is first run when server is 100% ready */
DLLFUNC int MOD_LOAD(m_whois)(int module_load)
{
    return MOD_SUCCESS;
}

/* Called when module is unloaded */
DLLFUNC int MOD_UNLOAD(m_whois)(int module_unload)
{
    if (del_Command(MSG_WHOIS, TOK_WHOIS, m_whois) < 0)
    {
        sendto_realops("Failed to delete commands when unloading %s",
                MOD_HEADER(m_whois).name);
    }
    return MOD_SUCCESS;
}


/*
** m_whois
**    parv[0] = sender prefix
**    parv[1] = nickname masklist
*/
DLLFUNC int  m_whois(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
    Membership *lp;
    anUser *user;
    aClient *acptr, *a2cptr;
    aChannel *chptr;
    char *nick, *tmp, *name;
    char *p = NULL;
    int  found, len, mlen;

    if (IsServer(sptr))   
        return 0;

    if (parc < 2)
    {
        sendto_one(sptr, err_str(ERR_NONICKNAMEGIVEN),
            me.name, parv[0]);
        return 0;
    }

    if (parc > 2)
    {
        if (hunt_server_token(cptr, sptr, MSG_WHOIS, TOK_WHOIS, "%s :%s", 1, parc,
            parv) != HUNTED_ISME)
            return 0;
        parv[1] = parv[2];
    }

    for (tmp = parv[1]; (nick = strtoken(&p, tmp, ",")); tmp = NULL)
    {
        unsigned char invis, showchannel, member, wilds, hideoper; /* <- these are all boolean-alike */

        found = 0;
        /* We do not support "WHOIS *" */
        wilds = (index(nick, '?') || index(nick, '*'));
        if (wilds)
            continue;

        if ((acptr = find_client(nick, NULL)))
        {
            if (IsServer(acptr))
                continue;
            /*
            * I'm always last :-) and acptr->next == NULL!!
            */
            if (IsMe(acptr))
                break;
            /*
            * 'Rules' established for sending a WHOIS reply:
            * - only send replies about common or public channels
            *  the target user(s) are on;
            */

            if (!IsPerson(acptr))
                continue;

            user = acptr->user;
            name = (!*acptr->name) ? "?" : acptr->name;

            invis = acptr != sptr && IsInvisible(acptr);
            member = (user->channel) ? 1 : 0;

            a2cptr = find_server_quick(user->server);

            hideoper = 0;
            if (IsHideOper(acptr) && (acptr != sptr) && !IsAnOper(sptr))
                hideoper = 1;

            if (IsWhois(acptr) && (sptr != acptr))
            {
                sendto_one(acptr,
                    ":%s %s %s :*** %s (%s@%s) did a /whois on you.",
                    me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name, sptr->name,
                    sptr->user->username, sptr->user->realhost);
            }
            sendto_one(sptr, rpl_str(RPL_WHOISUSER), me.name,
                parv[0], name,
                user->username,
                IsHidden(acptr) ? user->virthost : user->realhost,
                acptr->info);

            if (IsOper(sptr))
            {
                char sno[512];
                strcpy(sno, get_sno_str(acptr));
               
                /* send the target user's modes */
                sendto_one(sptr, rpl_str(RPL_WHOISMODES),
                    me.name, parv[0], name,
                    get_mode_str(acptr), sno[1] == 0 ? "" : sno);
            }
            if ((acptr == sptr) || IsAnOper(sptr))
            {
                sendto_one(sptr, rpl_str(RPL_WHOISHOST),
                    me.name, parv[0], acptr->name,
                    user->realhost, user->ip_str ? user->ip_str : "");
            }

            if (IsARegNick(acptr))
                sendto_one(sptr, rpl_str(RPL_WHOISREGNICK), me.name, parv[0], name);
           
            found = 1;
            mlen = strlen(me.name) + strlen(parv[0]) + 10 + strlen(name);
            for (len = 0, *buf = '\0', lp = user->channel; lp; lp = lp->next)
            {
                chptr = lp->chptr;
                showchannel = 0;
                if (ShowChannel(sptr, chptr))
                    showchannel = 1;
#ifndef SHOW_SECRET
                if (IsAnOper(sptr) && !SecretChannel(chptr))
#else
                if (IsAnOper(sptr))
#endif
                    showchannel = 1;
                if ((acptr->umodes & UMODE_HIDEWHOIS) && !IsMember(sptr, chptr) && !IsAnOper(sptr))
                    showchannel = 0;
                if (IsServices(acptr) && !IsNetAdmin(sptr) && !IsSAdmin(sptr))
                    showchannel = 0;
                if (acptr == sptr)
                    showchannel = 1;
                /* Hey, if you are editting here... don't forget to change the webtv w_whois ;p. */

                if (showchannel)
                {
                    long access;
                    if (len + strlen(chptr->chname) > (size_t)BUFSIZE - 4 - mlen)
                    {
                        sendto_one(sptr,
                            ":%s %d %s %s :%s",
                            me.name,
                            RPL_WHOISCHANNELS,
                            parv[0], name, buf);
                        *buf = '\0';
                        len = 0;
                    }
#ifdef SHOW_SECRET
                    if (IsAnOper(sptr)
#else
                    if (IsNetAdmin(sptr)
#endif
                        && SecretChannel(chptr) && !IsMember(sptr, chptr))
                        *(buf + len++) = '?';
                    if (acptr->umodes & UMODE_HIDEWHOIS && !IsMember(sptr, chptr)
                        && IsAnOper(sptr))
                        *(buf + len++) = '!';
                    access = get_access(acptr, chptr);
#ifdef PREFIX_AQ
                    if (access & CHFL_CHANOWNER)
                        *(buf + len++) = '~';
                    else if (access & CHFL_CHANPROT)

                        *(buf + len++) = '&';
                    else
#endif
                    if (access & CHFL_CHANOP)
                        *(buf + len++) = '@';
                    else if (access & CHFL_HALFOP)
                        *(buf + len++) = '%';
                    else if (access & CHFL_VOICE)
                        *(buf + len++) = '+';
                    if (len)
                        *(buf + len) = '\0';
                    (void)strcpy(buf + len, chptr->chname);
                    len += strlen(chptr->chname);
                    (void)strcat(buf + len, " ");
                    len++;
                }
            }

            if (buf[0] != '\0')
                sendto_one(sptr, rpl_str(RPL_WHOISCHANNELS), me.name, parv[0], name, buf);

                        if (!(IsULine(acptr) && !IsOper(sptr) && HIDE_ULINES))
                sendto_one(sptr, rpl_str(RPL_WHOISSERVER),
                    me.name, parv[0], name, user->server,
                    a2cptr ? a2cptr->info : "*Not On This Net*");

            if (user->away)
                sendto_one(sptr, rpl_str(RPL_AWAY), me.name,
                    parv[0], name, user->away);
            /* makesure they aren't +H (we'll also check
              before we display a helpop or IRCD Coder msg)
              -- codemastr */

        if ((IsAnOper(acptr) || IsServices(acptr)) && !hideoper)
            {
                buf[0] = '\0';
                        if (IsAdmin(acptr) && !stricmp("RainmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "[Genel Sorumlu]");
                        if (IsAdmin(acptr) && !stricmp("RainmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a Ağ Yöneticisi");
                        if (IsAdmin(acptr) && !stricmp("RainmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a SSH Operator");
                        if (IsAdmin(acptr) && !stricmp("RainmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a IRCd Modify Expert");
                        if (IsAdmin(acptr) && !stricmp("WingmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "[Teknik Sorumlu]");
                        if (IsAdmin(acptr) && !stricmp("WingmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a Linux Master");
                        if (IsAdmin(acptr) && !stricmp("WingmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a SSH Operator");
                        if (IsAdmin(acptr) && !stricmp("WingmaN", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a IRCd Modify Expert");
                        if (IsAdmin(acptr) && !stricmp("Cem", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "[Genel Sorumlu]");
                        if (IsAdmin(acptr) && !stricmp("Cem", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a Ağ Yöneticisi");
                        if (IsAdmin(acptr) && !stricmp("Cem", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a SSH Operator");
                        if (IsAdmin(acptr) && !stricmp("Cem", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a IRCd Modify Expert");
                        if (IsAdmin(acptr) && !stricmp("Oguz", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "[Teknik Sorumlu]");
                        if (IsAdmin(acptr) && !stricmp("Oguz", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a Linux Master");
                        if (IsAdmin(acptr) && !stricmp("Oguz", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a SSH Operator");
                        if (IsAdmin(acptr) && !stricmp("Oguz", nick))
                        sendto_one(sptr, rpl_str (RPL_WHOISOPERATOR),
                        me.name, parv[0], name, "is a IRCd Modify Expert");
                if (IsNetAdmin(acptr))
                    strlcat(buf, "is a Network Administrator", sizeof buf);
                else if (IsAdmin(acptr) && !IsCoAdmin(acptr))
                                        strlcat(buf, "is a Services Administrator", sizeof buf);
                                else if (IsSAdmin(acptr))
                                        strlcat(buf, "is a Services Administrator", sizeof buf);
                else if (IsCoAdmin(acptr))
                    strlcat(buf, "is a IRC Administrator", sizeof buf);
                else if (IsServices(acptr))
                    strlcat(buf, "is a Network Service", sizeof buf);
                else if (IsOper(acptr))
                    strlcat(buf, "is a IRC Operator", sizeof buf);

                else
                    strlcat(buf, "is a IRC Operator", sizeof buf);
                if (buf[0])
                    sendto_one(sptr,
                        rpl_str(RPL_WHOISOPERATOR), me.name,
                        parv[0], name, buf);
            }

            if (IsHelpOp(acptr) && !hideoper && !user->away)
                sendto_one(sptr, rpl_str(RPL_WHOISHELPOP), me.name, parv[0], name);

            if (acptr->umodes & UMODE_BOT)
                sendto_one(sptr, rpl_str(RPL_WHOISBOT), me.name, parv[0], name, ircnetwork);

            if (acptr->umodes & UMODE_SECURE)
                sendto_one(sptr, rpl_str(RPL_WHOISSECURE), me.name, parv[0], name,
                    "is using a Secure Connection");

            if (!BadPtr(user->swhois) && !hideoper)
                    sendto_one(sptr, ":%s %d %s %s :%s",
                        me.name, RPL_WHOISSPECIAL, parv[0],
                        name, acptr->user->swhois);

            /*
            * Fix /whois to not show idle times of
            * global opers to anyone except another
            * global oper or services.
            * -CodeM/Barubary
            */
            if (MyConnect(acptr) && (IsOper(sptr) || (acptr->user && MyConnect(acptr) && !IsOper(acptr))))
                sendto_one(sptr, rpl_str(RPL_WHOISIDLE),
                    me.name, parv[0], name,
                    TStime() - acptr->last, acptr->firsttime);
        }
        if (!found)
            sendto_one(sptr, err_str(ERR_NOSUCHNICK),
                me.name, parv[0], nick);
        if (p)
            p[-1] = ',';
    }
    sendto_one(sptr, rpl_str(RPL_ENDOFWHOIS), me.name, parv[0], parv[1]);

    return 0;
}


Freak 25 Nisan 2007 07:50

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
main.c

Kod:

/* Main NickServ module.
 *
 * IRC Services is copyright (c) 1996-2005 Andrew Church.
 *    E-mail: <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>
 * Parts written by Andrew Kempe and others.
 * This program is free but copyrighted software; see the file COPYING for
 * details.
 */

#include "services.h"
#include "modules.h"
#include "conffile.h"
#include "language.h"
#include "commands.h"
#include "encrypt.h"
#include "modules/operserv/operserv.h"

#include "nickserv.h"
#include "ns-local.h"

/*************************************************************************/

static Module *module;

static int cb_command      = -1;
static int cb_help          = -1;
static int cb_help_cmds    = -1;
      int cb_reglink_check = -1;  /* called from util.c */
static int cb_registered    = -1;
static int cb_id_check      = -1;
static int cb_identified    = -1;

static int db_opened = 0;

      char *s_NickServ;
static char *desc_NickServ;
static char *NickDBName;
EXPORT_VAR(char *,s_NickServ)

      int32  NSRegEmailMax;
      int    NSRequireEmail;
      time_t NSRegDelay;
      time_t NSInitialRegDelay;
      int32  NSDefFlags;
      time_t N***pire;
      time_t N***pireWarning;
      int    NSShowPassword;
      char * NSEnforcerUser;
      char * NSEnforcerHost;
      int    NSForceNickChange;
      time_t NSReleaseTimeout;
      int    NSAllowKillImmed;
      int    NSListOpersOnly;
      int32  NSListMax;
      int    NSSecureAdmins;
      time_t NSSuspendExpire;
      time_t NSSuspendGrace;
static int    NSHelpWarning;
static int    NSEnableDropEmail;
static time_t NSDropEmailExpire;

/*************************************************************************/

static void do_help(User *u);
static void do_register(User *u);
static void do_identify(User *u);
static void do_drop(User *u);
static void do_dropnick(User *u);
static void do_dropemail(User *u);
static void do_dropemail_confirm(User *u);
static void do_info(User *u);
static void do_listchans(User *u);
static void do_list(User *u);
static void do_listemail(User *u);
static void do_recover(User *u);
static void do_release(User *u);
static void do_ghost(User *u);
static void do_status(User *u);
static void do_getpass(User *u);
static void do_forbid(User *u);
static void do_suspend(User *u);
static void do_unsuspend(User *u);
#ifdef DEBUG_COMMANDS
static void do_listnick(User *u);
#endif

/*************************************************************************/

static Command cmds[] = {
    { "HELP",    do_help,    NULL,  -1,                    -1,-1 },
    { "REGISTER", do_register, NULL,  NICK_HELP_REGISTER,    -1,-1 },
    { "IDENTIFY", do_identify, NULL,  NICK_HELP_IDENTIFY,    -1,-1 },
    { "SIDENTIFY",do_identify, NULL,  -1,                    -1,-1 },
    { "DROP",    do_drop,    NULL,  NICK_HELP_DROP,        -1,-1 },
    { "SET",      do_set,      NULL,  NICK_HELP_SET,
        -1, NICK_OPER_HELP_SET },
    { "SET PASSWORD", NULL,    NULL,  NICK_HELP_SET_PASSWORD, -1,-1 },
    { "SET URL",      NULL,    NULL,  NICK_HELP_SET_URL,      -1,-1 },
    { "SET EMAIL",    NULL,    NULL,  NICK_HELP_SET_EMAIL,    -1,-1 },
    { "SET INFO",    NULL,    NULL,  NICK_HELP_SET_INFO,    -1,-1 },
    { "SET MSN",      NULL,    NULL,  NICK_HELP_SET_MSN,      -1,-1 },
    { "SET ICQ",      NULL,    NULL,  NICK_HELP_SET_ICQ,      -1,-1 },
    { "SET SEHIR",    NULL,    NULL,  NICK_HELP_SET_LOCATION, -1,-1 },
    { "SET ISIM",    NULL,    NULL,  NICK_HELP_SET_ISIM,    -1,-1 },
    { "SET YAS",      NULL,    NULL,  NICK_HELP_SET_YAS,      -1,-1 },
    { "SET KILL",    NULL,    NULL,  NICK_HELP_SET_KILL,    -1,-1 },
    { "SET SECURE",  NULL,    NULL,  NICK_HELP_SET_SECURE,  -1,-1 },
    { "SET PRIVATE",  NULL,    NULL,  NICK_HELP_SET_PRIVATE,  -1,-1 },
    { "SET HIDE",    NULL,    NULL,  NICK_HELP_SET_HIDE,    -1,-1 },
    { "SET TIMEZONE", NULL,    NULL,  NICK_HELP_SET_TIMEZONE, -1,-1 },
    { "SET NOEXPIRE", NULL,    NULL,  -1, -1,
        NICK_OPER_HELP_SET_NOEXPIRE },
    { "UNSET",    do_unset,    NULL,  NICK_HELP_UNSET,
        -1, NICK_OPER_HELP_UNSET },
    { "RECOVER",  do_recover,  NULL,  NICK_HELP_RECOVER,      -1,-1 },
    { "RELEASE",  do_release,  NULL,  NICK_HELP_RELEASE,      -1,-1 },
    { "GHOST",    do_ghost,    NULL,  NICK_HELP_GHOST,        -1,-1 },
    { "INFO",    do_info,    NULL,  NICK_HELP_INFO,
        -1, NICK_OPER_HELP_INFO },
    { "LIST",    do_list,    NULL,  -1,
        NICK_HELP_LIST, NICK_OPER_HELP_LIST },
    { "LISTEMAIL",do_listemail,NULL,  -1,
        NICK_HELP_LISTEMAIL, NICK_OPER_HELP_LISTEMAIL },
    { "STATUS",  do_status,  NULL,  NICK_HELP_STATUS,      -1,-1 },
    { "LISTCHANS",do_listchans,NULL,  NICK_HELP_LISTCHANS,
        -1, NICK_OPER_HELP_LISTCHANS },

    { "DROPNICK", do_dropnick, is_services_oper, -1,
        -1, NICK_OPER_HELP_DROPNICK },
    { "DROPEMAIL",do_dropemail,is_services_oper, -1,
        -1, NICK_OPER_HELP_DROPEMAIL },
    { "DROPEMAIL-CONFIRM", do_dropemail_confirm, is_services_oper, -1,
        -1, NICK_OPER_HELP_DROPEMAIL },
    { "GETPASS",  do_getpass,  is_services_admin, -1,
        -1, NICK_OPER_HELP_GETPASS },
    { "FORBID",  do_forbid,  is_services_oper, -1,
        -1, NICK_OPER_HELP_FORBID },
    { "SUSPEND",  do_suspend,  is_services_oper, -1,
        -1, NICK_OPER_HELP_SUSPEND },
    { "UNSUSPEND",do_unsuspend,is_services_oper, -1,
        -1, NICK_OPER_HELP_UNSUSPEND },
#ifdef DEBUG_COMMANDS
    { "LISTNICK", do_listnick, is_services_admin, -1, -1, -1 },
#endif
    { NULL }
};

/*************************************************************************/
/************************ Main NickServ routines *************************/
/*************************************************************************/

/* Introduce the NickServ pseudoclient. */

static int introduce_nickserv(const char *nick)
{
    if (!nick || irc_stricmp(nick, s_NickServ) == 0) {
    char modebuf[BUFSIZE];
    snprintf(modebuf, sizeof(modebuf), "o%s", pseudoclient_modes);
    send_nick(s_NickServ, ServiceUser, ServiceHost, ServerName,
          desc_NickServ, modebuf);
    return nick ? 1 : 0;
    }
    return 0;
}

/*************************************************************************/

/* Main NickServ routine. */

static int nickserv(const char *source, const char *target, char *buf)
{
    char *cmd;
    User *u = get_user(source);

    if (irc_stricmp(target, s_NickServ) != 0)
    return 0;

    if (!u) {
    module_log("user record for %s not found", source);
    notice(s_NickServ, source,
        getstring(NULL, INTERNAL_ERROR));
    return 1;
    }

    cmd = strtok(buf, " ");

    if (!cmd) {
    return 1;
    } else if (stricmp(cmd, "\1PING") == 0) {
    const char *s;
    if (!(s = strtok(NULL, "")))
        s = "\1";
    notice(s_NickServ, source, "\1PING %s", s);
    } else {
    if (call_callback_2(module, cb_command, u, cmd) <= 0)
        run_cmd(s_NickServ, u, module, cmd);
    }
    return 1;

}

/*************************************************************************/

/* Return a /WHOIS response for NickServ. */

static int nickserv_whois(const char *source, char *who, char *extra)
{
    if (irc_stricmp(who, s_NickServ) != 0)
    return 0;
    send_cmd(ServerName, "311 %s %s %s %s * :%s", source, who,
        ServiceUser, ServiceHost, desc_NickServ);
    send_cmd(ServerName, "312 %s %s %s :%s", source, who,
        ServerName, ServerDesc);
    send_cmd(ServerName, "313 %s %s :is a network service", source, who);
    send_cmd(ServerName, "318 %s %s End of /WHOIS response.", source, who);
    return 1;
}

/*************************************************************************/

/* Save nickname database. */

static int do_save_data()
{
    sync_nick_db(NickDBName);
    return 0;
}

/*************************************************************************/
/*************************************************************************/

/* Callback for users connecting to the network. */

static int do_user_create(User *user, int ac, char **av)
{
    validate_user(user);
    return 0;
}

/*************************************************************************/

/* Callbacks for users changing nicknames (before and after). */

static int do_user_nickchange_before(User *user, const char *newnick)
{
    /* Changing nickname case isn't a real change; pop out immediately
    * in that case. */
    if (irc_stricmp(newnick, user->nick) == 0)
    return 0;

    cancel_user(user);
    return 0;
}

static int do_user_nickchange_after(User *user, const char *oldnick)
{
    /* Changing nickname case isn't a real change; pop out immediately
    * in that case. */
    if (irc_stricmp(oldnick, user->nick) == 0)
    return 0;

    user->my_signon = time(NULL);
    validate_user(user);
    if (usermode_reg) {
    if (user_identified(user)) {
        send_cmd(s_NickServ, "SVSMODE %s :+%s", user->nick,
            mode_flags_to_string(usermode_reg, MODE_USER));
        user->mode |= usermode_reg;
    } else {
        send_cmd(s_NickServ, "SVSMODE %s :-%s", user->nick,
            mode_flags_to_string(usermode_reg, MODE_USER));
        user->mode &= ~usermode_reg;
    }
    }
    return 0;
}

/*************************************************************************/

/* Callback for users disconnecting from the network. */

static int do_user_delete(User *user, const char *reason)
{
    NickInfo *ni = user->ni;
    int i, j;

    if (user_recognized(user)) {
    free(ni->last_quit);
    ni->last_quit = *reason ? sstrdup(reason) : NULL;
    put_nickinfo(ni);
    }
    ARRAY_FOREACH (i, user->id_nicks) {
    NickGroupInfo *ngi = get_ngi_id(user->id_nicks[i]);
    if (!ngi)
        continue;
    ARRAY_SEARCH_PLAIN_SCALAR(ngi->id_users, user, j);
    if (j < ngi->id_users_count) {
        ARRAY_REMOVE(ngi->id_users, j);
    } else {
        module_log("BUG: do_user_delete(): nickgroup %u listed in"
              " id_nicks for user %p (%s), but user not in"
              " id_users!", ngi->id, user, user->nick);
    }
    }
    cancel_user(user);
    return 0;
}

/*************************************************************************/

/* Callback for REGISTER/LINK check; we disallow registration/linking of
 * the NickServ pseudoclient nickname or guest nicks.  This is done here
 * instead of in the routines themselves to avoid duplication of code at an
 * insignificant performance cost.
 */

static int do_reglink_check(const User *u, const char *nick,
                const char *pass, const char *email)
{
    if ((protocol_features & PF_CHANGENICK) && is_guest_nick(u->nick)) {
    /* Don't allow guest nicks to be registered or linked.  This check
    * has to be done regardless of the state of NSForceNickChange
    * because other modules might take advantage of forced nick
    * changing. */
    return 1;
    }
    return irc_stricmp(nick, s_NickServ) == 0;
}

/*************************************************************************/
/*********************** NickServ command routines ***********************/
/*************************************************************************/

/* Return a help message. */

static void do_help(User *u)
{
    char *cmd = strtok_remaining();

    if (!cmd) {
    notice_help(s_NickServ, u, NICK_HELP);
    if (N***pire)
        notice_help(s_NickServ, u, NICK_HELP_EXPIRES,
            maketime(u->ngi,N***pire,0));
    if (NSHelpWarning)
        notice_help(s_NickServ, u, NICK_HELP_WARNING);
    } else if (call_callback_2(module, cb_help, u, cmd) > 0) {
    return;
    } else if (stricmp(cmd, "COMMANDS") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_COMMANDS);
    if (find_module("nickserv/mail-auth"))
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_AUTH);
    notice_help(s_NickServ, u, NICK_HELP_COMMANDS_IDENTIFY);
    if (find_module("nickserv/sendpass"))
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_SENDPASS);
    notice_help(s_NickServ, u, NICK_HELP_COMMANDS_DROP);
    if (find_module("nickserv/link"))
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_LINK);
    if (find_module("nickserv/oldlink"))
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_OLDLINK);
    if (find_module("nickserv/access"))
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_ACCESS);
    if (find_module("nickserv/autojoin"))
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_AJOIN);
    notice_help(s_NickServ, u, NICK_HELP_COMMANDS_SET);
    if (!NSListOpersOnly)
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_LIST);
    notice_help(s_NickServ, u, NICK_HELP_COMMANDS_LISTCHANS);
    call_callback_2(module, cb_help_cmds, u, 0);
    if (is_oper(u)) {
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS);
        if (NSEnableDropEmail)
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS_DROPEMAIL);
        if (EnableGetpass)
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS_GETPASS);
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS_FORBID);
        if (find_module("nickserv/oldlink"))
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS_LISTLINKS);
        if (NSListOpersOnly)
        notice_help(s_NickServ, u, NICK_HELP_COMMANDS_LIST);
        if (find_module("nickserv/mail-auth"))
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS_SETAUTH);
        call_callback_2(module, cb_help_cmds, u, 1);
        notice_help(s_NickServ, u, NICK_OPER_HELP_COMMANDS_END);
    }
    } else if (stricmp(cmd, "REGISTER") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_REGISTER,
            getstring(u->ngi,NICK_REGISTER_SYNTAX));
    notice_help(s_NickServ, u, NICK_HELP_REGISTER_EMAIL);
    notice_help(s_NickServ, u, NICK_HELP_REGISTER_END);
    } else if (stricmp(cmd, "DROP") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_DROP);
    if (find_module("nickserv/link") || find_module("nickserv/oldlink"))
        notice_help(s_NickServ, u, NICK_HELP_DROP_LINK);
    notice_help(s_NickServ, u, NICK_HELP_DROP_END);
    } else if ((stricmp(cmd, "DROPEMAIL") == 0
        || stricmp(cmd, "DROPEMAIL-CONFIRM") == 0)
          && NSEnableDropEmail
          && is_oper(u)
    ) {
    notice_help(s_NickServ, u, NICK_OPER_HELP_DROPEMAIL,
            maketime(u->ngi,NSDropEmailExpire,0));
    } else if (stricmp(cmd, "SET") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_SET);
    if (find_module("nickserv/link"))
        notice_help(s_NickServ, u, NICK_HELP_SET_OPTION_MAINNICK);
    notice_help(s_NickServ, u, NICK_HELP_SET_END);
    if (is_oper(u))
        notice_help(s_NickServ, u, NICK_OPER_HELP_SET);
    } else if (strnicmp(cmd, "SET", 3) == 0
          && isspace(cmd[3])
          && stricmp(cmd+4+strspn(cmd+4," \t"), "LANGUAGE") == 0) {
    int i;
    notice_help(s_NickServ, u, NICK_HELP_SET_LANGUAGE);
    for (i = 0; i < NUM_LANGS && langlist[i] >= 0; i++) {
        notice(s_NickServ, u->nick, "    %2d) %s",
          i+1, getstring_lang(langlist[i],LANG_NAME));
    }
    } else if (stricmp(cmd, "INFO") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_INFO);
    if (find_module("nickserv/mail-auth"))
        notice_help(s_NickServ, u, NICK_HELP_INFO_AUTH);
    if (is_oper(u))
        notice_help(s_NickServ, u, NICK_OPER_HELP_INFO);
    } else if (stricmp(cmd, "LIST") == 0) {
    if (is_oper(u))
        notice_help(s_NickServ, u, NICK_OPER_HELP_LIST);
    else
        notice_help(s_NickServ, u, NICK_HELP_LIST);
    if (NSListOpersOnly)
        notice_help(s_NickServ, u, NICK_HELP_LIST_OPERSONLY);
    } else if (stricmp(cmd, "RECOVER") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_RECOVER,
            maketime(u->ngi,NSReleaseTimeout,MT_SECONDS));
    } else if (stricmp(cmd, "RELEASE") == 0) {
    notice_help(s_NickServ, u, NICK_HELP_RELEASE,
            maketime(u->ngi,NSReleaseTimeout,MT_SECONDS));
    } else if (stricmp(cmd, "SUSPEND") == 0 && is_oper(u)) {
    notice_help(s_NickServ, u, NICK_OPER_HELP_SUSPEND, s_OperServ);
    } else {
    help_cmd(s_NickServ, u, module, cmd);
    }
}

/*************************************************************************/

/* Register a nick. */

static void do_register(User *u)
{
    NickInfo *ni;
    NickGroupInfo *ngi;
    char *pass = strtok(NULL, " ");
    char *email = strtok(NULL, " ");
    int n;
    time_t now = time(NULL);

    if (readonly) {
    notice_lang(s_NickServ, u, NICK_REGISTRATION_DISABLED);
    return;
    }

    if (now < u->lastnickreg + NSRegDelay) {
    time_t left = (u->lastnickreg + NSRegDelay) - now;
    notice_lang(s_NickServ, u, NICK_REG_PLEASE_WAIT,
            maketime(u->ngi, left, MT_SECONDS));

    } else if (time(NULL) < u->my_signon + NSInitialRegDelay) {
    time_t left = (u->my_signon + NSInitialRegDelay) - now;
    notice_lang(s_NickServ, u, NICK_REG_PLEASE_WAIT_FIRST,
            maketime(u->ngi, left, MT_SECONDS));

    } else if (!pass || (NSRequireEmail && !email)
          || (stricmp(pass, u->nick) == 0
          && (strtok(NULL, "")
              || (email && (!strchr(email,'@')
                    || !strchr(email,'.')))))
    ) {
    /* No password/email, or they (apparently) tried to include the nick
    * in the command. */
    syntax_error(s_NickServ, u, "REGISTER", NICK_REGISTER_SYNTAX);

    } else if (!reglink_check(u, u->nick, pass, email)) {
    /* Denied by the callback. */
    notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, u->nick);
    return;

    } else if (u->ni) {  /* i.e. there's already such a nick regged */
    if (u->ni->status & NS_VERBOTEN) {
        module_log("%s@%s tried to register forbidden nick %s",
              u->username, u->host, u->nick);
        notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, u->nick);
    } else {
        if (u->ngi->suspendinfo)
        module_log("%s@%s tried to register suspended nick %s",
              u->username, u->host, u->nick);
        notice_lang(s_NickServ, u, NICK_X_ALREADY_REGISTERED, u->nick);
    }

    } else if (u->ngi == NICKGROUPINFO_INVALID) {
    module_log("%s@%s tried to register nick %s with missing nick group",
          u->username, u->host, u->nick);
    notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);

    } else if (stricmp(pass, u->nick) == 0
          || (StrictPasswords && strlen(pass) < 5)
    ) {
    notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);

    } else if (email && !valid_email(email)) {
    /* Display the syntax as well in case the user just got E-mail and
    * password backwards.  Don't use syntax_error(), because that also
    * prints a "for more help" message which might just confuse the
    * user more. */
    char buf[BUFSIZE];
    snprintf(buf, sizeof(buf), getstring(u->ngi,NICK_REGISTER_SYNTAX),
        "REGISTER");
    notice_lang(s_NickServ, u, SYNTAX_ERROR, buf);
    notice_lang(s_NickServ, u, BAD_EMAIL);

    } else if (NSRegEmailMax && email && !is_services_admin(u)
          && ((n = count_nicks_with_email(email)) < 0
          || n >= NSRegEmailMax)) {
    if (n < 0) {
        notice_lang(s_NickServ, u, NICK_REGISTER_EMAIL_UNAUTHED);
    } else {
        notice_lang(s_NickServ, u, NICK_REGISTER_TOO_MANY_NICKS, n,
            NSRegEmailMax);
    }

    } else {
    int replied = 0;
    int len = strlen(pass), max;
    char passbuf[PASSMAX];

    /* Make sure the password will fit in a PASSMAX-size buffer */
    max = encrypt_check_len(len, PASSMAX);
    /* Require the original password (including trailing NULL) to fit
    * in a PASSMAX-size buffer as well */
    if ((max == 0 && len > PASSMAX-1) || max > PASSMAX-1)
        max = PASSMAX-1;
    /* Truncate password if too long */
    if (max > 0) {
        memset(pass+max, 0, len-max);
        len = max;
        notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, max);
    }
    /* Encrypt password */
    if (encrypt(pass, len, passbuf, PASSMAX) < 0) {
        memset(pass, 0, len);
        module_log("Failed to encrypt password for %s (register)",
              u->nick);
        notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
        return;
    }
    /* Do nick setup stuff */
    ni = makenick(u->nick, &ngi);
    if (!ni) {
        module_log("makenick(%s) failed", u->nick);
        notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
        return;
    }
    memcpy(ngi->pass, passbuf, PASSMAX);
    memset(passbuf, 0, PASSMAX);
    ni->time_registered = ni->last_seen = time(NULL);
    ni->authstat = NA_IDENTIFIED | NA_RECOGNIZED;
    if (email)
        ngi->email = sstrdup(email);
    ngi->flags = NSDefFlags;
    ngi->memos.memomax = MEMOMAX_DEFAULT;
    ngi->channelmax = CHANMAX_DEFAULT;
    ngi->language = LANG_DEFAULT;
    ngi->timezone = TIMEZONE_DEFAULT;
    call_callback_4(module, cb_registered, u, ni, ngi, &replied);
    /* If the IDENTIFIED flag is still set (a module might have
    * cleared it, e.g. mail-auth), record the ID stamp */
    if (nick_identified(ni))
        ni->id_stamp = u->servicestamp;
    /* Link back and forth to user record and store modified data */
    u->ni = ni;
    u->ngi = ngi;
    ni->user = u;
    update_userinfo(u);
    put_nickinfo(ni);
    put_nickgroupinfo(ngi);
    /* Tell people about it */
    if (email) {
        module_log("%s registered by %s@%s (%s)",
              u->nick, u->username, u->host, email);
    } else {
        module_log("%s registered by %s@%s",
              u->nick, u->username, u->host);
    }
    if (!replied)
        notice_lang(s_NickServ, u, NICK_REGISTERED, u->nick);
    if (NSShowPassword)
        notice_lang(s_NickServ, u, NICK_PASSWORD_IS, pass);
    /* Clear password from memory and other last-minute things */
    memset(pass, 0, len);
    /* Note time REGISTER command was used */
    u->lastnickreg = time(NULL);
    /* Set +r (or other registered-nick mode) if IDENTIFIED is still
    * set. */
    if (nick_identified(ni) && usermode_reg) {
        send_cmd(s_NickServ, "SVSMODE %s :+%s", u->nick,
            mode_flags_to_string(usermode_reg, MODE_USER));
    }

    }

}

/*************************************************************************/

static void do_identify(User *u)
{
    char *pass = strtok_remaining();
    NickInfo *ni = NULL;
    NickGroupInfo *ngi = NULL;

    if (!pass) {
    syntax_error(s_NickServ, u, "IDENTIFY", NICK_IDENTIFY_SYNTAX);

    } else if (!(ni = u->ni)) {
    notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);

    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u->nick);

    } else if (!(ngi = u->ngi) || ngi == NICKGROUPINFO_INVALID) {
    module_log("IDENTIFY: missing NickGroupInfo for %s", u->nick);
    notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);

    } else if (ngi->suspendinfo) {
    notice_lang(s_NickServ, u, NICK_X_SUSPENDED, u->nick);

    } else if (!nick_check_password(u, u->ni, pass, "IDENTIFY",
                    NICK_IDENTIFY_FAILED)) {
    /* nothing */

    } else if (NSRequireEmail && !ngi->email) {
    ni->authstat |= NA_IDENT_NOMAIL;
    notice_lang(s_NickServ, u, NICK_IDENTIFY_EMAIL_MISSING, s_NickServ);

    } else if (call_callback_2(module, cb_id_check, u, pass) <= 0) {
    int old_authstat = ni->authstat;
    set_identified(u, ni, ngi);
    module_log("%s!%s@%s identified for nick %s",
          u->nick, u->username, u->host, u->nick);
    notice_lang(s_NickServ, u, NICK_IDENTIFY_SUCCEEDED);
              send_cmd(s_NickServ, "CHGHOST %s %s.Yuzukchat.Net", u->nick, u->nick);
              send_cmd(s_NickServ, "CHGHOST RainmaN Yuzukchat.Net", u->nick, u->nick);
              send_cmd(s_NickServ, "NOTICE %s :[VHost] %s.Yuzukchat.Net adresine sahipsiniz.", u->nick, u->nick);
    call_callback_2(module, cb_identified, u, old_authstat);
    }
}
/*************************************************************************/

static void do_drop(User *u)
{
    char *pass = strtok(NULL, " ");
    NickInfo *ni = u->ni;
    NickGroupInfo *ngi = (u->ngi==NICKGROUPINFO_INVALID ? NULL : u->ngi);

    if (readonly && !is_services_admin(u)) {
    notice_lang(s_NickServ, u, NICK_DROP_DISABLED);
    return;
    }

    if (!pass || strtok_remaining()) {
    syntax_error(s_NickServ, u, "DROP", NICK_DROP_SYNTAX);
    if (find_module("nickserv/link") || find_module("nickserv/oldlink"))
        notice_lang(s_NickServ, u, NICK_DROP_WARNING);
    } else if (!ni || !ngi) {
    notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
    } else if (ngi->suspendinfo) {
    notice_lang(s_NickServ, u, NICK_X_SUSPENDED, u->nick);
    } else if (!nick_check_password(u, u->ni, pass, "DROP",
                    NICK_DROP_FAILED)) {
    /* nothing */
    } else {
    if (readonly)  /* they must be a servadmin in this case */
        notice_lang(s_NickServ, u, READ_ONLY_MODE);
    drop_nickgroup(ngi, u, NULL);
    notice_lang(s_NickServ, u, NICK_DROPPED);
    }
}

/*************************************************************************/

/* Services admin function to drop another user's nickname.  Privileges
 * assumed to be pre-checked.
 */

static void do_dropnick(User *u)
{
    char *nick = strtok(NULL, " ");
    NickInfo *ni;
    NickGroupInfo *ngi;

#ifdef CLEAN_COMPILE
    ngi = NULL;
#endif

    if (!nick) {
    syntax_error(s_NickServ, u, "DROPNICK", NICK_DROPNICK_SYNTAX);
    } else if (!(ni = get_nickinfo(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->nickgroup && !(ngi = get_ngi(ni))) {
    notice_lang(s_NickServ, u, INTERNAL_ERROR);
    } else if (NSSecureAdmins && nick_is_services_admin(ni) &&
                            !is_services_root(u)) {
    notice_lang(s_NickServ, u, PERMISSION_DENIED);
    } else {
    if (readonly)
        notice_lang(s_NickServ, u, READ_ONLY_MODE);
    if (ni->nickgroup) {
        drop_nickgroup(ngi, u, PTR_INVALID);
    } else {
        module_log("%s!%s@%s dropped forbidden nick %s",
              u->nick, u->username, u->host, ni->nick);
        delnick(ni);
    }
    notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
    }
}

/*************************************************************************/

/* Services admin function to drop all nicknames whose E-mail address
 * matches the given mask.  Privileges assumed to be pre-checked.
 */

/* List of recent DROPEMAILs for CONFIRM */
static struct {
    char sender[NICKMAX];    /* Who sent the command (empty = no entry) */
    char mask[BUFSIZE];        /* What mask was used */
    int count;
    time_t sent;        /* When the command was sent */
} dropemail_buffer[DROPEMAIL_BUFSIZE];

static void do_dropemail(User *u)
{
    char *mask = strtok(NULL, " ");
    NickGroupInfo *ngi;
    int count, i, found;

    /* Parameter check */
    if (!mask || strtok_remaining()) {
    syntax_error(s_NickServ, u, "DROPEMAIL", NICK_DROPEMAIL_SYNTAX);
    return;
    }
    if (strlen(mask) > sizeof(dropemail_buffer[0].mask)-1) {
    notice_lang(s_NickServ, u, NICK_DROPEMAIL_PATTERN_TOO_LONG,
            sizeof(dropemail_buffer[0].mask)-1);
    return;
    }

    /* Count nicks matching this mask; exit if none found */
    if (strcmp(mask,"-") == 0)
    mask = NULL;
    count = 0;
    for (ngi = first_nickgroupinfo(); ngi; ngi = next_nickgroupinfo()) {
    if ((mask && ngi->email && match_wild_nocase(mask,ngi->email))
    || (!mask && !ngi->email)
    ) {
        count += ngi->nicks_count;
    }
    }
    if (!count) {
    notice_lang(s_NickServ, u, NICK_DROPEMAIL_NONE);
    return;
    }
    if (mask == NULL)
    mask = "-";

    /* Clear out any previous entries for this sender/mask */
    for (i = 0; i < DROPEMAIL_BUFSIZE; i++) {
    if (irc_stricmp(u->nick, dropemail_buffer[i].sender) == 0
    && stricmp(mask, dropemail_buffer[i].mask) == 0
    ) {
        memset(&dropemail_buffer[i], 0, sizeof(dropemail_buffer[i]));
    }
    }

    /* Register command in buffer */
    found = -1;
    for (i = 0; i < DROPEMAIL_BUFSIZE; i++) {
    if (!*dropemail_buffer[i].sender) {
        found = i;
        break;
    }
    }
    if (found < 0) {
    found = 0;
    for (i = 1; i < DROPEMAIL_BUFSIZE; i++) {
        if (dropemail_buffer[i].sent < dropemail_buffer[found].sent)
        found = i;
    }
    }
    memset(&dropemail_buffer[found], 0, sizeof(dropemail_buffer[found]));
    strscpy(dropemail_buffer[found].sender, u->nick,
        sizeof(dropemail_buffer[found].sender));
    strscpy(dropemail_buffer[found].mask, mask,
        sizeof(dropemail_buffer[found].mask));
    dropemail_buffer[found].sent = time(NULL);
    dropemail_buffer[found].count = count;

    /* Send count and prompt for confirmation */
    notice_lang(s_NickServ, u, NICK_DROPEMAIL_COUNT, count, s_NickServ, mask);
}


static void do_dropemail_confirm(User *u)
{
    char *mask = strtok(NULL, " ");
    NickGroupInfo *ngi;
    int i;

    /* Parameter check */
    if (!mask || strtok_remaining()) {
    syntax_error(s_NickServ, u, "DROPEMAIL-CONFIRM",
            NICK_DROPEMAIL_CONFIRM_SYNTAX);
    return;
    }

    /* Make sure this is a DROPEMAIL that (1) we've seen and (2) hasn't
    * expired */
    for (i = 0; i < DROPEMAIL_BUFSIZE; i++) {
    if (irc_stricmp(u->nick, dropemail_buffer[i].sender) == 0
    && stricmp(mask, dropemail_buffer[i].mask) == 0
    && time(NULL) - dropemail_buffer[i].sent < NSDropEmailExpire
    ) {
        break;
    }
    }
    if (i >= DROPEMAIL_BUFSIZE) {
    notice_lang(s_NickServ, u, NICK_DROPEMAIL_CONFIRM_UNKNOWN);
    return;
    }

    /* Okay, go ahead and delete */
    notice_lang(s_NickServ, u, NICK_DROPEMAIL_CONFIRM_DROPPING,
        dropemail_buffer[i].count);
    if (readonly)
    notice_lang(s_NickServ, u, READ_ONLY_MODE);
    if (strcmp(mask,"-") == 0)
    mask = NULL;
    for (ngi = first_nickgroupinfo(); ngi; ngi = next_nickgroupinfo()) {
    if ((mask && ngi->email && match_wild_nocase(mask,ngi->email))
    || (!mask && !ngi->email)
    ) {
        drop_nickgroup(ngi, u, mask ? mask : "-");
    }
    }
    notice_lang(s_NickServ, u, NICK_DROPEMAIL_CONFIRM_DROPPED);
}

/*************************************************************************/

/* Show hidden info to nick owners and sadmins when the "ALL" parameter is
 * supplied. If a nick is online, the "Last seen address" changes to "Is
 * online from".
 * Syntax: INFO <nick> {ALL}
 * -TheShadow (13 Mar 1999)
 */

/* Check the status of show_all and make a note of having done so.  This is
 * used at the end, to see whether we should print a "use ALL for more info"
 * message.  Note that this should be the last test in a boolean expression,
 * to ensure that used_all isn't set inappropriately. */
#define CHECK_SHOW_ALL (used_all++, show_all)

static void do_info(User *u)
{
    char *nick = strtok(NULL, " ");
    char *param = strtok(NULL, " ");
    NickInfo *ni;
    NickGroupInfo *ngi;
    time_t simdi = time(NULL);
    time_t zaman, zaman2;

    if (!nick) {
        syntax_error(s_NickServ, u, "INFO", NICK_INFO_SYNTAX);

    } else if (!(ni = get_nickinfo(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);

    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);

    } else {
    char buf[BUFSIZE], *end;
    char *buf2[BUFSIZE];
    const char *commastr = getstring(u->ngi, COMMA_SPACE);
    int need_comma = 0;
    int nick_online = 0;
    int can_show_all = 0, show_all = 0, used_all = 0;

    ngi = get_ngi(ni);
    if (!ngi) {
        notice_lang(s_NickServ, u, INTERNAL_ERROR);
        return;
    }

    /* Is the real owner of the nick we're looking up online? -TheShadow */
    if (ni->user && nick_id_or_rec(ni))
        nick_online = 1;

        /* Only show hidden fields to owner and sadmins and only when the ALL
    * parameter is used. -TheShadow */
    can_show_all = ((u==ni->user && nick_online) || is_services_admin(u));

    if (can_show_all && (param && stricmp(param, "ALL") == 0))
        show_all = 1;

    notice_lang(s_NickServ, u, NICK_INFO_REALNAME,
            nick, ni->last_realname);

    /* Ignore HIDE and show the real hostmask to anyone who can use
    * INFO ALL. */
    if (nick_online) {
        if (!(ngi->flags & NF_HIDE_MASK) || can_show_all)
        notice_lang(s_NickServ, u, NICK_INFO_ADDRESS_ONLINE,
            can_show_all ? ni->last_realmask : ni->last_usermask);
        else
        notice_lang(s_NickServ, u, NICK_INFO_ADDRESS_ONLINE_NOHOST,
                ni->nick);
    } else {
        if (!(ngi->flags & NF_HIDE_MASK) || can_show_all)
        notice_lang(s_NickServ, u, NICK_INFO_ADDRESS,
            can_show_all ? ni->last_realmask : ni->last_usermask);
        zaman = simdi - ni->last_seen;
            strftime_lang(buf, sizeof(buf), u->ngi,
              STRFTIME_DATE_TIME_FORMAT, ni->last_seen);
            notice_lang(s_NickServ, u, NICK_INFO_LAST_SEEN, buf, maketime2(u->ngi, zaman));
    }
    zaman2 = simdi - ni->time_registered;
    strftime_lang(buf, sizeof(buf), u->ngi, STRFTIME_DATE_TIME_FORMAT,
              ni->time_registered);
    notice_lang(s_NickServ, u, NICK_INFO_TIME_REGGED, buf, maketime2(u->ngi, zaman2));
    if (ni->last_quit && (!(ngi->flags & NF_HIDE_QUIT) || CHECK_SHOW_ALL))
        notice_lang(s_NickServ, u, NICK_INFO_LAST_QUIT, ni->last_quit);
    if (ngi->isim)
        notice_lang(s_NickServ, u, NICK_INFO_ISIM, ngi->isim);
    if (ngi->yas)
                notice_lang(s_NickServ, u, NICK_INFO_YAS, ngi->Yas);
        if (ngi->sehir)
                notice_lang(s_NickServ, u, NICK_INFO_LOCATION, ngi->Sehir);
    if (ngi->msn)
                notice_lang(s_NickServ, u, NICK_INFO_MSN, ngi->MSN);
    if (ngi->icq)
                notice_lang(s_NickServ, u, NICK_INFO_ICQ, ngi->ICQ);
    if (ngi->info)
            notice_lang(s_NickServ, u, NICK_INFO_INFO, ngi->Info);
    if (ngi->url)
        notice_lang(s_NickServ, u, NICK_INFO_URL, ngi->Url);
    if (ngi->email && (!(ngi->flags & NF_HIDE_EMAIL) || CHECK_SHOW_ALL)) {
        if (ngi->authcode) {
        if (can_show_all) {
            notice_lang(s_NickServ, u, NICK_INFO_EMAIL_UNAUTHED,
                ngi->email);
        }
        } else {
        notice_lang(s_NickServ, u, NICK_INFO_EMAIL, ngi->email);
        }
    }
    *buf = 0;
    end = buf;
    if (ngi->flags & NF_KILLPROTECT) {
        end += snprintf(end, sizeof(buf)-(end-buf), "%s",
                getstring(u->ngi, NICK_INFO_OPT_KILL));
        need_comma = 1;
    }
    if (ngi->flags & NF_SECURE) {
        end += snprintf(end, sizeof(buf)-(end-buf), "%s%s",
                need_comma ? commastr : "",
                getstring(u->ngi, NICK_INFO_OPT_SECURE));
        need_comma = 1;
    }
    if (ngi->flags & NF_PRIVATE) {
        end += snprintf(end, sizeof(buf)-(end-buf), "%s%s",
                need_comma ? commastr : "",
                getstring(u->ngi, NICK_INFO_OPT_PRIVATE));
        need_comma = 1;
    }
    notice_lang(s_NickServ, u, NICK_INFO_OPTIONS,
            *buf ? buf : getstring(u->ngi, NICK_INFO_OPT_NONE));

    if ((ni->status & NS_NOEXPIRE) && CHECK_SHOW_ALL)
        notice_lang(s_NickServ, u, NICK_INFO_NO_EXPIRE);

    if (ngi->suspendinfo) {
        notice_lang(s_NickServ, u, NICK_X_SUSPENDED, nick);
        if (CHECK_SHOW_ALL) {
        SuspendInfo *si = ngi->suspendinfo;
        char timebuf[BUFSIZE], expirebuf[BUFSIZE];

        strftime_lang(timebuf, sizeof(timebuf), u->ngi,
                  STRFTIME_DATE_TIME_FORMAT, si->suspended);
        expires_in_lang(expirebuf, sizeof(expirebuf), u->ngi,
                si->expires);
        notice_lang(s_NickServ, u, NICK_INFO_SUSPEND_DETAILS,
                si->who, timebuf, expirebuf);
        notice_lang(s_NickServ, u, NICK_INFO_SUSPEND_REASON,
                si->reason);
        }
    }

    if (can_show_all && !show_all && used_all)
        notice_lang(s_NickServ, u, NICK_INFO_SHOW_ALL, s_NickServ,
            ni->nick);
    }
}

/*************************************************************************/

static void do_listchans(User *u)
{
    NickInfo *ni = u->ni;
    NickGroupInfo *ngi;

    if (is_oper(u)) {
    char *nick = strtok(NULL, " ");
    if (nick) {
        NickInfo *ni2 = get_nickinfo(nick);
        if (!ni2) {
        notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
        return;
        } else if (ni2 == ni) {
        /* Let the command through even for non-servadmins if they
        * gave their own nick; it's less confusing than a
        * "Permission denied" error */
        } else if (!is_services_admin(u)) {
        notice_lang(s_NickServ, u, PERMISSION_DENIED);
        return;
        } else {
        ni = ni2;
        }
    }
    } else if (strtok_remaining()) {
    syntax_error(s_NickServ, u, "LISTCHANS", NICK_LISTCHANS_SYNTAX);
    return;
    }
    if (!ni) {
    notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
    return;
    }
    if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, ni->nick);
    } else if (!user_identified(u)) {
    notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
    } else if (!(ngi = get_ngi(ni))) {
    notice_lang(s_NickServ, u, INTERNAL_ERROR);
    } else if (!ngi->channels_count) {
    notice_lang(s_NickServ, u, NICK_LISTCHANS_NONE, ni->nick);
    } else {
    int i;
    notice_lang(s_NickServ, u, NICK_LISTCHANS_HEADER, ni->nick);
    ARRAY_FOREACH (i, ngi->channels)
        notice(s_NickServ, u->nick, "    %s", ngi->channels[i]);
    notice_lang(s_NickServ, u, NICK_LISTCHANS_END, ngi->channels_count);
    }
}

/*************************************************************************/

static void do_list(User *u)
{
    char *pattern = strtok(NULL, " ");
    char *keyword;
    NickInfo *ni;
    NickGroupInfo *ngi;
    int nnicks;
    char buf[BUFSIZE];
    int is_servadmin = is_services_admin(u);
    int16 match_NS = 0;  /* NS_ flags a nick must match one of to qualify */
    int32 match_NF = 0;  /* NF_ flags a nick must match one of to qualify */
    int match_susp = 0;  /* 1 if we match on suspended nicks */
    int match_auth = 0;  /* 1 if we match on nicks with auth codes */
    int have_auth_module = 0;  /* so we don't show no-auth char if no module */

    if (NSListOpersOnly && !is_oper(u)) {
    notice_lang(s_NickServ, u, PERMISSION_DENIED);
    return;
    }

    have_auth_module = (find_module("nickserv/mail-auth") != NULL);

    if (!pattern) {
    syntax_error(s_NickServ, u, "LIST",
            is_oper(u) ? NICK_LIST_OPER_SYNTAX : NICK_LIST_SYNTAX);
    } else {
    int mask_has_at = (strchr(pattern,'@') != 0);

    nnicks = 0;

    while (is_servadmin && (keyword = strtok(NULL, " "))) {
        if (stricmp(keyword, "FORBIDDEN") == 0) {
        match_NS |= NS_VERBOTEN;
        } else if (stricmp(keyword, "NOEXPIRE") == 0) {
        match_NS |= NS_NOEXPIRE;
        } else if (stricmp(keyword, "SUSPENDED") == 0) {
        match_susp = 1;
        } else if (stricmp(keyword, "NOAUTH") == 0 && have_auth_module) {
        match_auth = 1;
        } else {
        syntax_error(s_NickServ, u, "LIST",
            is_oper(u) ? NICK_LIST_OPER_SYNTAX : NICK_LIST_SYNTAX);
        }
    }

    notice_lang(s_NickServ, u, NICK_LIST_HEADER, pattern);
    for (ni = first_nickinfo(); ni; ni = next_nickinfo()) {
        int usermask_seen = 0;  /* does user get to see the usermask? */
        const char *mask;  /* which mask to show? (fake vs. real) */

        if (u == ni->user || is_services_admin(u))
        mask = ni->last_realmask;
        else
        mask = ni->last_usermask;
        ngi = get_nickgroupinfo(ni->nickgroup);
        if (!is_servadmin && ((ngi && (ngi->flags & NF_PRIVATE))
                  || (ni->status & NS_VERBOTEN)))
        continue;
        if (match_NS || match_NF || match_susp || match_auth)
        /* ok, we have flags, now see if they match */
        if (!((ni->status & match_NS)
          || (ngi && (ngi->flags & match_NF))
          || (ngi && ngi->suspendinfo && match_susp)
          || (ngi && ngi->authcode && match_auth)
        )) {
            continue;
        }
        if (!is_servadmin && (ngi->flags & NF_HIDE_MASK)) {
        snprintf(buf, sizeof(buf), "%-20s  [Hidden]", ni->nick);
        } else if (ni->status & NS_VERBOTEN) {
        snprintf(buf, sizeof(buf), "%-20s  [Forbidden]", ni->nick);
        } else {
        usermask_seen = 1;
        snprintf(buf, sizeof(buf), "%-20s  %s", ni->nick, mask);
        }
        if ((!mask_has_at && match_wild_nocase(pattern, ni->nick))
        || (mask_has_at && usermask_seen
        && match_wild_nocase(pattern, mask))
        ) {
        if (++nnicks <= NSListMax) {
            char suspended_char = ' ';
            char noexpire_char = ' ';
            const char *auth_char = have_auth_module ? " " : "";
            if (is_servadmin) {
            if (ngi && ngi->suspendinfo)
                suspended_char = '*';
            if (ni->status & NS_NOEXPIRE)
                noexpire_char = '!';
            if (have_auth_module && ngi && ngi->authcode)
                auth_char = "?";
            }
            notice(s_NickServ, u->nick, "  %c%c%s %s",
              suspended_char, noexpire_char, auth_char, buf);
        }
        }
    }
    notice_lang(s_NickServ, u, NICK_LIST_RESULTS,
            nnicks>NSListMax ? NSListMax : nnicks, nnicks);
    }
}

/*************************************************************************/

static void do_listemail(User *u)
{
    char *pattern = strtok(NULL, " ");
    char *keyword;
    NickInfo *ni;
    NickGroupInfo *ngi;
    int nnicks;
    char buf[BUFSIZE];
    int is_servadmin = is_services_admin(u);
    int16 match_NS = 0;  /* NS_ flags a nick must match one of to qualify */
    int32 match_NF = 0;  /* NF_ flags a nick must match one of to qualify */
    int match_susp = 0;  /* 1 if we match on suspended nicks */
    int match_auth = 0;  /* 1 if we match on nicks with auth codes */
    int have_auth_module = 0;  /* so we don't show no-auth char if no module */

    if (NSListOpersOnly && !is_oper(u)) {
    notice_lang(s_NickServ, u, PERMISSION_DENIED);
    return;
    }

    have_auth_module = (find_module("nickserv/mail-auth") != NULL);

    if (!pattern) {
    syntax_error(s_NickServ, u, "LISTEMAIL",
            is_oper(u) ? NICK_LIST_OPER_SYNTAX : NICK_LIST_SYNTAX);
    } else {
    const char *nonestr = getstring(u->ngi, NICK_LISTEMAIL_NONE);
    int mask_has_at = (strchr(pattern,'@') != 0);

    nnicks = 0;

    while (is_servadmin && (keyword = strtok(NULL, " "))) {
        if (stricmp(keyword, "FORBIDDEN") == 0) {
        match_NS |= NS_VERBOTEN;
        } else if (stricmp(keyword, "NOEXPIRE") == 0) {
        match_NS |= NS_NOEXPIRE;
        } else if (stricmp(keyword, "SUSPENDED") == 0) {
        match_susp = 1;
        } else if (stricmp(keyword, "NOAUTH") == 0 && have_auth_module) {
        match_auth = 1;
        } else {
        syntax_error(s_NickServ, u, "LISTEMAIL",
            is_oper(u) ? NICK_LIST_OPER_SYNTAX : NICK_LIST_SYNTAX);
        }
    }

    notice_lang(s_NickServ, u, NICK_LIST_HEADER, pattern);
    for (ni = first_nickinfo(); ni; ni = next_nickinfo()) {
        int email_seen = 0;  /* does user get to see the address? */

        ngi = get_nickgroupinfo(ni->nickgroup);
        if (!is_servadmin && ((ngi && (ngi->flags & NF_PRIVATE))
                  || (ni->status & NS_VERBOTEN)))
        continue;
        if (match_NS || match_NF || match_susp || match_auth)
        /* ok, we have flags, now see if they match */
        if (!((ni->status & match_NS)
          || (ngi && (ngi->flags & match_NF))
          || (ngi && ngi->suspendinfo && match_susp)
          || (ngi && ngi->authcode && match_auth)
        )) {
            continue;
        }
        if (!is_servadmin && (ngi->flags & NF_HIDE_EMAIL)
        && (!valid_ngi(u) || ngi->id!=u->ngi->id || !user_identified(u))){
        snprintf(buf, sizeof(buf), "%-20s  [Hidden]", ni->nick);
        } else if (ni->status & NS_VERBOTEN) {
        snprintf(buf, sizeof(buf), "%-20s  [Forbidden]", ni->nick);
        } else {
        email_seen = 1;
        snprintf(buf, sizeof(buf), "%-20s  %s", ni->nick,
            ngi->email ? ngi->email : nonestr);
        }
        if ((!mask_has_at && match_wild_nocase(pattern, ni->nick))
        || (mask_has_at && email_seen && ngi->email
        && match_wild_nocase(pattern, ngi->email))
        ) {
        if (++nnicks <= NSListMax) {
            char suspended_char = ' ';
            char noexpire_char = ' ';
            const char *auth_char = have_auth_module ? " " : "";
            if (is_servadmin) {
            if (ngi && ngi->suspendinfo)
                suspended_char = '*';
            if (ni->status & NS_NOEXPIRE)
                noexpire_char = '!';
            if (have_auth_module && ngi && ngi->authcode)
                auth_char = "?";
            }
            notice(s_NickServ, u->nick, "  %c%c%s %s",
              suspended_char, noexpire_char, auth_char, buf);
        }
        }
    }
    notice_lang(s_NickServ, u, NICK_LIST_RESULTS,
            nnicks>NSListMax ? NSListMax : nnicks, nnicks);
    }
}

/*************************************************************************/

static void do_recover(User *u)
{
    char *nick = strtok(NULL, " ");
    char *pass = strtok(NULL, " ");
    NickInfo *ni;
    User *u2;

    if (!nick || strtok_remaining()) {
    syntax_error(s_NickServ, u, "RECOVER", NICK_RECOVER_SYNTAX);
    } else if (!(u2 = get_user(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
    } else if (!(ni = u2->ni)) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->status & NS_GUESTED) {
    notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (irc_stricmp(nick, u->nick) == 0) {
    notice_lang(s_NickServ, u, NICK_NO_RECOVER_SELF);
    } else {
    if (pass) {
        if (!nick_check_password(u, ni, pass, "RECOVER", ACCESS_DENIED))
        return;
    } else if (!has_identified_nick(u, ni->nickgroup)) {
        notice_lang(s_NickServ, u, ACCESS_DENIED);
        return;
    }
    collide(ni, 0);
    notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick);
    }
}

/*************************************************************************/

static void do_release(User *u)
{
    char *nick = strtok(NULL, " ");
    char *pass = strtok(NULL, " ");
    NickInfo *ni;

    if (!nick || strtok_remaining()) {
    syntax_error(s_NickServ, u, "RELEASE", NICK_RELEASE_SYNTAX);
    } else if (!(ni = get_nickinfo(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(ni->status & NS_KILL_HELD)) {
    notice_lang(s_NickServ, u, NICK_RELEASE_NOT_HELD, nick);
    } else {
    if (pass) {
        if (!nick_check_password(u, ni, pass, "RELEASE", ACCESS_DENIED))
        return;
    } else if (!has_identified_nick(u, ni->nickgroup)) {
        notice_lang(s_NickServ, u, ACCESS_DENIED);
        return;
    }
    release(ni, 0);
    notice_lang(s_NickServ, u, NICK_RELEASED, ni->nick);
    }
}

/*************************************************************************/

static void do_ghost(User *u)
{
    char *nick = strtok(NULL, " ");
    char *pass = strtok(NULL, " ");
    NickInfo *ni;
    User *u2;

    if (!nick || strtok_remaining()) {
    syntax_error(s_NickServ, u, "GHOST", NICK_GHOST_SYNTAX);
    } else if (!(u2 = get_user(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
    } else if (!(ni = u2->ni)) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->status & NS_GUESTED) {
    notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (irc_stricmp(nick, u->nick) == 0) {
    notice_lang(s_NickServ, u, NICK_NO_GHOST_SELF);
    } else {
    char buf[NICKMAX+32];
    if (pass) {
        if (!nick_check_password(u, ni, pass, "GHOST", ACCESS_DENIED))
        return;
    } else if (!has_identified_nick(u, ni->nickgroup)) {
        notice_lang(s_NickServ, u, ACCESS_DENIED);
        return;
    }
    snprintf(buf, sizeof(buf), "GHOST command used by %s", u->nick);
    kill_user(s_NickServ, nick, buf);
    notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
    }
}

/*************************************************************************/

static void do_status(User *u)
{
    char *nick;
    User *u2;
    int i = 0;

    while ((nick = strtok(NULL, " ")) && (i++ < 16)) {
    if (!(u2 = get_user(nick)) || !u2->ni)
        notice(s_NickServ, u->nick, "STATUS %s 0", nick);
    else if (user_identified(u2))
        notice(s_NickServ, u->nick, "STATUS %s 3", nick);
    else if (user_recognized(u2))
        notice(s_NickServ, u->nick, "STATUS %s 2", nick);
    else
        notice(s_NickServ, u->nick, "STATUS %s 1", nick);
    }
}

/*************************************************************************/

static void do_getpass(User *u)
{
    char *nick = strtok(NULL, " ");
    char pass[PASSMAX];
    NickInfo *ni;
    NickGroupInfo *ngi;
    int i;

    /* Assumes that permission checking has already been done. */
    if (!nick) {
    syntax_error(s_NickServ, u, "GETPASS", NICK_GETPASS_SYNTAX);
    } else if (!(ni = get_nickinfo(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(ngi = get_ngi(ni))) {
    notice_lang(s_NickServ, u, INTERNAL_ERROR);
    } else if (NSSecureAdmins && nick_is_services_admin(ni) &&
                                !is_services_root(u)) {
    notice_lang(s_NickServ, u, PERMISSION_DENIED);
    } else if ((i = decrypt(ngi->pass, pass, PASSMAX)) < 0) {
    module_log("decrypt() failed for GETPASS on %s", nick);
    notice_lang(s_NickServ, u, INTERNAL_ERROR);
    } else if (i == 0) {
    notice_lang(s_NickServ, u, NICK_GETPASS_UNAVAILABLE);
    } else {
    module_log("%s!%s@%s used GETPASS on %s",
          u->nick, u->username, u->host, nick);
    if (WallGetpass)
        wallops(s_NickServ, "\2%s\2 used GETPASS on \2%s\2", u->nick,nick);
    notice_lang(s_NickServ, u, NICK_GETPASS_PASSWORD_IS, nick, pass);
    }
}

/*************************************************************************/

static void do_forbid(User *u)
{
    NickInfo *ni;
    char *nick = strtok(NULL, " ");
    User *u2;

    /* Assumes that permission checking has already been done. */
    if (!nick) {
    syntax_error(s_NickServ, u, "FORBID", NICK_FORBID_SYNTAX);
    return;
    }
    u2 = get_user(nick);
    if ((ni = get_nickinfo(nick)) != NULL) {
    if (NSSecureAdmins && nick_is_services_admin(ni) &&
                                                        !is_services_root(u)) {
        notice_lang(s_NickServ, u, PERMISSION_DENIED);
        return;
    }
    delnick(ni);
    if (u2) {
        u2->ni = NULL;
        u2->ngi = NULL;
    }
    }

    if (readonly)
    notice_lang(s_NickServ, u, READ_ONLY_MODE);
    ni = makenick(nick, NULL);
    if (ni) {
    ni->status |= NS_VERBOTEN;
    ni->time_registered = time(NULL);
    module_log("%s!%s@%s set FORBID for nick %s",
          u->nick, u->username, u->host, nick);
    notice_lang(s_NickServ, u, NICK_FORBID_SUCCEEDED, nick);
    /* If someone is using the nick, make them stop */
    if (u2)
        validate_user(u2);
    } else {
    module_log("Valid FORBID for %s by %s!%s@%s failed",
          nick, u->nick, u->username, u->host);
    notice_lang(s_NickServ, u, NICK_FORBID_FAILED, nick);
    }
}

/*************************************************************************/

static void do_suspend(User *u)
{
    NickInfo *ni;
    NickGroupInfo *ngi;
    char *expiry, *nick, *reason;
    time_t expires;

    nick = strtok(NULL, " ");
    if (nick && *nick == '+') {
    expiry = nick+1;
    nick = strtok(NULL, " ");
    } else {
    expiry = NULL;
    }
    reason = strtok_remaining();

    if (!reason) {
    syntax_error(s_NickServ, u, "SUSPEND", NICK_SUSPEND_SYNTAX);
    } else if (!(ni = get_nickinfo(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(ngi = get_ngi(ni))) {
    notice_lang(s_NickServ, u, INTERNAL_ERROR);
    } else if (ngi->suspendinfo) {
    notice_lang(s_NickServ, u, NICK_SUSPEND_ALREADY_SUSPENDED, nick);
    } else {
    if (expiry)
        expires = dotime(expiry);
    else
        expires = NSSuspendExpire;
    if (expires < 0) {
        notice_lang(s_NickServ, u, BAD_EXPIRY_TIME);
        return;
    } else if (expires > 0) {
        expires += time(NULL);    /* Set an absolute time */
    }
    module_log("%s!%s@%s suspended %s",
          u->nick, u->username, u->host, ni->nick);
    suspend_nick(ngi, reason, u->nick, expires);
    notice_lang(s_NickServ, u, NICK_SUSPEND_SUCCEEDED, nick);
    if (readonly)
        notice_lang(s_NickServ, u, READ_ONLY_MODE);
    /* If someone is using the nick, make them stop */
    if (ni->user)
        validate_user(ni->user);
    }
}

/*************************************************************************/

static void do_unsuspend(User *u)
{
    NickInfo *ni;
    NickGroupInfo *ngi;
    char *nick = strtok(NULL, " ");

    if (!nick) {
    syntax_error(s_NickServ, u, "UNSUSPEND", NICK_UNSUSPEND_SYNTAX);
    } else if (!(ni = get_nickinfo(nick))) {
    notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (ni->status & NS_VERBOTEN) {
    notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(ngi = get_ngi(ni))) {
    notice_lang(s_NickServ, u, INTERNAL_ERROR);
    } else if (!ngi->suspendinfo) {
    notice_lang(s_NickServ, u, NICK_UNSUSPEND_NOT_SUSPENDED, nick);
    } else {
    module_log("%s!%s@%s unsuspended %s",
          u->nick, u->username, u->host, ni->nick);
    unsuspend_nick(ngi, 1);
    notice_lang(s_NickServ, u, NICK_UNSUSPEND_SUCCEEDED, nick);
    if (readonly)
        notice_lang(s_NickServ, u, READ_ONLY_MODE);
    }
}

/*************************************************************************/

#ifdef DEBUG_COMMANDS

/* Return all the fields in the NickInfo structure. */

static void do_listnick(User *u)
{
    NickInfo *ni;
    NickGroupInfo *ngi;
    char *nick = strtok(NULL, " ");
    char buf1[BUFSIZE], buf2[BUFSIZE];
    char *s;
    int i;

    if (!nick)
    return;
    ni = get_nickinfo(nick);
    if (!ni) {
    notice(s_NickServ, u->nick, "%s", nick);
    notice(s_NickServ, u->nick, ":");
    return;
    }
    ngi = get_nickgroupinfo(ni->nickgroup);
    notice(s_NickServ, u->nick, "%s group:%u usermask:%s realmask:%s"
      " reg:%d seen:%d stat:%04X auth:%04X idstamp:%d badpass:%d :%s;%s",
      ni->nick, (int)ni->nickgroup, ni->last_usermask, ni->last_realmask,
      (int)ni->time_registered, (int)ni->last_seen, ni->status & 0xFFFF,
      ni->authstat & 0xFFFF, ni->id_stamp, ni->bad_passwords,
      ni->last_realname, (ni->last_quit ? ni->last_quit : "-"));
    if (ngi) {
    if (ngi->authcode) {
        snprintf(buf1, sizeof(buf1), "%d.%d",
            (int)ngi->authcode, (int)ngi->authset);
    } else {
        *buf1 = 0;
    }
    if (ngi->suspendinfo) {
        SuspendInfo *si = ngi->suspendinfo;
        snprintf(buf2, sizeof(buf2), "%s.%d.%d.%s",
            si->who, (int)si->suspended, (int)si->expires,
            si->reason ? si->reason : "-");
        strnrepl(buf2, sizeof(buf2), " ", "_");
    } else {
        *buf2 = 0;
    }
    notice(s_NickServ, u->nick, "+ flags:%08X ospriv:%04X authcode:%s"
          " susp:%s chancnt:%d chanmax:%d lang:%d tz:%d acccnt:%d"
          " ajoincnt:%d memocnt:%d memomax:%d igncnt:%d",
          ngi->flags, ngi->os_priv, buf1, buf2, ngi->channels_count,
          ngi->channelmax, ngi->language, ngi->timezone,
          ngi->access_count, ngi->ajoin_count, ngi->memos.memos_count,
          ngi->memos.memomax, ngi->ignore_count);
    notice(s_NickServ, u->nick, "+ url:%s", ngi->url ? ngi->url : "");
    notice(s_NickServ, u->nick, "+ email:%s", ngi->email?ngi->email:"");
    notice(s_NickServ, u->nick, "+ info:%s", ngi->info ? ngi->info : "");
    s = buf1;
    *buf1 = 0;
    ARRAY_FOREACH (i, ngi->access)
        s += snprintf(s, sizeof(buf1)-(s-buf1), "%s%s",
              *buf1 ? "," : "", ngi->access[i]);
    strnrepl(buf1, sizeof(buf1), " ", "_");
    notice(s_NickServ, u->nick, "+ acc:%s", buf1);
    s = buf1;
    *buf1 = 0;
    ARRAY_FOREACH (i, ngi->ajoin)
        s += snprintf(s, sizeof(buf1)-(s-buf1), "%s%s",
              *buf1 ? "," : "", ngi->ajoin[i]);
    strnrepl(buf1, sizeof(buf1), " ", "_");
    notice(s_NickServ, u->nick, "+ ajoin:%s", buf1);
    s = buf1;
    *buf1 = 0;
    ARRAY_FOREACH (i, ngi->ignore)
        s += snprintf(s, sizeof(buf1)-(s-buf1), "%s%s",
              *buf1 ? "," : "", ngi->ignore[i]);
    strnrepl(buf1, sizeof(buf1), " ", "_");
    notice(s_NickServ, u->nick, "+ ign:%s", buf1);
    } else {
    notice(s_NickServ, u->nick, ":");
    }
}

#endif /* DEBUG_COMMANDS */

/*************************************************************************/
/***************************** Module stuff ******************************/
/*************************************************************************/

const int32 module_version = MODULE_VERSION_CODE;

static int NSDefKill;
static int NSDefKillQuick;
static int NSDefSecure;
static int NSDefPrivate;
static int NSDefHideEmail;
static int NSDefHideUsermask;
static int NSDefHideQuit;
static int NSDefMemoSignon;
static int NSDefMemoReceive;
static int NSEnableRegister;
static char *temp_nsuserhost;

ConfigDirective module_config[] = {
    { "NickservDB",      { { CD_STRING, CF_DIRREQ, &NickDBName } } },
    { "NickServName",    { { CD_STRING, CF_DIRREQ, &s_NickServ },
                            { CD_STRING, 0, &desc_NickServ } } },
    { "NSAllowKillImmed", { { CD_SET, 0, &NSAllowKillImmed } } },
    { "NSDefHideEmail",  { { CD_SET, 0, &NSDefHideEmail } } },
    { "NSDefHideQuit",    { { CD_SET, 0, &NSDefHideQuit } } },
    { "NSDefHideUsermask",{ { CD_SET, 0, &NSDefHideUsermask } } },
    { "NSDefKill",        { { CD_SET, 0, &NSDefKill } } },
    { "NSDefKillQuick",  { { CD_SET, 0, &NSDefKillQuick } } },
    { "NSDefMemoReceive", { { CD_SET, 0, &NSDefMemoReceive } } },
    { "NSDefMemoSignon",  { { CD_SET, 0, &NSDefMemoSignon } } },
    { "NSDefPrivate",    { { CD_SET, 0, &NSDefPrivate } } },
    { "NSDefSecure",      { { CD_SET, 0, &NSDefSecure } } },
    { "NSDropEmailExpire",{ { CD_TIME, CF_DIRREQ, &NSDropEmailExpire } } },
    { "NSEnableDropEmail",{ { CD_SET, 0, &NSEnableDropEmail } } },
    { "NSEnableRegister", { { CD_SET, 0, &NSEnableRegister } } },
    { "NSEnforcerUser",  { { CD_STRING, CF_DIRREQ, &temp_nsuserhost } } },
    { "N***pire",        { { CD_TIME, 0, &N***pire } } },
    { "N***pireWarning",  { { CD_TIME, 0, &N***pireWarning } } },
    { "NSForceNickChange",{ { CD_SET, 0, &NSForceNickChange } } },
    { "NSHelpWarning",    { { CD_SET, 0, &NSHelpWarning } } },
    { "NSInitialRegDelay",{ { CD_TIME, 0, &NSInitialRegDelay } } },
    { "NSListMax",        { { CD_POSINT, CF_DIRREQ, &NSListMax } } },
    { "NSListOpersOnly",  { { CD_SET, 0, &NSListOpersOnly } } },
    { "NSRegDelay",      { { CD_TIME, 0, &NSRegDelay } } },
    { "NSRegEmailMax",    { { CD_POSINT, 0, &NSRegEmailMax } } },
    { "NSRequireEmail",  { { CD_SET, 0, &NSRequireEmail } } },
    { "NSReleaseTimeout", { { CD_TIME, CF_DIRREQ, &NSReleaseTimeout } } },
    { "NSSecureAdmins",  { { CD_SET, 0, &NSSecureAdmins } } },
    { "NSShowPassword",  { { CD_SET, 0, &NSShowPassword } } },
    { "NSSuspendExpire",  { { CD_TIME, 0 , &NSSuspendExpire },
                            { CD_TIME, 0 , &NSSuspendGrace } } },
    { NULL }
};

/* Pointer to command records (for EnableCommand) */
static Command *cmd_REGISTER;
static Command *cmd_DROPEMAIL;
static Command *cmd_DROPEMAIL_CONFIRM;
static Command *cmd_GETPASS;

/* Old message numbers */
static int old_REGISTER_SYNTAX          = -1;
static int old_HELP_REGISTER_EMAIL      = -1;
static int old_HELP_UNSET              = -1;
static int old_DISCONNECT_IN_1_MINUTE  = -1;
static int old_DISCONNECT_IN_20_SECONDS = -1;

/*************************************************************************/

static void handle_config(void)
{
    char *s;

    if (temp_nsuserhost) {
    NSEnforcerUser = temp_nsuserhost;
    if (!(s = strchr(temp_nsuserhost, '@'))) {
        NSEnforcerHost = ServiceHost;
    } else {
        *s++ = 0;
        NSEnforcerHost = s;
    }
    }

    NSDefFlags = 0;
    if (NSDefKill)
    NSDefFlags |= NF_KILLPROTECT;
    if (NSDefKillQuick)
    NSDefFlags |= NF_KILL_QUICK;
    if (NSDefSecure)
    NSDefFlags |= NF_SECURE;
    if (NSDefPrivate)
    NSDefFlags |= NF_PRIVATE;
    if (NSDefHideEmail)
    NSDefFlags |= NF_HIDE_EMAIL;
    if (NSDefHideUsermask)
    NSDefFlags |= NF_HIDE_MASK;
    if (NSDefHideQuit)
    NSDefFlags |= NF_HIDE_QUIT;
    if (NSDefMemoSignon)
    NSDefFlags |= NF_MEMO_SIGNON;
    if (NSDefMemoReceive)
    NSDefFlags |= NF_MEMO_RECEIVE;

    if (NSForceNickChange && !(protocol_features & PF_CHANGENICK)) {
    module_log("warning: forced nick changing not supported by IRC"
          " server, disabling NSForceNickChange");
    NSForceNickChange = 0;
    }
}

/*************************************************************************/

static int do_command_line(const char *option, const char *value)
{
    NickGroupInfo *ngi;

    if (!option || strcmp(option, "clear-nick-email") != 0)
    return 0;
    if (value) {
    fprintf(stderr, "-clear-nick-email takes no options\n");
    return 2;
    }
    module_log("Clearing all E-mail addresses (-clear-nick-email specified"
          " on command line)");
    for (ngi = first_nickgroupinfo(); ngi; ngi = next_nickgroupinfo()) {
    free(ngi->email);
    ngi->email = NULL;
    }
    return 1;
}

/*************************************************************************/

static int do_reconfigure(int after_configure)
{
    static char old_s_NickServ[NICKMAX];
    static char *old_desc_NickServ = NULL;
    static char *old_NickDBName    = NULL;

    if (!after_configure) {
    /* Before reconfiguration: save old values. */
    strscpy(old_s_NickServ, s_NickServ, NICKMAX);
    old_desc_NickServ = strdup(desc_NickServ);
    old_NickDBName    = strdup(NickDBName);
    } else {
    /* After reconfiguration: handle value changes. */
    handle_config();
    if (strcmp(old_s_NickServ,s_NickServ) != 0)
        send_nickchange(old_s_NickServ, s_NickServ);
    if (!old_desc_NickServ || strcmp(old_desc_NickServ,desc_NickServ) != 0)
        send_namechange(s_NickServ, desc_NickServ);
    if (!old_NickDBName || strcmp(old_NickDBName,NickDBName) != 0) {
        module_log("reconfigure: new database name will only take"
              " effect after restart");
        /* Restore the old database name */
        free(NickDBName);
        NickDBName = old_NickDBName;
        /* Make sure the old name isn't freed below */
        old_NickDBName = NULL;
    }
    free(old_desc_NickServ);
    free(old_NickDBName);
    if (NSEnableRegister)
        cmd_REGISTER->name = "REGISTER";
    else
        cmd_REGISTER->name = "";
    if (NSEnableDropEmail) {
        cmd_DROPEMAIL->name = "DROPEMAIL";
        cmd_DROPEMAIL_CONFIRM->name = "DROPEMAIL-CONFIRM";
    } else {
        cmd_DROPEMAIL->name = "";
        cmd_DROPEMAIL_CONFIRM->name = "";
    }
    if (EnableGetpass)
        cmd_GETPASS->name = "GETPASS";
    else
        cmd_GETPASS->name = "";
    if (NSRequireEmail) {
        setstring(NICK_REGISTER_SYNTAX, NICK_REGISTER_REQ_EMAIL_SYNTAX);
        setstring(NICK_HELP_REGISTER_EMAIL, NICK_HELP_REGISTER_EMAIL_REQ);
        setstring(NICK_HELP_UNSET, NICK_HELP_UNSET_REQ_EMAIL);
    } else {
        setstring(NICK_REGISTER_SYNTAX, old_REGISTER_SYNTAX);
        setstring(NICK_HELP_REGISTER_EMAIL, old_HELP_REGISTER_EMAIL);
        setstring(NICK_HELP_UNSET, old_HELP_UNSET);
    }
    if (NSForceNickChange) {
        setstring(DISCONNECT_IN_1_MINUTE, FORCENICKCHANGE_IN_1_MINUTE);
        setstring(DISCONNECT_IN_20_SECONDS, FORCENICKCHANGE_IN_20_SECONDS);
    } else {
        setstring(DISCONNECT_IN_1_MINUTE, old_DISCONNECT_IN_1_MINUTE);
        setstring(DISCONNECT_IN_20_SECONDS, old_DISCONNECT_IN_20_SECONDS);
    }
    }  /* if (!after_configure) */
    return 0;
}

/*************************************************************************/

int init_module(Module *module_)
{
    module = module_;

    handle_config();

    if (!new_commandlist(module) || !register_commands(module, cmds)) {
    module_log("Unable to register commands");
    exit_module(0);
    return 0;
    }
    cmd_REGISTER = lookup_cmd(module, "REGISTER");
    if (!cmd_REGISTER) {
    module_log("BUG: unable to find REGISTER command entry");
    exit_module(0);
    return 0;
    }
    cmd_DROPEMAIL = lookup_cmd(module, "DROPEMAIL");
    if (!cmd_DROPEMAIL) {
    module_log("BUG: unable to find DROPEMAIL command entry");
    exit_module(0);
    return 0;
    }
    cmd_DROPEMAIL_CONFIRM = lookup_cmd(module, "DROPEMAIL-CONFIRM");
    if (!cmd_DROPEMAIL_CONFIRM) {
    module_log("BUG: unable to find DROPEMAIL-CONFIRM command entry");
    exit_module(0);
    return 0;
    }
    cmd_GETPASS = lookup_cmd(module, "GETPASS");
    if (!cmd_GETPASS) {
    module_log("BUG: unable to find GETPASS command entry");
    exit_module(0);
    return 0;
    }
    if (!NSEnableRegister)
    cmd_REGISTER->name = "";
    if (!NSEnableDropEmail) {
    cmd_DROPEMAIL->name = "";
    cmd_DROPEMAIL_CONFIRM->name = "";
    }
    if (!EnableGetpass)
    cmd_GETPASS->name = "";

    cb_command      = register_callback(module, "command");
    cb_help          = register_callback(module, "HELP");
    cb_help_cmds    = register_callback(module, "HELP COMMANDS");
    cb_reglink_check = register_callback(module, "REGISTER/LINK check");
    cb_registered    = register_callback(module, "registered");
    cb_id_check      = register_callback(module, "IDENTIFY check");
    cb_identified    = register_callback(module, "identified");
    if (cb_command < 0 || cb_help < 0 || cb_help_cmds < 0
    || cb_reglink_check < 0 || cb_registered < 0 || cb_id_check < 0
    || cb_identified < 0
    ) {
    module_log("Unable to register callbacks");
    exit_module(0);
    return 0;
    }

    if (!add_callback(NULL, "command line", do_command_line)
    || !add_callback(NULL, "reconfigure", do_reconfigure)
    || !add_callback(NULL, "introduce_user", introduce_nickserv)
    || !add_callback(NULL, "m_privmsg", nickserv)
    || !add_callback(NULL, "m_whois", nickserv_whois)
    || !add_callback(NULL, "save data", do_save_data)
    || !add_callback(NULL, "user create", do_user_create)
    || !add_callback(NULL, "user nickchange (before)",
              do_user_nickchange_before)
    || !add_callback(NULL, "user nickchange (after)",
              do_user_nickchange_after)
    || !add_callback(NULL, "user delete", do_user_delete)
    || !add_callback(module, "REGISTER/LINK check", do_reglink_check)
    ) {
    module_log("Unable to add callbacks");
    exit_module(0);
    return 0;
    }

    if (!init_collide(module) || !init_set(module) || !init_util(module)) {
    exit_module(0);
    return 0;
    }

    open_nick_db(NickDBName);
    db_opened = 1;

    old_REGISTER_SYNTAX =
    setstring(NICK_REGISTER_SYNTAX, NICK_REGISTER_SYNTAX);
    old_HELP_REGISTER_EMAIL =
    setstring(NICK_HELP_REGISTER_EMAIL, NICK_HELP_REGISTER_EMAIL);
    old_HELP_UNSET =
    setstring(NICK_HELP_UNSET, NICK_HELP_UNSET);
    old_DISCONNECT_IN_1_MINUTE =
    setstring(DISCONNECT_IN_1_MINUTE, DISCONNECT_IN_1_MINUTE);
    old_DISCONNECT_IN_20_SECONDS =
    setstring(DISCONNECT_IN_20_SECONDS, DISCONNECT_IN_20_SECONDS);
    if (NSRequireEmail) {
    setstring(NICK_REGISTER_SYNTAX, NICK_REGISTER_REQ_EMAIL_SYNTAX);
    setstring(NICK_HELP_REGISTER_EMAIL, NICK_HELP_REGISTER_EMAIL_REQ);
    setstring(NICK_HELP_UNSET, NICK_HELP_UNSET_REQ_EMAIL);
    }
    if (NSForceNickChange) {
    setstring(DISCONNECT_IN_1_MINUTE, FORCENICKCHANGE_IN_1_MINUTE);
    setstring(DISCONNECT_IN_20_SECONDS, FORCENICKCHANGE_IN_20_SECONDS);
    }

    if (linked)
    introduce_nickserv(NULL);

    return 1;
}

/*************************************************************************/

int exit_module(int shutdown_unused)
{
#ifdef CLEAN_COMPILE
    shutdown_unused = shutdown_unused;
#endif

    if (linked)
    send_cmd(s_NickServ, "QUIT :");

    if (old_REGISTER_SYNTAX >= 0) {
    setstring(NICK_REGISTER_SYNTAX, old_REGISTER_SYNTAX);
    old_REGISTER_SYNTAX = -1;
    }
    if (old_HELP_REGISTER_EMAIL >= 0) {
    setstring(NICK_HELP_REGISTER_EMAIL, old_HELP_REGISTER_EMAIL);
    old_HELP_REGISTER_EMAIL = -1;
    }
    if (old_HELP_UNSET >= 0) {
    setstring(NICK_HELP_UNSET, old_HELP_UNSET);
    old_HELP_UNSET = -1;
    }
    if (old_DISCONNECT_IN_1_MINUTE >= 0) {
    setstring(DISCONNECT_IN_1_MINUTE, old_DISCONNECT_IN_1_MINUTE);
    old_DISCONNECT_IN_1_MINUTE = -1;
    }
    if (old_DISCONNECT_IN_20_SECONDS >= 0) {
    setstring(DISCONNECT_IN_20_SECONDS, old_DISCONNECT_IN_20_SECONDS);
    old_DISCONNECT_IN_20_SECONDS = -1;
    }

    if (db_opened)
    close_nick_db(NickDBName);

    exit_util();
    exit_set();
    exit_collide();

    remove_callback(module, "REGISTER/LINK check", do_reglink_check);
    remove_callback(NULL, "user delete", do_user_delete);
    remove_callback(NULL, "user nickchange (after)",
            do_user_nickchange_after);
    remove_callback(NULL, "user nickchange (before)",
            do_user_nickchange_before);
    remove_callback(NULL, "user create", do_user_create);
    remove_callback(NULL, "save data", do_save_data);
    remove_callback(NULL, "m_whois", nickserv_whois);
    remove_callback(NULL, "m_privmsg", nickserv);
    remove_callback(NULL, "introduce_user", introduce_nickserv);
    remove_callback(NULL, "reconfigure", do_reconfigure);
    remove_callback(NULL, "command line", do_command_line);

    unregister_callback(module, cb_identified);
    unregister_callback(module, cb_id_check);
    unregister_callback(module, cb_registered);
    unregister_callback(module, cb_reglink_check);
    unregister_callback(module, cb_help_cmds);
    unregister_callback(module, cb_help);
    unregister_callback(module, cb_command);

    /* These are static, so the pointers don't need to be cleared */
    if (cmd_GETPASS)
    cmd_GETPASS->name = "GETPASS";
    if (cmd_DROPEMAIL_CONFIRM)
    cmd_DROPEMAIL_CONFIRM->name = "DROPEMAIL-CONFIRM";
    if (cmd_DROPEMAIL)
    cmd_DROPEMAIL->name = "DROPEMAIL";
    if (cmd_REGISTER)
    cmd_REGISTER->name = "REGISTER";
    unregister_commands(module, cmds);
    del_commandlist(module);

    return 1;
}

/*************************************************************************/


Freak 25 Nisan 2007 07:51

Cevap: /* Yuzukchat.Net IRC(d) Dosyaları */
 
s_serv.c
Kod:

/*

 *  Unreal Internet Relay Chat Daemon, src/s_serv.c

 *  Copyright (C) 1990 Jarkko Oikarinen and

 *                      University of Oulu, Computing Center

 *

 *  See file AUTHORS in IRC package for additional names of

 *  the programmers.

 *

 *  This program is free software; you can redistribute it and/or modify

 *  it under the terms of the GNU General Public License as published by

 *  the Free Software Foundation; either version 1, or (at your option)

 *  any later version.

 *

 *  This program is distributed in the hope that it will be useful,

 *  but WITHOUT ANY WARRANTY; without even the implied warranty of

 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 *  GNU General Public License for more details.

 *

 *  You should have received a copy of the GNU General Public License

 *  along with this program; if not, write to the Free Software

 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

 */



#ifndef CLEAN_COMPILE

static char sccsid[] =

    "@(#)s_serv.c    2.55 2/7/94 (C) 1988 University of Oulu, Computing Center and Jarkko Oikarinen";

#endif

#define AllocCpy(x,y) x  = (char *) MyMalloc(strlen(y) + 1); strcpy(x,y)



#include "struct.h"

#include "common.h"

#include "sys.h"

#include "numeric.h"

#include "msg.h"

#include "channel.h"

#include "version.h"

#include <sys/stat.h>

#include <fcntl.h>

#ifdef _WIN32

#include <io.h>

#endif

#include <time.h>

#include "h.h"

#include "proto.h"

#include <string.h>

#ifdef USE_LIBCURL

#include <curl/curl.h>

#endif

extern VOIDSIG s_die();



static char buf[BUFSIZE];



MODVAR int  max_connection_count = 1, max_client_count = 1;

extern ircstats IRCstats;

extern int do_garbage_collect;

/* We need all these for cached MOTDs -- codemastr */

extern char *buildid;

aMotd *opermotd;

aMotd *rules;

aMotd *motd;

aMotd *svsmotd;

aMotd *botmotd;

aMotd *smotd;

struct tm motd_tm;

struct tm smotd_tm;

aMotd *read_file(char *filename, aMotd **list);

aMotd *read_file_ex(char *filename, aMotd **list, struct tm *);

extern aMotd *Find_file(char *, short);

/*

** m_functions execute protocol messages on this server:

**      CMD_FUNC(functionname) causes it to use the header

**            int functionname (aClient *cptr,

**                aClient *sptr, int parc, char *parv[])

**

**

**    cptr    is always NON-NULL, pointing to a *LOCAL* client

**        structure (with an open socket connected!). This

**        identifies the physical socket where the message

**        originated (or which caused the m_function to be

**        executed--some m_functions may call others...).

**

**    sptr    is the source of the message, defined by the

**        prefix part of the message if present. If not

**        or prefix not found, then sptr==cptr.

**

**        (!IsServer(cptr)) => (cptr == sptr), because

**        prefixes are taken *only* from servers...

**

**        (IsServer(cptr))

**            (sptr == cptr) => the message didn't

**            have the prefix.

**

**            (sptr != cptr && IsServer(sptr) means

**            the prefix specified servername. (?)

**

**            (sptr != cptr && !IsServer(sptr) means

**            that message originated from a remote

**            user (not local).

**

**        combining

**

**        (!IsServer(sptr)) means that, sptr can safely

**        taken as defining the target structure of the

**        message in this server.

**

**    *Always* true (if 'parse' and others are working correct):

**

**    1)    sptr->from == cptr  (note: cptr->from == cptr)

**

**    2)    MyConnect(sptr) <=> sptr == cptr (e.g. sptr

**        *cannot* be a local connection, unless it's

**        actually cptr!). [MyConnect(x) should probably

**        be defined as (x == x->from) --msa ]

**

**    parc    number of variable parameter strings (if zero,

**        parv is allowed to be NULL)

**

**    parv    a NULL terminated list of parameter pointers,

**

**            parv[0], sender (prefix string), if not present

**                this points to an empty string.

**            parv[1]...parv[parc-1]

**                pointers to additional parameters

**            parv[parc] == NULL, *always*

**

**        note:    it is guaranteed that parv[0]..parv[parc-1] are all

**            non-NULL pointers.

*/

#ifndef NO_FDLIST

extern fdlist serv_fdlist;

#endif



/*

** m_version

**    parv[0] = sender prefix

**    parv[1] = remote server

*/

CMD_FUNC(m_version)

{

    extern char serveropts[];

    extern char *IsupportStrings[];

    int reply, i;



    /* Only allow remote VERSIONs if registered -- Syzop */

    if (!IsPerson(sptr) && !IsServer(cptr))

        goto normal;



    if (hunt_server_token(cptr, sptr, MSG_VERSION, TOK_VERSION, ":%s", 1, parc,

        parv) == HUNTED_ISME)

    {

        sendto_one(sptr, rpl_str(RPL_VERSION), me.name,

            parv[0], version, debugmode, me.name,

            serveropts, extraflags ? extraflags : "",

            tainted ? "3" : "",

            (IsAnOper(sptr) ? MYOSNAME : "*"), UnrealProtocol);

#ifdef USE_SSL

        if (IsAnOper(sptr))

            sendto_one(sptr, ":%s NOTICE %s :%s", me.name, sptr->name, OPENSSL_VERSION_TEXT);

#endif

#ifdef ZIP_LINKS

        if (IsAnOper(sptr))

            sendto_one(sptr, ":%s NOTICE %s :zlib %s", me.name, sptr->name, zlibVersion());

#endif

#ifdef USE_LIBCURL

        if (IsAnOper(sptr))

            sendto_one(sptr, ":%s NOTICE %s :%s", me.name, sptr->name, curl_version());

#endif

        if (MyClient(sptr))

normal:

            reply = RPL_ISUPPORT;

        else

            reply = RPL_REMOTEISUPPORT;

        /* Send the text */

        for (i = 0; IsupportStrings[i]; i++)

            sendto_one(sptr, rpl_str(reply), me.name, sptr->name,

                  IsupportStrings[i]);

    }

    return 0;

}



char *num = NULL;



/*

 * send_proto:

 * sends PROTOCTL message to server, taking care of whether ZIP

 * should be enabled or not.

 */

void send_proto(aClient *cptr, ConfigItem_link *aconf)

{

char buf[1024];



    sprintf(buf, "CHANMODES=%s%s,%s%s,%s%s,%s%s NICKCHARS=%s",

        CHPAR1, EXPAR1, CHPAR2, EXPAR2, CHPAR3, EXPAR3, CHPAR4, EXPAR4, langsinuse);

#ifdef ZIP_LINKS

    if (aconf->options & CONNECT_ZIP)

    {

        sendto_one(cptr, "PROTOCTL %s ZIP %s", PROTOCTL_SERVER, buf);

    } else {

#endif

        sendto_one(cptr, "PROTOCTL %s %s", PROTOCTL_SERVER, buf);

#ifdef ZIP_LINKS

    }

#endif

}



#ifndef IRCDTOTALVERSION

#define IRCDTOTALVERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 PATCH5 PATCH6 PATCH7 PATCH8 PATCH9

#endif



/*

 * sends m_info into to sptr

*/



void m_info_send(aClient *sptr)

{

sendto_one(sptr, ":%s %d %s :|-=-=-=-=-=-= %s -=-=-=-=-=-=-", me.name, RPL_INFO, sptr->name, IRCDTOTALVERSION);

sendto_one(sptr, ":%s %d %s :| Sunucumuz Unreal3.2.3 üzerine modify edilerek hazırlanmıştır", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :|", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| IRCd Coder:", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :|", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| * RainmaN        <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| * WingmaN      <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| *        ", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :|", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| IRCd Tester:", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| * Cem        <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| * Oguz    <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| * NightwiSh    <
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
>", me.name, RPL_INFO, sptr->name);
sendto_one(sptr, ":%s %d %s :|", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| IRCd'de karşılaştığınız bug'ları", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| 
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
 adresine bildirebilirsiniz.", me.name, RPL_INFO, sptr->name);

sendto_one(sptr, ":%s %d %s :| IRCd destek icin 
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
yardim platformunu oneriyoruz.", me.name, RPL_INFO, sptr->name);

#ifdef _WIN32

#ifdef WIN32_SPECIFY

    sendto_one(sptr, ":%s %d %s :| wIRCd porter: | %s",

        me.name, RPL_INFO, sptr->name, WIN32_PORTER);

    sendto_one(sptr, ":%s %d %s :|    >>URL:    | %s",

        me.name, RPL_INFO, sptr->name, WIN32_URL);

#endif

#endif

    sendto_one(sptr,":%s %d %s :|-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-", me.name,RPL_INFO, sptr->name);

    sendto_one(sptr, ":%s %d %s :Hizmete geçiş tarihi: %s, derleme # %s", me.name,RPL_INFO, sptr->name, creation, generation);

    sendto_one(sptr, ":%s %d %s :Son online zamanı %s", me.name, RPL_INFO, sptr->name, myctime(me.firsttime));

    sendto_one(sptr, rpl_str(RPL_ENDOFINFO), me.name, sptr->name);

}





/*

** m_info

**    parv[0] = sender prefix

**    parv[1] = servername

**  Modified for hardcode by Stskeeps

*/



CMD_FUNC(m_info)

{



    if (hunt_server_token(cptr, sptr, MSG_INFO, TOK_INFO, ":%s", 1, parc,

        parv) == HUNTED_ISME)

    {

        m_info_send(sptr);

    }



    return 0;

}



/*

** m_dalinfo

**      parv[0] = sender prefix

**      parv[1] = servername

*/

CMD_FUNC(m_dalinfo)

{

    char **text = dalinfotext;



    if (hunt_server_token(cptr, sptr, MSG_DALINFO, TOK_DALINFO, ":%s", 1, parc,

        parv) == HUNTED_ISME)

    {

        while (*text)

            sendto_one(sptr, rpl_str(RPL_INFO),

                me.name, parv[0], *text++);



        sendto_one(sptr, rpl_str(RPL_INFO), me.name, parv[0], "");

        sendto_one(sptr,

            ":%s %d %s :Birth Date: %s, compile # %s",

            me.name, RPL_INFO, parv[0], creation, generation);

        sendto_one(sptr, ":%s %d %s :On-line since %s",

            me.name, RPL_INFO, parv[0], myctime(me.firsttime));

        sendto_one(sptr, rpl_str(RPL_ENDOFINFO), me.name, parv[0]);

    }



    return 0;

}



/*

** m_license

**      parv[0] = sender prefix

**      parv[1] = servername

*/

CMD_FUNC(m_license)

{

    char **text = gnulicense;



    if (hunt_server_token(cptr, sptr, MSG_LICENSE, TOK_LICENSE, ":%s", 1, parc,

        parv) == HUNTED_ISME)

    {

        while (*text)

            sendto_one(sptr, rpl_str(RPL_INFO),

                me.name, parv[0], *text++);



        sendto_one(sptr, rpl_str(RPL_INFO), me.name, parv[0], "");

        sendto_one(sptr, rpl_str(RPL_ENDOFINFO), me.name, parv[0]);

    }



    return 0;

}



/*

** m_credits

**      parv[0] = sender prefix

**      parv[1] = servername

*/

CMD_FUNC(m_credits)

{

    char **text = unrealcredits;



    if (hunt_server_token(cptr, sptr, MSG_CREDITS, TOK_CREDITS, ":%s", 1, parc,

        parv) == HUNTED_ISME)

    {

        while (*text)

            sendto_one(sptr, rpl_str(RPL_INFO),

                me.name, parv[0], *text++);



        sendto_one(sptr, rpl_str(RPL_INFO), me.name, parv[0], "");

        sendto_one(sptr,

            ":%s %d %s :Birth Date: %s, compile # %s",

            me.name, RPL_INFO, parv[0], creation, generation);

        sendto_one(sptr, ":%s %d %s :On-line since %s",

            me.name, RPL_INFO, parv[0], myctime(me.firsttime));

        sendto_one(sptr, rpl_str(RPL_ENDOFINFO), me.name, parv[0]);

    }



    return 0;

}





/*

 * RPL_NOWON    - Online at the moment (Succesfully added to WATCH-list)

 * RPL_NOWOFF    - Offline at the moement (Succesfully added to WATCH-list)

 * RPL_WATCHOFF    - Succesfully removed from WATCH-list.

 * ERR_TOOMANYWATCH - Take a guess :>  Too many WATCH entries.

 */

static void show_watch(aClient *cptr, char *name, int rpl1, int rpl2)

{

    aClient *acptr;





    if ((acptr = find_person(name, NULL)))

    {

        if (IsWebTV(cptr))

            sendto_one(cptr, ":IRC!IRC@%s PRIVMSG %s :%s (%s@%s) is on IRC",

                me.name, cptr->name, acptr->name, acptr->user->username,

                IsHidden(acptr) ? acptr->user->virthost : acptr->user->

                realhost);

        else

            sendto_one(cptr, rpl_str(rpl1), me.name, cptr->name,

                acptr->name, acptr->user->username,

                IsHidden(acptr) ? acptr->user->virthost : acptr->user->

                realhost, acptr->lastnick);

    }

    else

    {

        if (IsWebTV(cptr))

            sendto_one(cptr, ":IRC!IRC@%s PRIVMSG %s :%s is not on IRC", me.name,

                cptr->name, name);

        else   

            sendto_one(cptr, rpl_str(rpl2), me.name, cptr->name,

                name, "*", "*", 0);

    }

}



/*

 * m_watch

 */

CMD_FUNC(m_watch)

{

    aClient *acptr;

    char *s, **pav = parv, *user;

    char *p = NULL, *def = "l";







    if (parc < 2)

    {

        /*

        * Default to 'l' - list who's currently online

        */

        parc = 2;

        parv[1] = def;

    }



    for (s = (char *)strtoken(&p, *++pav, " "); s;

        s = (char *)strtoken(&p, NULL, " "))

    {

        if ((user = (char *)index(s, '!')))

            *user++ = '\0';    /* Not used */



        /*

        * Prefix of "+", they want to add a name to their WATCH

        * list.

        */

        if (*s == '+')

        {

            if (!*(s+1))

                continue;

            if (do_nick_name(s + 1))

            {

                if (sptr->watches >= MAXWATCH)

                {

                    sendto_one(sptr,

                        err_str(ERR_TOOMANYWATCH), me.name,

                        cptr->name, s + 1);



                    continue;

                }



                add_to_watch_hash_table(s + 1, sptr);

            }



            show_watch(sptr, s + 1, RPL_NOWON, RPL_NOWOFF);

            continue;

        }



        /*

        * Prefix of "-", coward wants to remove somebody from their

        * WATCH list.  So do it. :-)

        */

        if (*s == '-')

        {

            if (!*(s+1))

                continue;

            del_from_watch_hash_table(s + 1, sptr);

            show_watch(sptr, s + 1, RPL_WATCHOFF, RPL_WATCHOFF);



            continue;

        }



        /*

        * Fancy "C" or "c", they want to nuke their WATCH list and start

        * over, so be it.

        */

        if (*s == 'C' || *s == 'c')

        {

            hash_del_watch_list(sptr);



            continue;

        }



        /*

        * Now comes the fun stuff, "S" or "s" returns a status report of

        * their WATCH list.  I imagine this could be CPU intensive if its

        * done alot, perhaps an auto-lag on this?

        */

        if (*s == 'S' || *s == 's')

        {

            Link *lp;

            aWatch *anptr;

            int  count = 0;



            /*

            * Send a list of how many users they have on their WATCH list

            * and how many WATCH lists they are on.

            */

            anptr = hash_get_watch(sptr->name);

            if (anptr)

                for (lp = anptr->watch, count = 1;

                    (lp = lp->next); count++)

                    ;

            sendto_one(sptr, rpl_str(RPL_WATCHSTAT), me.name,

                parv[0], sptr->watches, count);



            /*

            * Send a list of everybody in their WATCH list. Be careful

            * not to buffer overflow.

            */

            if ((lp = sptr->watch) == NULL)

            {

                sendto_one(sptr, rpl_str(RPL_ENDOFWATCHLIST),

                    me.name, parv[0], *s);

                continue;

            }

            *buf = '\0';

            strlcpy(buf, lp->value.wptr->nick, sizeof buf);

            count =

                strlen(parv[0]) + strlen(me.name) + 10 +

                strlen(buf);

            while ((lp = lp->next))

            {

                if (count + strlen(lp->value.wptr->nick) + 1 >

                    BUFSIZE - 2)

                {

                    sendto_one(sptr, rpl_str(RPL_WATCHLIST),

                        me.name, parv[0], buf);

                    *buf = '\0';

                    count =

                        strlen(parv[0]) + strlen(me.name) +

                        10;

                }

                strcat(buf, " ");

                strcat(buf, lp->value.wptr->nick);

                count += (strlen(lp->value.wptr->nick) + 1);

            }

            sendto_one(sptr, rpl_str(RPL_WATCHLIST), me.name,

                parv[0], buf);



            sendto_one(sptr, rpl_str(RPL_ENDOFWATCHLIST), me.name,

                parv[0], *s);

            continue;

        }



        /*

        * Well that was fun, NOT.  Now they want a list of everybody in

        * their WATCH list AND if they are online or offline? Sheesh,

        * greedy arn't we?

        */

        if (*s == 'L' || *s == 'l')

        {

            Link *lp = sptr->watch;



            while (lp)

            {

                if ((acptr =

                    find_person(lp->value.wptr->nick, NULL)))

                {

                    sendto_one(sptr, rpl_str(RPL_NOWON),

                        me.name, parv[0], acptr->name,

                        acptr->user->username,

                        IsHidden(acptr) ? acptr->user->

                        virthost : acptr->user->realhost,

                        acptr->lastnick);

                }

                /*

                * But actually, only show them offline if its a capital

                * 'L' (full list wanted).

                */

                else if (isupper(*s))

                    sendto_one(sptr, rpl_str(RPL_NOWOFF),

                        me.name, parv[0],

                        lp->value.wptr->nick, "*", "*",

                        lp->value.wptr->lasttime);

                lp = lp->next;

            }



            sendto_one(sptr, rpl_str(RPL_ENDOFWATCHLIST), me.name,

                parv[0], *s);



            continue;

        }



        /*

        * Hmm.. unknown prefix character.. Ignore it. :-)

        */

    }



    return 0;

}



char *get_cptr_status(aClient *acptr)

{

    static char buf[10];

    char *p = buf;



    *p = '\0';

    *p++ = '[';

    if (acptr->flags & FLAGS_LISTEN)

    {

        if (acptr->umodes & LISTENER_NORMAL)

            *p++ = '*';

        if (acptr->umodes & LISTENER_SERVERSONLY)

            *p++ = 'S';

        if (acptr->umodes & LISTENER_CLIENTSONLY)

            *p++ = 'C';

#ifdef USE_SSL

        if (acptr->umodes & LISTENER_SSL)

            *p++ = 's';

#endif

        if (acptr->umodes & LISTENER_REMOTEADMIN)

            *p++ = 'R';

        if (acptr->umodes & LISTENER_JAVACLIENT)

            *p++ = 'J';

    }

    else

    {

#ifdef USE_SSL

        if (acptr->flags & FLAGS_SSL)

            *p++ = 's';

#endif

    }

    *p++ = ']';

    *p++ = '\0';

    return (buf);

}



/* Used to blank out ports -- Barubary */

char *get_client_name2(aClient *acptr, int showports)

{

    char *pointer = get_client_name(acptr, TRUE);



    if (!pointer)

        return NULL;

    if (showports)

        return pointer;

    if (!strrchr(pointer, '.'))

        return NULL;

    /*

    * This may seem like wack but remind this is only used

    * in rows of get_client_name2's, so it's perfectly fair

    *

    */

    strcpy((char *)strrchr((char *)pointer, '.'), ".0]");



    return pointer;

}



/*

** m_summon

** parv[0] = sender prefix

*/

CMD_FUNC(m_summon)

{

    /* /summon is old and out dated, we just return an error as

    * required by RFC1459 -- codemastr

    */ sendto_one(sptr, err_str(ERR_SUMMONDISABLED), me.name, parv[0]);

    return 0;

}

/*

** m_users

**    parv[0] = sender prefix

**    parv[1] = servername

*/

CMD_FUNC(m_users)

{

    /* /users is out of date, just return an error as  required by

    * RFC1459 -- codemastr

    */ sendto_one(sptr, err_str(ERR_USERSDISABLED), me.name, parv[0]);

    return 0;

}

/*

** Note: At least at protocol level ERROR has only one parameter,

** although this is called internally from other functions

** --msa

**

**    parv[0] = sender prefix

**    parv[*] = parameters

*/

CMD_FUNC(m_error)

{

    char *para;



    para = (parc > 1 && *parv[1] != '\0') ? parv[1] : "<>";



    Debug((DEBUG_ERROR, "Received ERROR message from %s: %s",

        sptr->name, para));

    /*

      ** Ignore error messages generated by normal user clients

      ** (because ill-behaving user clients would flood opers

      ** screen otherwise). Pass ERROR's from other sources to

      ** the local operator...

    */

    if (IsPerson(cptr) || IsUnknown(cptr))

        return 0;

    if (cptr == sptr)

    {

        sendto_serv_butone(&me, ":%s GLOBOPS :ERROR from %s -- %s",

            me.name, get_client_name(cptr, FALSE), para);

        sendto_locfailops("ERROR :from %s -- %s",

            get_client_name(cptr, FALSE), para);

    }

    else

    {

        sendto_serv_butone(&me,

            ":%s GLOBOPS :ERROR from %s via %s -- %s", me.name,

            sptr->name, get_client_name(cptr, FALSE), para);

        sendto_ops("ERROR :from %s via %s -- %s", sptr->name,

            get_client_name(cptr, FALSE), para);

    }

    return 0;

}



Link *helpign = NULL;



/* Now just empty ignore-list, in future reload dynamic help.

 * Move out to help.c -Donwulff */

void reset_help(void)

{

    free_str_list(helpign);

}



EVENT(save_tunefile)

{

    FILE *tunefile;



    tunefile = fopen(IRCDTUNE, "w");

    if (!tunefile)

    {

#if !defined(_WIN32) && !defined(_AMIGA)

        sendto_ops("Unable to write tunefile.. %s", strerror(errno));

#else

        sendto_ops("Unable to write tunefile..");

#endif

        return;

    }

    fprintf(tunefile, "%li\n", TSoffset);

    fprintf(tunefile, "%d\n", IRCstats.me_max);

    fclose(tunefile);

}



void load_tunefile(void)

{

    FILE *tunefile;

    char buf[1024];



    tunefile = fopen(IRCDTUNE, "r");

    if (!tunefile)

        return;

    fprintf(stderr, "* Loading tunefile..\n");

    fgets(buf, 1023, tunefile);

    TSoffset = atol(buf);

    fgets(buf, 1023, tunefile);

    IRCstats.me_max = atol(buf);

    fclose(tunefile);

}



/** Rehash motd and rule files (MPATH/RPATH and all tld entries). */

void rehash_motdrules()

{

ConfigItem_tld *tlds;



    motd = (aMotd *) read_file_ex(MPATH, &motd, &motd_tm);

    rules = (aMotd *) read_file(RPATH, &rules);

    smotd = (aMotd *) read_file_ex(SMPATH, &smotd, &smotd_tm);

    for (tlds = conf_tld; tlds; tlds = (ConfigItem_tld *) tlds->next)

    {

        tlds->motd = read_file_ex(tlds->motd_file, &tlds->motd, &tlds->motd_tm);

        tlds->rules = read_file(tlds->rules_file, &tlds->rules);

        if (tlds->smotd_file)

            tlds->smotd = read_file_ex(tlds->smotd_file, &tlds->smotd, &tlds->smotd_tm);

        if (tlds->opermotd_file)

            tlds->opermotd = read_file(tlds->opermotd_file, &tlds->opermotd);

        if (tlds->botmotd_file)

            tlds->botmotd = read_file(tlds->botmotd_file, &tlds->botmotd);

    }

}



void reread_motdsandrules()

{

    motd = (aMotd *) read_file_ex(MPATH, &motd, &motd_tm);

    rules = (aMotd *) read_file(RPATH, &rules);

    smotd = (aMotd *) read_file_ex(SMPATH, &smotd, &smotd_tm);

    botmotd = (aMotd *) read_file(BPATH, &botmotd);

    opermotd = (aMotd *) read_file(OPATH, &opermotd);

}



/*

** m_rehash

** remote rehash by binary

** now allows the -flags in remote rehash

** ugly code but it seems to work :) -- codemastr

** added -all and fixed up a few lines -- niquil (
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
)

** fixed remote rehashing, but it's getting a bit weird code again -- Syzop

** removed '-all' code, this is now considered as '/rehash', this is ok

** since we rehash everything with simple '/rehash' now. Syzop/20040205

*/

CMD_FUNC(m_rehash)

{

    int  x;



    if (MyClient(sptr) && !OPCanRehash(sptr))

    {

        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

        return 0;

    }

    if (!MyClient(sptr) && !IsNetAdmin(sptr)

        && !IsULine(sptr))

    {

        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

        return 0;

    }

    x = 0;



    if (BadPtr(parv[2])) {

        /* If the argument starts with a '-' (like -motd, -opermotd, etc) then it's

        * assumed not to be a server. -- Syzop

        */

        if (parv[1] && (parv[1][0] == '-'))

            x = HUNTED_ISME;

        else

            x = hunt_server_token(cptr, sptr, MSG_REHASH, TOK_REHASH, "%s", 1, parc, parv);

    } else {

        x = hunt_server_token(cptr, sptr, MSG_REHASH, TOK_REHASH, "%s %s", 1, parc, parv);

    }

    if (x != HUNTED_ISME)

        return 0; /* Now forwarded or server didnt exist */



    if (cptr != sptr)

    {

#ifndef REMOTE_REHASH

        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

        return 0;

#endif

        if (parv[2] == NULL)

        {

            if (loop.ircd_rehashing)

            {

                sendto_one(sptr, ":%s NOTICE %s :A rehash is already in progress",

                    me.name, sptr->name);

                return 0;

            }

            sendto_serv_butone(&me,

                ":%s GLOBOPS :%s is remotely rehashing server config file",

                me.name, sptr->name);

            sendto_ops

                ("%s is remotely rehashing server config file",

                parv[0]);

            reread_motdsandrules();

            return rehash(cptr, sptr,

                (parc > 1) ? ((*parv[1] == 'q') ? 2 : 0) : 0);

        }

        parv[1] = parv[2];

    }



    if (!BadPtr(parv[1]) && strcmp(parv[1], "-all"))

    {



        if (!IsAdmin(sptr) && !IsCoAdmin(sptr))

        {

            sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

            return 0;

        }



        if (*parv[1] == '-')

        {

            if (!strnicmp("-gar", parv[1], 4))

            {

                loop.do_garbage_collect = 1;

                RunHook3(HOOKTYPE_REHASHFLAG, cptr, sptr, parv[1]);

                return 0;

            }

            if (!_match("-o*motd", parv[1]))

            {

                sendto_ops

                    ("%sRehashing OperMOTD on request of %s",

                    cptr != sptr ? "Remotely " : "",

                    sptr->name);

                if (cptr != sptr)

                    sendto_serv_butone(&me, ":%s GLOBOPS :%s is remotely rehashing OperMOTD", me.name, sptr->name);

                opermotd = (aMotd *) read_file(OPATH, &opermotd);

                RunHook3(HOOKTYPE_REHASHFLAG, cptr, sptr, parv[1]);

                return 0;

            }

            if (!_match("-b*motd", parv[1]))

            {

                sendto_ops

                    ("%sRehashing BotMOTD on request of %s",

                    cptr != sptr ? "Remotely " : "",

                    sptr->name);

                if (cptr != sptr)

                    sendto_serv_butone(&me, ":%s GLOBOPS :%s is remotely rehashing BotMOTD", me.name, sptr->name);

                botmotd = (aMotd *) read_file(BPATH, &botmotd);

                RunHook3(HOOKTYPE_REHASHFLAG, cptr, sptr, parv[1]);

                return 0;

            }

            if (!strnicmp("-motd", parv[1], 5)

                || !strnicmp("-rules", parv[1], 6))

            {

                sendto_ops

                    ("%sRehashing all MOTDs and RULES on request of %s",

                    cptr != sptr ? "Remotely " : "",

                    sptr->name);

                if (cptr != sptr)

                    sendto_serv_butone(&me, ":%s GLOBOPS :%s is remotely rehashing all MOTDs and RULES", me.name, sptr->name);

                rehash_motdrules();

                RunHook3(HOOKTYPE_REHASHFLAG, cptr, sptr, parv[1]);

                return 0;

            }

            RunHook3(HOOKTYPE_REHASHFLAG, cptr, sptr, parv[1]);

            return 0;

        }

    }

    else

    {

        if (loop.ircd_rehashing)

        {

            sendto_one(sptr, ":%s NOTICE %s :A rehash is already in progress",

                me.name, sptr->name);

            return 0;

        }

        sendto_ops("%s is rehashing server config file", parv[0]);

    }



    /* Normal rehash, rehash motds&rules too, just like the on in the tld block will :p */

    reread_motdsandrules();

    if (cptr == sptr)

        sendto_one(sptr, rpl_str(RPL_REHASHING), me.name, parv[0], configfile);

    return rehash(cptr, sptr, (parc > 1) ? ((*parv[1] == 'q') ? 2 : 0) : 0);

}



/*

** m_restart

**

** parv[1] - password *OR* reason if no X:line

** parv[2] - reason for restart (optional & only if X:line exists)

**

** The password is only valid if there is a matching X line in the

** config file. If it is not,  then it becomes the

*/

CMD_FUNC(m_restart)

{

    char *reason = NULL;

    /* Check permissions */

        if (MyClient(sptr) && !OPCanRestart(sptr))

        {

                sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

                return 0;

        }

        if (!MyClient(sptr) && !IsNetAdmin(sptr)

            && !IsULine(sptr))

        {

                sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

                return 0;

        }



    /* Syntax: /restart */

    if (parc == 1)

    {

        if (conf_drpass)

        {

            sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name,

                            parv[0], "RESTART");

                        return 0;

        }

    }

    else if (parc == 2)

    {

        /* Syntax: /restart <pass> */

        if (conf_drpass)

        {

            int ret;

            ret = Auth_Check(cptr, conf_drpass->restartauth, parv[1]);

            if (ret == -1)

            {

                sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name,

                      parv[0]);

                return 0;

            }

            if (ret < 1)

                return 0;

        }

        /* Syntax: /rehash <reason> */

        else

            reason = parv[1];

    }

    else if (parc > 2)

    {

        /* Syntax: /restart <pass> <reason> */

        if (conf_drpass)

        {

            int ret;

            ret = Auth_Check(cptr, conf_drpass->restartauth, parv[1]);

            if (ret == -1)

            {

                sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name,

                      parv[0]);

                return 0;

            }

            if (ret < 1)

                return 0;

        }

        reason = parv[2];

    }

    sendto_ops("Server is Restarting by request of %s", parv[0]);

    server_reboot(reason ? reason : "No reason");

    return 0;

}



/*

 * Heavily modified from the ircu m_motd by codemastr

 * Also svsmotd support added

 */

int short_motd(aClient *sptr) {

    ConfigItem_tld *ptr;

    aMotd *temp;

    struct tm *tm = &smotd_tm;

    char userhost[HOSTLEN + USERLEN + 6];

    char is_short = 1;

    strlcpy(userhost,make_user_host(sptr->user->username, sptr->user->realhost), sizeof userhost);

    ptr = Find_tld(sptr, userhost);



    if (ptr)

    {

        if (ptr->smotd)

        {

            temp = ptr->smotd;

            tm = &ptr->smotd_tm;

        }

        else if (smotd)

            temp = smotd;

        else

        {

            temp = ptr->motd;

            tm = &ptr->motd_tm;

            is_short = 0;

        }

    }

    else

    {

        if (smotd)

            temp = smotd;

        else

        {

            temp = motd;

            tm = &motd_tm;

            is_short = 0;

        }

    }



    if (!temp)

    {

        sendto_one(sptr, err_str(ERR_NOMOTD), me.name, sptr->name);

        return 0;

    }

    if (tm)

    {

        sendto_one(sptr, rpl_str(RPL_MOTDSTART), me.name, sptr->name,

            me.name);

        sendto_one(sptr, ":%s %d %s :- %d/%d/%d %d:%02d", me.name,

            RPL_MOTD, sptr->name, tm->tm_mday, tm->tm_mon + 1,

            1900 + tm->tm_year, tm->tm_hour, tm->tm_min);

    }

    if (is_short)

    {

        sendto_one(sptr, rpl_str(RPL_MOTD), me.name, sptr->name,

            "This is the short MOTD. To view the complete MOTD type /motd");

        sendto_one(sptr, rpl_str(RPL_MOTD), me.name, sptr->name, "");

    }



    while (temp)

    {

        sendto_one(sptr, rpl_str(RPL_MOTD), me.name, sptr->name,

            temp->line);

        temp = temp->next;

    }

    sendto_one(sptr, rpl_str(RPL_ENDOFMOTD), me.name, sptr->name);

    return 0;

}





/*

 * Heavily modified from the ircu m_motd by codemastr

 * Also svsmotd support added

 */

CMD_FUNC(m_motd)

{

    ConfigItem_tld *ptr;

    aMotd *temp, *temp2;

    struct tm *tm = &motd_tm;

    int  svsnofile = 0;

    char userhost[HOSTLEN + USERLEN + 6];



    if (IsServer(sptr))

        return 0;

    if (hunt_server_token(cptr, sptr, MSG_MOTD, TOK_MOTD, ":%s", 1, parc, parv) !=

HUNTED_ISME)

        return 0;

#ifndef TLINE_Remote

    if (!MyConnect(sptr))

    {

        temp = motd;

        goto playmotd;

    }

#endif

    strlcpy(userhost,make_user_host(cptr->user->username, cptr->user->realhost), sizeof userhost);

    ptr = Find_tld(sptr, userhost);



    if (ptr)

    {

        temp = ptr->motd;

        tm = &ptr->motd_tm;

    }

    else

        temp = motd;



      playmotd:

    if (temp == NULL)

    {

        sendto_one(sptr, err_str(ERR_NOMOTD), me.name, parv[0]);

        svsnofile = 1;

        goto svsmotd;



    }



    if (tm)

    {

        sendto_one(sptr, rpl_str(RPL_MOTDSTART), me.name, parv[0],

            me.name);

        sendto_one(sptr, ":%s %d %s :- %d/%d/%d %d:%02d", me.name,

            RPL_MOTD, parv[0], tm->tm_mday, tm->tm_mon + 1,

            1900 + tm->tm_year, tm->tm_hour, tm->tm_min);

    }



    while (temp)

    {

        sendto_one(sptr, rpl_str(RPL_MOTD), me.name, parv[0],

            temp->line);

        temp = temp->next;

    }

      svsmotd:

    temp2 = svsmotd;

    while (temp2)

    {

        sendto_one(sptr, rpl_str(RPL_MOTD), me.name, parv[0],

            temp2->line);

        temp2 = temp2->next;

    }

    if (svsnofile == 0)

        sendto_one(sptr, rpl_str(RPL_ENDOFMOTD), me.name, parv[0]);

    return 0;

}

/*

 * Modified from comstud by codemastr

 */

CMD_FUNC(m_opermotd)

{

    aMotd *temp;

    ConfigItem_tld *ptr;

    char userhost[HOSTLEN + USERLEN + 6];

    strlcpy(userhost,make_user_host(cptr->user->username, cptr->user->realhost), sizeof userhost);

    ptr = Find_tld(sptr, userhost);



    if (ptr)

    {

        if (ptr->opermotd)

            temp = ptr->opermotd;

        else

            temp = opermotd;

    }

    else

        temp = opermotd;



    if (!IsAnOper(sptr))

    {

        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

        return 0;

    }



    if (!temp)

    {

        sendto_one(sptr, err_str(ERR_NOOPERMOTD), me.name, parv[0]);

        return 0;

    }

    sendto_one(sptr, rpl_str(RPL_MOTDSTART), me.name, parv[0], me.name);

    sendto_one(sptr, rpl_str(RPL_MOTD), me.name, parv[0],

        "IRC Operator Message of the Day");



    while (temp)

    {

        sendto_one(sptr, rpl_str(RPL_MOTD), me.name, parv[0],

            temp->line);

        temp = temp->next;

    }

    sendto_one(sptr, rpl_str(RPL_ENDOFMOTD), me.name, parv[0]);

    return 0;

}



/*

 * A merge from ircu and bahamut, and some extra stuff added by codemastr

 * we can now use 1 function for multiple files -- codemastr

 * Merged read_motd/read_rules stuff into this -- Syzop

 */



/** Read motd-like file, used for rules/motd/botmotd/opermotd/etc.

 * @param filename Filename of file to read.

 * @param list Reference to motd pointer (used for freeing if needed, can be NULL)

 * @returns Pointer to MOTD or NULL if reading failed.

 */

aMotd *read_file(char *filename, aMotd **list)

{

    return read_file_ex(filename, list, NULL);

}



/** Read motd-like file, used for rules/motd/botmotd/opermotd/etc.

 * @param filename Filename of file to read.

 * @param list Reference to motd pointer (used for freeing if needed, NULL allowed)

 * @param t Pointer to struct tm to store filedatetime info in (NULL allowed)

 * @returns Pointer to MOTD or NULL if reading failed.

 */

aMotd *read_file_ex(char *filename, aMotd **list, struct tm *t)

{



    int  fd = open(filename, O_RDONLY);

    aMotd *temp, *newmotd, *last, *old;

    char line[82];

    char *tmp;

    int  i;



    if (fd == -1)

        return NULL;



    if (list)

    {

        while (*list)

        {

            old = (*list)->next;

            MyFree((*list)->line);

            MyFree(*list);

            *list  = old;

        }

    }



    if (t)

    {

        struct tm *ttmp;

        struct stat sb;

        if (!fstat(fd, &sb))

        {

            ttmp = localtime(&sb.st_mtime);

            memcpy(t, ttmp, sizeof(struct tm));

        } else {

            /* Sure, fstat() shouldn't fail, but... */

            memset(t, 0, sizeof(struct tm));

        }

    }



    (void)dgets(-1, NULL, 0);    /* make sure buffer is at empty pos */



    newmotd = last = NULL;

    while ((i = dgets(fd, line, 81)) > 0)

    {

        line[i] = '\0';

        if ((tmp = (char *)strchr(line, '\n')))

            *tmp = '\0';

        if ((tmp = (char *)strchr(line, '\r')))

            *tmp = '\0';

        temp = (aMotd *) MyMalloc(sizeof(aMotd));

        if (!temp)

            outofmemory();

        AllocCpy(temp->line, line);

        temp->next = NULL;

        if (!newmotd)

            newmotd = temp;

        else

            last->next = temp;

        last = temp;

    }

    close(fd);

    return newmotd;



}



/*

 * Modified from comstud by codemastr

 */

CMD_FUNC(m_botmotd)

{

    aMotd *temp;

    ConfigItem_tld *ptr;

    char userhost[HOSTLEN + USERLEN + 6];



    if (hunt_server_token(cptr, sptr, MSG_BOTMOTD, TOK_BOTMOTD, ":%s", 1, parc,

        parv) != HUNTED_ISME)

        return 0;



    if (!IsPerson(sptr))

        return 0;



    strlcpy(userhost,make_user_host(sptr->user->username, sptr->user->realhost), sizeof userhost);

    ptr = Find_tld(sptr, userhost);



    if (ptr)

    {

        if (ptr->botmotd)

            temp = ptr->botmotd;

        else

            temp = botmotd;

    }

    else

        temp = botmotd;



    if (!temp)

    {

        sendto_one(sptr, ":%s NOTICE %s :BOTMOTD File not found",

            me.name, sptr->name);

        return 0;

    }

    sendto_one(sptr, ":%s NOTICE %s :- %s Bot Message of the Day - ",

        me.name, sptr->name, me.name);



    while (temp)

    {

        sendto_one(sptr, ":%s NOTICE %s :- %s", me.name, sptr->name, temp->line);

        temp = temp->next;

    }

    sendto_one(sptr, ":%s NOTICE %s :End of /BOTMOTD command.", me.name, sptr->name);

    return 0;

}



/* m_die, this terminates the server, and it intentionally does not

 * have a reason. If you use it you should first do a GLOBOPS and

 * then a server notice to let everyone know what is going down...

 */

CMD_FUNC(m_die)

{

    aClient *acptr;

    int  i;

    if (!MyClient(sptr) || !OPCanDie(sptr))

    {

        sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]);

        return 0;

    }



    if (conf_drpass)    /* See if we have and DIE/RESTART password */

    {

        if (parc < 2)    /* And if so, require a password :) */

        {

            sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name,

                parv[0], "DIE");

            return 0;

        }

        i = Auth_Check(cptr, conf_drpass->dieauth, parv[1]);

        if (i == -1)

        {

            sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name,

                parv[0]);

            return 0;

        }

        if (i < 1)

        {

            return 0;

        }

    }



    /* Let the +s know what is going on */

    sendto_ops("Server Terminating by request of %s", parv[0]);



    for (i = 0; i <= LastSlot; i++)

    {

        if (!(acptr = local[i]))

            continue;

        if (IsClient(acptr))

            sendto_one(acptr,

                ":%s %s %s :Server Terminating. %s",

                me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name, sptr->name);

        else if (IsServer(acptr))

            sendto_one(acptr, ":%s ERROR :Terminated by %s",

                me.name, get_client_name(sptr, TRUE));

    }

    (void)s_die();

    return 0;

}



#ifdef _WIN32

/*

 * Added to let the local console shutdown the server without just

 * calling exit(-1), in Windows mode.  -Cabal95

 */

int  localdie(void)

{

    aClient *acptr;

    int  i;



    for (i = 0; i <= LastSlot; i++)

    {

        if (!(acptr = local[i]))

            continue;

        if (IsClient(acptr))

            sendto_one(acptr,

                ":%s %s %s :Server Terminated by local console",

                me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name);

        else if (IsServer(acptr))

            sendto_one(acptr,

                ":%s ERROR :Terminated by local console", me.name);

    }

    (void)s_die();

    return 0;

}



#endif



aClient *find_match_server(char *mask)

{

    aClient *acptr;



    if (BadPtr(mask))

        return NULL;

    for (acptr = client, collapse(mask); acptr; acptr = acptr->next)

    {

        if (!IsServer(acptr) && !IsMe(acptr))

            continue;

        if (!match(mask, acptr->name))

            break;

        continue;

    }

    return acptr;

}



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

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