00001 #include "inspircd.h"
00002 #include "inspircd_io.h"
00003 #include "inspircd_util.h"
00004 #include "inspircd_config.h"
00005 #include <unistd.h>
00006 #include <fcntl.h>
00007 #include <sys/errno.h>
00008 #include <sys/ioctl.h>
00009 #include <sys/utsname.h>
00010 #include <cstdio>
00011 #include <time.h>
00012 #include <string>
00013 #ifdef GCC3
00014 #include <ext/hash_map>
00015 #else
00016 #include <hash_map>
00017 #endif
00018 #include <map>
00019 #include <sstream>
00020 #include <vector>
00021 #include <errno.h>
00022 #include <deque>
00023 #include <errno.h>
00024 #include <unistd.h>
00025 #include <sched.h>
00026 #include "connection.h"
00027 #include "users.h"
00028 #include "servers.h"
00029 #include "ctables.h"
00030 #include "globals.h"
00031 #include "modules.h"
00032 #include "dynamic.h"
00033 #include "wildcard.h"
00034 #include "message.h"
00035 #include "mode.h"
00036 #include "xline.h"
00037
00038 #ifdef GCC3
00039 #define nspace __gnu_cxx
00040 #else
00041 #define nspace std
00042 #endif
00043
00044 using namespace std;
00045
00046 extern int MODCOUNT;
00047 extern vector<Module*> modules;
00048 extern vector<ircd_module*> factory;
00049
00050 extern int LogLevel;
00051 extern char ServerName[MAXBUF];
00052 extern char Network[MAXBUF];
00053 extern char ServerDesc[MAXBUF];
00054 extern char AdminName[MAXBUF];
00055 extern char AdminEmail[MAXBUF];
00056 extern char AdminNick[MAXBUF];
00057 extern char diepass[MAXBUF];
00058 extern char restartpass[MAXBUF];
00059 extern char motd[MAXBUF];
00060 extern char rules[MAXBUF];
00061 extern char list[MAXBUF];
00062 extern char PrefixQuit[MAXBUF];
00063 extern char DieValue[MAXBUF];
00064
00065 extern int debugging;
00066 extern int WHOWAS_STALE;
00067 extern int WHOWAS_MAX;
00068 extern int DieDelay;
00069 extern time_t startup_time;
00070 extern int NetBufferSize;
00071 int MaxWhoResults;
00072 extern time_t nb_start;
00073
00074 extern std::vector<int> fd_reap;
00075 extern std::vector<std::string> module_names;
00076
00077 extern char bannerBuffer[MAXBUF];
00078 extern int boundPortCount;
00079 extern int portCount;
00080 extern int UDPportCount;
00081 extern int ports[MAXSOCKS];
00082 extern int defaultRoute;
00083
00084 extern std::vector<long> auth_cookies;
00085 extern std::stringstream config_f;
00086
00087 extern serverrec* me[32];
00088
00089 extern FILE *log_file;
00090
00091
00092 using namespace std;
00093
00094 std::vector<ModeParameter> custom_mode_params;
00095
00096 chanrec::chanrec()
00097 {
00098 strcpy(name,"");
00099 strcpy(custom_modes,"");
00100 strcpy(topic,"");
00101 strcpy(setby,"");
00102 strcpy(key,"");
00103 created = topicset = limit = 0;
00104 topiclock = noexternal = inviteonly = moderated = secret = c_private = false;
00105 }
00106
00107 void chanrec::SetCustomMode(char mode,bool mode_on)
00108 {
00109 if (mode_on) {
00110 char m[3];
00111 m[0] = mode;
00112 m[1] = '\0';
00113 if (!strchr(this->custom_modes,mode))
00114 {
00115 strncat(custom_modes,m,MAXMODES);
00116 }
00117 log(DEBUG,"Custom mode %c set",mode);
00118 }
00119 else {
00120 char temp[MAXBUF];
00121 int count = 0;
00122 for (int q = 0; q < strlen(custom_modes); q++) {
00123 if (custom_modes[q] != mode) {
00124 temp[count++] = mode;
00125 }
00126 }
00127 temp[count] = '\0';
00128 strncpy(custom_modes,temp,MAXMODES);
00129 log(DEBUG,"Custom mode %c removed",mode);
00130 this->SetCustomModeParam(mode,"",false);
00131 }
00132 }
00133
00134
00135 void chanrec::SetCustomModeParam(char mode,char* parameter,bool mode_on)
00136 {
00137
00138 log(DEBUG,"SetCustomModeParam called");
00139 ModeParameter M;
00140 M.mode = mode;
00141 strcpy(M.channel,this->name);
00142 strcpy(M.parameter,parameter);
00143 if (mode_on)
00144 {
00145 log(DEBUG,"Custom mode parameter %c %s added",mode,parameter);
00146 custom_mode_params.push_back(M);
00147 }
00148 else
00149 {
00150 if (custom_mode_params.size())
00151 {
00152 for (vector<ModeParameter>::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++)
00153 {
00154 if ((i->mode == mode) && (!strcasecmp(this->name,i->channel)))
00155 {
00156 log(DEBUG,"Custom mode parameter %c %s removed",mode,parameter);
00157 custom_mode_params.erase(i);
00158 return;
00159 }
00160 }
00161 }
00162 log(DEBUG,"*** BUG *** Attempt to remove non-existent mode parameter!");
00163 }
00164 }
00165
00166 bool chanrec::IsCustomModeSet(char mode)
00167 {
00168 log(DEBUG,"Checking ISCustomModeSet: %c %s",mode,this->custom_modes);
00169 return (strchr(this->custom_modes,mode) != 0);
00170 }
00171
00172 std::string chanrec::GetModeParameter(char mode)
00173 {
00174 if (custom_mode_params.size())
00175 {
00176 for (vector<ModeParameter>::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++)
00177 {
00178 if ((i->mode == mode) && (!strcasecmp(this->name,i->channel)))
00179 {
00180 return std::string(i->parameter);
00181 }
00182 }
00183 }
00184 return std::string("");
00185 }