]> granicus.if.org Git - uw-imap/commitdiff
add files for 2006-12-07T02:40:21Z
authorUnknown <>
Thu, 7 Dec 2006 02:40:21 +0000 (02:40 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Fri, 7 Sep 2018 00:02:35 +0000 (00:02 +0000)
src/c-client/smanager.c [new file with mode: 0644]

diff --git a/src/c-client/smanager.c b/src/c-client/smanager.c
new file mode 100644 (file)
index 0000000..cee659f
--- /dev/null
@@ -0,0 +1,129 @@
+/* ========================================================================
+ * Copyright 1988-2006 University of Washington
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 
+ * ========================================================================
+ */
+
+/*
+ * Program:    Subscription Manager
+ *
+ * Author:     Mark Crispin
+ *             Networks and Distributed Computing
+ *             Computing & Communications
+ *             University of Washington
+ *             Administration Building, AG-44
+ *             Seattle, WA  98195
+ *             Internet: MRC@CAC.Washington.EDU
+ *
+ * Date:       3 December 1992
+ * Last Edited:        6 December 2006
+ */
+
+
+#include <stdio.h>
+#include <ctype.h>
+#include "c-client.h"
+\f
+/* Subscribe to mailbox
+ * Accepts: mailbox name
+ * Returns: T on success, NIL on failure
+ */
+
+long sm_subscribe (char *mailbox)
+{
+  FILE *f;
+  char *s,db[MAILTMPLEN],tmp[MAILTMPLEN];
+                               /* canonicalize INBOX */
+  if (!compare_cstring (mailbox,"INBOX")) mailbox = "INBOX";
+  SUBSCRIPTIONFILE (db);       /* open subscription database */
+  if (f = fopen (db,"r")) {    /* make sure not already there */
+    while (fgets (tmp,MAILTMPLEN,f)) {
+      if (s = strchr (tmp,'\n')) *s = '\0';
+      if (!strcmp (tmp,mailbox)) {/* already subscribed? */
+       sprintf (tmp,"Already subscribed to mailbox %.80s",mailbox);
+       MM_LOG (tmp,ERROR);
+       fclose (f);
+       return NIL;
+      }
+    }
+    fclose (f);
+  }
+  if (!(f = fopen (db,"a"))) { /* append new entry */
+    MM_LOG ("Can't append to subscription database",ERROR);
+    return NIL;
+  }
+  fprintf (f,"%s\n",mailbox);
+  return (fclose (f) == EOF) ? NIL : T;
+}
+\f
+/* Unsubscribe from mailbox
+ * Accepts: mailbox name
+ * Returns: T on success, NIL on failure
+ */
+
+long sm_unsubscribe (char *mailbox)
+{
+  FILE *f,*tf;
+  char *s,tmp[MAILTMPLEN],old[MAILTMPLEN],newname[MAILTMPLEN];
+  int found = NIL;
+                               /* canonicalize INBOX */
+  if (!compare_cstring (mailbox,"INBOX")) mailbox = "INBOX";
+  SUBSCRIPTIONFILE (old);      /* make file names */
+  SUBSCRIPTIONTEMP (newname);
+  if (!(f = fopen (old,"r")))  /* open subscription database */
+    MM_LOG ("No subscriptions",ERROR);
+  else if (!(tf = fopen (newname,"w"))) {
+    MM_LOG ("Can't create subscription temporary file",ERROR);
+    fclose (f);
+  }
+  else {
+    while (fgets (tmp,MAILTMPLEN,f)) {
+      if (s = strchr (tmp,'\n')) *s = '\0';
+      if (strcmp (tmp,mailbox)) fprintf (tf,"%s\n",tmp);
+      else found = T;          /* found the name */
+    }
+    fclose (f);
+    if (fclose (tf) == EOF)
+      MM_LOG ("Can't write subscription temporary file",ERROR);
+    else if (!found) {
+      sprintf (tmp,"Not subscribed to mailbox %.80s",mailbox);
+      MM_LOG (tmp,ERROR);      /* error if at end */
+    }
+    else if (!unlink (old) && !rename (newname,old)) return LONGT;
+    else MM_LOG ("Can't update subscription database",ERROR);
+  }
+  return NIL;
+}
+\f
+/* Read subscription database
+ * Accepts: pointer to subscription database handle (handle NIL if first time)
+ * Returns: character string for subscription database or NIL if done
+ */
+
+static char sbname[MAILTMPLEN];
+
+char *sm_read (void **sdb)
+{
+  FILE *f = (FILE *) *sdb;
+  char *s;
+  if (!f) {                    /* first time through? */
+    SUBSCRIPTIONFILE (sbname); /* open subscription database */
+                               /* make sure not already there */
+    if (f = fopen (sbname,"r")) *sdb = (void *) f;
+    else return NIL;
+  }
+  if (fgets (sbname,MAILTMPLEN,f)) {
+    if (s = strchr (sbname,'\n')) *s = '\0';
+    return sbname;
+  }
+  fclose (f);                  /* all done */
+  *sdb = NIL;                  /* zap sdb */
+  return NIL;
+}