aboutsummaryrefslogtreecommitdiff
path: root/irc/ignore.c
diff options
context:
space:
mode:
Diffstat (limited to 'irc/ignore.c')
-rw-r--r--irc/ignore.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/irc/ignore.c b/irc/ignore.c
new file mode 100644
index 0000000..23bc5db
--- /dev/null
+++ b/irc/ignore.c
@@ -0,0 +1,141 @@
+/************************************************************************
+ * IRC - Internet Relay Chat, irc/ignore.c
+ * Copyright (C) 1990 Jarkko Oikarinen
+ *
+ * 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.
+ */
+
+#ifndef lint
+static char rcsid[] = "@(#)$Id: ignore.c,v 1.2 1997/09/03 17:45:39 kalt Exp $";
+#endif
+
+#include "os.h"
+#include "c_defines.h"
+#define IGNORE_C
+#include "c_externs.h"
+#undef IGNORE_C
+
+anIgnore *ignore = (anIgnore *) 0;
+char ibuf[80];
+
+void do_ignore(user, temp)
+char *user, *temp;
+{
+ char *ch, *wild = "*";
+ anIgnore *iptr;
+ char *apu = user, *uh;
+ int status;
+ if ((user == (char *) 0) || (*user == '\0')) {
+
+ putline("*** Current ignore list entries:");
+ for (iptr = ignore; iptr; iptr = iptr->next) {
+ sprintf(ibuf," Ignoring %s messages from user %s!%s",
+ (iptr->flags == IGNORE_TOTAL) ? "all" :
+ (iptr->flags == IGNORE_PRIVATE) ? "private" : "public",
+ iptr->user, iptr->from);
+ putline(ibuf);
+ }
+ putline("*** End of ignore list entries");
+ return;
+ }
+ while (apu && *apu) {
+ ch = apu;
+ if (*ch == '+') {
+ ch++;
+ status = IGNORE_PUBLIC;
+ }
+ else if (*ch == '-') {
+ ch++;
+ status = IGNORE_PRIVATE;
+ }
+ else
+ status = IGNORE_TOTAL;
+ if ((apu = index(ch, ',')))
+ *(apu++) = '\0';
+ if ((uh = index(ch, '!')))
+ *uh++ = '\0';
+ else if ((uh = index(ch, '@')))
+ *uh++ = '\0';
+ else
+ uh = wild;
+ if (!*ch)
+ ch = wild;
+ if ((iptr = find_ignore(ch, (anIgnore *)NULL, uh))) {
+ sprintf(ibuf,"*** Ignore removed: user %s!%s",
+ iptr->user, iptr->from);
+ putline(ibuf);
+ kill_ignore(iptr);
+ } else {
+ if (strlen(ch) > (size_t) NICKLEN)
+ ch[NICKLEN] = '\0';
+ if (add_ignore(ch, status, uh) >= 0) {
+ sprintf(ibuf,"*** Ignore %s messages from user %s!%s",
+ (status == IGNORE_TOTAL) ? "all" :
+ (status == IGNORE_PRIVATE) ? "private" : "public", ch, uh);
+ putline(ibuf);
+ } else
+ putline("Fatal Error: Cannot allocate memory for ignore buffer");
+ }
+ }
+}
+
+anIgnore *find_ignore(user, para, fromhost)
+char *user, *fromhost;
+anIgnore *para;
+{
+ anIgnore *iptr;
+ for (iptr = ignore; iptr; iptr=iptr->next)
+ if ((match(iptr->user, user) == 0) &&
+ (match(iptr->from, fromhost)==0))
+ break;
+
+ return iptr ? iptr : para;
+}
+
+int kill_ignore(iptr)
+anIgnore *iptr;
+{
+ anIgnore *i2ptr, *i3ptr = (anIgnore *) 0;
+ for (i2ptr = ignore; i2ptr; i2ptr = i2ptr->next) {
+ if (i2ptr == iptr)
+ break;
+ i3ptr = i2ptr;
+ }
+ if (i2ptr) {
+ if (i3ptr)
+ i3ptr->next = i2ptr->next;
+ else
+ ignore = i2ptr->next;
+ free(i2ptr);
+ return (1);
+ }
+ return (-1);
+}
+
+int add_ignore(ch, status, fromhost)
+char *ch, *fromhost;
+int status;
+{
+ anIgnore *iptr;
+ iptr = (anIgnore *) malloc(sizeof (anIgnore));
+ if (iptr == (anIgnore *) 0)
+ return(-1);
+ strncpyzt(iptr->user, ch, sizeof(iptr->user));
+ strncpyzt(iptr->from, fromhost, sizeof(iptr->from));
+ iptr->next = ignore;
+ ignore = iptr;
+ iptr->flags = status;
+ return(1);
+}