diff --git a/Changes b/Changes index 102d6a6b3..1e7cf4b45 100644 --- a/Changes +++ b/Changes @@ -335,3 +335,4 @@ - Modified an old Unreal3.1.1 to be network file converter, and converted all of the networks files to the new format. - Fixed a bug with RAKILL and UNSQLINE not working +- Moved m_chgident to an .so diff --git a/src/modules/Makefile b/src/modules/Makefile index 706e8f8b2..7e6d4ff73 100644 --- a/src/modules/Makefile +++ b/src/modules/Makefile @@ -19,9 +19,9 @@ #* $Id$ #*/ -COMMANDS_MODULES=m_sethost.so m_chghost.so +COMMANDS_MODULES=m_sethost.so m_chghost.so m_chgident.so -COMMANDS=m_sethost.c m_chghost.c +COMMANDS=m_sethost.c m_chghost.c m_chgident.c MODULES=commands.so $(COMMANDS_MODULES) @@ -41,5 +41,9 @@ m_chghost.so: m_chghost.c $(INCLUDES) $(CC) $(CFLAGS) -fPIC -DPIC -shared -DDYNAMIC_LINKING \ -o m_chghost.so m_chghost.c +m_chgident.so: m_chgident.c $(INCLUDES) + $(CC) $(CFLAGS) -fPIC -DPIC -shared -DDYNAMIC_LINKING \ + -o m_chgident.so m_chgident.c + clean: $(RM) -f *.o *.so *~ core diff --git a/src/modules/l_commands.c b/src/modules/l_commands.c index 9aec14b15..a71b49447 100644 --- a/src/modules/l_commands.c +++ b/src/modules/l_commands.c @@ -79,6 +79,8 @@ void l_commands_init(void) */ m_sethost_init(); m_chghost_init(); + m_chgident_init(); + module_buffer = &l_commands_info; } @@ -90,5 +92,6 @@ void l_commands_unload(void) { m_sethost_unload(); m_chghost_unload(); + m_chgident_unload(); } diff --git a/src/modules/m_chgident.c b/src/modules/m_chgident.c new file mode 100644 index 000000000..6e9060eba --- /dev/null +++ b/src/modules/m_chgident.c @@ -0,0 +1,194 @@ +/* + * IRC - Internet Relay Chat, src/modules/m_chgident.c + * (C) 1999-2001 Carsten Munk (Techie/Stskeeps) + * + * 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 "userload.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include "h.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif + +#define MSG_CHGIDENT "CHGIDENT" +#define TOK_CHGIDENT "AZ" + +DLLFUNC int m_chgident(aClient *cptr, aClient *sptr, int parc, char *parv[]); + +ModuleInfo m_chgident_info + = { + 1, + "chgident", /* Name of module */ + "$Id$", /* Version */ + "/chgident", /* Short description of module */ + NULL, /* Pointer to our dlopen() return value */ + NULL + }; + +/* + * The purpose of these ifdefs, are that we can "static" link the ircd if we + * want to +*/ + +#ifdef DYNAMIC_LINKING +DLLFUNC void mod_init(void) +#else +void m_chgident_init(void) +#endif +{ + /* extern variable to export m_chgident_info to temporary + ModuleInfo *modulebuffer; + the module_load() will use this to add to the modules linked + list + */ + module_buffer = &m_chgident_info; + /* + * We call our add_Command crap here + */ + add_Command(MSG_CHGIDENT, TOK_CHGIDENT, m_chgident, MAXPARA); +} + +#ifdef DYNAMIC_LINKING +DLLFUNC void mod_unload(void) +#else +void m_chgident_unload(void) +#endif +{ + if (del_Command(MSG_CHGIDENT, TOK_CHGIDENT, m_chgident) < 0) + { + sendto_realops("Failed to delete commands when unloading %s", + m_chgident_info.name); + } +} + +/* + * m_chgident - 12/07/1999 (two months after I made SETIDENT) - Stskeeps + * :prefix CHGIDENT + * parv[0] - sender + * parv[1] - nickname + * parv[2] - identname + * +*/ + +int m_chgident(aClient *cptr, aClient *sptr, int parc, char *parv[]) +{ + aClient *acptr; + char *s; + int legalident = 1; + +#ifdef DISABLE_USERMOD + if (MyClient(sptr)) + { + sendto_one(sptr, ":%s NOTICE %s :*** The /chgident command is disabled on this server", me.name, sptr->name); + return 0; + } +#endif + + if (MyClient(sptr)) + if (!IsAnOper(sptr)) + { + sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, + parv[0]); + return 0; + + } + + if (parc < 3) + { + sendto_one(sptr, + ":%s NOTICE %s :*** /ChgIdent syntax is /ChgIdent ", + me.name, sptr->name); + return 0; + } + + if (strlen(parv[2]) < 1) + { + sendto_one(sptr, + ":%s NOTICE %s :*** Write atleast something to change the ident to!", + me.name, sptr->name); + return 0; + } + + if (strlen(parv[2]) > (USERLEN)) + { + sendto_one(sptr, + ":%s NOTICE %s :*** ChgIdent Error: Too long ident!!", + me.name, sptr->name); + return 0; + } + + /* illegal?! */ + for (s = parv[2]; *s; s++) + { + if (!isallowed(*s)) + { + legalident = 0; + } + } + + if (legalident == 0) + { + sendto_one(sptr, + ":%s NOTICE %s :*** /ChgIdent Error: A ident may contain a-z, A-Z, 0-9, '-' & '.' - Please only use them", + me.name, parv[0]); + return 0; + } + + if ((acptr = find_person(parv[1], NULL))) + { + if (!IsULine(sptr)) + { + sendto_umode(UMODE_EYES, + "%s changed the virtual ident of %s (%s@%s) to be %s", + sptr->name, acptr->name, acptr->user->username, + (acptr->umodes & UMODE_HIDE ? acptr-> + user->realhost : acptr->user->realhost), parv[2]); + } + sendto_serv_butone_token(cptr, sptr->name, + MSG_CHGIDENT, + TOK_CHGIDENT, "%s %s", acptr->name, parv[2]); + ircsprintf(acptr->user->username, "%s", parv[2]); + return 0; + } + else + { + sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, sptr->name, + parv[1]); + return 0; + } + return 0; +}