<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>InspIRCd: channels.cpp Source File</title> <link href="inspircd.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.3.3 --> <div class="qindex"><a class="qindex" href="main.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>channels.cpp</h1><a href="channels_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/* +------------------------------------+</span> 00002 <span class="comment"> * | Inspire Internet Relay Chat Daemon |</span> 00003 <span class="comment"> * +------------------------------------+</span> 00004 <span class="comment"> *</span> 00005 <span class="comment"> * Inspire is copyright (C) 2002-2004 ChatSpike-Dev.</span> 00006 <span class="comment"> * E-mail:</span> 00007 <span class="comment"> * <brain@chatspike.net></span> 00008 <span class="comment"> * <Craig@chatspike.net></span> 00009 <span class="comment"> * </span> 00010 <span class="comment"> * Written by Craig Edwards, Craig McLure, and others.</span> 00011 <span class="comment"> * This program is free but copyrighted software; see</span> 00012 <span class="comment"> * the file COPYING for details.</span> 00013 <span class="comment"> *</span> 00014 <span class="comment"> * ---------------------------------------------------</span> 00015 <span class="comment"> */</span> 00016 00017 <span class="preprocessor">#include "inspircd.h"</span> 00018 <span class="preprocessor">#include "inspircd_io.h"</span> 00019 <span class="preprocessor">#include "inspircd_util.h"</span> 00020 <span class="preprocessor">#include "inspircd_config.h"</span> 00021 <span class="preprocessor">#include <unistd.h></span> 00022 <span class="preprocessor">#include <fcntl.h></span> 00023 <span class="preprocessor">#include <sys/errno.h></span> 00024 <span class="preprocessor">#include <sys/ioctl.h></span> 00025 <span class="preprocessor">#include <sys/utsname.h></span> 00026 <span class="preprocessor">#include <cstdio></span> 00027 <span class="preprocessor">#include <time.h></span> 00028 <span class="preprocessor">#include <string></span> 00029 <span class="preprocessor">#ifdef GCC3</span> 00030 <span class="preprocessor"></span><span class="preprocessor">#include <ext/hash_map></span> 00031 <span class="preprocessor">#else</span> 00032 <span class="preprocessor"></span><span class="preprocessor">#include <hash_map></span> 00033 <span class="preprocessor">#endif</span> 00034 <span class="preprocessor"></span><span class="preprocessor">#include <map></span> 00035 <span class="preprocessor">#include <sstream></span> 00036 <span class="preprocessor">#include <vector></span> 00037 <span class="preprocessor">#include <errno.h></span> 00038 <span class="preprocessor">#include <deque></span> 00039 <span class="preprocessor">#include <errno.h></span> 00040 <span class="preprocessor">#include <unistd.h></span> 00041 <span class="preprocessor">#include <sched.h></span> 00042 <span class="preprocessor">#include "<a class="code" href="connection_8h.html">connection.h</a>"</span> 00043 <span class="preprocessor">#include "<a class="code" href="users_8h.html">users.h</a>"</span> 00044 <span class="preprocessor">#include "<a class="code" href="servers_8h.html">servers.h</a>"</span> 00045 <span class="preprocessor">#include "<a class="code" href="ctables_8h.html">ctables.h</a>"</span> 00046 <span class="preprocessor">#include "globals.h"</span> 00047 <span class="preprocessor">#include "<a class="code" href="modules_8h.html">modules.h</a>"</span> 00048 <span class="preprocessor">#include "dynamic.h"</span> 00049 <span class="preprocessor">#include "wildcard.h"</span> 00050 <span class="preprocessor">#include "<a class="code" href="message_8h.html">message.h</a>"</span> 00051 <span class="preprocessor">#include "<a class="code" href="mode_8h.html">mode.h</a>"</span> 00052 <span class="preprocessor">#include "<a class="code" href="xline_8h.html">xline.h</a>"</span> 00053 <span class="preprocessor">#include "inspstring.h"</span> 00054 00055 <span class="preprocessor">#ifdef GCC3</span> 00056 <span class="preprocessor"></span><span class="preprocessor">#define nspace __gnu_cxx</span> 00057 <span class="preprocessor"></span><span class="preprocessor">#else</span> <a name="l00058"></a><a class="code" href="channels_8cpp.html#a0">00058</a> <span class="preprocessor"></span><span class="preprocessor">#define nspace std</span> 00059 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00060 <span class="preprocessor"></span> 00061 <span class="keyword">using</span> <span class="keyword">namespace </span>std; 00062 00063 <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="modules_8cpp.html#a1">MODCOUNT</a>; <a name="l00064"></a><a class="code" href="channels_8cpp.html#a2">00064</a> <span class="keyword">extern</span> std::vector<Module*> <a class="code" href="channels_8cpp.html#a2">modules</a>; <a name="l00065"></a><a class="code" href="channels_8cpp.html#a3">00065</a> <span class="keyword">extern</span> std::vector<ircd_module*> <a class="code" href="channels_8cpp.html#a3">factory</a>; 00066 <a name="l00067"></a><a class="code" href="channels_8cpp.html#a4">00067</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a4">LogLevel</a>; <a name="l00068"></a><a class="code" href="channels_8cpp.html#a5">00068</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a5">ServerName</a>[MAXBUF]; <a name="l00069"></a><a class="code" href="channels_8cpp.html#a6">00069</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a6">Network</a>[MAXBUF]; <a name="l00070"></a><a class="code" href="channels_8cpp.html#a7">00070</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a7">ServerDesc</a>[MAXBUF]; <a name="l00071"></a><a class="code" href="channels_8cpp.html#a8">00071</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a8">AdminName</a>[MAXBUF]; <a name="l00072"></a><a class="code" href="channels_8cpp.html#a9">00072</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a9">AdminEmail</a>[MAXBUF]; <a name="l00073"></a><a class="code" href="channels_8cpp.html#a10">00073</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a10">AdminNick</a>[MAXBUF]; <a name="l00074"></a><a class="code" href="channels_8cpp.html#a11">00074</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a11">diepass</a>[MAXBUF]; <a name="l00075"></a><a class="code" href="channels_8cpp.html#a12">00075</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a12">restartpass</a>[MAXBUF]; <a name="l00076"></a><a class="code" href="channels_8cpp.html#a13">00076</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a13">motd</a>[MAXBUF]; <a name="l00077"></a><a class="code" href="channels_8cpp.html#a14">00077</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a14">rules</a>[MAXBUF]; <a name="l00078"></a><a class="code" href="channels_8cpp.html#a15">00078</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a15">list</a>[MAXBUF]; <a name="l00079"></a><a class="code" href="channels_8cpp.html#a16">00079</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a16">PrefixQuit</a>[MAXBUF]; <a name="l00080"></a><a class="code" href="channels_8cpp.html#a17">00080</a> <span class="keyword">extern</span> <span class="keywordtype">char</span> <a class="code" href="channels_8cpp.html#a17">DieValue</a>[MAXBUF]; 00081 <a name="l00082"></a><a class="code" href="channels_8cpp.html#a18">00082</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a18">debugging</a>; <a name="l00083"></a><a class="code" href="channels_8cpp.html#a19">00083</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a19">WHOWAS_STALE</a>; <a name="l00084"></a><a class="code" href="channels_8cpp.html#a20">00084</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a20">WHOWAS_MAX</a>; <a name="l00085"></a><a class="code" href="channels_8cpp.html#a21">00085</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a21">DieDelay</a>; <a name="l00086"></a><a class="code" href="channels_8cpp.html#a22">00086</a> <span class="keyword">extern</span> time_t <a class="code" href="channels_8cpp.html#a22">startup_time</a>; <a name="l00087"></a><a class="code" href="channels_8cpp.html#a23">00087</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a23">NetBufferSize</a>; <a name="l00088"></a><a class="code" href="channels_8cpp.html#a24">00088</a> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a24">MaxWhoResults</a>; <a name="l00089"></a><a class="code" href="channels_8cpp.html#a25">00089</a> <span class="keyword">extern</span> time_t <a class="code" href="channels_8cpp.html#a25">nb_start</a>; 00090 <a name="l00091"></a><a class="code" href="channels_8cpp.html#a26">00091</a> <span class="keyword">extern</span> std::vector<int> <a class="code" href="channels_8cpp.html#a26">fd_reap</a>; <a name="l00092"></a><a class="code" href="channels_8cpp.html#a27">00092</a> <span class="keyword">extern</span> std::vector<std::string> <a class="code" href="channels_8cpp.html#a27">module_names</a>; 00093 <a name="l00094"></a><a class="code" href="channels_8cpp.html#a28">00094</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a28">boundPortCount</a>; <a name="l00095"></a><a class="code" href="channels_8cpp.html#a29">00095</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a29">portCount</a>; <a name="l00096"></a><a class="code" href="channels_8cpp.html#a30">00096</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a30">UDPportCount</a>; <a name="l00097"></a><a class="code" href="channels_8cpp.html#a31">00097</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a31">ports</a>[MAXSOCKS]; <a name="l00098"></a><a class="code" href="channels_8cpp.html#a32">00098</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="channels_8cpp.html#a32">defaultRoute</a>; 00099 <a name="l00100"></a><a class="code" href="channels_8cpp.html#a33">00100</a> <span class="keyword">extern</span> std::vector<long> <a class="code" href="channels_8cpp.html#a33">auth_cookies</a>; <a name="l00101"></a><a class="code" href="channels_8cpp.html#a34">00101</a> <span class="keyword">extern</span> std::stringstream <a class="code" href="channels_8cpp.html#a34">config_f</a>; 00102 <a name="l00103"></a><a class="code" href="channels_8cpp.html#a35">00103</a> <span class="keyword">extern</span> <a class="code" href="classserverrec.html">serverrec</a>* <a class="code" href="channels_8cpp.html#a35">me</a>[32]; 00104 <a name="l00105"></a><a class="code" href="channels_8cpp.html#a36">00105</a> <span class="keyword">extern</span> FILE *<a class="code" href="channels_8cpp.html#a36">log_file</a>; 00106 <a name="l00107"></a><a class="code" href="channels_8cpp.html#a37">00107</a> <span class="keyword">extern</span> time_t <a class="code" href="channels_8cpp.html#a37">TIME</a>; 00108 00109 <span class="keyword">using</span> <span class="keyword">namespace </span>std; 00110 <a name="l00111"></a><a class="code" href="channels_8cpp.html#a38">00111</a> std::vector<ModeParameter> <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>; 00112 <a name="l00113"></a><a class="code" href="classchanrec.html#a10">00113</a> <a class="code" href="classchanrec.html#a10">chanrec::chanrec</a>() 00114 { 00115 strcpy(<a class="code" href="classchanrec.html#o0">name</a>,<span class="stringliteral">""</span>); 00116 strcpy(<a class="code" href="classchanrec.html#o1">custom_modes</a>,<span class="stringliteral">""</span>); 00117 strcpy(<a class="code" href="classchanrec.html#o4">topic</a>,<span class="stringliteral">""</span>); 00118 strcpy(<a class="code" href="classchanrec.html#o7">setby</a>,<span class="stringliteral">""</span>); 00119 strcpy(<a class="code" href="classchanrec.html#o9">key</a>,<span class="stringliteral">""</span>); 00120 <a class="code" href="classchanrec.html#o5">created</a> = <a class="code" href="classchanrec.html#o6">topicset</a> = <a class="code" href="classchanrec.html#o8">limit</a> = <a class="code" href="classchanrec.html#o2">users</a> = 0; 00121 <a class="code" href="classchanrec.html#o10">topiclock</a> = <a class="code" href="classchanrec.html#o11">noexternal</a> = <a class="code" href="classchanrec.html#o12">inviteonly</a> = <a class="code" href="classchanrec.html#o13">moderated</a> = <a class="code" href="classchanrec.html#o14">secret</a> = <a class="code" href="classchanrec.html#o15">c_private</a> = <span class="keyword">false</span>; 00122 <a class="code" href="classchanrec.html#o3">internal_userlist</a>.clear(); 00123 } 00124 <a name="l00125"></a><a class="code" href="classchanrec.html#a0">00125</a> <span class="keywordtype">void</span> <a class="code" href="classchanrec.html#a0">chanrec::SetCustomMode</a>(<span class="keywordtype">char</span> mode,<span class="keywordtype">bool</span> mode_on) 00126 { 00127 <span class="keywordflow">if</span> (mode_on) { 00128 <span class="keyword">static</span> <span class="keywordtype">char</span> m[3]; 00129 m[0] = mode; 00130 m[1] = <span class="charliteral">'\0'</span>; 00131 <span class="keywordflow">if</span> (!strchr(this->custom_modes,mode)) 00132 { 00133 strlcat(<a class="code" href="classchanrec.html#o1">custom_modes</a>,m,MAXMODES); 00134 } 00135 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Custom mode %c set"</span>,mode); 00136 } 00137 <span class="keywordflow">else</span> { 00138 00139 std::string a = this-><a class="code" href="classchanrec.html#o1">custom_modes</a>; 00140 <span class="keywordtype">int</span> pos = a.find(mode); 00141 a.erase(pos,1); 00142 strncpy(this->custom_modes,a.c_str(),MAXMODES); 00143 00144 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Custom mode %c removed: modelist='%s'"</span>,mode,this->custom_modes); 00145 this-><a class="code" href="classchanrec.html#a1">SetCustomModeParam</a>(mode,<span class="stringliteral">""</span>,<span class="keyword">false</span>); 00146 } 00147 } 00148 00149 <a name="l00150"></a><a class="code" href="classchanrec.html#a1">00150</a> <span class="keywordtype">void</span> <a class="code" href="classchanrec.html#a1">chanrec::SetCustomModeParam</a>(<span class="keywordtype">char</span> mode,<span class="keywordtype">char</span>* parameter,<span class="keywordtype">bool</span> mode_on) 00151 { 00152 00153 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"SetCustomModeParam called"</span>); 00154 <a class="code" href="classModeParameter.html">ModeParameter</a> M; 00155 M.<a class="code" href="classModeParameter.html#o0">mode</a> = mode; 00156 strlcpy(M.<a class="code" href="classModeParameter.html#o2">channel</a>,this->name,CHANMAX); 00157 strlcpy(M.<a class="code" href="classModeParameter.html#o1">parameter</a>,parameter,MAXBUF); 00158 <span class="keywordflow">if</span> (mode_on) 00159 { 00160 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Custom mode parameter %c %s added"</span>,mode,parameter); 00161 <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.push_back(M); 00162 } 00163 <span class="keywordflow">else</span> 00164 { 00165 <span class="keywordflow">if</span> (<a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.size()) 00166 { 00167 <span class="keywordflow">for</span> (vector<ModeParameter>::iterator i = <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.begin(); i < <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.end(); i++) 00168 { 00169 <span class="keywordflow">if</span> ((i->mode == mode) && (!strcasecmp(this->name,i->channel))) 00170 { 00171 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Custom mode parameter %c %s removed"</span>,mode,parameter); 00172 <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.erase(i); 00173 <span class="keywordflow">return</span>; 00174 } 00175 } 00176 } 00177 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"*** BUG *** Attempt to remove non-existent mode parameter!"</span>); 00178 } 00179 } 00180 <a name="l00181"></a><a class="code" href="classchanrec.html#a2">00181</a> <span class="keywordtype">bool</span> <a class="code" href="classchanrec.html#a2">chanrec::IsCustomModeSet</a>(<span class="keywordtype">char</span> mode) 00182 { 00183 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Checking ISCustomModeSet: %c %s"</span>,mode,this->custom_modes); 00184 <span class="keywordflow">return</span> (strchr(this->custom_modes,mode) != 0); 00185 } 00186 <a name="l00187"></a><a class="code" href="classchanrec.html#a3">00187</a> std::string <a class="code" href="classchanrec.html#a3">chanrec::GetModeParameter</a>(<span class="keywordtype">char</span> mode) 00188 { 00189 <span class="keywordflow">if</span> (<a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.size()) 00190 { 00191 <span class="keywordflow">for</span> (vector<ModeParameter>::iterator i = <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.begin(); i < <a class="code" href="channels_8cpp.html#a38">custom_mode_params</a>.end(); i++) 00192 { 00193 <span class="keywordflow">if</span> ((i->mode == mode) && (!strcasecmp(this->name,i->channel))) 00194 { 00195 <span class="keywordflow">return</span> std::string(i->parameter); 00196 } 00197 } 00198 } 00199 <span class="keywordflow">return</span> std::string(<span class="stringliteral">""</span>); 00200 } 00201 <a name="l00202"></a><a class="code" href="classchanrec.html#a4">00202</a> <span class="keywordtype">void</span> <a class="code" href="classchanrec.html#a4">chanrec::IncUserCounter</a>() 00203 { 00204 this-><a class="code" href="classchanrec.html#o2">users</a>++; 00205 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Incremented channel user count for %s to %lu"</span>,<a class="code" href="classchanrec.html#o0">name</a>,(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)<a class="code" href="classchanrec.html#o2">users</a>); 00206 } 00207 <a name="l00208"></a><a class="code" href="classchanrec.html#a5">00208</a> <span class="keywordtype">void</span> <a class="code" href="classchanrec.html#a5">chanrec::DecUserCounter</a>() 00209 { 00210 <span class="keywordflow">if</span> (this-><a class="code" href="classchanrec.html#o2">users</a> > 0) 00211 this-><a class="code" href="classchanrec.html#o2">users</a>--; 00212 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Decremented channel user count for %s to %lu"</span>,<a class="code" href="classchanrec.html#o0">name</a>,(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)<a class="code" href="classchanrec.html#o2">users</a>); 00213 } 00214 <a name="l00215"></a><a class="code" href="classchanrec.html#a6">00215</a> <span class="keywordtype">long</span> <a class="code" href="classchanrec.html#a6">chanrec::GetUserCounter</a>() 00216 { 00217 <span class="keywordflow">return</span> (this-><a class="code" href="classchanrec.html#o2">users</a>); 00218 } 00219 <a name="l00220"></a><a class="code" href="classchanrec.html#a7">00220</a> <span class="keywordtype">void</span> <a class="code" href="classchanrec.html#a7">chanrec::AddUser</a>(<span class="keywordtype">char</span>* castuser) 00221 { 00222 <a class="code" href="classchanrec.html#o3">internal_userlist</a>.push_back(castuser); 00223 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Added casted user to channel's internal list"</span>); 00224 } 00225 <a name="l00226"></a><a class="code" href="classchanrec.html#a8">00226</a> <span class="keywordtype">void</span> <a class="code" href="classchanrec.html#a8">chanrec::DelUser</a>(<span class="keywordtype">char</span>* castuser) 00227 { 00228 <span class="keywordflow">for</span> (std::vector<char*>::iterator a = <a class="code" href="classchanrec.html#o3">internal_userlist</a>.begin(); a < <a class="code" href="classchanrec.html#o3">internal_userlist</a>.end(); a++) 00229 { 00230 <span class="keywordflow">if</span> (*a == castuser) 00231 { 00232 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"Removed casted user from channel's internal list"</span>); 00233 <a class="code" href="classchanrec.html#o3">internal_userlist</a>.erase(a); 00234 <span class="keywordflow">return</span>; 00235 } 00236 } 00237 log(<a class="code" href="modules_8h.html#a0">DEBUG</a>,<span class="stringliteral">"BUG BUG BUG! Attempt to remove an uncasted user from the internal list of %s!"</span>,<a class="code" href="classchanrec.html#o0">name</a>); 00238 } 00239 <a name="l00240"></a><a class="code" href="classchanrec.html#a9">00240</a> std::vector<char*> *<a class="code" href="classchanrec.html#a9">chanrec::GetUsers</a>() 00241 { 00242 <span class="keywordflow">return</span> &<a class="code" href="classchanrec.html#o3">internal_userlist</a>; 00243 } </pre></div><hr size="1"><address style="align: right;"><small>Generated on Sat May 7 15:34:20 2005 for InspIRCd by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.3 </small></address> </body> </html>