summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorsvn svn@31f1291d-b8d6-0310-a050-a5561fc1590b <svn svn@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-03-28 21:59:56 +0000
committersvn svn@31f1291d-b8d6-0310-a050-a5561fc1590b <svn svn@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2004-03-28 21:59:56 +0000
commit55bf4dbcabf378e9472b7d31d6edf87f6ac853e9 (patch)
tree7a9454ea6b8750256e242cf6d5fba3ca7a4b5044 /process.c
Initial Anope Import
git-svn-id: svn://svn.anope.org/anope/trunk@1 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@1 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'process.c')
-rw-r--r--process.c268
1 files changed, 268 insertions, 0 deletions
diff --git a/process.c b/process.c
new file mode 100644
index 000000000..84388d813
--- /dev/null
+++ b/process.c
@@ -0,0 +1,268 @@
+/* Main processing code for Services.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: process.c,v 1.18 2004/01/31 18:57:18 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "messages.h"
+#include "modules.h"
+extern Module *mod_current_module;
+extern char *mod_current_module_name;
+extern User *mod_current_user;
+extern int mod_current_op;
+extern char *mod_current_buffer;
+/*************************************************************************/
+/*************************************************************************/
+
+/* Use ignore code? */
+int allow_ignore = 1;
+
+/* People to ignore (hashed by first character of nick). */
+IgnoreData *ignore[256];
+
+/*************************************************************************/
+
+/* add_ignore: Add someone to the ignorance list for the next `delta'
+ * seconds.
+ */
+
+void add_ignore(const char *nick, time_t delta)
+{
+ IgnoreData *ign;
+ char who[NICKMAX];
+ time_t now = time(NULL);
+ IgnoreData **whichlist = &ignore[tolower(nick[0])];
+
+ strscpy(who, nick, NICKMAX);
+ for (ign = *whichlist; ign; ign = ign->next) {
+ if (stricmp(ign->who, who) == 0)
+ break;
+ }
+ if (ign) {
+ if (ign->time > now)
+ ign->time += delta;
+ else
+ ign->time = now + delta;
+ } else {
+ ign = scalloc(sizeof(*ign), 1);
+ strscpy(ign->who, who, sizeof(ign->who));
+ ign->time = now + delta;
+ ign->next = *whichlist;
+ *whichlist = ign;
+ }
+}
+
+/*************************************************************************/
+
+/* get_ignore: Retrieve an ignorance record for a nick. If the nick isn't
+ * being ignored, return NULL and flush the record from the
+ * in-core list if it exists (i.e. ignore timed out).
+ */
+
+IgnoreData *get_ignore(const char *nick)
+{
+ IgnoreData *ign, *prev;
+ time_t now = time(NULL);
+ IgnoreData **whichlist = &ignore[tolower(nick[0])];
+ User *u = finduser(nick);
+ IgnoreData **whichlist2 = NULL;
+ // Bleah, this doesn't work. I need a way to get the first char of u->username.
+ //if (u) whichlist2 = &ignore[tolower(u->username[0])];
+ IgnoreData **whichlistast = &ignore[42]; /* * */
+ IgnoreData **whichlistqst = &ignore[63]; /* ? */
+ int finished = 0;
+ for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) {
+ if (stricmp(ign->who, nick) == 0) {
+ finished = 1;
+ break;
+ }
+ }
+ if (!finished && whichlist2) {
+ for (ign = *whichlist2, prev = NULL; ign;
+ prev = ign, ign = ign->next) {
+ if (match_usermask(ign->who, u)) {
+ finished = 1;
+ break;
+ }
+ }
+ }
+ if (!finished) {
+ for (ign = *whichlistast, prev = NULL; ign;
+ prev = ign, ign = ign->next) {
+ if (match_usermask(ign->who, u)) {
+ finished = 1;
+ break;
+ }
+ }
+ }
+ if (!finished) {
+ for (ign = *whichlistqst, prev = NULL; ign;
+ prev = ign, ign = ign->next) {
+ if (match_usermask(ign->who, u)) {
+ finished = 1;
+ break;
+ }
+ }
+ }
+ if (ign && ign->time <= now) {
+ if (prev)
+ prev->next = ign->next;
+ else
+ *whichlist = ign->next;
+ free(ign);
+ ign = NULL;
+ }
+ return ign;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* split_buf: Split a buffer into arguments and store the arguments in an
+ * argument vector pointed to by argv (which will be malloc'd
+ * as necessary); return the argument count. If colon_special
+ * is non-zero, then treat a parameter with a leading ':' as
+ * the last parameter of the line, per the IRC RFC. Destroys
+ * the buffer by side effect.
+ */
+
+int split_buf(char *buf, char ***argv, int colon_special)
+{
+ int argvsize = 8;
+ int argc;
+ char *s;
+
+ *argv = scalloc(sizeof(char *) * argvsize, 1);
+ argc = 0;
+ while (*buf) {
+ if (argc == argvsize) {
+ argvsize += 8;
+ *argv = srealloc(*argv, sizeof(char *) * argvsize);
+ }
+ if (*buf == ':') {
+ (*argv)[argc++] = buf + 1;
+ buf = "";
+ } else {
+ s = strpbrk(buf, " ");
+ if (s) {
+ *s++ = 0;
+ while (*s == ' ')
+ s++;
+ } else {
+ s = buf + strlen(buf);
+ }
+ (*argv)[argc++] = buf;
+ buf = s;
+ }
+ }
+ return argc;
+}
+
+/*************************************************************************/
+
+/* process: Main processing routine. Takes the string in inbuf (global
+ * variable) and does something appropriate with it. */
+
+void process()
+{
+ int retVal = 0;
+ Message *current = NULL;
+ char source[64];
+ char cmd[64];
+ char buf[512]; /* Longest legal IRC command line */
+ char *s;
+ int ac; /* Parameters for the command */
+ char **av;
+ Message *m;
+
+
+ /* If debugging, log the buffer */
+ if (debug)
+ alog("debug: Received: %s", inbuf);
+
+ /* First make a copy of the buffer so we have the original in case we
+ * crash - in that case, we want to know what we crashed on. */
+ strscpy(buf, inbuf, sizeof(buf));
+
+ doCleanBuffer((char *) buf);
+
+ /* Split the buffer into pieces. */
+ if (*buf == ':') {
+ s = strpbrk(buf, " ");
+ if (!s)
+ return;
+ *s = 0;
+ while (isspace(*++s));
+ strscpy(source, buf + 1, sizeof(source));
+ memmove(buf, s, strlen(s) + 1);
+ } else {
+ *source = 0;
+ }
+ if (!*buf)
+ return;
+ s = strpbrk(buf, " ");
+ if (s) {
+ *s = 0;
+ while (isspace(*++s));
+ } else
+ s = buf + strlen(buf);
+ strscpy(cmd, buf, sizeof(cmd));
+ ac = split_buf(s, &av, 1);
+ if (mod_current_buffer) {
+ free(mod_current_buffer);
+ }
+ if (av[1]) {
+ mod_current_buffer = sstrdup(av[1]);
+ } else {
+ mod_current_buffer = NULL;
+ }
+ /* Do something with the message. */
+ m = find_message(cmd);
+ if (m) {
+ if (m->func) {
+ mod_current_module_name = m->mod_name;
+ retVal = m->func(source, ac, av);
+ mod_current_module_name = NULL;
+ if (retVal == MOD_CONT) {
+ current = m->next;
+ while (current && current->func && retVal == MOD_CONT) {
+ mod_current_module_name = m->mod_name;
+ retVal = current->func(source, ac, av);
+ mod_current_module_name = NULL;
+ current = current->next;
+ }
+ }
+ }
+ } else {
+ if (debug)
+ alog("unknown message from server (%s)", inbuf);
+ }
+ if (mod_current_op == 1) {
+ alog("trying to load [%s]", mod_current_module->name);
+ alog("status: [%d]",
+ loadModule(mod_current_module, mod_current_user));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ mod_current_op = 0;
+ } else if (mod_current_op == 2) {
+ alog("trying to unload [%s]", mod_current_module->name);
+ alog("status: [%d]",
+ unloadModule(mod_current_module, mod_current_user));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ mod_current_op = 0;
+ }
+ /* Free argument list we created */
+ free(av);
+}
+
+/*************************************************************************/