"Fossies" - the Fresh Open Source Software Archive

Member "netbiff-0.9.18/netbiffd-imap.c" (21 Sep 2003, 3761 Bytes) of package /linux/privat/old/netbiff-0.9.18.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 #include <string.h>
    2 #include <stdlib.h>
    3 
    4 #include "imap.h"
    5 #include "nbproto.h"
    6 
    7 typedef struct _folder Folder;
    8 struct _folder {
    9   char *name;
   10   int recent;
   11   struct _folder *next;
   12 };
   13 
   14 Folder *folders = NULL;
   15 
   16 int check_folder(ImapContext *imap, Folder *f) {
   17   int r;
   18 
   19   r = imap_get_recent(imap, f->name);
   20   if(r < 0) {
   21     netbiff_send(NO, "%s", imap->errstr);
   22     return -1;
   23   }
   24 
   25   if(r > f->recent)
   26     netbiff_send(UPDATE, "%s", f->name);
   27   else if(r < f->recent)
   28     netbiff_send(RESET, "%s", f->name);
   29   
   30   f->recent = r;
   31 
   32   return 0;
   33 }
   34 
   35 int add_folder(const char *name) {
   36   Folder *f;
   37 
   38   f = malloc(sizeof(Folder));
   39   if(!f)
   40     return -1;
   41 
   42   f->name = strdup(name);
   43   if(!f->name) {
   44     free(f);
   45     return -1;
   46   }
   47 
   48   f->recent = 0;
   49 
   50   f->next = folders;
   51   folders = f;
   52   return 0;
   53 }
   54 
   55 int main(int argc, char **argv) {
   56   ImapContext *imap = NULL;
   57 
   58   if(argc < 2) {
   59     netbiff_send(BAD, "Insufficient arguments.");
   60     return 1;
   61   }
   62 
   63   if(!strcasecmp("preauth", argv[1])) {
   64     if(argc < 3) {
   65       netbiff_send(BAD, "Insufficient arguments.");
   66       return 1;
   67     }
   68     imap = imap_preauth(argv + 2);
   69     if(imap->error) {
   70       netbiff_send(NO, "%s", imap->errstr); 
   71       return 1;
   72     }
   73   }
   74   else if(!strcasecmp("login", argv[1])) {
   75     if(argc < 4) {
   76       netbiff_send(BAD, "Insufficient arguments.");
   77       return 1;
   78     }
   79     if(argc > 4) { /* do we have a password? */
   80       imap = imap_login(argv[2], argv[3], argv[4]);
   81       if(imap->error) {
   82         netbiff_send(NO, "%s", imap->errstr);
   83         return 1;
   84       }
   85     }
   86   }
   87   else {
   88     netbiff_send(BAD, "Unknown argument: %s", argv[1]);
   89     return 1;
   90   }
   91 
   92   netbiff_send(OK, "Howdy");
   93 
   94   while(1) {
   95     int cmd;
   96     char *arg[NETBIFF_PROTO_MAXARGS];
   97 
   98     cmd = netbiff_proto_next(arg);
   99     switch(cmd) {
  100       case NETBIFF_CMD_QUIT:
  101       case NETBIFF_CMD_EOF:
  102         if(imap)
  103           imap_destroy(imap);
  104         return 0;
  105 
  106       case NETBIFF_CMD_FOLDER:
  107         if(add_folder(arg[0]) < 0)
  108           netbiff_send(NO, "Out of memory.");
  109         else
  110           netbiff_send(OK, "%s added.", arg[0]);
  111         break;
  112 
  113       case NETBIFF_CMD_POLL:
  114         /* if we haven't established a connection, request the password
  115          * then don't poll */
  116         if(!imap) {
  117           netbiff_send(DATAREQUEST, "secret/password IMAP password for %s@%s",
  118               argv[3], argv[2]);
  119           netbiff_send(OK, "Asking for password.");
  120           break;
  121         }
  122 
  123         if(!arg[0]) {
  124           /* if no argument, poll all */
  125           Folder *p;
  126           for(p = folders; p; p = p->next)
  127             if(check_folder(imap, p) < 0)
  128               return 1;
  129           netbiff_send(OK, "Poll completed");
  130         }
  131         else {
  132           /* otherwise poll argument */
  133           Folder *p;
  134           for(p = folders; p; p = p->next)
  135             if(!strcmp(p->name, arg[0]))
  136               break;
  137           if(p) {
  138             if(check_folder(imap, p) < 0)
  139               return 1;
  140             netbiff_send(OK, "Poll completed");
  141           }
  142           else
  143             netbiff_send(NO, "No such folder");
  144         }
  145         break;
  146 
  147       case NETBIFF_CMD_DATARESPONSE:
  148         if(!strcasecmp(arg[0], "secret/password")) {
  149           imap = imap_login(argv[2], argv[3], arg[1]);
  150           if(imap->error) {
  151             netbiff_send(NO, "%s", imap->errstr);
  152             imap_destroy(imap);
  153             imap = NULL;
  154           }
  155           else {
  156             Folder *p;
  157             for(p = folders; p; p = p->next)
  158               if(check_folder(imap, p) < 0)
  159                 return 1;
  160             netbiff_send(OK, "Data acquisition complete. Poll complete.");
  161           }
  162         }
  163         else {
  164           netbiff_send(NO, "Never heard of data item %s", arg[0]);
  165         }
  166         break;
  167     }
  168   }
  169 }
  170