annotate src/imapd/imapd.c @ 4:d741b3ecc917 draft

imapext-2007f
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 30 Oct 2014 00:03:05 +0900
parents 2366b362676d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1 /* ========================================================================
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2 * Copyright 1988-2008 University of Washington
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3 *
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
5 * you may not use this file except in compliance with the License.
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
6 * You may obtain a copy of the License at
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
7 *
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
9 *
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
10 *
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
11 * ========================================================================
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
12 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
13
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
14 /*
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
15 * Program: IMAP4rev1 server
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
16 *
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
17 * Author: Mark Crispin
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
18 * UW Technology
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
19 * University of Washington
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
20 * Seattle, WA 98195
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
21 * Internet: MRC@Washington.EDU
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
22 *
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
23 * Date: 5 November 1990
3
2366b362676d imap-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
24 * Last Edited: 22 July 2011
0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
25 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
26
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
27 /* Parameter files */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
28
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
29 #include <stdio.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
30 #include <ctype.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
31 #include <errno.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
32 extern int errno; /* just in case */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
33 #include <signal.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
34 #include <setjmp.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
35 #include <time.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
36 #include "c-client.h"
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
37 #include "newsrc.h"
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
38 #include <sys/stat.h>
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
39
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
40
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
41 #define CRLF PSOUT ("\015\012") /* primary output terpri */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
42
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
43
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
44 /* Timeouts and timers */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
45
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
46 #define MINUTES *60
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
47
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
48 #define LOGINTIMEOUT 3 MINUTES /* not logged in autologout timer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
49 #define TIMEOUT 30 MINUTES /* RFC 3501 minimum autologout timer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
50 #define INPUTTIMEOUT 5 MINUTES /* timer for additional command input */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
51 #define ALERTTIMER 1 MINUTES /* alert check timer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
52 #define SHUTDOWNTIMER 1 MINUTES /* shutdown dally timer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
53 #define IDLETIMER 1 MINUTES /* IDLE command poll timer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
54 #define CHECKTIMER 15 MINUTES /* IDLE command last checkpoint timer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
55
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
56
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
57 #define LITSTKLEN 20 /* length of literal stack */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
58 #define MAXCLIENTLIT 10000 /* maximum non-APPEND client literal size
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
59 * must be smaller than 4294967295
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
60 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
61 #define MAXAPPENDTXT 0x40000000 /* maximum APPEND literal size
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
62 * must be smaller than 4294967295
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
63 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
64 #define CMDLEN 65536 /* size of command buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
65
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
66
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
67 /* Server states */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
68
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
69 #define LOGIN 0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
70 #define SELECT 1
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
71 #define OPEN 2
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
72 #define LOGOUT 3
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
73
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
74 /* Body text fetching */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
75
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
76 typedef struct text_args {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
77 char *section; /* body section */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
78 STRINGLIST *lines; /* header lines */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
79 unsigned long first; /* first octet to fetch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
80 unsigned long last; /* number of octets to fetch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
81 long flags; /* fetch flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
82 long binary; /* binary flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
83 } TEXTARGS;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
84
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
85 #define FTB_BINARY 0x1 /* fetch as binary */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
86 #define FTB_SIZE 0x2 /* fetch size only */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
87
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
88
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
89 /* Append data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
90
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
91 typedef struct append_data {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
92 unsigned char *arg; /* append argument pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
93 char *flags; /* message flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
94 char *date; /* message date */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
95 char *msg; /* message text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
96 STRING *message; /* message stringstruct */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
97 } APPENDDATA;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
98
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
99
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
100 /* Message pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
101
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
102 typedef struct msg_data {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
103 MAILSTREAM *stream; /* stream */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
104 unsigned long msgno; /* message number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
105 char *flags; /* current flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
106 char *date; /* current date */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
107 STRING *message; /* stringstruct of message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
108 } MSGDATA;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
109
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
110 /* Function prototypes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
111
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
112 int main (int argc,char *argv[]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
113 void ping_mailbox (unsigned long uid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
114 time_t palert (char *file,time_t oldtime);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
115 void msg_string_init (STRING *s,void *data,unsigned long size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
116 char msg_string_next (STRING *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
117 void msg_string_setpos (STRING *s,unsigned long i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
118 void new_flags (MAILSTREAM *stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
119 void settimeout (unsigned int i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
120 void clkint (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
121 void kodint (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
122 void hupint (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
123 void trmint (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
124 void staint (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
125 char *sout (char *s,char *t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
126 char *nout (char *s,unsigned long n,unsigned long base);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
127 void slurp (char *s,int n,unsigned long timeout);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
128 void inliteral (char *s,unsigned long n);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
129 unsigned char *flush (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
130 void ioerror (FILE *f,char *reason);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
131 unsigned char *parse_astring (unsigned char **arg,unsigned long *i,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
132 unsigned char *del);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
133 unsigned char *snarf (unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
134 unsigned char *snarf_base64 (unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
135 unsigned char *snarf_list (unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
136 STRINGLIST *parse_stringlist (unsigned char **s,int *list);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
137 unsigned long uidmax (MAILSTREAM *stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
138 long parse_criteria (SEARCHPGM *pgm,unsigned char **arg,unsigned long maxmsg,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
139 unsigned long maxuid,unsigned long depth);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
140 long parse_criterion (SEARCHPGM *pgm,unsigned char **arg,unsigned long msgmsg,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
141 unsigned long maxuid,unsigned long depth);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
142 long crit_date (unsigned short *date,unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
143 long crit_date_work (unsigned short *date,unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
144 long crit_set (SEARCHSET **set,unsigned char **arg,unsigned long maxima);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
145 long crit_number (unsigned long *number,unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
146 long crit_string (STRINGLIST **string,unsigned char **arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
147
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
148 void fetch (char *t,unsigned long uid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
149 typedef void (*fetchfn_t) (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
150 void fetch_work (char *t,unsigned long uid,fetchfn_t f[],void *fa[]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
151 void fetch_bodystructure (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
152 void fetch_body (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
153 void fetch_body_part_mime (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
154 void fetch_body_part_contents (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
155 void fetch_body_part_binary (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
156 void fetch_body_part_header (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
157 void fetch_body_part_text (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
158 void remember (unsigned long uid,char *id,SIZEDTEXT *st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
159 void fetch_envelope (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
160 void fetch_encoding (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
161 void changed_flags (unsigned long i,int f);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
162 void fetch_flags (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
163 void put_flag (int *c,char *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
164 void fetch_internaldate (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
165 void fetch_uid (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
166 void fetch_rfc822 (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
167 void fetch_rfc822_header (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
168 void fetch_rfc822_size (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
169 void fetch_rfc822_text (unsigned long i,void *args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
170 void penv (ENVELOPE *env);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
171 void pbodystructure (BODY *body);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
172 void pbody (BODY *body);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
173 void pparam (PARAMETER *param);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
174 void paddr (ADDRESS *a);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
175 void pset (SEARCHSET **set);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
176 void pnum (unsigned long i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
177 void pstring (char *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
178 void pnstring (char *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
179 void pastring (char *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
180 void psizedquoted (SIZEDTEXT *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
181 void psizedliteral (SIZEDTEXT *s,STRING *st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
182 void psizedstring (SIZEDTEXT *s,STRING *st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
183 void psizedastring (SIZEDTEXT *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
184 void pastringlist (STRINGLIST *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
185 void pnstringorlist (STRINGLIST *s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
186 void pbodypartstring (unsigned long msgno,char *id,SIZEDTEXT *st,STRING *bs,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
187 TEXTARGS *ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
188 void ptext (SIZEDTEXT *s,STRING *st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
189 void pthread (THREADNODE *thr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
190 void pcapability (long flag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
191 long nameok (char *ref,char *name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
192 char *bboardname (char *cmd,char *name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
193 long isnewsproxy (char *name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
194 long newsproxypattern (char *ref,char *pat,char *pattern,long flag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
195 char *imap_responder (void *challenge,unsigned long clen,unsigned long *rlen);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
196 long proxycopy (MAILSTREAM *stream,char *sequence,char *mailbox,long options);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
197 long proxy_append (MAILSTREAM *stream,void *data,char **flags,char **date,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
198 STRING **message);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
199 long append_msg (MAILSTREAM *stream,void *data,char **flags,char **date,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
200 STRING **message);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
201 void copyuid (MAILSTREAM *stream,char *mailbox,unsigned long uidvalidity,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
202 SEARCHSET *sourceset,SEARCHSET *destset);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
203 void appenduid (char *mailbox,unsigned long uidvalidity,SEARCHSET *set);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
204 char *referral (MAILSTREAM *stream,char *url,long code);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
205 void mm_list_work (char *what,int delimiter,char *name,long attributes);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
206 char *lasterror (void);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
207
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
208 /* Global storage */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
209
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
210 char *version = "404"; /* edit number of this server */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
211 char *logout = "Logout"; /* syslogreason for logout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
212 char *goodbye = NIL; /* bye reason */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
213 time_t alerttime = 0; /* time of last alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
214 time_t sysalerttime = 0; /* time of last system alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
215 time_t useralerttime = 0; /* time of last user alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
216 time_t lastcheck = 0; /* time of last checkpoint */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
217 time_t shutdowntime = 0; /* time of last shutdown */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
218 int state = LOGIN; /* server state */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
219 int cancelled = NIL; /* authenticate cancelled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
220 int trycreate = 0; /* saw a trycreate */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
221 int finding = NIL; /* doing old FIND command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
222 int anonymous = 0; /* non-zero if anonymous */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
223 int critical = NIL; /* non-zero if in critical code */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
224 int quell_events = NIL; /* non-zero if in FETCH response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
225 int existsquelled = NIL; /* non-zero if an EXISTS was quelled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
226 int proxylist = NIL; /* doing a proxy LIST */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
227 MAILSTREAM *stream = NIL; /* mailbox stream */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
228 DRIVER *curdriver = NIL; /* note current driver */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
229 MAILSTREAM *tstream = NIL; /* temporary mailbox stream */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
230 unsigned int nflags = 0; /* current number of keywords */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
231 unsigned long nmsgs =0xffffffff;/* last reported # of messages and recent */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
232 unsigned long recent = 0xffffffff;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
233 char *nntpproxy = NIL; /* NNTP proxy name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
234 unsigned char *user = NIL; /* user name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
235 unsigned char *pass = NIL; /* password */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
236 unsigned char *initial = NIL; /* initial response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
237 unsigned char cmdbuf[CMDLEN]; /* command buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
238 char *status = "starting up"; /* server status */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
239 char *tag; /* tag portion of command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
240 unsigned char *cmd; /* command portion of command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
241 unsigned char *arg; /* pointer to current argument of command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
242 char *lstwrn = NIL; /* last warning message from c-client */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
243 char *lsterr = NIL; /* last error message from c-client */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
244 char *lstref = NIL; /* last referral from c-client */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
245 char *response = NIL; /* command response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
246 struct {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
247 unsigned long size; /* size of current LITERAL+ */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
248 unsigned int ok : 1; /* LITERAL+ in effect */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
249 } litplus;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
250 int litsp = 0; /* literal stack pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
251 char *litstk[LITSTKLEN]; /* stack to hold literals */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
252 unsigned long uidvalidity = 0; /* last reported UID validity */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
253 unsigned long lastuid = 0; /* last fetched uid */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
254 char *lastid = NIL; /* last fetched body id for this message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
255 char *lastsel = NIL; /* last selected mailbox name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
256 SIZEDTEXT lastst = {NIL,0}; /* last sizedtext */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
257 unsigned long cauidvalidity = 0;/* UIDVALIDITY for COPYUID/APPENDUID */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
258 SEARCHSET *csset = NIL; /* COPYUID source set */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
259 SEARCHSET *caset = NIL; /* COPYUID/APPENDUID destination set */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
260 jmp_buf jmpenv; /* stack context for setjmp */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
261
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
262
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
263 /* Response texts which appear in multiple places */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
264
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
265 char *win = "%.80s OK ";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
266 char *rowin = "%.80s OK [READ-ONLY] %.80s completed\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
267 char *rwwin = "%.80s OK [READ-WRITE] %.80s completed\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
268 char *lose = "%.80s NO ";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
269 char *logwin = "%.80s OK [";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
270 char *losetry = "%.80s NO [TRYCREATE] %.80s failed: %.900s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
271 char *loseunknowncte = "%.80s NO [UNKNOWN-CTE] %.80s failed: %.900s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
272 char *badcmd = "%.80s BAD Command unrecognized: %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
273 char *misarg = "%.80s BAD Missing or invalid argument to %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
274 char *badarg = "%.80s BAD Argument given to %.80s when none expected\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
275 char *badseq = "%.80s BAD Bogus sequence in %.80s: %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
276 char *badatt = "%.80s BAD Bogus attribute list in %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
277 char *badbin = "%.80s BAD Syntax error in binary specifier\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
278
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
279 /* Message string driver for message stringstructs */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
280
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
281 STRINGDRIVER msg_string = {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
282 msg_string_init, /* initialize string structure */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
283 msg_string_next, /* get next byte in string structure */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
284 msg_string_setpos /* set position in string structure */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
285 };
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
286
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
287 /* Main program */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
288
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
289 int main (int argc,char *argv[])
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
290 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
291 unsigned long i,uid;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
292 long f;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
293 unsigned char *s,*t,*u,*v,tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
294 struct stat sbuf;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
295 logouthook_t lgoh;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
296 int ret = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
297 time_t autologouttime = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
298 char *pgmname;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
299 /* if case we get borked immediately */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
300 if (setjmp (jmpenv)) _exit (1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
301 pgmname = (argc && argv[0]) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
302 (((s = strrchr (argv[0],'/')) || (s = strrchr (argv[0],'\\'))) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
303 (char *) s+1 : argv[0]) : "imapd";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
304 /* set service name before linkage */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
305 mail_parameters (NIL,SET_SERVICENAME,(void *) "imap");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
306 #include "linkage.c"
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
307 rfc822_date (tmp); /* get date/time at startup */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
308 /* initialize server */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
309 server_init (pgmname,"imap","imaps",clkint,kodint,hupint,trmint,staint);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
310 /* forbid automatic untagged expunge */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
311 mail_parameters (NIL,SET_EXPUNGEATPING,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
312 /* arm proxy copy callback */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
313 mail_parameters (NIL,SET_MAILPROXYCOPY,(void *) proxycopy);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
314 /* arm referral callback */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
315 mail_parameters (NIL,SET_IMAPREFERRAL,(void *) referral);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
316 /* arm COPYUID callback */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
317 mail_parameters (NIL,SET_COPYUID,(void *) copyuid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
318 /* arm APPENDUID callback */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
319 mail_parameters (NIL,SET_APPENDUID,(void *) appenduid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
320
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
321 if (stat (SHUTDOWNFILE,&sbuf)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
322 char proxy[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
323 FILE *nntp = fopen (NNTPFILE,"r");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
324 if (nntp) { /* desire NNTP proxy? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
325 if (fgets (proxy,MAILTMPLEN,nntp)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
326 /* remove newline and set NNTP proxy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
327 if (s = strchr (proxy,'\n')) *s = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
328 nntpproxy = cpystr (proxy);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
329 /* disable the news driver */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
330 mail_parameters (NIL,DISABLE_DRIVER,"news");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
331 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
332 fclose (nntp); /* done reading proxy name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
333 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
334 s = myusername_full (&i); /* get user name and flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
335 switch (i) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
336 case MU_NOTLOGGEDIN:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
337 PSOUT ("* OK ["); /* not logged in, ordinary startup */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
338 pcapability (-1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
339 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
340 case MU_ANONYMOUS:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
341 anonymous = T; /* anonymous user, fall into default */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
342 s = "ANONYMOUS";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
343 case MU_LOGGEDIN:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
344 PSOUT ("* PREAUTH ["); /* already logged in, pre-authorized */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
345 pcapability (1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
346 user = cpystr (s); /* copy user name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
347 pass = cpystr ("*"); /* set fake password */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
348 state = SELECT; /* enter select state */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
349 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
350 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
351 fatal ("Unknown state from myusername_full()");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
352 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
353 PSOUT ("] ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
354 if (user) { /* preauthenticated as someone? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
355 PSOUT ("Pre-authenticated user ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
356 PSOUT (user);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
357 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
358 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
359 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
360 else { /* login disabled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
361 PSOUT ("* BYE Service not available ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
362 state = LOGOUT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
363 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
364 PSOUT (tcp_serverhost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
365 PSOUT (" IMAP4rev1 ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
366 PSOUT (CCLIENTVERSION);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
367 PBOUT ('.');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
368 PSOUT (version);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
369 PSOUT (" at ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
370 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
371 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
372 PFLUSH (); /* dump output buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
373 switch (state) { /* do this after the banner */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
374 case LOGIN:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
375 autologouttime = time (0) + LOGINTIMEOUT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
376 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
377 case SELECT:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
378 syslog (LOG_INFO,"Preauthenticated user=%.80s host=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
379 user,tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
380 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
381 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
382
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
383 if (setjmp (jmpenv)) { /* die if a signal handler say so */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
384 /* in case we get borked now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
385 if (setjmp (jmpenv)) _exit (1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
386 /* need to close stream gracefully? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
387 if (stream && !stream->lock && (stream->dtb->flags & DR_XPOINT))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
388 stream = mail_close (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
389 ret = 1; /* set exit status */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
390 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
391 else while (state != LOGOUT) {/* command processing loop */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
392 slurp (cmdbuf,CMDLEN,TIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
393 /* no more last error or literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
394 if (lstwrn) fs_give ((void **) &lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
395 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
396 if (lstref) fs_give ((void **) &lstref);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
397 while (litsp) fs_give ((void **) &litstk[--litsp]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
398 /* find end of line */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
399 if (!strchr (cmdbuf,'\012')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
400 if (t = strchr (cmdbuf,' ')) *t = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
401 if ((t - cmdbuf) > 100) t = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
402 flush (); /* flush excess */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
403 if (state == LOGIN) /* error if NLI */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
404 syslog (LOG_INFO,"Line too long before authentication host=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
405 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
406 sprintf (tmp,response,t ? (char *) cmdbuf : "*");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
407 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
408 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
409 else if (!(tag = strtok (cmdbuf," \015\012"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
410 if (state == LOGIN) /* error if NLI */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
411 syslog (LOG_INFO,"Null command before authentication host=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
412 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
413 PSOUT ("* BAD Null command\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
414 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
415 else if (strlen (tag) > 50) PSOUT ("* BAD Excessively long tag\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
416 else if (!(s = strtok (NIL," \015\012"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
417 if (state == LOGIN) /* error if NLI */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
418 syslog (LOG_INFO,"Missing command before authentication host=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
419 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
420 PSOUT (tag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
421 PSOUT (" BAD Missing command\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
422 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
423 else { /* parse command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
424 response = win; /* set default response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
425 finding = NIL; /* no longer FINDing */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
426 ucase (s); /* canonicalize command case */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
427 /* UID command? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
428 if (!strcmp (s,"UID") && strtok (NIL," \015\012")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
429 uid = T; /* a UID command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
430 s[3] = ' '; /* restore the space delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
431 ucase (s); /* make sure command all uppercase */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
432 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
433 else uid = NIL; /* not a UID command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
434 /* flush previous saved command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
435 if (cmd) fs_give ((void **) &cmd);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
436 cmd = cpystr (s); /* save current command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
437 /* snarf argument, see if possible litplus */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
438 if ((arg = strtok (NIL,"\015\012")) && ((i = strlen (arg)) > 3) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
439 (arg[i - 1] == '}') && (arg[i - 2] == '+') && isdigit (arg[i - 3])) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
440 /* back over possible count */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
441 for (i -= 4; i && isdigit (arg[i]); i--);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
442 if (arg[i] == '{') { /* found a literal? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
443 litplus.ok = T; /* yes, note LITERAL+ in effect, set size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
444 litplus.size = strtoul (arg + i + 1,NIL,10);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
445 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
446 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
447
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
448 /* these commands always valid */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
449 if (!strcmp (cmd,"NOOP")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
450 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
451 else if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
452 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
453 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
454 else if (!strcmp (cmd,"LOGOUT")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
455 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
456 else { /* time to say farewell */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
457 server_init (NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
458 if (lastsel) fs_give ((void **) &lastsel);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
459 if (state == OPEN) stream = mail_close (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
460 state = LOGOUT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
461 PSOUT ("* BYE ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
462 PSOUT (mylocalhost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
463 PSOUT (" IMAP4rev1 server terminating connection\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
464 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
465 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
466 else if (!strcmp (cmd,"CAPABILITY")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
467 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
468 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
469 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
470 pcapability (0); /* print capabilities */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
471 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
472 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
473 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
474 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
475 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
476 #ifdef NETSCAPE_BRAIN_DAMAGE
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
477 else if (!strcmp (cmd,"NETSCAPE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
478 PSOUT ("* OK [NETSCAPE]\015\012* VERSION 1.0 UNIX\015\012* ACCOUNT-URL \"");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
479 PSOUT (NETSCAPE_BRAIN_DAMAGE);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
480 PBOUT ('"');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
481 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
482 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
483 #endif
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
484
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
485 else switch (state) { /* dispatch depending upon state */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
486 case LOGIN: /* waiting to get logged in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
487 /* new style authentication */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
488 if (!strcmp (cmd,"AUTHENTICATE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
489 if (user) fs_give ((void **) &user);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
490 if (pass) fs_give ((void **) &pass);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
491 initial = NIL; /* no initial argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
492 cancelled = NIL; /* not cancelled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
493 /* mandatory first argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
494 if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
495 else if (arg && !(initial = snarf_base64 (&arg)))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
496 response = misarg; /* optional second argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
497 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
498 else if (!strcmp (ucase (s),"ANONYMOUS") && !stat (ANOFILE,&sbuf)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
499 if (!(s = imap_responder ("",0,NIL)))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
500 response ="%.80s BAD AUTHENTICATE ANONYMOUS cancelled\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
501 else if (anonymous_login (argc,argv)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
502 anonymous = T; /* note we are anonymous */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
503 user = cpystr ("ANONYMOUS");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
504 pass = cpystr ("*");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
505 state = SELECT; /* make select */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
506 alerttime = 0; /* force alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
507 response = logwin;/* return logged-in capabilities */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
508 syslog (LOG_INFO,"Authenticated anonymous=%.80s host=%.80s",s,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
509 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
510 fs_give ((void **) &s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
511 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
512 else response ="%.80s NO AUTHENTICATE ANONYMOUS failed\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
513 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
514 else if (user = cpystr (mail_auth (s,imap_responder,argc,argv))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
515 pass = cpystr ("*");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
516 state = SELECT; /* make select */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
517 alerttime = 0; /* force alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
518 response = logwin; /* return logged-in capabilities */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
519 syslog (LOG_INFO,"Authenticated user=%.80s host=%.80s mech=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
520 user,tcp_clienthost (),s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
521 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
522
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
523 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
524 AUTHENTICATOR *auth = mail_lookup_auth (1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
525 char *msg = (char *) fs_get (strlen (cmd) + strlen (s) + 2);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
526 sprintf (msg,"%s %s",cmd,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
527 fs_give ((void **) &cmd);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
528 cmd = msg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
529 for (i = !mail_parameters (NIL,GET_DISABLEPLAINTEXT,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
530 auth && compare_cstring (s,auth->name); auth = auth->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
531 /* Failed authentication when hidden looks like invalid command.
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
532 * This is intentional but confused me when I was debugging.
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
533 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
534 if (auth && auth->server && !(auth->flags & AU_DISABLE) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
535 !(auth->flags & AU_HIDE) && (i || (auth->flags & AU_SECURE))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
536 response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
537 if (cancelled) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
538 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
539 lsterr = cpystr ("cancelled by user");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
540 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
541 if (!lsterr) /* catch-all */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
542 lsterr = cpystr ("Invalid authentication credentials");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
543 syslog (LOG_INFO,"AUTHENTICATE %.80s failure host=%.80s",s,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
544 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
545 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
546 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
547 response = badcmd;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
548 syslog (LOG_INFO,"AUTHENTICATE %.80s invalid host=%.80s",s,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
549 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
550 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
551 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
552 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
553
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
554 /* plaintext login with password */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
555 else if (!strcmp (cmd,"LOGIN")) {
4
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
556 #ifdef QMAIL
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
557 extern char* conv_virtualdomain(char*);
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
558 #endif
0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
559 if (user) fs_give ((void **) &user);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
560 if (pass) fs_give ((void **) &pass);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
561 /* two arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
562 if (!((user = cpystr (snarf (&arg))) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
563 (pass = cpystr (snarf (&arg))))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
564 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
565 /* see if we allow anonymous */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
566 else if (!compare_cstring (user,"ANONYMOUS") &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
567 !stat (ANOFILE,&sbuf) && anonymous_login (argc,argv)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
568 anonymous = T; /* note we are anonymous */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
569 ucase (user); /* make all uppercase for consistency */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
570 state = SELECT; /* make select */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
571 alerttime = 0; /* force alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
572 response = logwin; /* return logged-in capabilities */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
573 syslog (LOG_INFO,"Login anonymous=%.80s host=%.80s",pass,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
574 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
575 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
576 else { /* delimit user from possible admin */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
577 if (s = strchr (user,'*')) *s++ ='\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
578 /* see if username and password are OK */
4
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
579 #ifdef QMAIL
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
580 if (server_login (conv_virtualdomain(user),pass,s,argc,argv)) {
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
581 #else
0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
582 if (server_login (user,pass,s,argc,argv)) {
4
d741b3ecc917 imapext-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 3
diff changeset
583 #endif
0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
584 state = SELECT; /* make select */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
585 alerttime = 0; /* force alert */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
586 response = logwin;/* return logged-in capabilities */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
587 syslog (LOG_INFO,"Login user=%.80s host=%.80s",user,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
588 tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
589 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
590 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
591 response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
592 if (!lsterr) lsterr = cpystr ("Invalid login credentials");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
593 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
594 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
595 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
596 /* start TLS security */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
597 else if (!strcmp (cmd,"STARTTLS")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
598 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
599 else if (lsterr = ssl_start_tls (pgmname)) response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
600 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
601 else response = badcmd;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
602 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
603
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
604 case OPEN: /* valid only when mailbox open */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
605 /* fetch mailbox attributes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
606 if (!strcmp (cmd,"FETCH") || !strcmp (cmd,"UID FETCH")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
607 if (!(arg && (s = strtok (arg," ")) && (t = strtok(NIL,"\015\012"))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
608 response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
609 else if (uid ? mail_uid_sequence (stream,s) :
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
610 mail_sequence (stream,s)) fetch (t,uid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
611 else response = badseq;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
612 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
613 /* store mailbox attributes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
614 else if (!strcmp (cmd,"STORE") || !strcmp (cmd,"UID STORE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
615 /* must have three arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
616 if (!(arg && (s = strtok (arg," ")) && (v = strtok (NIL," ")) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
617 (t = strtok (NIL,"\015\012")))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
618 else if (!(uid ? mail_uid_sequence (stream,s) :
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
619 mail_sequence (stream,s))) response = badseq;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
620 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
621 f = ST_SET | (uid ? ST_UID : NIL)|((v[5]&&v[6]) ? ST_SILENT : NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
622 if (!strcmp (ucase (v),"FLAGS") || !strcmp (v,"FLAGS.SILENT")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
623 strcpy (tmp,"\\Answered \\Flagged \\Deleted \\Draft \\Seen");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
624 for (i = 0, u = tmp;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
625 (i < NUSERFLAGS) && (v = stream->user_flags[i]); i++)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
626 if (strlen (v) <
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
627 ((size_t) (MAILTMPLEN - ((u += strlen (u)) + 2 - tmp)))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
628 *u++ = ' '; /* write next flag */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
629 strcpy (u,v);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
630 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
631 mail_flag (stream,s,tmp,f & ~ST_SET);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
632 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
633 else if (!strcmp (v,"-FLAGS") || !strcmp (v,"-FLAGS.SILENT"))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
634 f &= ~ST_SET; /* clear flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
635 else if (strcmp (v,"+FLAGS") && strcmp (v,"+FLAGS.SILENT")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
636 response = badatt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
637 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
638 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
639 /* find last keyword */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
640 for (i = 0; (i < NUSERFLAGS) && stream->user_flags[i]; i++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
641 mail_flag (stream,s,t,f);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
642 /* any new keywords appeared? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
643 if (i < NUSERFLAGS && stream->user_flags[i]) new_flags (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
644 /* return flags if silence not wanted */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
645 if (uid ? mail_uid_sequence (stream,s) : mail_sequence (stream,s))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
646 for (i = 1; i <= nmsgs; i++) if (mail_elt(stream,i)->sequence)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
647 mail_elt (stream,i)->spare2 = (f & ST_SILENT) ? NIL : T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
648 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
649 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
650
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
651 /* check for new mail */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
652 else if (!strcmp (cmd,"CHECK")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
653 /* no arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
654 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
655 else if (!anonymous) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
656 mail_check (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
657 /* remember last check time */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
658 lastcheck = time (0);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
659 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
660 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
661 /* expunge deleted messages */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
662 else if (!(anonymous || (strcmp (cmd,"EXPUNGE") &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
663 strcmp (cmd,"UID EXPUNGE")))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
664 if (uid && !arg) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
665 else if (!uid && arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
666 else { /* expunge deleted or specified UIDs */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
667 mail_expunge_full (stream,arg,arg ? EX_UID : NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
668 /* remember last checkpoint */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
669 lastcheck = time (0);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
670 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
671 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
672 /* close mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
673 else if (!strcmp (cmd,"CLOSE") || !strcmp (cmd,"UNSELECT")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
674 /* no arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
675 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
676 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
677 /* no last uid */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
678 uidvalidity = lastuid = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
679 if (lastsel) fs_give ((void **) &lastsel);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
680 if (lastid) fs_give ((void **) &lastid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
681 if (lastst.data) fs_give ((void **) &lastst.data);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
682 stream = mail_close_full (stream,((*cmd == 'C') && !anonymous) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
683 CL_EXPUNGE : NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
684 state = SELECT; /* no longer opened */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
685 lastcheck = 0; /* no last checkpoint */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
686 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
687 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
688 else if (!anonymous && /* copy message(s) */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
689 (!strcmp (cmd,"COPY") || !strcmp (cmd,"UID COPY"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
690 trycreate = NIL; /* no trycreate status */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
691 if (!(arg && (s = strtok (arg," ")) && (arg = strtok(NIL,"\015\012"))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
692 && (t = snarf (&arg)))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
693 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
694 else if (!nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
695 response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
696 if (!lsterr) lsterr = cpystr ("Mailbox is empty");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
697 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
698 else if (!(uid ? mail_uid_sequence (stream,s) :
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
699 mail_sequence (stream,s))) response = badseq;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
700 /* try copy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
701 else if (!mail_copy_full (stream,s,t,uid ? CP_UID : NIL)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
702 response = trycreate ? losetry : lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
703 if (!lsterr) lsterr = cpystr ("No such destination mailbox");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
704 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
705 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
706
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
707 /* sort mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
708 else if (!strcmp (cmd,"SORT") || !strcmp (cmd,"UID SORT")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
709 /* must have four arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
710 if (!(arg && (*arg == '(') && (t = strchr (s = arg + 1,')')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
711 (t[1] == ' ') && (*(arg = t + 2)))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
712 else { /* read criteria */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
713 SEARCHPGM *spg = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
714 char *cs = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
715 SORTPGM *pgm = NIL,*pg = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
716 unsigned long *slst,*sl;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
717 *t = NIL; /* tie off criteria list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
718 if (!(s = strtok (ucase (s)," "))) response = badatt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
719 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
720 do { /* parse sort attributes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
721 if (pg) pg = pg->next = mail_newsortpgm ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
722 else pgm = pg = mail_newsortpgm ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
723 if (!strcmp (s,"REVERSE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
724 pg->reverse = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
725 if (!(s = strtok (NIL," "))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
726 s = ""; /* end of attributes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
727 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
728 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
729 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
730 if (!strcmp (s,"DATE")) pg->function = SORTDATE;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
731 else if (!strcmp (s,"ARRIVAL")) pg->function = SORTARRIVAL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
732 else if (!strcmp (s,"FROM")) pg->function = SORTFROM;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
733 else if (!strcmp (s,"SUBJECT")) pg->function = SORTSUBJECT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
734 else if (!strcmp (s,"TO")) pg->function = SORTTO;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
735 else if (!strcmp (s,"CC")) pg->function = SORTCC;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
736 else if (!strcmp (s,"SIZE")) pg->function = SORTSIZE;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
737 else break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
738 } while (s = strtok (NIL," "));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
739 /* bad SORT attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
740 if (s) response = badatt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
741 /* get charset and search criteria */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
742 else if (!((t = snarf (&arg)) && (cs = cpystr (t)) && arg &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
743 *arg)) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
744 /* parse search criteria */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
745 else if (!parse_criteria (spg = mail_newsearchpgm (),&arg,nmsgs,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
746 uidmax (stream),0)) response = badatt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
747 else if (arg && *arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
748 else if (slst = mail_sort (stream,cs,spg,pgm,uid ? SE_UID:NIL)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
749 PSOUT ("* SORT");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
750 for (sl = slst; *sl; sl++) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
751 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
752 pnum (*sl);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
753 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
754 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
755 fs_give ((void **) &slst);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
756 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
757 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
758 if (pgm) mail_free_sortpgm (&pgm);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
759 if (spg) mail_free_searchpgm (&spg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
760 if (cs) fs_give ((void **) &cs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
761 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
762 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
763
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
764 /* thread mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
765 else if (!strcmp (cmd,"THREAD") || !strcmp (cmd,"UID THREAD")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
766 THREADNODE *thr;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
767 SEARCHPGM *spg = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
768 char *cs = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
769 /* must have four arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
770 if (!(arg && (s = strtok (arg," ")) && (cs = strtok (NIL," ")) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
771 (cs = cpystr (cs)) && (arg = strtok (NIL,"\015\012"))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
772 response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
773 else if (!parse_criteria (spg = mail_newsearchpgm (),&arg,nmsgs,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
774 uidmax (stream),0)) response = badatt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
775 else if (arg && *arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
776 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
777 if (thr = mail_thread (stream,s,cs,spg,uid ? SE_UID : NIL)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
778 PSOUT ("* THREAD ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
779 pthread (thr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
780 mail_free_threadnode (&thr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
781 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
782 else PSOUT ("* THREAD");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
783 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
784 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
785 if (spg) mail_free_searchpgm (&spg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
786 if (cs) fs_give ((void **) &cs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
787 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
788
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
789 /* search mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
790 else if (!strcmp (cmd,"SEARCH") || !strcmp (cmd,"UID SEARCH")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
791 int retval = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
792 char *charset = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
793 SEARCHPGM *pgm;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
794 response = misarg; /* assume failure */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
795 if (!arg) break; /* one or more arguments required */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
796 if (((arg[0] == 'R') || (arg[0] == 'r')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
797 ((arg[1] == 'E') || (arg[1] == 'e')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
798 ((arg[2] == 'T') || (arg[2] == 't')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
799 ((arg[3] == 'U') || (arg[3] == 'u')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
800 ((arg[4] == 'R') || (arg[4] == 'r')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
801 ((arg[5] == 'N') || (arg[5] == 'n')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
802 (arg[6] == ' ') && (arg[7] == '(')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
803 retval = 0x4000; /* return is specified */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
804 for (arg += 8; *arg && (*arg != ')'); ) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
805 if (((arg[0] == 'M') || (arg[0] == 'm')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
806 ((arg[1] == 'I') || (arg[1] == 'i')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
807 ((arg[2] == 'N') || (arg[2] == 'n')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
808 ((arg[3] == ' ') || (arg[3] == ')'))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
809 retval |= 0x1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
810 arg += 3;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
811 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
812 else if (((arg[0] == 'M') || (arg[0] == 'm')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
813 ((arg[1] == 'A') || (arg[1] == 'a')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
814 ((arg[2] == 'X') || (arg[2] == 'x')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
815 ((arg[3] == ' ') || (arg[3] == ')'))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
816 retval |= 0x2;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
817 arg += 3;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
818 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
819 else if (((arg[0] == 'A') || (arg[0] == 'a')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
820 ((arg[1] == 'L') || (arg[1] == 'l')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
821 ((arg[2] == 'L') || (arg[2] == 'l')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
822 ((arg[3] == ' ') || (arg[3] == ')'))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
823 retval |= 0x4;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
824 arg += 3;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
825 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
826 else if (((arg[0] == 'C') || (arg[0] == 'c')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
827 ((arg[1] == 'O') || (arg[1] == 'o')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
828 ((arg[2] == 'U') || (arg[2] == 'u')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
829 ((arg[3] == 'N') || (arg[3] == 'n')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
830 ((arg[4] == 'T') || (arg[4] == 't')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
831 ((arg[5] == ' ') || (arg[5] == ')'))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
832 retval |= 0x10;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
833 arg += 5;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
834 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
835 else break; /* unknown return value */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
836 /* more return values to come */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
837 if ((*arg == ' ') && (arg[1] != ')')) ++arg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
838 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
839 /* RETURN list must be properly terminated */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
840 if ((*arg++ != ')') || (*arg++ != ' ')) break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
841 /* default return value is ALL */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
842 if (!(retval &= 0x3fff)) retval = 0x4;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
843 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
844
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
845 /* character set specified? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
846 if (((arg[0] == 'C') || (arg[0] == 'c')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
847 ((arg[1] == 'H') || (arg[1] == 'h')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
848 ((arg[2] == 'A') || (arg[2] == 'a')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
849 ((arg[3] == 'R') || (arg[3] == 'r')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
850 ((arg[4] == 'S') || (arg[4] == 's')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
851 ((arg[5] == 'E') || (arg[5] == 'e')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
852 ((arg[6] == 'T') || (arg[6] == 't')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
853 (arg[7] == ' ')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
854 arg += 8; /* yes, skip over CHARSET token */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
855 if (s = snarf (&arg)) charset = cpystr (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
856 else break; /* missing character set */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
857 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
858 /* must have arguments here */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
859 if (!(arg && *arg)) break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
860 if (parse_criteria (pgm = mail_newsearchpgm (),&arg,nmsgs,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
861 uidmax (stream),0) && !*arg) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
862 response = win; /* looks good, try the search */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
863 mail_search_full (stream,charset,pgm,SE_FREE);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
864 /* output search results if success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
865 if (response == win) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
866 if (retval) { /* ESEARCH desired */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
867 PSOUT ("* ESEARCH (TAG ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
868 pstring (tag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
869 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
870 if (uid) PSOUT (" UID");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
871 /* wants MIN */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
872 if (retval & 0x1) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
873 for (i = 1; (i <= nmsgs) && !mail_elt (stream,i)->searched;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
874 ++i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
875 if (i <= nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
876 PSOUT (" MIN ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
877 pnum (uid ? mail_uid (stream,i) : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
878 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
879 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
880 /* wants MAX */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
881 if (retval & 0x2) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
882 for (i = nmsgs; i && !mail_elt (stream,i)->searched; --i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
883 if (i) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
884 PSOUT (" MAX ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
885 pnum (uid ? mail_uid (stream,i) : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
886 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
887 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
888
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
889 /* wants ALL */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
890 if (retval & 0x4) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
891 unsigned long j;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
892 /* find first match */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
893 for (i = 1; (i <= nmsgs) && !mail_elt (stream,i)->searched;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
894 ++i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
895 if (i <= nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
896 PSOUT (" ALL ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
897 pnum (uid ? mail_uid (stream,i) : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
898 j = i; /* last message output */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
899 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
900 while (++i <= nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
901 if (mail_elt (stream,i)->searched) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
902 while ((++i <= nmsgs) && mail_elt (stream,i)->searched);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
903 /* previous message is end of range */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
904 if (j != --i) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
905 PBOUT (':');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
906 pnum (uid ? mail_uid (stream,i) : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
907 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
908 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
909 /* search for next match */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
910 while ((++i <= nmsgs) && !mail_elt (stream,i)->searched);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
911 if (i <= nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
912 PBOUT (',');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
913 pnum (uid ? mail_uid (stream,i) : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
914 j = i; /* last message output */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
915 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
916 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
917 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
918 /* wants COUNT */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
919 if (retval & 0x10) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
920 unsigned long j;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
921 for (i = 1, j = 0; i <= nmsgs; ++i)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
922 if (mail_elt (stream,i)->searched) ++j;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
923 PSOUT (" COUNT ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
924 pnum (j);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
925 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
926 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
927 else { /* standard search */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
928 PSOUT ("* SEARCH");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
929 for (i = 1; i <= nmsgs; ++i)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
930 if (mail_elt (stream,i)->searched) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
931 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
932 pnum (uid ? mail_uid (stream,i) : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
933 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
934 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
935 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
936 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
937 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
938 else mail_free_searchpgm (&pgm);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
939 if (charset) fs_give ((void **) &charset);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
940 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
941
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
942 else /* fall into select case */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
943 case SELECT: /* valid whenever logged in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
944 /* select new mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
945 if (!(strcmp (cmd,"SELECT") && strcmp (cmd,"EXAMINE") &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
946 strcmp (cmd,"BBOARD"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
947 /* single argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
948 if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
949 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
950 else if (nameok (NIL,s = bboardname (cmd,s))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
951 DRIVER *factory = mail_valid (NIL,s,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
952 f = (anonymous ? OP_ANONYMOUS + OP_READONLY : NIL) |
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
953 ((*cmd == 'S') ? NIL : OP_READONLY);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
954 curdriver = NIL; /* no drivers known */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
955 /* no last uid */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
956 uidvalidity = lastuid = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
957 if (lastid) fs_give ((void **) &lastid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
958 if (lastst.data) fs_give ((void **) &lastst.data);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
959 nflags = 0; /* force update */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
960 nmsgs = recent = 0xffffffff;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
961 if (factory && !strcmp (factory->name,"phile") &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
962 (stream = mail_open (stream,s,f | OP_SILENT)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
963 (response == win)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
964 BODY *b;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
965 /* see if proxy open */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
966 if ((mail_elt (stream,1)->rfc822_size < 400) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
967 mail_fetchstructure (stream,1,&b) && (b->type == TYPETEXT) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
968 (t = mail_fetch_text (stream,1,NIL,&i,NIL)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
969 (i < MAILTMPLEN) && (t[0] == '{')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
970 /* copy and tie off */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
971 strncpy (tmp,t,i)[i] = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
972 /* nuke any trailing newline */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
973 if (t = strpbrk (tmp,"\r\n")) *t = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
974 /* try to open proxy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
975 if ((tstream = mail_open (NIL,tmp,f | OP_SILENT)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
976 (response == win) && tstream->nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
977 s = tmp; /* got it, close the link */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
978 mail_close (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
979 stream = tstream;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
980 tstream = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
981 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
982 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
983 /* now give the exists event */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
984 stream->silent = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
985 mm_exists (stream,stream->nmsgs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
986 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
987 else if (!factory && isnewsproxy (s)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
988 sprintf (tmp,"{%.300s/nntp}%.300s",nntpproxy,(char *) s+6);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
989 stream = mail_open (stream,tmp,f);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
990 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
991 /* open stream normally then */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
992 else stream = mail_open (stream,s,f);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
993
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
994 if (stream && (response == win)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
995 state = OPEN; /* note state open */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
996 if (lastsel) fs_give ((void **) &lastsel);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
997 /* canonicalize INBOX */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
998 if (!compare_cstring (s,"#MHINBOX"))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
999 lastsel = cpystr ("#MHINBOX");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1000 else lastsel = cpystr (compare_cstring (s,"INBOX") ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1001 (char *) s : "INBOX");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1002 /* note readonly/readwrite */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1003 response = stream->rdonly ? rowin : rwwin;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1004 if (anonymous)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1005 syslog (LOG_INFO,"Anonymous select of %.80s host=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1006 stream->mailbox,tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1007 lastcheck = 0; /* no last check */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1008 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1009 else { /* failed, nuke old selection */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1010 if (stream) stream = mail_close (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1011 state = SELECT; /* no mailbox open now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1012 if (lastsel) fs_give ((void **) &lastsel);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1013 response = lose; /* open failed */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1014 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1015 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1016 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1017
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1018 /* APPEND message to mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1019 else if (!(anonymous || strcmp (cmd,"APPEND"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1020 /* parse mailbox name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1021 if ((s = snarf (&arg)) && arg) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1022 STRING st; /* message stringstruct */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1023 APPENDDATA ad;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1024 ad.arg = arg; /* command arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1025 /* no message yet */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1026 ad.flags = ad.date = ad.msg = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1027 ad.message = &st; /* pointer to stringstruct to use */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1028 trycreate = NIL; /* no trycreate status */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1029 if (!mail_append_multiple (NIL,s,append_msg,(void *) &ad)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1030 if (response == win) response = trycreate ? losetry : lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1031 /* this can happen with #driver. hack */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1032 if (!lsterr) lsterr = cpystr ("No such destination mailbox");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1033 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1034 /* clean up any message text left behind */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1035 if (ad.flags) fs_give ((void **) &ad.flags);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1036 if (ad.date) fs_give ((void **) &ad.date);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1037 if (ad.msg) fs_give ((void **) &ad.msg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1038 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1039 else response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1040 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1041 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1042 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1043 /* list mailboxes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1044 else if (!strcmp (cmd,"LIST") || !strcmp (cmd,"RLIST")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1045 /* get reference and mailbox argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1046 if (!((s = snarf (&arg)) && (t = snarf_list (&arg))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1047 response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1048 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1049 /* make sure anonymous can't do bad things */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1050 else if (nameok (s,t)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1051 if (newsproxypattern (s,t,tmp,LONGT)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1052 proxylist = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1053 mail_list (NIL,"",tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1054 proxylist = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1055 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1056 else mail_list (NIL,s,t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1057 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1058 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1059 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1060 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1061 /* scan mailboxes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1062 else if (!strcmp (cmd,"SCAN")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1063 /* get arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1064 if (!((s = snarf (&arg)) && (t = snarf_list (&arg)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1065 (u = snarf (&arg)))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1066 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1067 /* make sure anonymous can't do bad things */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1068 else if (nameok (s,t)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1069 if (newsproxypattern (s,t,tmp,NIL))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1070 mm_log ("SCAN not permitted for news",ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1071 else mail_scan (NIL,s,t,u);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1072 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1073 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1074 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1075 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1076 /* list subscribed mailboxes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1077 else if (!strcmp (cmd,"LSUB") || !strcmp (cmd,"RLSUB")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1078 /* get reference and mailbox argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1079 if (!((s = snarf (&arg)) && (t = snarf_list (&arg))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1080 response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1081 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1082 /* make sure anonymous can't do bad things */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1083 else if (nameok (s,t)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1084 if (newsproxypattern (s,t,tmp,NIL)) newsrc_lsub (NIL,tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1085 else mail_lsub (NIL,s,t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1086 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1087 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1088 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1089 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1090
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1091 /* find mailboxes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1092 else if (!strcmp (cmd,"FIND")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1093 /* get subcommand and true argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1094 if (!(arg && (s = strtok (arg," \015\012")) && (s == cmd + 5) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1095 (cmd[4] = ' ') && ucase (s) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1096 (arg = strtok (NIL,"\015\012")) && (s = snarf_list (&arg))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1097 response = misarg; /* missing required argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1098 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1099 /* punt on single-char wildcards */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1100 else if (strpbrk (s,"%?")) response =
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1101 "%.80s NO IMAP2 ? and %% wildcards not supported: %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1102 else if (nameok (NIL,s)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1103 finding = T; /* note that we are FINDing */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1104 /* dispatch based on type */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1105 if (!strcmp (cmd,"FIND MAILBOXES") && !anonymous)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1106 mail_lsub (NIL,NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1107 else if (!strcmp (cmd,"FIND ALL.MAILBOXES")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1108 /* convert * to % for compatible behavior */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1109 for (t = s; *t; t++) if (*t == '*') *t = '%';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1110 mail_list (NIL,NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1111 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1112 else response = badcmd;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1113 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1114 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1115 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1116 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1117
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1118 /* status of mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1119 else if (!strcmp (cmd,"STATUS")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1120 if (!((s = snarf (&arg)) && arg && (*arg++ == '(') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1121 (t = strchr (arg,')')) && (t - arg) && !t[1]))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1122 response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1123 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1124 f = NIL; /* initially no flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1125 *t = '\0'; /* tie off flag string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1126 /* read flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1127 t = strtok (ucase (arg)," ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1128 do { /* parse each one; unknown generate warning */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1129 if (!strcmp (t,"MESSAGES")) f |= SA_MESSAGES;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1130 else if (!strcmp (t,"RECENT")) f |= SA_RECENT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1131 else if (!strcmp (t,"UNSEEN")) f |= SA_UNSEEN;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1132 else if (!strcmp (t,"UIDNEXT")) f |= SA_UIDNEXT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1133 else if (!strcmp (t,"UIDVALIDITY")) f |= SA_UIDVALIDITY;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1134 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1135 PSOUT ("* NO Unknown status flag ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1136 PSOUT (t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1137 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1138 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1139 } while (t = strtok (NIL," "));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1140 ping_mailbox (uid); /* in case the fool did STATUS on open mbx */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1141 PFLUSH (); /* make sure stdout is dumped in case slave */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1142 if (!compare_cstring (s,"INBOX")) s = "INBOX";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1143 else if (!compare_cstring (s,"#MHINBOX")) s = "#MHINBOX";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1144 if (state == LOGOUT) response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1145 /* get mailbox status */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1146 else if (lastsel && (!strcmp (s,lastsel) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1147 (stream && !strcmp (s,stream->mailbox)))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1148 unsigned long unseen;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1149 /* snarl at cretins which do this */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1150 PSOUT ("* NO CLIENT BUG DETECTED: STATUS on selected mailbox: ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1151 PSOUT (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1152 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1153 tmp[0] = ' '; tmp[1] = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1154 if (f & SA_MESSAGES)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1155 sprintf (tmp + strlen (tmp)," MESSAGES %lu",stream->nmsgs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1156 if (f & SA_RECENT)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1157 sprintf (tmp + strlen (tmp)," RECENT %lu",stream->recent);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1158 if (f & SA_UNSEEN) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1159 for (i = 1,unseen = 0; i <= stream->nmsgs; i++)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1160 if (!mail_elt (stream,i)->seen) unseen++;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1161 sprintf (tmp + strlen (tmp)," UNSEEN %lu",unseen);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1162 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1163 if (f & SA_UIDNEXT)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1164 sprintf (tmp + strlen (tmp)," UIDNEXT %lu",stream->uid_last+1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1165 if (f & SA_UIDVALIDITY)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1166 sprintf (tmp + strlen(tmp)," UIDVALIDITY %lu",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1167 stream->uid_validity);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1168 tmp[1] = '(';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1169 strcat (tmp,")\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1170 PSOUT ("* STATUS ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1171 pastring (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1172 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1173 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1174 else if (isnewsproxy (s)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1175 sprintf (tmp,"{%.300s/nntp}%.300s",nntpproxy,(char *) s+6);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1176 if (!mail_status (NIL,tmp,f)) response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1177 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1178 else if (!mail_status (NIL,s,f)) response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1179 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1180 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1181 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1182 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1183
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1184 /* subscribe to mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1185 else if (!(anonymous || strcmp (cmd,"SUBSCRIBE"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1186 /* get <mailbox> or MAILBOX <mailbox> */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1187 if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1188 else if (arg) { /* IMAP2bis form */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1189 if (compare_cstring (s,"MAILBOX")) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1190 else if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1191 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1192 else mail_subscribe (NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1193 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1194 else if (isnewsproxy (s)) newsrc_update (NIL,s+6,':');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1195 else mail_subscribe (NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1196 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1197 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1198 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1199 /* unsubscribe to mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1200 else if (!(anonymous || strcmp (cmd,"UNSUBSCRIBE"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1201 /* get <mailbox> or MAILBOX <mailbox> */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1202 if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1203 else if (arg) { /* IMAP2bis form */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1204 if (compare_cstring (s,"MAILBOX")) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1205 else if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1206 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1207 else if (isnewsproxy (s)) newsrc_update (NIL,s+6,'!');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1208 else mail_unsubscribe (NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1209 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1210 else mail_unsubscribe (NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1211 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1212 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1213 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1214
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1215 else if (!strcmp (cmd,"NAMESPACE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1216 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1217 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1218 NAMESPACE **ns = (NAMESPACE **) mail_parameters(NIL,GET_NAMESPACE,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1219 NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1220 NAMESPACE *n;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1221 PARAMETER *p;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1222 PSOUT ("* NAMESPACE");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1223 if (ns) for (i = 0; i < 3; i++) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1224 if (n = ns[i]) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1225 PSOUT (" (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1226 do {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1227 PBOUT ('(');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1228 pstring (n->name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1229 switch (n->delimiter) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1230 case '\\': /* quoted delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1231 case '"':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1232 PSOUT (" \"\\\\\"");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1233 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1234 case '\0': /* no delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1235 PSOUT (" NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1236 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1237 default: /* unquoted delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1238 PSOUT (" \"");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1239 PBOUT (n->delimiter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1240 PBOUT ('"');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1241 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1242 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1243 /* NAMESPACE extensions are hairy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1244 if (p = n->param) do {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1245 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1246 pstring (p->attribute);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1247 PSOUT (" (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1248 do pstring (p->value);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1249 while (p->next && !p->next->attribute && (p = p->next));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1250 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1251 } while (p = p->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1252 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1253 } while (n = n->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1254 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1255 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1256 else PSOUT (" NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1257 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1258 else PSOUT (" NIL NIL NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1259 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1260 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1261 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1262 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1263 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1264
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1265 /* create mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1266 else if (!(anonymous || strcmp (cmd,"CREATE"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1267 if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1268 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1269 else mail_create (NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1270 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1271 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1272 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1273 /* delete mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1274 else if (!(anonymous || strcmp (cmd,"DELETE"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1275 if (!(s = snarf (&arg))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1276 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1277 else { /* make sure not selected */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1278 if (lastsel && (!strcmp (s,lastsel) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1279 (stream && !strcmp (s,stream->mailbox))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1280 mm_log ("Can not DELETE the selected mailbox",ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1281 else mail_delete (NIL,s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1282 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1283 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1284 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1285 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1286 /* rename mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1287 else if (!(anonymous || strcmp (cmd,"RENAME"))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1288 if (!((s = snarf (&arg)) && (t = snarf (&arg)))) response = misarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1289 else if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1290 else { /* make sure not selected */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1291 if (!compare_cstring (s,"INBOX")) s = "INBOX";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1292 else if (!compare_cstring (s,"#MHINBOX")) s = "#MHINBOX";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1293 if (lastsel && (!strcmp (s,lastsel) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1294 (stream && !strcmp (s,stream->mailbox))))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1295 mm_log ("Can not RENAME the selected mailbox",ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1296 else mail_rename (NIL,s,t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1297 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1298 if (stream) /* allow untagged EXPUNGE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1299 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,(void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1300 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1301
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1302 /* idle mode */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1303 else if (!strcmp (cmd,"IDLE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1304 /* no arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1305 if (arg) response = badarg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1306 else { /* tell client ready for argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1307 unsigned long donefake = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1308 PSOUT ("+ Waiting for DONE\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1309 PFLUSH (); /* dump output buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1310 /* inactivity countdown */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1311 i = ((TIMEOUT) / (IDLETIMER)) + 1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1312 do { /* main idle loop */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1313 if (!donefake) { /* don't ping mailbox if faking */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1314 mail_parameters (stream,SET_ONETIMEEXPUNGEATPING,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1315 (void *) stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1316 ping_mailbox (uid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1317 /* maybe do a checkpoint if not anonymous */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1318 if (!anonymous && stream && (time (0) > lastcheck + CHECKTIMER)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1319 mail_check (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1320 /* cancel likely altwin from mail_check() */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1321 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1322 if (lstwrn) fs_give ((void **) &lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1323 /* remember last checkpoint */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1324 lastcheck = time (0);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1325 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1326 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1327 if (lstwrn) { /* have a warning? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1328 PSOUT ("* NO ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1329 PSOUT (lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1330 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1331 fs_give ((void **) &lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1332 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1333 if (!(i % 2)) { /* prevent NAT timeouts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1334 sprintf (tmp,"* OK Timeout in %lu minutes\015\012",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1335 (i * IDLETIMER) / 60);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1336 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1337 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1338 /* two minutes before the end... */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1339 if ((state == OPEN) && (i <= 2)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1340 sprintf (tmp,"* %lu EXISTS\015\012* %lu RECENT\015\012",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1341 donefake = nmsgs + 1,recent + 1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1342 PSOUT (tmp); /* prod client to wake up */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1343 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1344 PFLUSH (); /* dump output buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1345 } while ((state != LOGOUT) && !INWAIT (IDLETIMER) && --i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1346
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1347 /* time to exit idle loop */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1348 if (state != LOGOUT) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1349 if (i) { /* still have time left? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1350 /* yes, read expected DONE */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1351 slurp (tmp,MAILTMPLEN,INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1352 if (((tmp[0] != 'D') && (tmp[0] != 'd')) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1353 ((tmp[1] != 'O') && (tmp[1] != 'o')) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1354 ((tmp[2] != 'N') && (tmp[2] != 'n')) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1355 ((tmp[3] != 'E') && (tmp[3] != 'e')) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1356 (((tmp[4] != '\015') || (tmp[5] != '\012')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1357 (tmp[4] != '\012')))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1358 response = "%.80s BAD Bogus IDLE continuation\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1359 if (donefake) { /* if faking at the end */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1360 /* send EXPUNGE (should be just 1) */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1361 while (donefake > nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1362 sprintf (tmp,"* %lu EXPUNGE\015\012",donefake--);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1363 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1364 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1365 sprintf (tmp,"* %lu EXISTS\015\012* %lu RECENT\015\012",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1366 nmsgs,recent);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1367 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1368 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1369 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1370 else clkint (); /* otherwise do autologout action */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1371 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1372 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1373 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1374 else response = badcmd;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1375 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1376 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1377 response = "%.80s BAD Unknown state for %.80s command\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1378 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1379 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1380
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1381 while (litplus.ok) { /* any unread LITERAL+? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1382 litplus.ok = NIL; /* yes, cancel it now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1383 clearerr (stdin); /* clear stdin errors */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1384 status = "discarding unread literal";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1385 /* read literal and discard it */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1386 while (i = (litplus.size > MAILTMPLEN) ? MAILTMPLEN : litplus.size) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1387 if (state == LOGOUT) litplus.size = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1388 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1389 settimeout (INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1390 if (PSINR (tmp,i)) litplus.size -= i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1391 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1392 ioerror (stdin,status);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1393 litplus.size = 0; /* in case it continues */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1394 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1395 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1396 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1397 settimeout (0); /* stop timeout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1398 /* get new command tail */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1399 slurp (tmp,MAILTMPLEN,INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1400 /* locate end of line */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1401 if (t = strchr (tmp,'\012')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1402 /* back over CR */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1403 if ((t > tmp) && (t[-1] == '\015')) --t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1404 *t = NIL; /* tie off CRLF */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1405 /* possible LITERAL+? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1406 if (((i = strlen (tmp)) > 3) && (tmp[i - 1] == '}') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1407 (tmp[i - 2] == '+') && isdigit (tmp[i - 3])) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1408 /* back over possible count */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1409 for (i -= 4; i && isdigit (tmp[i]); i--);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1410 if (tmp[i] == '{') { /* found a literal? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1411 litplus.ok = T; /* yes, note LITERAL+ in effect, set size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1412 litplus.size = strtoul (tmp + i + 1,NIL,10);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1413 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1414 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1415 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1416 else flush (); /* overlong line after LITERAL+, punt */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1417 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1418 ping_mailbox (uid); /* update mailbox status before response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1419 if (lstwrn && lsterr) { /* output most recent warning */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1420 PSOUT ("* NO ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1421 PSOUT (lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1422 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1423 fs_give ((void **) &lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1424 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1425
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1426 if (response == logwin) { /* authentication win message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1427 sprintf (tmp,response,lstref ? "*" : tag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1428 PSOUT (tmp); /* start response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1429 pcapability (1); /* print logged-in capabilities */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1430 PSOUT ("] User ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1431 PSOUT (user);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1432 PSOUT (" authenticated\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1433 if (lstref) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1434 sprintf (tmp,response,tag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1435 PSOUT (tmp); /* start response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1436 PSOUT ("[REFERRAL ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1437 PSOUT (lstref);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1438 PSOUT ("] ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1439 PSOUT (lasterror ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1440 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1441 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1442 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1443 else if ((response == win) || (response == lose)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1444 sprintf (tmp,response,tag);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1445 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1446 if (cauidvalidity) { /* COPYUID/APPENDUID response? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1447 sprintf (tmp,"[%.80sUID %lu ",(char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1448 ((s = strchr (cmd,' ')) ? s+1 : cmd),cauidvalidity);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1449 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1450 cauidvalidity = 0; /* cancel response for future */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1451 if (csset) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1452 pset (&csset);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1453 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1454 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1455 pset (&caset);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1456 PSOUT ("] ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1457 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1458 else if (lstref) { /* have a referral? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1459 PSOUT ("[REFERRAL ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1460 PSOUT (lstref);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1461 PSOUT ("] ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1462 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1463 if (lsterr || lstwrn) PSOUT (lasterror ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1464 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1465 PSOUT (cmd);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1466 PSOUT ((response == win) ? " completed" : "failed");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1467 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1468 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1469 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1470 else { /* normal response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1471 if ((response == rowin) || (response == rwwin)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1472 if (lstwrn) { /* output most recent warning */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1473 PSOUT ("* NO ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1474 PSOUT (lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1475 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1476 fs_give ((void **) &lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1477 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1478 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1479 sprintf (tmp,response,tag,cmd,lasterror ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1480 PSOUT (tmp); /* output response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1481 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1482 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1483 PFLUSH (); /* make sure output blatted */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1484
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1485 if (autologouttime) { /* have an autologout in effect? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1486 /* cancel if no longer waiting for login */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1487 if (state != LOGIN) autologouttime = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1488 /* took too long to login */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1489 else if (autologouttime < time (0)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1490 logout = goodbye = "Autologout";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1491 stream = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1492 state = LOGOUT; /* sayonara */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1493 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1494 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1495 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1496 if (goodbye && !quell_events){/* have a goodbye message? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1497 PSOUT ("* BYE "); /* utter it */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1498 PSOUT (goodbye);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1499 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1500 PFLUSH (); /* make sure blatted */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1501 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1502 syslog (LOG_INFO,"%s user=%.80s host=%.80s",logout,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1503 user ? (char *) user : "???",tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1504 /* do logout hook if needed */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1505 if (lgoh = (logouthook_t) mail_parameters (NIL,GET_LOGOUTHOOK,NIL))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1506 (*lgoh) (mail_parameters (NIL,GET_LOGOUTDATA,NIL));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1507 _exit (ret); /* all done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1508 return ret; /* stupid compilers */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1509 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1510
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1511 /* Ping mailbox during each cycle. Also check alerts
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1512 * Accepts: last command was UID flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1513 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1514
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1515 void ping_mailbox (unsigned long uid)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1516 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1517 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1518 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1519 if (state == OPEN) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1520 if (!mail_ping (stream)) { /* make sure stream still alive */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1521 PSOUT ("* BYE ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1522 PSOUT (mylocalhost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1523 PSOUT (" Fatal mailbox error: ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1524 PSOUT (lasterror ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1525 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1526 stream = NIL; /* don't try to clean up stream */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1527 state = LOGOUT; /* go away */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1528 syslog (LOG_INFO,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1529 "Fatal mailbox error user=%.80s host=%.80s mbx=%.80s: %.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1530 user ? (char *) user : "???",tcp_clienthost (),
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1531 (stream && stream->mailbox) ? stream->mailbox : "???",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1532 lasterror ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1533 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1534 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1535 /* change in number of messages? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1536 if (existsquelled || (nmsgs != stream->nmsgs)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1537 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1538 pnum (nmsgs = stream->nmsgs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1539 PSOUT (" EXISTS\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1540 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1541 /* change in recent messages? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1542 if (existsquelled || (recent != stream->recent)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1543 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1544 pnum (recent = stream->recent);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1545 PSOUT (" RECENT\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1546 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1547 existsquelled = NIL; /* don't do this until asked again */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1548 if (stream->uid_validity && (stream->uid_validity != uidvalidity)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1549 PSOUT ("* OK [UIDVALIDITY ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1550 pnum (stream->uid_validity);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1551 PSOUT ("] UID validity status\015\012* OK [UIDNEXT ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1552 pnum (stream->uid_last + 1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1553 PSOUT ("] Predicted next UID\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1554 if (stream->uid_nosticky) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1555 PSOUT ("* NO [UIDNOTSTICKY] Non-permanent unique identifiers: ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1556 PSOUT (stream->mailbox);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1557 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1558 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1559 uidvalidity = stream->uid_validity;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1560 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1561
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1562 /* don't bother if driver changed */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1563 if (curdriver == stream->dtb) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1564 /* first report any new flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1565 if ((nflags < NUSERFLAGS) && stream->user_flags[nflags])
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1566 new_flags (stream);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1567 for (i = 1; i <= nmsgs; i++) if (mail_elt (stream,i)->spare2) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1568 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1569 pnum (i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1570 PSOUT (" FETCH (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1571 fetch_flags (i,NIL); /* output changed flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1572 if (uid) { /* need to include UIDs in response? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1573 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1574 fetch_uid (i,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1575 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1576 PSOUT (")\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1577 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1578 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1579 else { /* driver changed */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1580 new_flags (stream); /* send mailbox flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1581 if (curdriver) { /* note readonly/write if possible change */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1582 PSOUT ("* OK [READ-");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1583 PSOUT (stream->rdonly ? "ONLY" : "WRITE");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1584 PSOUT ("] Mailbox status\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1585 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1586 curdriver = stream->dtb;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1587 if (nmsgs) { /* get flags for all messages */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1588 sprintf (tmp,"1:%lu",nmsgs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1589 mail_fetch_flags (stream,tmp,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1590 /* don't do this if newsrc already did */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1591 if (!(curdriver->flags & DR_NEWS)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1592 /* find first unseen message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1593 for (i = 1; i <= nmsgs && mail_elt (stream,i)->seen; i++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1594 if (i <= nmsgs) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1595 PSOUT ("* OK [UNSEEN ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1596 pnum (i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1597 PSOUT ("] first unseen message in ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1598 PSOUT (stream->mailbox);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1599 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1600 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1601 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1602 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1603 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1604 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1605 if (shutdowntime && (time (0) > shutdowntime + SHUTDOWNTIMER)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1606 PSOUT ("* BYE Server shutting down\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1607 state = LOGOUT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1608 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1609 /* don't do these stat()s every cycle */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1610 else if (time (0) > alerttime + ALERTTIMER) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1611 struct stat sbuf;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1612 /* have a shutdown file? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1613 if (!stat (SHUTDOWNFILE,&sbuf)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1614 PSOUT ("* OK [ALERT] Server shutting down shortly\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1615 shutdowntime = time (0);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1616 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1617 alerttime = time (0); /* output any new alerts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1618 sysalerttime = palert (ALERTFILE,sysalerttime);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1619 if (state != LOGIN) /* do user alert if logged in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1620 useralerttime = palert (mailboxfile (tmp,USERALERTFILE),useralerttime);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1621 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1622 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1623
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1624 /* Print an alert file
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1625 * Accepts: path of alert file
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1626 * time of last printed alert file
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1627 * Returns: updated time of last printed alert file
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1628 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1629
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1630 time_t palert (char *file,time_t oldtime)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1631 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1632 FILE *alf;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1633 struct stat sbuf;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1634 int c,lc = '\012';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1635 /* have a new alert file? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1636 if (stat (file,&sbuf) || (sbuf.st_mtime <= oldtime) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1637 !(alf = fopen (file,"r"))) return oldtime;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1638 /* yes, display it */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1639 while ((c = getc (alf)) != EOF) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1640 if (lc == '\012') PSOUT ("* OK [ALERT] ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1641 switch (c) { /* output character */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1642 case '\012': /* newline means do CRLF */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1643 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1644 case '\015': /* flush CRs */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1645 case '\0': /* flush nulls */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1646 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1647 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1648 PBOUT (c); /* output all other characters */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1649 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1650 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1651 lc = c; /* note previous character */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1652 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1653 fclose (alf);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1654 if (lc != '\012') CRLF; /* final terminating CRLF */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1655 return sbuf.st_mtime; /* return updated last alert time */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1656 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1657
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1658 /* Initialize file string structure for file stringstruct
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1659 * Accepts: string structure
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1660 * pointer to message data structure
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1661 * size of string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1662 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1663
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1664 void msg_string_init (STRING *s,void *data,unsigned long size)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1665 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1666 MSGDATA *md = (MSGDATA *) data;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1667 s->data = data; /* note stream/msgno and header length */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1668 #if 0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1669 s->size = size; /* message size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1670 s->curpos = s->chunk = /* load header */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1671 mail_fetchheader_full (md->stream,md->msgno,NIL,&s->data1,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1672 FT_PREFETCHTEXT | FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1673 #else /* This kludge is necessary because of broken mail stores */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1674 mail_fetchtext_full (md->stream,md->msgno,&s->size,FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1675 s->curpos = s->chunk = /* load header */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1676 mail_fetchheader_full (md->stream,md->msgno,NIL,&s->data1,FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1677 s->size += s->data1; /* header + body size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1678 #endif
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1679 s->cursize = s->chunksize = s->data1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1680 s->offset = 0; /* offset is start of message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1681 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1682
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1683
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1684 /* Get next character from file stringstruct
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1685 * Accepts: string structure
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1686 * Returns: character, string structure chunk refreshed
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1687 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1688
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1689 char msg_string_next (STRING *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1690 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1691 char c = *s->curpos++; /* get next byte */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1692 SETPOS (s,GETPOS (s)); /* move to next chunk */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1693 return c; /* return the byte */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1694 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1695
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1696
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1697 /* Set string pointer position for file stringstruct
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1698 * Accepts: string structure
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1699 * new position
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1700 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1701
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1702 void msg_string_setpos (STRING *s,unsigned long i)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1703 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1704 MSGDATA *md = (MSGDATA *) s->data;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1705 if (i < s->data1) { /* want header? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1706 s->chunk = mail_fetchheader_full (md->stream,md->msgno,NIL,NIL,FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1707 s->chunksize = s->data1; /* header length */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1708 s->offset = 0; /* offset is start of message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1709 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1710 else if (i < s->size) { /* want body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1711 s->chunk = mail_fetchtext_full (md->stream,md->msgno,NIL,FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1712 s->chunksize = s->size - s->data1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1713 s->offset = s->data1; /* offset is end of header */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1714 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1715 else { /* off end of message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1716 s->chunk = NIL; /* make sure that we crack on this then */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1717 s->chunksize = 1; /* make sure SNX cracks the right way... */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1718 s->offset = i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1719 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1720 /* initial position and size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1721 s->curpos = s->chunk + (i -= s->offset);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1722 s->cursize = s->chunksize - i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1723 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1724
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1725 /* Send flags for stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1726 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1727 * scratch buffer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1728 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1729
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1730 void new_flags (MAILSTREAM *stream)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1731 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1732 int i,c;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1733 PSOUT ("* FLAGS (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1734 for (i = 0; i < NUSERFLAGS; i++) if (stream->user_flags[i]) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1735 PSOUT (stream->user_flags[i]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1736 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1737 nflags = i + 1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1738 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1739 PSOUT ("\\Answered \\Flagged \\Deleted \\Draft \\Seen)\015\012* OK [PERMANENTFLAGS (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1740 for (i = c = 0; i < NUSERFLAGS; i++)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1741 if ((stream->perm_user_flags & (1 << i)) && stream->user_flags[i])
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1742 put_flag (&c,stream->user_flags[i]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1743 if (stream->kwd_create) put_flag (&c,"\\*");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1744 if (stream->perm_answered) put_flag (&c,"\\Answered");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1745 if (stream->perm_flagged) put_flag (&c,"\\Flagged");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1746 if (stream->perm_deleted) put_flag (&c,"\\Deleted");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1747 if (stream->perm_draft) put_flag (&c,"\\Draft");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1748 if (stream->perm_seen) put_flag (&c,"\\Seen");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1749 PSOUT (")] Permanent flags\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1750 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1751
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1752 /* Set timeout
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1753 * Accepts: desired interval
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1754 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1755
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1756 void settimeout (unsigned int i)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1757 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1758 /* limit if not logged in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1759 if (i) alarm ((state == LOGIN) ? LOGINTIMEOUT : i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1760 else alarm (0);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1761 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1762
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1763
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1764 /* Clock interrupt
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1765 * Returns only if critical code in progress
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1766 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1767
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1768 void clkint (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1769 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1770 settimeout (0); /* disable all interrupts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1771 server_init (NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1772 logout = "Autologout";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1773 goodbye = "Autologout (idle for too long)";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1774 if (critical) { /* must defer if in critical code(?) */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1775 close (0); /* kill stdin */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1776 state = LOGOUT; /* die as soon as we can */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1777 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1778 else longjmp (jmpenv,1); /* die now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1779 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1780
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1781
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1782 /* Kiss Of Death interrupt
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1783 * Returns only if critical code in progress
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1784 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1785
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1786 void kodint (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1787 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1788 settimeout (0); /* disable all interrupts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1789 server_init (NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1790 logout = goodbye = "Killed (lost mailbox lock)";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1791 if (critical) { /* must defer if in critical code */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1792 close (0); /* kill stdin */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1793 state = LOGOUT; /* die as soon as we can */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1794 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1795 else longjmp (jmpenv,1); /* die now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1796 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1797
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1798 /* Hangup interrupt
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1799 * Returns only if critical code in progress
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1800 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1801
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1802 void hupint (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1803 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1804 settimeout (0); /* disable all interrupts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1805 server_init (NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1806 logout = "Hangup";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1807 goodbye = NIL; /* other end is already gone */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1808 if (critical) { /* must defer if in critical code */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1809 close (0); /* kill stdin */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1810 close (1); /* and stdout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1811 state = LOGOUT; /* die as soon as we can */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1812 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1813 else longjmp (jmpenv,1); /* die now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1814 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1815
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1816
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1817 /* Termination interrupt
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1818 * Returns only if critical code in progress
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1819 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1820
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1821 void trmint (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1822 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1823 settimeout (0); /* disable all interrupts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1824 server_init (NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1825 logout = goodbye = "Killed (terminated)";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1826 /* Make no attempt at graceful closure since a shutdown may be in
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1827 * progress, and we won't have any time to do mail_close() actions
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1828 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1829 stream = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1830 if (critical) { /* must defer if in critical code */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1831 close (0); /* kill stdin */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1832 close (1); /* and stdout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1833 state = LOGOUT; /* die as soon as we can */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1834 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1835 else longjmp (jmpenv,1); /* die now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1836 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1837
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1838 /* The routines on this and the next page eschew the use of non-syscall libc
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1839 * routines (especially stdio) for a reason. Also, these hideous #if
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1840 * condtionals need to be replaced.
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1841 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1842
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1843 #ifndef unix
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1844 #define unix 0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1845 #endif
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1846
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1847
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1848 /* Status request interrupt
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1849 * Always returns
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1850 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1851
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1852 void staint (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1853 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1854 #if unix
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1855 int fd;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1856 char *s,buf[8*MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1857 unsigned long pid = getpid ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1858 /* build file name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1859 s = nout (sout (buf,"/tmp/imapd-status."),pid,10);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1860 if (user) s = sout (sout (s,"."),user);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1861 *s = '\0'; /* tie off file name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1862 if ((fd = open (buf,O_WRONLY | O_CREAT | O_TRUNC,0666)) >= 0) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1863 fchmod (fd,0666);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1864 s = nout (sout (buf,"PID="),pid,10);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1865 if (user) s = sout (sout (s,", user="),user);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1866 switch (state) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1867 case LOGIN:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1868 s = sout (s,", not logged in");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1869 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1870 case SELECT:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1871 s = sout (s,", logged in");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1872 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1873 case OPEN:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1874 s = sout (s,", mailbox open");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1875 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1876 case LOGOUT:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1877 s = sout (s,", logging out");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1878 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1879 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1880 if (stream && stream->mailbox)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1881 s = sout (sout (s,"\nmailbox="),stream->mailbox);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1882 *s++ = '\n';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1883 if (status) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1884 s = sout (s,status);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1885 if (cmd) s = sout (sout (s,", last command="),cmd);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1886 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1887 else s = sout (sout (s,cmd)," in progress");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1888 *s++ = '\n';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1889 write (fd,buf,s-buf);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1890 close (fd);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1891 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1892 #endif
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1893 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1894
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1895 /* Write string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1896 * Accepts: destination string pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1897 * string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1898 * Returns: updated string pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1899 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1900
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1901 char *sout (char *s,char *t)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1902 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1903 while (*t) *s++ = *t++;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1904 return s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1905 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1906
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1907
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1908 /* Write number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1909 * Accepts: destination string pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1910 * number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1911 * base
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1912 * Returns: updated string pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1913 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1914
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1915 char *nout (char *s,unsigned long n,unsigned long base)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1916 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1917 char stack[256];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1918 char *t = stack;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1919 /* push PID digits on stack */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1920 do *t++ = (char) (n % base) + '0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1921 while (n /= base);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1922 /* pop digits from stack */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1923 while (t > stack) *s++ = *--t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1924 return s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1925 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1926
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1927 /* Slurp a command line
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1928 * Accepts: buffer pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1929 * buffer size
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1930 * input timeout
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1931 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1932
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1933 void slurp (char *s,int n,unsigned long timeout)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1934 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1935 memset (s,'\0',n); /* zap buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1936 if (state != LOGOUT) { /* get a command under timeout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1937 settimeout (timeout);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1938 clearerr (stdin); /* clear stdin errors */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1939 status = "reading line";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1940 if (!PSIN (s,n-1)) ioerror (stdin,status);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1941 settimeout (0); /* make sure timeout disabled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1942 status = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1943 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1944 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1945
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1946
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1947 /* Read a literal
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1948 * Accepts: destination buffer (must be size+1 for trailing NUL)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1949 * size of buffer (must be less than 4294967295)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1950 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1951
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1952 void inliteral (char *s,unsigned long n)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1953 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1954 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1955 if (litplus.ok) { /* no more LITERAL+ to worry about */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1956 litplus.ok = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1957 litplus.size = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1958 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1959 else { /* otherwise tell client ready for argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1960 PSOUT ("+ Ready for argument\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1961 PFLUSH (); /* dump output buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1962 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1963 clearerr (stdin); /* clear stdin errors */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1964 memset (s,'\0',n+1); /* zap buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1965 status = "reading literal";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1966 while (n) { /* get data under timeout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1967 if (state == LOGOUT) n = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1968 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1969 settimeout (INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1970 i = min (n,8192); /* must read at least 8K within timeout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1971 if (PSINR (s,i)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1972 s += i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1973 n -= i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1974 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1975 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1976 ioerror (stdin,status);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1977 n = 0; /* in case it continues */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1978 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1979 settimeout (0); /* stop timeout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1980 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1981 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1982 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1983
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1984 /* Flush until newline seen
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1985 * Returns: NIL, always
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1986 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1987
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1988 unsigned char *flush (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1989 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1990 int c;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1991 if (state != LOGOUT) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1992 settimeout (INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1993 clearerr (stdin); /* clear stdin errors */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1994 status = "flushing line";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1995 while ((c = PBIN ()) != '\012') if (c == EOF) ioerror (stdin,status);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1996 settimeout (0); /* make sure timeout disabled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1997 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1998 response = "%.80s BAD Command line too long\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
1999 status = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2000 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2001 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2002
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2003
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2004 /* Report command stream error and die
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2005 * Accepts: stdin or stdout (whichever got the error)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2006 * reason (what caller was doing)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2007 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2008
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2009 void ioerror (FILE *f,char *reason)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2010 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2011 static char msg[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2012 char *s,*t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2013 if (logout) { /* say nothing if already dying */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2014 settimeout (0); /* disable all interrupts */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2015 server_init (NIL,NIL,NIL,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN,SIG_IGN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2016 /* write error string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2017 for (s = ferror (f) ? strerror (errno) : "Unexpected client disconnect",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2018 t = logout = msg; *s; *t++ = *s++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2019 for (s = ", while "; *s; *t++ = *s++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2020 for (s = reason; *s; *t++ = *s++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2021 if (critical) { /* must defer if in critical code */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2022 close (0); /* kill stdin */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2023 close (1); /* and stdout */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2024 state = LOGOUT; /* die as soon as we can */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2025 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2026 else longjmp (jmpenv,1); /* die now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2027 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2028 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2029
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2030 /* Parse an IMAP astring
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2031 * Accepts: pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2032 * pointer to returned size
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2033 * pointer to returned delimiter
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2034 * Returns: argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2035 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2036
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2037 unsigned char *parse_astring (unsigned char **arg,unsigned long *size,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2038 unsigned char *del)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2039 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2040 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2041 unsigned char c,*s,*t,*v;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2042 if (!*arg) return NIL; /* better be an argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2043 switch (**arg) { /* see what the argument is */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2044 default: /* atom */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2045 for (s = t = *arg, i = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2046 (*t > ' ') && (*t < 0x7f) && (*t != '(') && (*t != ')') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2047 (*t != '{') && (*t != '%') && (*t != '*') && (*t != '"') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2048 (*t != '\\'); ++t,++i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2049 if (*size = i) break; /* got atom if non-empty */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2050 case ')': case '%': case '*': case '\\': case '\0': case ' ':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2051 return NIL; /* empty atom is a bogon */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2052 case '"': /* hunt for trailing quote */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2053 for (s = t = v = *arg + 1; (c = *t++) != '"'; *v++ = c) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2054 /* quote next character */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2055 if (c == '\\') switch (c = *t++) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2056 case '"': case '\\': break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2057 default: return NIL; /* invalid quote-next */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2058 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2059 /* else must be a CHAR */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2060 if (!c || (c & 0x80)) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2061 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2062 *v = '\0'; /* tie off string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2063 *size = v - s; /* return size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2064 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2065
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2066 case '{': /* literal string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2067 s = *arg + 1; /* get size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2068 if (!isdigit (*s)) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2069 if ((*size = i = strtoul (s,(char **) &t,10)) > MAXCLIENTLIT) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2070 mm_notify (NIL,"Absurdly long client literal",ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2071 syslog (LOG_INFO,"Overlong (%lu) client literal user=%.80s host=%.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2072 i,user ? (char *) user : "???",tcp_clienthost ());
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2073 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2074 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2075 switch (*t) { /* validate end of literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2076 case '+': /* non-blocking literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2077 if (*++t != '}') return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2078 case '}':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2079 if (!t[1]) break; /* OK if end of line */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2080 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2081 return NIL; /* bad literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2082 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2083 if (litsp >= LITSTKLEN) { /* make sure don't overflow stack */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2084 mm_notify (NIL,"Too many literals in command",ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2085 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2086 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2087 /* get a literal buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2088 inliteral (s = litstk[litsp++] = (char *) fs_get (i+1),i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2089 /* get new command tail */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2090 slurp (*arg = t,CMDLEN - (t - cmdbuf),INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2091 if (!strchr (t,'\012')) return flush ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2092 /* reset strtok mechanism, tie off if done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2093 if (!strtok (t,"\015\012")) *t = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2094 /* possible LITERAL+? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2095 if (((i = strlen (t)) > 3) && (t[i - 1] == '}') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2096 (t[i - 2] == '+') && isdigit (t[i - 3])) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2097 /* back over possible count */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2098 for (i -= 4; i && isdigit (t[i]); i--);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2099 if (t[i] == '{') { /* found a literal? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2100 litplus.ok = T; /* yes, note LITERAL+ in effect, set size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2101 litplus.size = strtoul (t + i + 1,NIL,10);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2102 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2103 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2104 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2105 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2106 if (*del = *t) { /* have a delimiter? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2107 *t++ = '\0'; /* yes, stomp on it */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2108 *arg = t; /* update argument pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2109 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2110 else *arg = NIL; /* no more arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2111 return s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2112 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2113
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2114 /* Snarf a command argument (simple jacket into parse_astring())
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2115 * Accepts: pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2116 * Returns: argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2117 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2118
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2119 unsigned char *snarf (unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2120 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2121 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2122 unsigned char c;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2123 unsigned char *s = parse_astring (arg,&i,&c);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2124 return ((c == ' ') || !c) ? s : NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2125 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2126
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2127
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2128 /* Snarf a BASE64 argument for SASL-IR
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2129 * Accepts: pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2130 * Returns: argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2131 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2132
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2133 unsigned char *snarf_base64 (unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2134 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2135 unsigned char *ret = *arg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2136 unsigned char *s = ret + 1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2137 static char base64mask[256] = {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2138 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2139 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2140 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2141 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2142 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2143 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2144 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2145 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2146 };
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2147 if (*(ret = *arg) == '='); /* easy case if zero-length argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2148 /* must be at least one BASE64 char */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2149 else if (!base64mask[*ret]) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2150 else { /* quick and dirty */
3
2366b362676d imap-2007f
HIROSE Yuuji <yuuji@gentei.org>
parents: 1
diff changeset
2151 while (base64mask[*s]) s++; /* scan until end of BASE64 */
0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2152 if (*s == '=') ++s; /* allow up to two padding chars */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2153 if (*s == '=') ++s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2154 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2155 switch (*s) { /* anything following the argument? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2156 case ' ': /* another argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2157 *s++ = '\0'; /* tie off previous argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2158 *arg = s; /* and update argument pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2159 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2160 case '\0': /* end of command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2161 *arg = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2162 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2163 default: /* syntax error */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2164 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2165 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2166 return ret; /* return BASE64 string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2167 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2168
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2169 /* Snarf a list command argument (simple jacket into parse_astring())
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2170 * Accepts: pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2171 * Returns: argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2172 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2173
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2174 unsigned char *snarf_list (unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2175 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2176 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2177 unsigned char c,*s,*t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2178 if (!*arg) return NIL; /* better be an argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2179 switch (**arg) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2180 default: /* atom and/or wildcard chars */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2181 for (s = t = *arg, i = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2182 (*t > ' ') && (*t != '(') && (*t != ')') && (*t != '{') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2183 (*t != '"') && (*t != '\\'); ++t,++i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2184 if (c = *t) { /* have a delimiter? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2185 *t++ = '\0'; /* stomp on it */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2186 *arg = t; /* update argument pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2187 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2188 else *arg = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2189 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2190 case ')': case '\\': case '\0': case ' ':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2191 return NIL; /* empty name is bogus */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2192 case '"': /* quoted string? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2193 case '{': /* or literal? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2194 s = parse_astring (arg,&i,&c);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2195 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2196 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2197 return ((c == ' ') || !c) ? s : NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2198 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2199
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2200 /* Get a list of header lines
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2201 * Accepts: pointer to string pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2202 * pointer to list flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2203 * Returns: string list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2204 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2205
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2206 STRINGLIST *parse_stringlist (unsigned char **s,int *list)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2207 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2208 char c = ' ',*t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2209 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2210 STRINGLIST *ret = NIL,*cur = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2211 if (*s && **s == '(') { /* proper list? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2212 ++*s; /* for each item in list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2213 while ((c == ' ') && (t = parse_astring (s,&i,&c))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2214 /* get new block */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2215 if (cur) cur = cur->next = mail_newstringlist ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2216 else cur = ret = mail_newstringlist ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2217 /* note text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2218 cur->text.data = (unsigned char *) fs_get (i + 1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2219 memcpy (cur->text.data,t,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2220 cur->text.size = i; /* and size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2221 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2222 /* must be end of list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2223 if (c != ')') mail_free_stringlist (&ret);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2224 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2225 if (t = *s) { /* need to reload strtok() state? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2226 /* end of a list? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2227 if (*list && (*t == ')') && !t[1]) *list = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2228 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2229 *--t = ' '; /* patch a space back in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2230 *--t = 'x'; /* and a hokey character before that */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2231 t = strtok (t," "); /* reset to *s */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2232 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2233 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2234 return ret;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2235 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2236
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2237 /* Get value of UID * for criteria parsing
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2238 * Accepts: stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2239 * Returns: maximum UID
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2240 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2241
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2242 unsigned long uidmax (MAILSTREAM *stream)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2243 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2244 return stream->nmsgs ? mail_uid (stream,stream->nmsgs) : 0xffffffff;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2245 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2246
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2247
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2248 /* Parse search criteria
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2249 * Accepts: search program to write criteria into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2250 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2251 * maximum message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2252 * maximum UID
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2253 * logical nesting depth
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2254 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2255 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2256
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2257 long parse_criteria (SEARCHPGM *pgm,unsigned char **arg,unsigned long maxmsg,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2258 unsigned long maxuid,unsigned long depth)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2259 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2260 if (arg && *arg) { /* must be an argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2261 /* parse criteria */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2262 do if (!parse_criterion (pgm,arg,maxmsg,maxuid,depth)) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2263 /* as long as a space delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2264 while (**arg == ' ' && (*arg)++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2265 /* failed if not end of criteria */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2266 if (**arg && **arg != ')') return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2267 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2268 return T; /* success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2269 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2270
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2271 /* Parse a search criterion
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2272 * Accepts: search program to write criterion into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2273 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2274 * maximum message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2275 * maximum UID
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2276 * logical nesting depth
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2277 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2278 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2279
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2280 long parse_criterion (SEARCHPGM *pgm,unsigned char **arg,unsigned long maxmsg,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2281 unsigned long maxuid,unsigned long depth)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2282 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2283 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2284 unsigned char c = NIL,*s,*t,*v,*tail,*del;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2285 SEARCHSET **set;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2286 SEARCHPGMLIST **not;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2287 SEARCHOR **or;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2288 SEARCHHEADER **hdr;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2289 long ret = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2290 /* better be an argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2291 if ((depth > 500) || !(arg && *arg));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2292 else if (**arg == '(') { /* list of criteria? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2293 (*arg)++; /* yes, parse the criteria */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2294 if (parse_criteria (pgm,arg,maxmsg,maxuid,depth+1) && **arg == ')') {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2295 (*arg)++; /* skip closing paren */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2296 ret = T; /* successful parse of list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2297 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2298 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2299 else { /* find end of criterion */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2300 if (!(tail = strpbrk ((s = *arg)," )"))) tail = *arg + strlen (*arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2301 c = *(del = tail); /* remember the delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2302 *del = '\0'; /* tie off criterion */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2303 switch (*ucase (s)) { /* dispatch based on character */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2304 case '*': /* sequence */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2305 case '0': case '1': case '2': case '3': case '4':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2306 case '5': case '6': case '7': case '8': case '9':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2307 if (*(set = &pgm->msgno)){/* already a sequence? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2308 /* silly, but not as silly as the client! */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2309 for (not = &pgm->not; *not; not = &(*not)->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2310 *not = mail_newsearchpgmlist ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2311 set = &((*not)->pgm->not = mail_newsearchpgmlist ())->pgm->msgno;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2312 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2313 ret = crit_set (set,&s,maxmsg) && (tail == s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2314 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2315 case 'A': /* possible ALL, ANSWERED */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2316 if (!strcmp (s+1,"LL")) ret = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2317 else if (!strcmp (s+1,"NSWERED")) ret = pgm->answered = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2318 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2319
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2320 case 'B': /* possible BCC, BEFORE, BODY */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2321 if (!strcmp (s+1,"CC") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2322 ret = crit_string (&pgm->bcc,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2323 else if (!strcmp (s+1,"EFORE") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2324 ret = crit_date (&pgm->before,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2325 else if (!strcmp (s+1,"ODY") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2326 ret = crit_string (&pgm->body,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2327 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2328 case 'C': /* possible CC */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2329 if (!strcmp (s+1,"C") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2330 ret = crit_string (&pgm->cc,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2331 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2332 case 'D': /* possible DELETED */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2333 if (!strcmp (s+1,"ELETED")) ret = pgm->deleted = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2334 if (!strcmp (s+1,"RAFT")) ret = pgm->draft = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2335 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2336 case 'F': /* possible FLAGGED, FROM */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2337 if (!strcmp (s+1,"LAGGED")) ret = pgm->flagged = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2338 else if (!strcmp (s+1,"ROM") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2339 ret = crit_string (&pgm->from,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2340 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2341 case 'H': /* possible HEADER */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2342 if (!strcmp (s+1,"EADER") && c == ' ' && *(v = tail + 1) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2343 (s = parse_astring (&v,&i,&c)) && i && c == ' ' &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2344 (t = parse_astring (&v,&i,&c))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2345 for (hdr = &pgm->header; *hdr; hdr = &(*hdr)->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2346 *hdr = mail_newsearchheader (s,t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2347 /* update tail, restore delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2348 *(tail = v ? v - 1 : t + i) = c;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2349 ret = T; /* success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2350 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2351 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2352 case 'K': /* possible KEYWORD */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2353 if (!strcmp (s+1,"EYWORD") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2354 ret = crit_string (&pgm->keyword,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2355 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2356 case 'L':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2357 if (!strcmp (s+1,"ARGER") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2358 ret = crit_number (&pgm->larger,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2359 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2360 case 'N': /* possible NEW, NOT */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2361 if (!strcmp (s+1,"EW")) ret = pgm->recent = pgm->unseen = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2362 else if (!strcmp (s+1,"OT") && c == ' ' && *++tail) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2363 for (not = &pgm->not; *not; not = &(*not)->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2364 *not = mail_newsearchpgmlist ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2365 ret = parse_criterion ((*not)->pgm,&tail,maxmsg,maxuid,depth+1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2366 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2367 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2368
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2369 case 'O': /* possible OLD, ON */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2370 if (!strcmp (s+1,"LD")) ret = pgm->old = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2371 else if (!strcmp (s+1,"N") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2372 ret = crit_date (&pgm->on,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2373 else if (!strcmp (s+1,"R") && c == ' ') {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2374 for (or = &pgm->or; *or; or = &(*or)->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2375 *or = mail_newsearchor ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2376 ret = *++tail && parse_criterion((*or)->first,&tail,maxmsg,maxuid,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2377 depth+1) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2378 (*tail == ' ') && *++tail &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2379 parse_criterion ((*or)->second,&tail,maxmsg,maxuid,depth+1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2380 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2381 else if (!strcmp (s+1,"LDER") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2382 ret = crit_number (&pgm->older,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2383 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2384 case 'R': /* possible RECENT */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2385 if (!strcmp (s+1,"ECENT")) ret = pgm->recent = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2386 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2387 case 'S': /* possible SEEN, SINCE, SUBJECT */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2388 if (!strcmp (s+1,"EEN")) ret = pgm->seen = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2389 else if (!strcmp (s+1,"ENTBEFORE") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2390 ret = crit_date (&pgm->sentbefore,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2391 else if (!strcmp (s+1,"ENTON") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2392 ret = crit_date (&pgm->senton,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2393 else if (!strcmp (s+1,"ENTSINCE") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2394 ret = crit_date (&pgm->sentsince,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2395 else if (!strcmp (s+1,"INCE") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2396 ret = crit_date (&pgm->since,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2397 else if (!strcmp (s+1,"MALLER") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2398 ret = crit_number (&pgm->smaller,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2399 else if (!strcmp (s+1,"UBJECT") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2400 ret = crit_string (&pgm->subject,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2401 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2402 case 'T': /* possible TEXT, TO */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2403 if (!strcmp (s+1,"EXT") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2404 ret = crit_string (&pgm->text,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2405 else if (!strcmp (s+1,"O") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2406 ret = crit_string (&pgm->to,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2407 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2408
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2409 case 'U': /* possible UID, UN* */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2410 if (!strcmp (s+1,"ID") && c== ' ' && *++tail) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2411 if (*(set = &pgm->uid)){/* already a sequence? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2412 /* silly, but not as silly as the client! */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2413 for (not = &pgm->not; *not; not = &(*not)->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2414 *not = mail_newsearchpgmlist ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2415 set = &((*not)->pgm->not = mail_newsearchpgmlist ())->pgm->uid;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2416 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2417 ret = crit_set (set,&tail,maxuid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2418 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2419 else if (!strcmp (s+1,"NANSWERED")) ret = pgm->unanswered = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2420 else if (!strcmp (s+1,"NDELETED")) ret = pgm->undeleted = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2421 else if (!strcmp (s+1,"NDRAFT")) ret = pgm->undraft = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2422 else if (!strcmp (s+1,"NFLAGGED")) ret = pgm->unflagged = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2423 else if (!strcmp (s+1,"NKEYWORD") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2424 ret = crit_string (&pgm->unkeyword,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2425 else if (!strcmp (s+1,"NSEEN")) ret = pgm->unseen = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2426 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2427 case 'Y': /* possible YOUNGER */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2428 if (!strcmp (s+1,"OUNGER") && c == ' ' && *++tail)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2429 ret = crit_number (&pgm->younger,&tail);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2430 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2431 default: /* oh dear */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2432 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2433 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2434 if (ret) { /* only bother if success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2435 *del = c; /* restore delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2436 *arg = tail; /* update argument pointer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2437 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2438 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2439 return ret; /* return more to come */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2440 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2441
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2442 /* Parse a search date criterion
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2443 * Accepts: date to write into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2444 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2445 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2446 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2447
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2448 long crit_date (unsigned short *date,unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2449 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2450 if (*date) return NIL; /* can't double this value */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2451 /* handle quoted form */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2452 if (**arg != '"') return crit_date_work (date,arg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2453 (*arg)++; /* skip past opening quote */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2454 if (!(crit_date_work (date,arg) && (**arg == '"'))) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2455 (*arg)++; /* skip closing quote */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2456 return T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2457 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2458
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2459 /* Worker routine to parse a search date criterion
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2460 * Accepts: date to write into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2461 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2462 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2463 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2464
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2465 long crit_date_work (unsigned short *date,unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2466 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2467 int d,m,y;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2468 /* day */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2469 if (isdigit (d = *(*arg)++) || ((d == ' ') && isdigit (**arg))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2470 if (d == ' ') d = 0; /* leading space */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2471 else d -= '0'; /* first digit */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2472 if (isdigit (**arg)) { /* if a second digit */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2473 d *= 10; /* slide over first digit */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2474 d += *(*arg)++ - '0'; /* second digit */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2475 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2476 if ((**arg == '-') && (y = *++(*arg))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2477 m = (y >= 'a' ? y - 'a' : y - 'A') * 1024;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2478 if ((y = *++(*arg))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2479 m += (y >= 'a' ? y - 'a' : y - 'A') * 32;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2480 if ((y = *++(*arg))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2481 m += (y >= 'a' ? y - 'a' : y - 'A');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2482 switch (m) { /* determine the month */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2483 case (('J'-'A') * 1024) + (('A'-'A') * 32) + ('N'-'A'): m = 1; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2484 case (('F'-'A') * 1024) + (('E'-'A') * 32) + ('B'-'A'): m = 2; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2485 case (('M'-'A') * 1024) + (('A'-'A') * 32) + ('R'-'A'): m = 3; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2486 case (('A'-'A') * 1024) + (('P'-'A') * 32) + ('R'-'A'): m = 4; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2487 case (('M'-'A') * 1024) + (('A'-'A') * 32) + ('Y'-'A'): m = 5; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2488 case (('J'-'A') * 1024) + (('U'-'A') * 32) + ('N'-'A'): m = 6; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2489 case (('J'-'A') * 1024) + (('U'-'A') * 32) + ('L'-'A'): m = 7; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2490 case (('A'-'A') * 1024) + (('U'-'A') * 32) + ('G'-'A'): m = 8; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2491 case (('S'-'A') * 1024) + (('E'-'A') * 32) + ('P'-'A'): m = 9; break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2492 case (('O'-'A') * 1024) + (('C'-'A') * 32) + ('T'-'A'): m = 10;break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2493 case (('N'-'A') * 1024) + (('O'-'A') * 32) + ('V'-'A'): m = 11;break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2494 case (('D'-'A') * 1024) + (('E'-'A') * 32) + ('C'-'A'): m = 12;break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2495 default: return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2496 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2497 if ((*++(*arg) == '-') && isdigit (*++(*arg))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2498 y = 0; /* init year */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2499 do {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2500 y *= 10; /* add this number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2501 y += *(*arg)++ - '0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2502 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2503 while (isdigit (**arg));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2504 /* minimal validity check of date */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2505 if (d < 1 || d > 31 || m < 1 || m > 12 || y < 0) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2506 /* time began on UNIX in 1970 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2507 if (y < 100) y += (y >= (BASEYEAR - 1900)) ? 1900 : 2000;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2508 /* return value */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2509 *date = mail_shortdate (y - BASEYEAR,m,d);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2510 return T; /* success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2511 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2512 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2513 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2514 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2515 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2516 return NIL; /* else error */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2517 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2518
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2519 /* Parse a search set criterion
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2520 * Accepts: set to write into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2521 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2522 * maximum value permitted
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2523 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2524 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2525
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2526 long crit_set (SEARCHSET **set,unsigned char **arg,unsigned long maxima)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2527 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2528 unsigned long i = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2529 if (*set) return NIL; /* can't double this value */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2530 *set = mail_newsearchset (); /* instantiate a new search set */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2531 if (**arg == '*') { /* maxnum? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2532 (*arg)++; /* skip past that number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2533 (*set)->first = maxima;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2534 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2535 else if (crit_number (&i,arg) && i) (*set)->first = i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2536 else return NIL; /* bogon */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2537 switch (**arg) { /* decide based on delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2538 case ':': /* sequence range */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2539 i = 0; /* reset for crit_number() */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2540 if (*++(*arg) == '*') { /* maxnum? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2541 (*arg)++; /* skip past that number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2542 (*set)->last = maxima;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2543 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2544 else if (crit_number (&i,arg) && i) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2545 if (i < (*set)->first) { /* backwards range */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2546 (*set)->last = (*set)->first;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2547 (*set)->first = i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2548 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2549 else (*set)->last = i; /* set last number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2550 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2551 else return NIL; /* bogon */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2552 if (**arg != ',') break; /* drop into comma case if comma seen */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2553 case ',':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2554 (*arg)++; /* skip past delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2555 return crit_set (&(*set)->next,arg,maxima);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2556 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2557 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2558 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2559 return T; /* return success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2560 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2561
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2562 /* Parse a search number criterion
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2563 * Accepts: number to write into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2564 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2565 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2566 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2567
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2568 long crit_number (unsigned long *number,unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2569 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2570 /* can't double this value */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2571 if (*number || !isdigit (**arg)) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2572 *number = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2573 while (isdigit (**arg)) { /* found a digit? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2574 *number *= 10; /* add a decade */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2575 *number += *(*arg)++ - '0'; /* add number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2576 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2577 return T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2578 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2579
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2580
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2581 /* Parse a search string criterion
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2582 * Accepts: date to write into
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2583 * pointer to argument text pointer
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2584 * Returns: T if success, NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2585 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2586
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2587 long crit_string (STRINGLIST **string,unsigned char **arg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2588 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2589 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2590 char c;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2591 char *s = parse_astring (arg,&i,&c);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2592 if (!s) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2593 /* find tail of list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2594 while (*string) string = &(*string)->next;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2595 *string = mail_newstringlist ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2596 (*string)->text.data = (unsigned char *) fs_get (i + 1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2597 memcpy ((*string)->text.data,s,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2598 (*string)->text.data[i] = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2599 (*string)->text.size = i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2600 /* if end of arguments, wrap it up here */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2601 if (!*arg) *arg = (char *) (*string)->text.data + i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2602 else (*--(*arg) = c); /* back up pointer, restore delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2603 return T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2604 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2605
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2606 /* Fetch message data
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2607 * Accepts: string of data items to be fetched (must be writeable)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2608 * UID fetch flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2609 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2610
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2611 #define MAXFETCH 100
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2612
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2613 void fetch (char *t,unsigned long uid)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2614 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2615 fetchfn_t f[MAXFETCH +2];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2616 void *fa[MAXFETCH + 2];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2617 int k;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2618 memset ((void *) f,NIL,sizeof (f));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2619 memset ((void *) fa,NIL,sizeof (fa));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2620 fetch_work (t,uid,f,fa); /* do the work */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2621 /* clean up arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2622 for (k = 1; f[k]; k++) if (fa[k]) (*f[k]) (0,fa[k]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2623 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2624
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2625
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2626 /* Fetch message data worker routine
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2627 * Accepts: string of data items to be fetched (must be writeable)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2628 * UID fetch flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2629 * function dispatch vector
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2630 * function argument vector
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2631 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2632
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2633 void fetch_work (char *t,unsigned long uid,fetchfn_t f[],void *fa[])
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2634 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2635 unsigned char *s,*v;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2636 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2637 unsigned long k = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2638 BODY *b;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2639 int list = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2640 int parse_envs = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2641 int parse_bodies = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2642 if (uid) { /* need to fetch UIDs? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2643 fa[k] = NIL; /* no argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2644 f[k++] = fetch_uid; /* push a UID fetch on the stack */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2645 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2646
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2647 /* process macros */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2648 if (!strcmp (ucase (t),"ALL"))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2649 strcpy (t,"(FLAGS INTERNALDATE RFC822.SIZE ENVELOPE)");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2650 else if (!strcmp (t,"FULL"))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2651 strcpy (t,"(FLAGS INTERNALDATE RFC822.SIZE ENVELOPE BODY)");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2652 else if (!strcmp (t,"FAST")) strcpy (t,"(FLAGS INTERNALDATE RFC822.SIZE)");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2653 if (list = (*t == '(')) t++; /* skip open paren */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2654 if (s = strtok (t," ")) do { /* parse attribute list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2655 if (list && (i = strlen (s)) && (s[i-1] == ')')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2656 list = NIL; /* done with list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2657 s[i-1] = '\0'; /* tie off last item */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2658 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2659 fa[k] = NIL; /* default to no argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2660 if (!strcmp (s,"UID")) { /* no-op if implicit */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2661 if (!uid) f[k++] = fetch_uid;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2662 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2663 else if (!strcmp (s,"FLAGS")) f[k++] = fetch_flags;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2664 else if (!strcmp (s,"INTERNALDATE")) f[k++] = fetch_internaldate;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2665 else if (!strcmp (s,"RFC822.SIZE")) f[k++] = fetch_rfc822_size;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2666 else if (!strcmp (s,"ENVELOPE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2667 parse_envs = T; /* we will need to parse envelopes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2668 f[k++] = fetch_envelope;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2669 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2670 else if (!strcmp (s,"BODY")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2671 parse_envs = parse_bodies = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2672 f[k++] = fetch_body;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2673 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2674 else if (!strcmp (s,"BODYSTRUCTURE")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2675 parse_envs = parse_bodies = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2676 f[k++] = fetch_bodystructure;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2677 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2678 else if (!strcmp (s,"RFC822")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2679 fa[k] = s[6] ? (void *) FT_PEEK : NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2680 f[k++] = fetch_rfc822;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2681 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2682 else if (!strcmp (s,"RFC822.HEADER")) f[k++] = fetch_rfc822_header;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2683 else if (!strcmp (s,"RFC822.TEXT")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2684 fa[k] = s[11] ? (void *) FT_PEEK : NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2685 f[k++] = fetch_rfc822_text;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2686 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2687
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2688 else if (!strncmp (s,"BODY[",5) || !strncmp (s,"BODY.PEEK[",10) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2689 !strncmp (s,"BINARY[",7) || !strncmp (s,"BINARY.PEEK[",12) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2690 !strncmp (s,"BINARY.SIZE[",12)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2691 TEXTARGS *ta = (TEXTARGS *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2692 memset (fs_get (sizeof (TEXTARGS)),0,sizeof (TEXTARGS));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2693 if (s[1] == 'I') { /* body or binary? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2694 ta->binary = FTB_BINARY;/* binary */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2695 f[k] = fetch_body_part_binary;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2696 if (s[6] == '.') { /* wanted peek or size? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2697 if (s[7] == 'P') ta->flags = FT_PEEK;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2698 else ta->binary |= FTB_SIZE;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2699 s += 12; /* skip to section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2700 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2701 else s += 7; /* skip to section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2702 if (!isdigit (*s)) { /* make sure top-level digit */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2703 fs_give ((void **) &ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2704 response = badbin;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2705 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2706 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2707 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2708 else { /* body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2709 f[k] = fetch_body_part_contents;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2710 if (s[4] == '.') { /* wanted peek? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2711 ta->flags = FT_PEEK;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2712 s += 10; /* skip to section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2713 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2714 else s += 5; /* skip to section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2715 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2716 if (*(v = s) != ']') { /* non-empty section specifier? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2717 if (isdigit (*v)) { /* have section specifier? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2718 /* need envelopes and bodies */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2719 parse_envs = parse_bodies = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2720 while (isdigit (*v)) /* scan to end of section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2721 if ((*++v == '.') && isdigit (v[1])) v++;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2722 /* any IMAP4rev1 stuff following? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2723 if ((*v == '.') && isalpha (v[1])) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2724 if (ta->binary) { /* not if binary you don't */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2725 fs_give ((void **) &ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2726 response = badbin;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2727 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2728 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2729 *v++ = '\0'; /* yes, tie off section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2730 if (!strncmp (v,"MIME",4)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2731 v += 4; /* found <section>.MIME */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2732 f[k] = fetch_body_part_mime;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2733 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2734 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2735 else if (*v != ']') { /* better be the end if no IMAP4rev1 stuff */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2736 fs_give ((void **) &ta);/* clean up */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2737 response = "%.80s BAD Syntax error in section specifier\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2738 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2739 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2740 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2741
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2742 if (*v != ']') { /* IMAP4rev1 stuff here? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2743 if (!strncmp (v,"HEADER",6)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2744 *v = '\0'; /* tie off in case top level */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2745 v += 6; /* found [<section>.]HEADER */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2746 f[k] = fetch_body_part_header;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2747 /* partial headers wanted? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2748 if (!strncmp (v,".FIELDS",7)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2749 v += 7; /* yes */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2750 if (!strncmp (v,".NOT",4)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2751 v += 4; /* want to exclude named headers */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2752 ta->flags |= FT_NOT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2753 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2754 if (*v || !(v = strtok (NIL,"\015\012")) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2755 !(ta->lines = parse_stringlist (&v,&list))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2756 fs_give ((void **) &ta);/* clean up */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2757 response = "%.80s BAD Syntax error in header fields\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2758 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2759 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2760 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2761 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2762 else if (!strncmp (v,"TEXT",4)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2763 *v = '\0'; /* tie off in case top level */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2764 v += 4; /* found [<section>.]TEXT */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2765 f[k] = fetch_body_part_text;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2766 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2767 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2768 fs_give ((void **) &ta);/* clean up */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2769 response = "%.80s BAD Unknown section text specifier\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2770 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2771 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2772 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2773 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2774 /* tie off section */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2775 if (*v == ']') *v++ = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2776 else { /* bogon */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2777 if (ta->lines) mail_free_stringlist (&ta->lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2778 fs_give ((void **) &ta);/* clean up */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2779 response = "%.80s BAD Section specifier not terminated\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2780 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2781 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2782
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2783 if ((*v == '<') && /* partial specifier? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2784 ((ta->binary & FTB_SIZE) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2785 !(isdigit (v[1]) && ((ta->first = strtoul (v+1,(char **) &v,10)) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2786 v) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2787 (*v++ == '.') && (ta->last = strtoul (v,(char **) &v,10)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2788 (*v++ == '>')))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2789 if (ta->lines) mail_free_stringlist (&ta->lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2790 fs_give ((void **) &ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2791 response ="%.80s BAD Syntax error in partial text specifier\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2792 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2793 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2794 switch (*v) { /* what's there now? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2795 case ' ': /* more follows */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2796 *--v = ' '; /* patch a space back in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2797 *--v = 'x'; /* and a hokey character before that */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2798 strtok (v," "); /* reset strtok mechanism */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2799 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2800 case '\0': /* none */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2801 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2802 case ')': /* end of list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2803 if (list && !v[1]) { /* make sure of that */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2804 list = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2805 strtok (v," "); /* reset strtok mechanism */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2806 break; /* all done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2807 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2808 /* otherwise it's a bogon, drop in */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2809 default: /* bogon */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2810 if (ta->lines) mail_free_stringlist (&ta->lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2811 fs_give ((void **) &ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2812 response = "%.80s BAD Syntax error after section specifier\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2813 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2814 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2815 /* make copy of section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2816 if (s && *s) ta->section = cpystr (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2817 fa[k++] = (void *) ta; /* set argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2818 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2819 else { /* unknown attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2820 response = badatt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2821 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2822 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2823 } while ((s = strtok (NIL," ")) && (k < MAXFETCH) && list);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2824 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2825 response = misarg; /* missing attribute list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2826 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2827 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2828
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2829 if (s) { /* too many attributes? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2830 response = "%.80s BAD Excessively complex FETCH attribute list\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2831 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2832 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2833 if (list) { /* too many attributes? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2834 response = "%.80s BAD Unterminated FETCH attribute list\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2835 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2836 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2837 f[k] = NIL; /* tie off attribute list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2838 /* c-client clobbers sequence, use spare */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2839 for (i = 1; i <= nmsgs; i++)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2840 mail_elt (stream,i)->spare = mail_elt (stream,i)->sequence;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2841 /* for each requested message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2842 for (i = 1; (i <= nmsgs) && (response != loseunknowncte); i++) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2843 /* kill if dying */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2844 if (state == LOGOUT) longjmp (jmpenv,1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2845 if (mail_elt (stream,i)->spare) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2846 /* parse envelope, set body, do warnings */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2847 if (parse_envs) mail_fetchstructure (stream,i,parse_bodies ? &b : NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2848 quell_events = T; /* can't do any events now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2849 PSOUT ("* "); /* leader */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2850 pnum (i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2851 PSOUT (" FETCH (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2852 (*f[0]) (i,fa[0]); /* do first attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2853 /* for each subsequent attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2854 for (k = 1; f[k] && (response != loseunknowncte); k++) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2855 PBOUT (' '); /* delimit with space */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2856 (*f[k]) (i,fa[k]); /* do that attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2857 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2858 PSOUT (")\015\012"); /* trailer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2859 quell_events = NIL; /* events alright now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2860 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2861 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2862 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2863
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2864 /* Fetch message body structure (extensible)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2865 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2866 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2867 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2868
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2869 void fetch_bodystructure (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2870 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2871 BODY *body;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2872 mail_fetchstructure (stream,i,&body);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2873 PSOUT ("BODYSTRUCTURE ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2874 pbodystructure (body); /* output body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2875 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2876
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2877
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2878 /* Fetch message body structure (non-extensible)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2879 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2880 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2881 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2882
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2883
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2884 void fetch_body (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2885 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2886 BODY *body;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2887 mail_fetchstructure (stream,i,&body);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2888 PSOUT ("BODY "); /* output attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2889 pbody (body); /* output body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2890 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2891
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2892 /* Fetch body part MIME header
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2893 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2894 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2895 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2896
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2897 void fetch_body_part_mime (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2898 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2899 TEXTARGS *ta = (TEXTARGS *) args;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2900 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2901 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2902 unsigned long uid = mail_uid (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2903 char *tmp = (char *) fs_get (100 + strlen (ta->section));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2904 sprintf (tmp,"BODY[%s.MIME]",ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2905 /* try to use remembered text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2906 if (lastuid && (uid == lastuid) && !strcmp (tmp,lastid)) st = lastst;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2907 else { /* get data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2908 st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2909 mail_fetch_mime (stream,i,ta->section,&st.size,ta->flags);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2910 if (ta->first || ta->last) remember (uid,tmp,&st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2911 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2912 pbodypartstring (i,tmp,&st,NIL,ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2913 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2914 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2915 else { /* clean up the arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2916 fs_give ((void **) &ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2917 fs_give ((void **) &args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2918 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2919 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2920
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2921
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2922 /* Fetch body part contents
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2923 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2924 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2925 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2926
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2927 void fetch_body_part_contents (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2928 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2929 TEXTARGS *ta = (TEXTARGS *) args;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2930 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2931 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2932 char *tmp = (char *) fs_get (100+(ta->section ? strlen (ta->section) : 0));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2933 unsigned long uid = mail_uid (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2934 sprintf (tmp,"BODY[%s]",ta->section ? ta->section : "");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2935 /* try to use remembered text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2936 if (lastuid && (uid == lastuid) && !strcmp (tmp,lastid)) st = lastst;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2937 /* get data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2938 else if ((st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2939 mail_fetch_body (stream,i,ta->section,&st.size,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2940 ta->flags | FT_RETURNSTRINGSTRUCT)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2941 (ta->first || ta->last)) remember (uid,tmp,&st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2942 pbodypartstring (i,tmp,&st,&stream->private.string,ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2943 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2944 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2945 else { /* clean up the arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2946 if (ta->section) fs_give ((void **) &ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2947 fs_give ((void **) &args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2948 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2949 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2950
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2951 /* Fetch body part binary
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2952 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2953 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2954 * Someday fix this to use stringstruct instead of memory
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2955 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2956
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2957 void fetch_body_part_binary (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2958 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2959 TEXTARGS *ta = (TEXTARGS *) args;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2960 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2961 SIZEDTEXT st,cst;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2962 BODY *body = mail_body (stream,i,ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2963 char *tmp = (char *) fs_get (100+(ta->section ? strlen (ta->section) : 0));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2964 unsigned long uid = mail_uid (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2965 /* try to use remembered text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2966 if (lastuid && (uid == lastuid) && !strcmp (tmp,lastid)) st = lastst;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2967 else { /* get data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2968 st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2969 mail_fetch_body (stream,i,ta->section,&st.size,ta->flags);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2970 if (ta->first || ta->last) remember (uid,tmp,&st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2971 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2972 /* what encoding was used? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2973 if (body) switch (body->encoding) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2974 case ENCBASE64:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2975 if (cst.data = rfc822_base64 (st.data,st.size,&cst.size)) break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2976 fetch_uid (i,NIL); /* wrote a space, so must do something */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2977 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2978 lsterr = cpystr ("Undecodable BASE64 contents");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2979 response = loseunknowncte;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2980 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2981 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2982 case ENCQUOTEDPRINTABLE:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2983 if (cst.data = rfc822_qprint (st.data,st.size,&cst.size)) break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2984 fetch_uid (i,NIL); /* wrote a space, so must do something */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2985 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2986 lsterr = cpystr ("Undecodable QUOTED-PRINTABLE contents");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2987 response = loseunknowncte;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2988 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2989 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2990 case ENC7BIT: /* no need to convert any of these */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2991 case ENC8BIT:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2992 case ENCBINARY:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2993 cst.data = NIL; /* no converted data to free */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2994 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2995 default: /* unknown encoding, oops */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2996 fetch_uid (i,NIL); /* wrote a space, so must do something */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2997 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2998 lsterr = cpystr ("Unknown Content-Transfer-Encoding");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
2999 response = loseunknowncte;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3000 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3001 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3002 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3003 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3004 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3005 lsterr = cpystr ("Invalid body part");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3006 response = loseunknowncte;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3007 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3008 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3009 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3010
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3011 /* use decoded version if exists */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3012 if (cst.data) memcpy ((void *) &st,(void *) &cst,sizeof (SIZEDTEXT));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3013 if (ta->binary & FTB_SIZE) {/* just want size? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3014 sprintf (tmp,"BINARY.SIZE[%s] %lu",ta->section ? ta->section : "",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3015 st.size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3016 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3017 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3018 else { /* no, blat binary data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3019 int f = mail_elt (stream,i)->seen;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3020 if (st.data) { /* only if have useful data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3021 /* partial specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3022 if (ta->first || ta->last)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3023 sprintf (tmp,"BINARY[%s]<%lu> ",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3024 ta->section ? ta->section : "",ta->first);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3025 else sprintf (tmp,"BINARY[%s] ",ta->section ? ta->section : "");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3026 /* in case first byte beyond end of text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3027 if (st.size <= ta->first) st.size = ta->first = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3028 else { /* offset and truncate */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3029 st.data += ta->first; /* move to desired position */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3030 st.size -= ta->first; /* reduced size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3031 if (ta->last && (st.size > ta->last)) st.size = ta->last;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3032 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3033 if (st.size) sprintf (tmp + strlen (tmp),"{%lu}\015\012",st.size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3034 else strcat (tmp,"\"\"");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3035 PSOUT (tmp); /* write binary output */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3036 if (st.size && (PSOUTR (&st) == EOF)) ioerror(stdout,"writing binary");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3037 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3038 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3039 sprintf (tmp,"BINARY[%s] NIL",ta->section ? ta->section : "");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3040 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3041 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3042 changed_flags (i,f); /* write changed flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3043 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3044 /* free converted data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3045 if (cst.data) fs_give ((void **) &cst.data);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3046 fs_give ((void **) &tmp); /* and temporary string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3047 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3048 else { /* clean up the arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3049 if (ta->section) fs_give ((void **) &ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3050 fs_give ((void **) &args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3051 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3052 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3053
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3054 /* Fetch MESSAGE/RFC822 body part header
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3055 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3056 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3057 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3058
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3059 void fetch_body_part_header (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3060 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3061 TEXTARGS *ta = (TEXTARGS *) args;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3062 unsigned long len = 100 + (ta->section ? strlen (ta->section) : 0);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3063 STRINGLIST *s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3064 for (s = ta->lines; s; s = s->next) len += s->text.size + 1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3065 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3066 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3067 char *tmp = (char *) fs_get (len);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3068 PSOUT ("BODY[");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3069 /* output attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3070 if (ta->section && *ta->section) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3071 PSOUT (ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3072 PBOUT ('.');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3073 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3074 PSOUT ("HEADER");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3075 if (ta->lines) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3076 PSOUT ((ta->flags & FT_NOT) ? ".FIELDS.NOT " : ".FIELDS ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3077 pastringlist (ta->lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3078 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3079 strcpy (tmp,"]"); /* close section specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3080 st.data = (unsigned char *) /* get data (no hope in using remember here) */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3081 mail_fetch_header (stream,i,ta->section,ta->lines,&st.size,ta->flags);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3082 pbodypartstring (i,tmp,&st,NIL,ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3083 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3084 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3085 else { /* clean up the arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3086 if (ta->lines) mail_free_stringlist (&ta->lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3087 if (ta->section) fs_give ((void **) &ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3088 fs_give ((void **) &args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3089 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3090 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3091
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3092 /* Fetch MESSAGE/RFC822 body part text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3093 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3094 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3095 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3096
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3097 void fetch_body_part_text (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3098 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3099 TEXTARGS *ta = (TEXTARGS *) args;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3100 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3101 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3102 char *tmp = (char *) fs_get (100+(ta->section ? strlen (ta->section) : 0));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3103 unsigned long uid = mail_uid (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3104 /* output attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3105 if (ta->section && *ta->section) sprintf (tmp,"BODY[%s.TEXT]",ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3106 else strcpy (tmp,"BODY[TEXT]");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3107 /* try to use remembered text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3108 if (lastuid && (uid == lastuid) && !strcmp (tmp,lastid)) st = lastst;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3109 /* get data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3110 else if ((st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3111 mail_fetch_text (stream,i,ta->section,&st.size,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3112 ta->flags | FT_RETURNSTRINGSTRUCT)) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3113 (ta->first || ta->last)) remember (uid,tmp,&st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3114 pbodypartstring (i,tmp,&st,&stream->private.string,ta);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3115 fs_give ((void **) &tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3116 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3117 else { /* clean up the arguments */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3118 if (ta->section) fs_give ((void **) &ta->section);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3119 fs_give ((void **) &args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3120 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3121 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3122
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3123
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3124 /* Remember body part text for subsequent partial fetching
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3125 * Accepts: message UID
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3126 * body part id
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3127 * text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3128 * string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3129 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3130
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3131 void remember (unsigned long uid,char *id,SIZEDTEXT *st)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3132 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3133 lastuid = uid; /* remember UID */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3134 if (lastid) fs_give ((void **) &lastid);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3135 lastid = cpystr (id); /* remember body part id */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3136 if (lastst.data) fs_give ((void **) &lastst.data);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3137 /* remember text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3138 lastst.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3139 memcpy (fs_get (st->size + 1),st->data,st->size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3140 lastst.size = st->size;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3141 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3142
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3143
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3144 /* Fetch envelope
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3145 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3146 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3147 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3148
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3149 void fetch_envelope (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3150 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3151 ENVELOPE *env = mail_fetchenvelope (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3152 PSOUT ("ENVELOPE "); /* output attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3153 penv (env); /* output envelope */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3154 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3155
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3156 /* Fetch flags
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3157 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3158 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3159 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3160
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3161 void fetch_flags (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3162 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3163 unsigned long u;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3164 char *t,tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3165 int c = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3166 MESSAGECACHE *elt = mail_elt (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3167 if (!elt->valid) { /* have valid flags yet? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3168 sprintf (tmp,"%lu",i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3169 mail_fetch_flags (stream,tmp,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3170 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3171 PSOUT ("FLAGS ("); /* output attribute */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3172 /* output system flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3173 if (elt->recent) put_flag (&c,"\\Recent");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3174 if (elt->seen) put_flag (&c,"\\Seen");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3175 if (elt->deleted) put_flag (&c,"\\Deleted");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3176 if (elt->flagged) put_flag (&c,"\\Flagged");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3177 if (elt->answered) put_flag (&c,"\\Answered");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3178 if (elt->draft) put_flag (&c,"\\Draft");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3179 if (u = elt->user_flags) do /* any user flags? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3180 if (t = stream->user_flags[find_rightmost_bit (&u)]) put_flag (&c,t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3181 while (u); /* until no more user flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3182 PBOUT (')'); /* end of flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3183 elt->spare2 = NIL; /* we've sent the update */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3184 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3185
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3186
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3187 /* Output a flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3188 * Accepts: pointer to current delimiter character
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3189 * flag to output
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3190 * Changes delimiter character to space
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3191 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3192
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3193 void put_flag (int *c,char *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3194 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3195 if (*c) PBOUT (*c); /* put delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3196 PSOUT (s); /* dump flag */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3197 *c = ' '; /* change delimiter if necessary */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3198 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3199
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3200
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3201 /* Output flags if was unseen
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3202 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3203 * prior value of Seen flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3204 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3205
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3206 void changed_flags (unsigned long i,int f)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3207 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3208 /* was unseen, now seen? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3209 if (!f && mail_elt (stream,i)->seen) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3210 PBOUT (' '); /* yes, delimit with space */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3211 fetch_flags (i,NIL); /* output flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3212 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3213 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3214
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3215 /* Fetch message internal date
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3216 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3217 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3218 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3219
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3220 void fetch_internaldate (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3221 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3222 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3223 MESSAGECACHE *elt = mail_elt (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3224 if (!elt->day) { /* have internal date yet? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3225 sprintf (tmp,"%lu",i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3226 mail_fetch_fast (stream,tmp,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3227 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3228 PSOUT ("INTERNALDATE \"");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3229 PSOUT (mail_date (tmp,elt));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3230 PBOUT ('"');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3231 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3232
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3233
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3234 /* Fetch unique identifier
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3235 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3236 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3237 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3238
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3239 void fetch_uid (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3240 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3241 PSOUT ("UID ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3242 pnum (mail_uid (stream,i));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3243 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3244
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3245 /* Fetch complete RFC-822 format message
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3246 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3247 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3248 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3249
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3250 void fetch_rfc822 (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3251 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3252 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3253 int f = mail_elt (stream,i)->seen;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3254 #if 0
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3255 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3256 st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3257 mail_fetch_message (stream,i,&st.size,(long) args);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3258 pbodypartstring (i,"RFC822",&st,NIL,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3259 #else
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3260 /* Yes, this version is bletcherous, but mail_fetch_message() requires
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3261 too much memory */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3262 SIZEDTEXT txt,hdr;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3263 char *s = mail_fetch_header (stream,i,NIL,NIL,&hdr.size,FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3264 hdr.data = (unsigned char *) memcpy (fs_get (hdr.size),s,hdr.size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3265 txt.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3266 mail_fetch_text (stream,i,NIL,&txt.size,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3267 ((long) args) | FT_RETURNSTRINGSTRUCT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3268 PSOUT ("RFC822 {");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3269 pnum (hdr.size + txt.size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3270 PSOUT ("}\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3271 ptext (&hdr,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3272 ptext (&txt,&stream->private.string);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3273 fs_give ((void **) &hdr.data);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3274 #endif
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3275 changed_flags (i,f); /* output changed flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3276 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3277 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3278
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3279
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3280 /* Fetch RFC-822 header
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3281 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3282 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3283 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3284
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3285 void fetch_rfc822_header (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3286 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3287 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3288 st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3289 mail_fetch_header (stream,i,NIL,NIL,&st.size,FT_PEEK);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3290 pbodypartstring (i,"RFC822.HEADER",&st,NIL,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3291 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3292
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3293
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3294 /* Fetch RFC-822 message length
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3295 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3296 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3297 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3298
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3299 void fetch_rfc822_size (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3300 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3301 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3302 MESSAGECACHE *elt = mail_elt (stream,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3303 if (!elt->rfc822_size) { /* have message size yet? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3304 sprintf (tmp,"%lu",i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3305 mail_fetch_fast (stream,tmp,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3306 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3307 PSOUT ("RFC822.SIZE ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3308 pnum (elt->rfc822_size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3309 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3310
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3311 /* Fetch RFC-822 text only
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3312 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3313 * extra argument
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3314 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3315
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3316 void fetch_rfc822_text (unsigned long i,void *args)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3317 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3318 if (i) { /* do work? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3319 int f = mail_elt (stream,i)->seen;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3320 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3321 st.data = (unsigned char *)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3322 mail_fetch_text (stream,i,NIL,&st.size,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3323 ((long) args) | FT_RETURNSTRINGSTRUCT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3324 pbodypartstring (i,"RFC822.TEXT",&st,&stream->private.string,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3325 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3326 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3327
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3328 /* Print envelope
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3329 * Accepts: body
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3330 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3331
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3332 void penv (ENVELOPE *env)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3333 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3334 PBOUT ('('); /* delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3335 if (env) { /* only if there is an envelope */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3336 pnstring (env->date); /* output envelope fields */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3337 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3338 pnstring (env->subject);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3339 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3340 paddr (env->from);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3341 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3342 paddr (env->sender);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3343 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3344 paddr (env->reply_to);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3345 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3346 paddr (env->to);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3347 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3348 paddr (env->cc);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3349 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3350 paddr (env->bcc);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3351 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3352 pnstring (env->in_reply_to);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3353 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3354 pnstring (env->message_id);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3355 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3356 /* no envelope */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3357 else PSOUT ("NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3358 PBOUT (')'); /* end of envelope */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3359 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3360
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3361 /* Print body structure (extensible)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3362 * Accepts: body
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3363 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3364
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3365 void pbodystructure (BODY *body)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3366 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3367 PBOUT ('('); /* delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3368 if (body) { /* only if there is a body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3369 PART *part;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3370 /* multipart type? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3371 if (body->type == TYPEMULTIPART) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3372 /* print each part */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3373 if (part = body->nested.part)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3374 for (; part; part = part->next) pbodystructure (&(part->body));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3375 else pbodystructure (NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3376 PBOUT (' '); /* space delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3377 pstring (body->subtype); /* subtype */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3378 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3379 pparam (body->parameter); /* multipart body extension data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3380 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3381 if (body->disposition.type) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3382 PBOUT ('(');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3383 pstring (body->disposition.type);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3384 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3385 pparam (body->disposition.parameter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3386 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3387 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3388 else PSOUT ("NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3389 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3390 pnstringorlist (body->language);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3391 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3392 pnstring (body->location);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3393 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3394
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3395 else { /* non-multipart body type */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3396 pstring ((char *) body_types[body->type]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3397 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3398 pstring (body->subtype);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3399 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3400 pparam (body->parameter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3401 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3402 pnstring (body->id);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3403 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3404 pnstring (body->description);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3405 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3406 pstring ((char *) body_encodings[body->encoding]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3407 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3408 pnum (body->size.bytes);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3409 switch (body->type) { /* extra stuff depends upon body type */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3410 case TYPEMESSAGE:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3411 /* can't do this if not RFC822 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3412 if (strcmp (body->subtype,"RFC822")) break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3413 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3414 penv (body->nested.msg->env);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3415 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3416 pbodystructure (body->nested.msg->body);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3417 case TYPETEXT:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3418 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3419 pnum (body->size.lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3420 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3421 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3422 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3423 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3424 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3425 pnstring (body->md5);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3426 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3427 if (body->disposition.type) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3428 PBOUT ('(');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3429 pstring (body->disposition.type);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3430 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3431 pparam (body->disposition.parameter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3432 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3433 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3434 else PSOUT ("NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3435 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3436 pnstringorlist (body->language);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3437 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3438 pnstring (body->location);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3439 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3440 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3441 /* no body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3442 else PSOUT ("\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 0 0 NIL NIL NIL NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3443 PBOUT (')'); /* end of body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3444 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3445
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3446 /* Print body (non-extensible)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3447 * Accepts: body
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3448 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3449
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3450 void pbody (BODY *body)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3451 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3452 PBOUT ('('); /* delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3453 if (body) { /* only if there is a body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3454 PART *part;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3455 /* multipart type? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3456 if (body->type == TYPEMULTIPART) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3457 /* print each part */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3458 if (part = body->nested.part)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3459 for (; part; part = part->next) pbody (&(part->body));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3460 else pbody (NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3461 PBOUT (' '); /* space delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3462 pstring (body->subtype); /* and finally the subtype */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3463 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3464 else { /* non-multipart body type */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3465 pstring ((char *) body_types[body->type]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3466 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3467 pstring (body->subtype);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3468 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3469 pparam (body->parameter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3470 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3471 pnstring (body->id);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3472 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3473 pnstring (body->description);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3474 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3475 pstring ((char *) body_encodings[body->encoding]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3476 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3477 pnum (body->size.bytes);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3478 switch (body->type) { /* extra stuff depends upon body type */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3479 case TYPEMESSAGE:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3480 /* can't do this if not RFC822 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3481 if (strcmp (body->subtype,"RFC822")) break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3482 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3483 penv (body->nested.msg ? body->nested.msg->env : NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3484 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3485 pbody (body->nested.msg ? body->nested.msg->body : NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3486 case TYPETEXT:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3487 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3488 pnum (body->size.lines);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3489 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3490 default:
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3491 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3492 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3493 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3494 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3495 /* no body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3496 else PSOUT ("\"TEXT\" \"PLAIN\" (\"CHARSET\" \"US-ASCII\") NIL NIL \"7BIT\" 0 0");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3497 PBOUT (')'); /* end of body */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3498 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3499
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3500 /* Print parameter list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3501 * Accepts: paramter
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3502 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3503
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3504 void pparam (PARAMETER *param)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3505 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3506 if (param) { /* one specified? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3507 PBOUT ('(');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3508 do {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3509 pstring (param->attribute);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3510 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3511 pstring (param->value);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3512 if (param = param->next) PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3513 } while (param);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3514 PBOUT (')'); /* end of parameters */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3515 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3516 else PSOUT ("NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3517 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3518
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3519
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3520 /* Print address list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3521 * Accepts: address list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3522 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3523
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3524 void paddr (ADDRESS *a)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3525 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3526 if (a) { /* have anything in address? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3527 PBOUT ('('); /* open the address list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3528 do { /* for each address */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3529 PBOUT ('('); /* open the address */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3530 pnstring (a->personal); /* personal name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3531 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3532 pnstring (a->adl); /* at-domain-list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3533 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3534 pnstring (a->mailbox); /* mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3535 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3536 pnstring (a->host); /* domain name of mailbox's host */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3537 PBOUT (')'); /* terminate address */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3538 } while (a = a->next); /* until end of address */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3539 PBOUT (')'); /* close address list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3540 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3541 else PSOUT ("NIL"); /* empty address */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3542 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3543
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3544 /* Print set
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3545 * Accepts: set
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3546 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3547
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3548 void pset (SEARCHSET **set)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3549 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3550 SEARCHSET *cur = *set;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3551 while (cur) { /* while there's a set to do */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3552 pnum (cur->first); /* output first value */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3553 if (cur->last) { /* if range, output second value of range */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3554 PBOUT (':');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3555 pnum (cur->last);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3556 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3557 if (cur = cur->next) PBOUT (',');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3558 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3559 mail_free_searchset (set); /* flush set */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3560 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3561
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3562
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3563 /* Print number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3564 * Accepts: number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3565 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3566
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3567 void pnum (unsigned long i)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3568 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3569 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3570 sprintf (tmp,"%lu",i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3571 PSOUT (tmp);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3572 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3573
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3574
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3575 /* Print string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3576 * Accepts: string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3577 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3578
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3579 void pstring (char *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3580 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3581 SIZEDTEXT st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3582 st.data = (unsigned char *) s;/* set up sized text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3583 st.size = strlen (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3584 psizedstring (&st,NIL); /* print string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3585 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3586
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3587
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3588 /* Print nstring
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3589 * Accepts: string or NIL
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3590 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3591
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3592 void pnstring (char *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3593 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3594 if (s) pstring (s); /* print string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3595 else PSOUT ("NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3596 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3597
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3598
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3599 /* Print atom or string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3600 * Accepts: astring
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3601 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3602
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3603 void pastring (char *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3604 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3605 char *t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3606 if (!*s) PSOUT ("\"\""); /* empty string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3607 else { /* see if atom */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3608 for (t = s; (*t > ' ') && !(*t & 0x80) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3609 (*t != '"') && (*t != '\\') && (*t != '(') && (*t != ')') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3610 (*t != '{') && (*t != '%') && (*t != '*'); t++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3611 if (*t) pstring (s); /* not an atom */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3612 else PSOUT (s); /* else plop down as atomic */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3613 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3614 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3615
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3616 /* Print sized text as quoted
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3617 * Accepts: sized text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3618 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3619
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3620 void psizedquoted (SIZEDTEXT *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3621 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3622 PBOUT ('"'); /* use quoted string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3623 ptext (s,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3624 PBOUT ('"');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3625 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3626
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3627
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3628 /* Print sized text as literal
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3629 * Accepts: sized text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3630 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3631
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3632 void psizedliteral (SIZEDTEXT *s,STRING *st)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3633 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3634 PBOUT ('{'); /* print literal size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3635 pnum (s->size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3636 PSOUT ("}\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3637 ptext (s,st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3638 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3639
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3640 /* Print sized text as literal or quoted string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3641 * Accepts: sized text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3642 * alternative stringstruct of text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3643 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3644
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3645 void psizedstring (SIZEDTEXT *s,STRING *st)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3646 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3647 unsigned char c;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3648 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3649
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3650 if (s->data) { /* if text, check if must use literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3651 for (i = 0; ((i < s->size) && ((c = s->data[i]) & 0xe0) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3652 !(c & 0x80) && (c != '"') && (c != '\\')); ++i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3653 /* must use literal if not all QUOTED-CHAR */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3654 if (i < s->size) psizedliteral (s,st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3655 else psizedquoted (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3656 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3657 else psizedliteral (s,st);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3658 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3659
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3660
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3661 /* Print sized text as literal or quoted string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3662 * Accepts: sized text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3663 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3664
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3665 void psizedastring (SIZEDTEXT *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3666 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3667 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3668 unsigned int atomp = s->size ? T : NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3669 for (i = 0; i < s->size; i++){/* check if must use literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3670 if (!(s->data[i] & 0xe0) || (s->data[i] & 0x80) ||
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3671 (s->data[i] == '"') || (s->data[i] == '\\')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3672 psizedliteral (s,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3673 return;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3674 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3675 else switch (s->data[i]) { /* else see if any atom-specials */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3676 case '(': case ')': case '{': case ' ':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3677 case '%': case '*': /* list-wildcards */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3678 case ']': /* resp-specials */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3679 /* CTL and quoted-specials in literal check */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3680 atomp = NIL; /* not an atom */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3681 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3682 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3683 if (atomp) ptext (s,NIL); /* print as atom */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3684 else psizedquoted (s); /* print as quoted string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3685 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3686
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3687 /* Print string list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3688 * Accepts: string list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3689 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3690
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3691 void pastringlist (STRINGLIST *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3692 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3693 PBOUT ('('); /* start list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3694 do {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3695 psizedastring (&s->text); /* output list member */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3696 if (s->next) PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3697 } while (s = s->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3698 PBOUT (')'); /* terminate list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3699 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3700
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3701
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3702 /* Print nstring or list of strings
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3703 * Accepts: string / string list
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3704 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3705
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3706 void pnstringorlist (STRINGLIST *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3707 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3708 if (!s) PSOUT ("NIL"); /* no argument given */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3709 else if (s->next) { /* output list as list of strings*/
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3710 PBOUT ('('); /* start list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3711 do { /* output list member */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3712 psizedstring (&s->text,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3713 if (s->next) PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3714 } while (s = s->next);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3715 PBOUT (')'); /* terminate list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3716 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3717 /* and single-element list as string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3718 else psizedstring (&s->text,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3719 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3720
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3721 /* Print body part string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3722 * Accepts: message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3723 * body part id (note: must have space at end to append stuff)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3724 * sized text of string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3725 * alternative stringstruct of string
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3726 * text printing arguments
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3727 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3728
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3729 void pbodypartstring (unsigned long msgno,char *id,SIZEDTEXT *st,STRING *bs,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3730 TEXTARGS *ta)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3731 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3732 int f = mail_elt (stream,msgno)->seen;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3733 /* ignore stringstruct if non-initialized */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3734 if (bs && !bs->curpos) bs = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3735 if (ta && st->size) { /* only if have useful data */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3736 /* partial specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3737 if (ta->first || ta->last) sprintf (id + strlen (id),"<%lu>",ta->first);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3738 /* in case first byte beyond end of text */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3739 if (st->size <= ta->first) st->size = ta->first = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3740 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3741 if (st->data) { /* offset and truncate */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3742 st->data += ta->first; /* move to desired position */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3743 st->size -= ta->first; /* reduced size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3744 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3745 else if (bs && (SIZE (bs) >= ta->first))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3746 SETPOS (bs,ta->first + GETPOS (bs));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3747 else st->size = 0; /* shouldn't happen */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3748 if (ta->last && (st->size > ta->last)) st->size = ta->last;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3749 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3750 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3751 PSOUT (id);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3752 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3753 psizedstring (st,bs); /* output string */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3754 changed_flags (msgno,f); /* and changed flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3755 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3756
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3757 /* RFC 3501 technically forbids NULs in literals. Normally, the delivering
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3758 * MTA would take care of MIME converting the message text so that it is
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3759 * NUL-free. If it doesn't, then we have the choice of either violating
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3760 * IMAP by sending NULs, corrupting the data, or going to lots of work to do
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3761 * MIME conversion in the IMAP server.
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3762 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3763
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3764 /* Print raw sized text
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3765 * Accepts: sizedtext
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3766 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3767
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3768 void ptext (SIZEDTEXT *txt,STRING *st)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3769 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3770 unsigned char c,*s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3771 unsigned long i = txt->size;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3772 if (s = txt->data) while (i && ((PBOUT ((c = *s++) ? c : 0x80) != EOF))) --i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3773 else if (st) while (i && (PBOUT ((c = SNX (st)) ? c : 0x80) != EOF)) --i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3774 /* failed to complete? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3775 if (i) ioerror (stdout,"writing text");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3776 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3777
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3778 /* Print thread
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3779 * Accepts: thread
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3780 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3781
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3782 void pthread (THREADNODE *thr)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3783 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3784 THREADNODE *t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3785 while (thr) { /* for each branch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3786 PBOUT ('('); /* open branch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3787 if (thr->num) { /* first node message number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3788 pnum (thr->num);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3789 if (t = thr->next) { /* any subsequent nodes? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3790 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3791 while (t) { /* for each subsequent node */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3792 if (t->branch) { /* branches? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3793 pthread (t); /* yes, recurse to do branch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3794 t = NIL; /* done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3795 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3796 else { /* just output this number */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3797 pnum (t->num);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3798 t = t->next; /* and do next message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3799 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3800 if (t) PBOUT (' '); /* delimit if more to come */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3801 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3802 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3803 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3804 else pthread (thr->next); /* nest for dummy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3805 PBOUT (')'); /* done with this branch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3806 thr = thr->branch; /* do next branch */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3807 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3808 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3809
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3810 /* Print capabilities
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3811 * Accepts: option flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3812 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3813
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3814 void pcapability (long flag)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3815 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3816 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3817 char *s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3818 struct stat sbuf;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3819 AUTHENTICATOR *auth;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3820 THREADER *thr = (THREADER *) mail_parameters (NIL,GET_THREADERS,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3821 /* always output protocol level */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3822 PSOUT ("CAPABILITY IMAP4REV1 I18NLEVEL=1 LITERAL+");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3823 #ifdef NETSCAPE_BRAIN_DAMAGE
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3824 PSOUT (" X-NETSCAPE");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3825 #endif
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3826 if (flag >= 0) { /* want post-authentication capabilities? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3827 PSOUT (" IDLE UIDPLUS NAMESPACE CHILDREN MAILBOX-REFERRALS BINARY UNSELECT ESEARCH WITHIN SCAN SORT");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3828 while (thr) { /* threaders */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3829 PSOUT (" THREAD=");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3830 PSOUT (thr->name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3831 thr = thr->next;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3832 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3833 if (!anonymous) PSOUT (" MULTIAPPEND");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3834 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3835 if (flag <= 0) { /* want pre-authentication capabilities? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3836 PSOUT (" SASL-IR LOGIN-REFERRALS");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3837 if (s = ssl_start_tls (NIL)) fs_give ((void **) &s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3838 else PSOUT (" STARTTLS");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3839 /* disable plaintext */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3840 if (!(i = !mail_parameters (NIL,GET_DISABLEPLAINTEXT,NIL)))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3841 PSOUT (" LOGINDISABLED");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3842 for (auth = mail_lookup_auth (1); auth; auth = auth->next)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3843 if (auth->server && !(auth->flags & AU_DISABLE) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3844 !(auth->flags & AU_HIDE) && (i || (auth->flags & AU_SECURE))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3845 PSOUT (" AUTH=");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3846 PSOUT (auth->name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3847 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3848 if (!stat (ANOFILE,&sbuf)) PSOUT (" AUTH=ANONYMOUS");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3849 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3850 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3851
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3852 /* Anonymous users may only use these mailboxes in these namespaces */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3853
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3854 char *oktab[] = {"#news.", "#ftp/", "#public/", 0};
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3855
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3856
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3857 /* Check if mailbox name is OK
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3858 * Accepts: reference name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3859 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3860 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3861
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3862 long nameok (char *ref,char *name)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3863 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3864 int i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3865 unsigned char *s,*t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3866 if (!name) return NIL; /* failure if missing name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3867 if (!anonymous) return T; /* otherwise OK if not anonymous */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3868 /* validate reference */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3869 if (ref && ((*ref == '#') || (*ref == '{')))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3870 for (i = 0; oktab[i]; i++) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3871 for (s = ref, t = oktab[i]; *t && !compare_uchar (*s,*t); s++, t++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3872 if (!*t) { /* reference OK */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3873 if (*name == '#') break;/* check name if override */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3874 else return T; /* otherwise done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3875 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3876 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3877 /* ordinary names are OK */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3878 if ((*name != '#') && (*name != '{')) return T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3879 for (i = 0; oktab[i]; i++) { /* validate mailbox */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3880 for (s = name, t = oktab[i]; *t && !compare_uchar (*s,*t); s++, t++);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3881 if (!*t) return T; /* name is OK */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3882 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3883 response = "%.80s NO Anonymous may not %.80s this name\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3884 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3885 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3886
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3887
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3888 /* Convert possible BBoard name to actual name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3889 * Accepts: command
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3890 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3891 * Returns: maibox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3892 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3893
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3894 char *bboardname (char *cmd,char *name)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3895 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3896 if (cmd[0] == 'B') { /* want bboard? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3897 char *s = litstk[litsp++] = (char *) fs_get (strlen (name) + 9);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3898 sprintf (s,"#public/%s",(*name == '/') ? name+1 : name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3899 name = s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3900 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3901 return name;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3902 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3903
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3904 /* Test if name is news proxy
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3905 * Accepts: name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3906 * Returns: T if news proxy, NIL otherwise
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3907 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3908
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3909 long isnewsproxy (char *name)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3910 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3911 return (nntpproxy && (name[0] == '#') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3912 ((name[1] == 'N') || (name[1] == 'n')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3913 ((name[2] == 'E') || (name[2] == 'e')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3914 ((name[3] == 'W') || (name[3] == 'w')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3915 ((name[4] == 'S') || (name[4] == 's')) && (name[5] == '.')) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3916 LONGT : NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3917 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3918
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3919
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3920 /* News proxy generate canonical pattern
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3921 * Accepts: reference
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3922 * pattern
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3923 * buffer to return canonical pattern
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3924 * Returns: T on success with pattern in buffer, NIL on failure
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3925 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3926
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3927 long newsproxypattern (char *ref,char *pat,char *pattern,long flag)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3928 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3929 if (!nntpproxy) return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3930 if (strlen (ref) > NETMAXMBX) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3931 sprintf (pattern,"Invalid reference specification: %.80s",ref);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3932 mm_log (pattern,ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3933 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3934 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3935 if (strlen (pat) > NETMAXMBX) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3936 sprintf (pattern,"Invalid pattern specification: %.80s",pat);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3937 mm_log (pattern,ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3938 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3939 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3940 if (flag) { /* prepend proxy specifier */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3941 sprintf (pattern,"{%.300s/nntp}",nntpproxy);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3942 pattern += strlen (pattern);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3943 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3944 if (*ref) { /* have a reference */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3945 strcpy (pattern,ref); /* copy reference to pattern */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3946 /* # overrides mailbox field in reference */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3947 if (*pat == '#') strcpy (pattern,pat);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3948 /* pattern starts, reference ends, with . */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3949 else if ((*pat == '.') && (pattern[strlen (pattern) - 1] == '.'))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3950 strcat (pattern,pat + 1); /* append, omitting one of the period */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3951 else strcat (pattern,pat); /* anything else is just appended */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3952 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3953 else strcpy (pattern,pat); /* just have basic name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3954 return isnewsproxy (pattern);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3955 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3956
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3957 /* IMAP4rev1 Authentication responder
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3958 * Accepts: challenge
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3959 * length of challenge
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3960 * pointer to response length return location if non-NIL
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3961 * Returns: response
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3962 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3963
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3964 #define RESPBUFLEN 8*MAILTMPLEN
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3965
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3966 char *imap_responder (void *challenge,unsigned long clen,unsigned long *rlen)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3967 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3968 unsigned long i,j;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3969 unsigned char *t,resp[RESPBUFLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3970 if (initial) { /* initial response given? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3971 if (clen) return NIL; /* not permitted */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3972 /* set up response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3973 i = strlen ((char *) (t = initial));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3974 initial = NIL; /* no more initial response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3975 if ((*t == '=') && !t[1]) { /* SASL-IR does this for 0-length response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3976 if (rlen) *rlen = 0; /* set length zero if empty */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3977 return cpystr (""); /* and return empty string as response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3978 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3979 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3980 else { /* issue challenge, get response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3981 PSOUT ("+ ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3982 for (t = rfc822_binary ((void *) challenge,clen,&i),j = 0; j < i; j++)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3983 if (t[j] > ' ') PBOUT (t[j]);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3984 fs_give ((void **) &t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3985 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3986 PFLUSH (); /* dump output buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3987 /* slurp response buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3988 slurp ((char *) resp,RESPBUFLEN,INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3989 if (!(t = (unsigned char *) strchr ((char *) resp,'\012')))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3990 return (char *) flush ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3991 if (t[-1] == '\015') --t; /* remove CR */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3992 *t = '\0'; /* tie off buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3993 if (resp[0] == '*') {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3994 cancelled = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3995 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3996 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3997 i = t - resp; /* length of response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3998 t = resp; /* set up for return call */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
3999 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4000 return (i % 4) ? NIL : /* return if valid BASE64 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4001 (char *) rfc822_base64 (t,i,rlen ? rlen : &i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4002 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4003
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4004 /* Proxy copy across mailbox formats
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4005 * Accepts: mail stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4006 * sequence to copy on this stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4007 * destination mailbox
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4008 * option flags
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4009 * Returns: T if success, else NIL
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4010 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4011
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4012 long proxycopy (MAILSTREAM *stream,char *sequence,char *mailbox,long options)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4013 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4014 MAILSTREAM *ts;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4015 STRING st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4016 MSGDATA md;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4017 SEARCHSET *set;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4018 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4019 unsigned long i,j;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4020 md.stream = stream;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4021 md.msgno = 0;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4022 md.flags = md.date = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4023 md.message = &st;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4024 /* Currently ignores CP_MOVE and CP_DEBUG */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4025 if (!((options & CP_UID) ? /* validate sequence */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4026 mail_uid_sequence (stream,sequence) : mail_sequence (stream,sequence)))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4027 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4028 response = win; /* cancel previous errors */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4029 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4030 /* c-client clobbers sequence, use spare */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4031 for (i = 1,j = 0,set = mail_newsearchset (); i <= nmsgs; i++)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4032 if (mail_elt (stream,i)->spare = mail_elt (stream,i)->sequence) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4033 mail_append_set (set,mail_uid (stream,i));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4034 if (!j) md.msgno = (j = i) - 1;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4035 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4036 /* only if at least one message to copy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4037 if (j && !mail_append_multiple (NIL,mailbox,proxy_append,(void *) &md)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4038 response = trycreate ? losetry : lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4039 if (set) mail_free_searchset (&set);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4040 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4041 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4042 if (caset) csset = set; /* set for return value now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4043 else if (set) mail_free_searchset (&set);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4044 response = win; /* stomp any previous babble */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4045 if (md.msgno) { /* get new driver name if was dummy */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4046 sprintf (tmp,"Cross-format (%.80s -> %.80s) COPY completed",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4047 stream->dtb->name,(ts = mail_open (NIL,mailbox,OP_PROTOTYPE)) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4048 ts->dtb->name : "unknown");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4049 mm_log (tmp,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4050 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4051 return LONGT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4052 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4053
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4054 /* Proxy append message callback
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4055 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4056 * append data package
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4057 * pointer to return initial flags
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4058 * pointer to return message internal date
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4059 * pointer to return stringstruct of message or NIL to stop
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4060 * Returns: T if success (have message or stop), NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4061 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4062
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4063 long proxy_append (MAILSTREAM *stream,void *data,char **flags,char **date,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4064 STRING **message)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4065 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4066 MESSAGECACHE *elt;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4067 unsigned long i;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4068 char *s,*t,tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4069 MSGDATA *md = (MSGDATA *) data;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4070 if (md->flags) fs_give ((void **) &md->flags);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4071 if (md->date) fs_give ((void **) &md->date);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4072 *message = NIL; /* assume all done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4073 *flags = *date = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4074 while (++md->msgno <= nmsgs)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4075 if ((elt = mail_elt (md->stream,md->msgno))->spare) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4076 if (!(elt->valid && elt->day)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4077 sprintf (tmp,"%lu",md->msgno);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4078 mail_fetch_fast (md->stream,tmp,NIL);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4079 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4080 memset (s = tmp,0,MAILTMPLEN);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4081 /* copy flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4082 if (elt->seen) strcat (s," \\Seen");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4083 if (elt->deleted) strcat (s," \\Deleted");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4084 if (elt->flagged) strcat (s," \\Flagged");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4085 if (elt->answered) strcat (s," \\Answered");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4086 if (elt->draft) strcat (s," \\Draft");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4087 if (i = elt->user_flags) do
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4088 if ((t = md->stream->user_flags[find_rightmost_bit (&i)]) && *t &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4089 (strlen (t) < ((size_t) (MAILTMPLEN-((s += strlen (s))+2-tmp))))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4090 *s++ = ' '; /* space delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4091 strcpy (s,t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4092 } while (i); /* until no more user flags */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4093 *message = md->message; /* set up return values */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4094 *flags = md->flags = cpystr (tmp + 1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4095 *date = md->date = cpystr (mail_date (tmp,elt));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4096 INIT (md->message,msg_string,(void *) md,elt->rfc822_size);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4097 break; /* process this message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4098 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4099 return LONGT;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4100 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4101
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4102 /* Append message callback
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4103 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4104 * append data package
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4105 * pointer to return initial flags
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4106 * pointer to return message internal date
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4107 * pointer to return stringstruct of message or NIL to stop
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4108 * Returns: T if success (have message or stop), NIL if error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4109 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4110
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4111 long append_msg (MAILSTREAM *stream,void *data,char **flags,char **date,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4112 STRING **message)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4113 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4114 unsigned long i,j;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4115 char *t;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4116 APPENDDATA *ad = (APPENDDATA *) data;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4117 unsigned char *arg = ad->arg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4118 /* flush text of previous message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4119 if (t = ad->flags) fs_give ((void **) &ad->flags);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4120 if (t = ad->date) fs_give ((void **) &ad->date);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4121 if (t = ad->msg) fs_give ((void **) &ad->msg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4122 *flags = *date = NIL; /* assume no flags or date */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4123 if (t) { /* have previous message? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4124 if (!*arg) { /* if least one message, and no more coming */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4125 *message = NIL; /* set stop */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4126 return LONGT; /* return success */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4127 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4128 else if (*arg++ != ' ') { /* must have a delimiter to next argument */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4129 response = misarg; /* oops */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4130 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4131 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4132 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4133 *message = ad->message; /* return pointer to message stringstruct */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4134 if (*arg == '(') { /* parse optional flag list */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4135 t = ++arg; /* pointer to flag list contents */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4136 while (*arg && (*arg != ')')) arg++;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4137 if (*arg) *arg++ = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4138 if (*arg == ' ') arg++;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4139 *flags = ad->flags = cpystr (t);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4140 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4141 /* parse optional date */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4142 if (*arg == '"') *date = ad->date = cpystr (snarf (&arg));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4143 if (!arg || (*arg != '{')) /* parse message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4144 response = "%.80s BAD Missing literal in %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4145 else if (!isdigit (arg[1]))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4146 response = "%.80s BAD Missing message to %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4147 else if (!(i = strtoul (arg+1,&t,10)))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4148 response = "%.80s NO Empty message to %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4149 else if (i > MAXAPPENDTXT) /* maybe relax this a little */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4150 response = "%.80s NO Excessively large message to %.80s\015\012";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4151 else if (((*t == '+') && (t[1] == '}') && !t[2]) || ((*t == '}') && !t[1])) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4152 /* get a literal buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4153 inliteral (ad->msg = (char *) fs_get (i+1),i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4154 /* get new command tail */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4155 slurp (ad->arg,CMDLEN - (ad->arg - cmdbuf),INPUTTIMEOUT);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4156 if (strchr (ad->arg,'\012')) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4157 /* reset strtok mechanism, tie off if done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4158 if (!strtok (ad->arg,"\015\012")) *ad->arg = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4159 /* possible LITERAL+? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4160 if (((j = strlen (ad->arg)) > 3) && (ad->arg[j - 1] == '}') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4161 (ad->arg[j - 2] == '+') && isdigit (ad->arg[j - 3])) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4162 /* back over possible count */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4163 for (j -= 4; j && isdigit (ad->arg[j]); j--);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4164 if (ad->arg[j] == '{') {/* found a literal? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4165 litplus.ok = T; /* yes, note LITERAL+ in effect, set size */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4166 litplus.size = strtoul (ad->arg + j + 1,NIL,10);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4167 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4168 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4169 /* initialize stringstruct */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4170 INIT (ad->message,mail_string,(void *) ad->msg,i);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4171 return LONGT; /* ready to go */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4172 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4173 flush (); /* didn't find end of line? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4174 fs_give ((void **) &ad->msg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4175 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4176 else response = badarg; /* not a literal */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4177 return NIL; /* error */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4178 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4179
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4180 /* Got COPY UID data
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4181 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4182 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4183 * UID validity
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4184 * source set of UIDs
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4185 * destination set of UIDs
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4186 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4187
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4188 void copyuid (MAILSTREAM *stream,char *mailbox,unsigned long uidvalidity,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4189 SEARCHSET *sourceset,SEARCHSET *destset)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4190 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4191 if (cauidvalidity) fatal ("duplicate COPYUID/APPENDUID data");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4192 cauidvalidity = uidvalidity;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4193 csset = sourceset;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4194 caset = destset;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4195 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4196
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4197
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4198 /* Got APPEND UID data
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4199 * Accepts: mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4200 * UID validity
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4201 * destination set of UIDs
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4202 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4203
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4204 void appenduid (char *mailbox,unsigned long uidvalidity,SEARCHSET *set)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4205 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4206 copyuid (NIL,mailbox,uidvalidity,NIL,set);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4207 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4208
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4209
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4210 /* Got a referral
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4211 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4212 * URL
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4213 * referral type code
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4214 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4215
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4216 char *referral (MAILSTREAM *stream,char *url,long code)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4217 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4218 if (lstref) fs_give ((void **) &lstref);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4219 lstref = cpystr (url); /* set referral */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4220 /* set error if not a logged in referral */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4221 if (code != REFAUTH) response = lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4222 if (!lsterr) lsterr = cpystr ("Try referral URL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4223 return NIL; /* don't chase referrals for now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4224 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4225
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4226 /* Co-routines from MAIL library */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4227
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4228
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4229 /* Message matches a search
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4230 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4231 * message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4232 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4233
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4234 void mm_searched (MAILSTREAM *s,unsigned long msgno)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4235 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4236 /* nothing to do here */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4237 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4238
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4239
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4240 /* Message exists (i.e. there are that many messages in the mailbox)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4241 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4242 * message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4243 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4244
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4245 void mm_exists (MAILSTREAM *s,unsigned long number)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4246 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4247 /* note change in number of messages */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4248 if ((s != tstream) && (nmsgs != number)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4249 nmsgs = number; /* always update number of messages */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4250 if (quell_events) existsquelled = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4251 else {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4252 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4253 pnum (nmsgs);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4254 PSOUT (" EXISTS\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4255 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4256 recent = 0xffffffff; /* make sure update recent too */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4257 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4258 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4259
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4260
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4261 /* Message expunged
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4262 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4263 * message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4264 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4265
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4266 void mm_expunged (MAILSTREAM *s,unsigned long number)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4267 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4268 if (quell_events) fatal ("Impossible EXPUNGE event");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4269 if (s != tstream) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4270 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4271 pnum (number);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4272 PSOUT (" EXPUNGE\015\012");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4273 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4274 nmsgs--;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4275 existsquelled = T; /* do EXISTS when command done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4276 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4277
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4278
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4279 /* Message status changed
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4280 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4281 * message number
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4282 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4283
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4284 void mm_flags (MAILSTREAM *s,unsigned long number)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4285 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4286 if (s != tstream) mail_elt (s,number)->spare2 = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4287 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4288
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4289 /* Mailbox found
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4290 * Accepts: hierarchy delimiter
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4291 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4292 * attributes
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4293 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4294
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4295 void mm_list (MAILSTREAM *stream,int delimiter,char *name,long attributes)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4296 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4297 mm_list_work ("LIST",delimiter,name,attributes);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4298 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4299
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4300
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4301 /* Subscribed mailbox found
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4302 * Accepts: hierarchy delimiter
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4303 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4304 * attributes
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4305 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4306
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4307 void mm_lsub (MAILSTREAM *stream,int delimiter,char *name,long attributes)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4308 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4309 mm_list_work ("LSUB",delimiter,name,attributes);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4310 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4311
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4312
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4313 /* Mailbox status
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4314 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4315 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4316 * mailbox status
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4317 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4318
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4319 void mm_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4320 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4321 if (!quell_events) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4322 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4323 tmp[0] = tmp[1] = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4324 if (status->flags & SA_MESSAGES)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4325 sprintf (tmp + strlen (tmp)," MESSAGES %lu",status->messages);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4326 if (status->flags & SA_RECENT)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4327 sprintf (tmp + strlen (tmp)," RECENT %lu",status->recent);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4328 if (status->flags & SA_UNSEEN)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4329 sprintf (tmp + strlen (tmp)," UNSEEN %lu",status->unseen);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4330 if (status->flags & SA_UIDNEXT)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4331 sprintf (tmp + strlen (tmp)," UIDNEXT %lu",status->uidnext);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4332 if (status->flags & SA_UIDVALIDITY)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4333 sprintf (tmp + strlen(tmp)," UIDVALIDITY %lu",status->uidvalidity);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4334 PSOUT ("* STATUS ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4335 pastring (mailbox);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4336 PSOUT (" (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4337 PSOUT (tmp+1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4338 PBOUT (')');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4339 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4340 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4341 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4342
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4343 /* Worker routine for LIST and LSUB
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4344 * Accepts: name of response
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4345 * hierarchy delimiter
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4346 * mailbox name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4347 * attributes
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4348 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4349
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4350 void mm_list_work (char *what,int delimiter,char *name,long attributes)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4351 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4352 char *s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4353 if (!quell_events) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4354 char tmp[MAILTMPLEN];
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4355 if (finding) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4356 PSOUT ("* MAILBOX ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4357 PSOUT (name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4358 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4359 /* new form */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4360 else if ((cmd[0] == 'R') || !(attributes & LATT_REFERRAL)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4361 PSOUT ("* ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4362 PSOUT (what);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4363 PSOUT (" (");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4364 tmp[0] = tmp[1] = '\0';
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4365 if (attributes & LATT_NOINFERIORS) strcat (tmp," \\NoInferiors");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4366 if (attributes & LATT_NOSELECT) strcat (tmp," \\NoSelect");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4367 if (attributes & LATT_MARKED) strcat (tmp," \\Marked");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4368 if (attributes & LATT_UNMARKED) strcat (tmp," \\UnMarked");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4369 if (attributes & LATT_HASCHILDREN) strcat (tmp," \\HasChildren");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4370 if (attributes & LATT_HASNOCHILDREN) strcat (tmp," \\HasNoChildren");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4371 PSOUT (tmp+1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4372 switch (delimiter) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4373 case '\\': /* quoted delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4374 case '"':
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4375 PSOUT (") \"\\");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4376 PBOUT (delimiter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4377 PBOUT ('"');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4378 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4379 case '\0': /* no delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4380 PSOUT (") NIL");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4381 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4382 default: /* unquoted delimiter */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4383 PSOUT (") \"");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4384 PBOUT (delimiter);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4385 PBOUT ('"');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4386 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4387 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4388 PBOUT (' ');
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4389 /* output mailbox name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4390 if (proxylist && (s = strchr (name,'}'))) pastring (s+1);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4391 else pastring (name);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4392 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4393 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4394 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4395 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4396
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4397 /* Notification event
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4398 * Accepts: MAIL stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4399 * string to log
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4400 * error flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4401 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4402
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4403 void mm_notify (MAILSTREAM *stream,char *string,long errflg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4404 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4405 SIZEDTEXT msg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4406 char *s,*code;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4407 if (!quell_events && (!tstream || (stream != tstream))) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4408 switch (errflg) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4409 case NIL: /* information message, set as OK response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4410 if ((string[0] == '[') &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4411 ((string[1] == 'T') || (string[1] == 't')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4412 ((string[2] == 'R') || (string[2] == 'r')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4413 ((string[3] == 'Y') || (string[3] == 'y')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4414 ((string[4] == 'C') || (string[4] == 'c')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4415 ((string[5] == 'R') || (string[5] == 'r')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4416 ((string[6] == 'E') || (string[6] == 'e')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4417 ((string[7] == 'A') || (string[7] == 'a')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4418 ((string[8] == 'T') || (string[8] == 't')) &&
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4419 ((string[9] == 'E') || (string[9] == 'e')) && (string[10] == ']'))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4420 trycreate = T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4421 case BYE: /* some other server signing off */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4422 case PARSE: /* parse glitch, output unsolicited OK */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4423 code = "* OK ";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4424 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4425 case WARN: /* warning, output unsolicited NO (kludge!) */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4426 code = "* NO ";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4427 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4428 case ERROR: /* error that broke command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4429 default: /* default should never happen */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4430 code = "* BAD ";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4431 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4432 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4433 PSOUT (code);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4434 msg.size = (s = strpbrk ((char *) (msg.data = (unsigned char *) string),
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4435 "\015\012")) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4436 (s - string) : strlen (string);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4437 PSOUTR (&msg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4438 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4439 PFLUSH (); /* let client see it immediately */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4440 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4441 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4442
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4443 /* Log an event for the user to see
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4444 * Accepts: string to log
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4445 * error flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4446 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4447
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4448 void mm_log (char *string,long errflg)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4449 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4450 SIZEDTEXT msg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4451 char *s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4452 msg.size =
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4453 (s = strpbrk ((char *) (msg.data = (unsigned char *) string),"\015\012")) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4454 (s - string) : strlen (string);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4455 switch (errflg) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4456 case NIL: /* information message, set as OK response */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4457 if (response == win) { /* only if no other response yet */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4458 if (lsterr) { /* if there was a previous message */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4459 if (!quell_events) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4460 PSOUT ("* OK "); /* blat it out */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4461 PSOUT (lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4462 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4463 PFLUSH (); /* let client see it immediately */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4464 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4465 fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4466 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4467 lsterr = cpystr (string); /* copy string for later use */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4468 if (s) lsterr[s - string] = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4469 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4470 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4471 case PARSE: /* parse glitch, output unsolicited OK */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4472 if (!quell_events) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4473 PSOUT ("* OK [PARSE] ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4474 PSOUTR (&msg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4475 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4476 PFLUSH (); /* let client see it immediately */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4477 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4478 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4479 case WARN: /* warning, output unsolicited NO */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4480 /* ignore "Mailbox is empty" (KLUDGE!) */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4481 if (strcmp (string,"Mailbox is empty")) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4482 if (lstwrn) { /* have previous warning? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4483 if (!quell_events) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4484 PSOUT ("* NO ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4485 PSOUT (lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4486 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4487 PFLUSH (); /* make sure client sees it immediately */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4488 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4489 fs_give ((void **) &lstwrn);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4490 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4491 lstwrn = cpystr (string); /* note last warning */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4492 if (s) lstwrn[s - string] = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4493 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4494 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4495 case ERROR: /* error that broke command */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4496 default: /* default should never happen */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4497 response = trycreate ? losetry : lose;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4498 if (lsterr) fs_give ((void **) &lsterr);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4499 lsterr = cpystr (string); /* note last error */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4500 if (s) lsterr[s - string] = NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4501 break;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4502 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4503 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4504
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4505 /* Return last error
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4506 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4507
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4508 char *lasterror (void)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4509 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4510 if (lsterr) return lsterr;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4511 if (lstwrn) return lstwrn;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4512 return "<unknown>";
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4513 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4514
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4515
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4516 /* Log an event to debugging telemetry
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4517 * Accepts: string to log
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4518 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4519
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4520 void mm_dlog (char *string)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4521 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4522 mm_log (string,WARN); /* shouldn't happen normally */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4523 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4524
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4525 /* Get user name and password for this host
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4526 * Accepts: parse of network user name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4527 * where to return user name
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4528 * where to return password
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4529 * trial count
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4530 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4531
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4532 void mm_login (NETMBX *mb,char *username,char *password,long trial)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4533 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4534 /* set user name */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4535 strncpy (username,*mb->user ? mb->user : (char *) user,NETMAXUSER);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4536 strncpy (password,pass,256); /* and password */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4537 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4538
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4539
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4540 /* About to enter critical code
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4541 * Accepts: stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4542 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4543
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4544 void mm_critical (MAILSTREAM *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4545 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4546 ++critical;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4547 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4548
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4549
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4550 /* About to exit critical code
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4551 * Accepts: stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4552 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4553
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4554 void mm_nocritical (MAILSTREAM *s)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4555 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4556 /* go non-critical, pending death? */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4557 if (!--critical && (state == LOGOUT)) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4558 /* clean up iff needed */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4559 if (s && (stream != s) && !s->lock && (s->dtb->flags & DR_XPOINT))
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4560 s = mail_close (s);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4561 longjmp (jmpenv,1); /* die now */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4562 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4563 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4564
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4565 /* Disk error found
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4566 * Accepts: stream
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4567 * system error code
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4568 * flag indicating that mailbox may be clobbered
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4569 * Returns: abort flag
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4570 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4571
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4572 long mm_diskerror (MAILSTREAM *s,long errcode,long serious)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4573 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4574 if (serious) { /* try your damnest if clobberage likely */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4575 mm_notify (s,"Retrying to fix probable mailbox damage!",ERROR);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4576 PFLUSH (); /* dump output buffer */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4577 syslog (LOG_ALERT,
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4578 "Retrying after disk error user=%.80s host=%.80s mbx=%.80s: %.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4579 user ? (char *) user : "???",tcp_clienthost (),
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4580 (stream && stream->mailbox) ? stream->mailbox : "???",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4581 strerror (errcode));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4582 settimeout (0); /* make damn sure timeout disabled */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4583 sleep (60); /* give it some time to clear up */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4584 return NIL;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4585 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4586 if (!quell_events) { /* otherwise die before more damage is done */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4587 PSOUT ("* NO Disk error: ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4588 PSOUT (strerror (errcode));
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4589 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4590 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4591 return T;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4592 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4593
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4594
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4595 /* Log a fatal error event
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4596 * Accepts: string to log
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4597 */
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4598
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4599 void mm_fatal (char *string)
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4600 {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4601 SIZEDTEXT msg;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4602 char *s;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4603 msg.size =
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4604 (s = strpbrk ((char *) (msg.data = (unsigned char *) string),"\015\012")) ?
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4605 (s - string) : strlen (string);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4606 if (!quell_events) {
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4607 PSOUT ("* BYE [ALERT] IMAP4rev1 server crashing: ");
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4608 PSOUTR (&msg);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4609 CRLF;
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4610 PFLUSH ();
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4611 }
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4612 syslog (LOG_ALERT,"Fatal error user=%.80s host=%.80s mbx=%.80s: %.80s",
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4613 user ? (char *) user : "???",tcp_clienthost (),
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4614 (stream && stream->mailbox) ? stream->mailbox : "???",string);
ada5e610ab86 imap-2007e
yuuji@gentei.org
parents:
diff changeset
4615 }

yatex.org