00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "stdinc.h"
00026 #include "handlers.h"
00027 #include "client.h"
00028 #include "msg.h"
00029 #include "parse.h"
00030 #include "sprintf_irc.h"
00031 #include "s_serv.h"
00032 #include "send.h"
00033 #include "modules.h"
00034 #include "irc_string.h"
00035
00036 static void ms_encap(struct Client *, struct Client *, int, char *[]);
00037
00038 struct Message encap_msgtab = {
00039 "ENCAP", 0, 0, 3, 0, MFLG_SLOW, 0,
00040 {m_ignore, m_ignore, ms_encap, m_ignore, m_ignore, m_ignore}
00041 };
00042
00043 #ifndef STATIC_MODULES
00044 void
00045 _modinit(void)
00046 {
00047 mod_add_cmd(&encap_msgtab);
00048 add_capability("ENCAP", CAP_ENCAP, 1);
00049 }
00050
00051 void
00052 _moddeinit(void)
00053 {
00054 mod_del_cmd(&encap_msgtab);
00055 delete_capability("ENCAP");
00056 }
00057 const char *_version = "$Revision: 33 $";
00058 #endif
00059
00060
00061
00062
00063
00064
00065
00066
00067 static void
00068 ms_encap(struct Client *client_p, struct Client *source_p,
00069 int parc, char *parv[])
00070 {
00071 char buffer[IRCD_BUFSIZE], *ptr = buffer;
00072 unsigned int cur_len = 0, len, i;
00073 int paramcount, mpara = 0;
00074 struct Message *mptr = NULL;
00075 MessageHandler handler = 0;
00076
00077 for (i = 1; i < (unsigned int)parc - 1; i++)
00078 {
00079 len = strlen(parv[i]) + 1;
00080
00081 if ((cur_len + len) >= sizeof(buffer))
00082 return;
00083
00084 ircsprintf(ptr, "%s ", parv[i]);
00085 cur_len += len;
00086 ptr += len;
00087 }
00088
00089 len = strlen(parv[i]);
00090
00091
00092
00093
00094
00095
00096
00097 if (parc == 3)
00098 ircsprintf(ptr, "%s", parv[2]);
00099 else
00100 ircsprintf(ptr, ":%s", parv[parc-1]);
00101
00102 if ((cur_len + len) >= sizeof(buffer))
00103 buffer[sizeof(buffer)-1] = '\0';
00104
00105 sendto_match_servs(source_p, parv[1], CAP_ENCAP,
00106 "ENCAP %s", buffer);
00107
00108 if (!match(parv[1], me.name))
00109 return;
00110
00111 if ((mptr = find_command(parv[2])) == NULL)
00112 return;
00113
00114 paramcount = mptr->parameters;
00115 mpara = mptr->maxpara;
00116
00117 mptr->bytes += strlen(buffer);
00118
00119
00120
00121
00122
00123
00124 ptr = parv[0];
00125 parv += 2;
00126 parc -= 2;
00127 parv[0] = ptr;
00128
00129 if ((handler = mptr->handlers[ENCAP_HANDLER]) == NULL)
00130 return;
00131
00132 (*handler)(client_p, source_p, parc, parv);
00133 }