diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /imap/src/c-client/smanager.c | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'imap/src/c-client/smanager.c')
-rw-r--r-- | imap/src/c-client/smanager.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/imap/src/c-client/smanager.c b/imap/src/c-client/smanager.c new file mode 100644 index 00000000..cee659ff --- /dev/null +++ b/imap/src/c-client/smanager.c @@ -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" + +/* 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; +} + +/* 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; +} + +/* 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; +} |