"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