2 * S-nail - a mail user agent derived from Berkeley Mail.
4 * Copyright (c) 2000-2004 Gunnar Ritter, Freiburg i. Br., Germany.
5 * Copyright (c) 2012 Steffen "Daode" Nurpmeso.
9 * Copyright (c) 1992, 1993
10 * The Regents of the University of California. All rights reserved.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 * 3. All advertising materials mentioning features or use of this software
21 * must display the following acknowledgement:
22 * This product includes software developed by the University of
23 * California, Berkeley and its contributors.
24 * 4. Neither the name of the University nor the names of its contributors
25 * may be used to endorse or promote products derived from this software
26 * without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
42 void panic(const char *format
, ...);
45 void touch(struct message
*mp
);
46 int is_dir(char *name
);
47 int argcount(char **argv
);
48 void i_strcpy(char *dest
, const char *src
, int size
);
49 char *i_strdup(const char *src
);
50 void makelow(char *cp
);
51 int substr(const char *str
, const char *sub
);
52 char *colalign(const char *cp
, int col
, int fill
);
53 void try_pager(FILE *fp
);
56 void alter(char *name
);
57 int blankline(char *linebuf
);
58 int anyof(char *s1
, char *s2
);
59 int is_prefix(const char *as1
, const char *as2
);
60 char *last_at_before_slash(const char *sp
);
61 enum protocol
which_protocol(const char *name
);
62 const char *protfile(const char *xcp
);
63 char *protbase(const char *cp
);
64 int disconnected(const char *file
);
65 unsigned pjw(const char *cp
);
66 long nextprime(long n
);
67 char *strenc(const char *cp
);
68 char *strdec(const char *cp
);
70 char *md5tohex(const void *vp
);
71 char *cram_md5_string(const char *user
, const char *pass
, const char *b64
);
74 char *getpassword(struct termios
*otio
, int *reset_tio
, const char *query
);
75 void transflags(struct message
*omessage
, long omsgCount
, int transparent
);
76 char *getrandstring(size_t length
);
77 void out_of_memory(void);
78 void *smalloc(size_t s
);
79 void *srealloc(void *v
, size_t s
);
80 void *scalloc(size_t nmemb
, size_t size
);
81 char *sstpcpy(char *dst
, const char *src
);
82 char *sstrdup(const char *cp
);
83 enum okay
makedir(const char *name
);
84 enum okay
cwget(struct cw
*cw
);
85 enum okay
cwret(struct cw
*cw
);
86 void cwrelse(struct cw
*cw
);
87 void makeprint(struct str
*in
, struct str
*out
);
88 char *prstr(const char *s
);
89 int prout(const char *s
, size_t sz
, FILE *fp
);
90 int putuc(int u
, int c
, FILE *fp
);
91 int asccasecmp(const char *s1
, const char *s2
);
92 int ascncasecmp(const char *s1
, const char *s2
, size_t sz
);
93 char *asccasestr(const char *haystack
, const char *xneedle
);
96 char *strtob64(const char *p
);
97 char *memtob64(const void *vp
, size_t isz
);
98 size_t mime_write_tob64(struct str
*in
, FILE *fo
, int is_header
);
99 void mime_fromb64(struct str
*in
, struct str
*out
, int is_text
);
100 void mime_fromb64_b(struct str
*in
, struct str
*out
, int is_text
, FILE *f
);
103 enum okay
getcache1(struct mailbox
*mp
, struct message
*m
,
104 enum needspec need
, int setflags
);
105 enum okay
getcache(struct mailbox
*mp
, struct message
*m
, enum needspec need
);
106 void putcache(struct mailbox
*mp
, struct message
*m
);
107 void initcache(struct mailbox
*mp
);
108 void purgecache(struct mailbox
*mp
, struct message
*m
, long mc
);
109 void delcache(struct mailbox
*mp
, struct message
*m
);
110 enum okay
cache_setptr(int transparent
);
111 enum okay
cache_list(struct mailbox
*mp
, const char *base
, int strip
, FILE *fp
);
112 enum okay
cache_remove(const char *name
);
113 enum okay
cache_rename(const char *old
, const char *new);
114 unsigned long cached_uidvalidity(struct mailbox
*mp
);
115 FILE *cache_queue(struct mailbox
*mp
);
116 enum okay
cache_dequeue(struct mailbox
*mp
);
119 char *get_pager(void);
120 int headers(void *v
);
123 int screensize(void);
125 void printhead(int mesg
, FILE *f
, int threaded
);
127 int pcmdlist(void *v
);
128 char *laststring(char *linebuf
, int *flag
, int strip
);
134 int pipecmd(void *v
);
135 int Pipecmd(void *v
);
139 int folders(void *v
);
145 int copycmd(void *v
);
146 int Copycmd(void *v
);
149 int cdecrypt(void *v
);
150 int cDecrypt(void *v
);
153 int deltype(void *v
);
154 int undeletecmd(void *v
);
155 int retfield(void *v
);
156 int igfield(void *v
);
157 int saveretfield(void *v
);
158 int saveigfield(void *v
);
159 int fwdretfield(void *v
);
160 int fwdigfield(void *v
);
161 int unignore(void *v
);
162 int unretain(void *v
);
163 int unsaveignore(void *v
);
164 int unsaveretain(void *v
);
165 int unfwdignore(void *v
);
166 int unfwdretain(void *v
);
173 int respond(void *v
);
174 int respondall(void *v
);
175 int respondsender(void *v
);
176 int followup(void *v
);
177 int followupall(void *v
);
178 int followupsender(void *v
);
179 int preserve(void *v
);
182 int messize(void *v
);
187 int ungroup(void *v
);
190 int Respond(void *v
);
191 int Followup(void *v
);
192 int forwardcmd(void *v
);
193 int Forwardcmd(void *v
);
195 int elsecmd(void *v
);
196 int endifcmd(void *v
);
197 int alternates(void *v
);
198 int resendcmd(void *v
);
199 int Resendcmd(void *v
);
200 int newmail(void *v
);
201 int shortcut(void *v
);
202 struct shortcut
*get_shortcut(const char *str
);
203 int unshortcut(void *v
);
204 struct oldaccount
*get_oldaccount(const char *name
);
205 int account(void *v
);
207 int cunflag(void *v
);
208 int canswered(void *v
);
209 int cunanswered(void *v
);
211 int cundraft(void *v
);
213 int cunkill(void *v
);
216 int cremove(void *v
);
217 int crename(void *v
);
222 struct attachment
*edit_attachments(struct attachment
*attach
);
223 struct attachment
*add_attachment(struct attachment
*attach
, char *file
,
225 FILE *collect(struct header
*hp
, int printheaders
, struct message
*mp
,
226 char *quotefile
, int doprefix
, int tflag
);
227 void savedeadletter(FILE *fp
);
230 int fcntl_lock(int fd
, int type
);
231 int dot_lock(const char *fname
, int fd
, int pollinterval
, FILE *fp
,
233 void dot_unlock(const char *fname
);
238 FILE *run_editor(FILE *fp
, off_t size
, int type
, int readonly
,
239 struct header
*hp
, struct message
*mp
, enum sendaction action
,
240 sighandler_type oldint
);
243 void setptr(FILE *ibuf
, off_t offset
);
244 int putline(FILE *obuf
, char *linebuf
, size_t count
);
245 #define readline(a, b, c) readline_restart(a, b, c, 0)
246 int readline_restart(FILE *ibuf
, char **linebuf
, size_t *linesize
, size_t n
);
247 FILE *setinput(struct mailbox
*mp
, struct message
*m
, enum needspec need
);
248 struct message
*setdot(struct message
*mp
);
251 void relsesigs(void);
252 off_t
fsize(FILE *iob
);
253 char *expand(char *name
);
254 int getfold(char *name
, int size
);
255 char *getdeadletter(void);
256 char *fgetline(char **line
, size_t *linesize
, size_t *count
,
257 size_t *llen
, FILE *fp
, int appendnl
);
258 void newline_appended(void);
259 enum okay
get_body(struct message
*mp
);
260 int sclose(struct sock
*sp
);
261 enum okay
swrite(struct sock
*sp
, const char *data
);
262 enum okay
swrite1(struct sock
*sp
, const char *data
, int sz
, int use_buffer
);
263 int sgetline(char **line
, size_t *linesize
, size_t *linelen
, struct sock
*sp
);
264 enum okay
sopen(const char *xserver
, struct sock
*sp
, int use_ssl
,
265 const char *uhp
, const char *portstr
, int verbose
);
268 char *getname(int uid
);
269 int getuserid(char *name
);
272 #ifdef USE_BUILTIN_GETOPT
273 int getopt(int argc
, char *const argv
[], const char *optstring
);
277 int is_head(char *linebuf
, size_t linelen
);
278 void parse(char *line
, size_t linelen
, struct headline
*hl
, char *pbuf
);
279 void extract_header(FILE *fp
, struct header
*hp
);
280 #define hfieldX(a, b) hfield_mult(a, b, 1)
281 #define hfield1(a, b) hfield_mult(a, b, 0)
282 char *hfield_mult(char *field
, struct message
*mp
, int mult
);
283 char *thisfield(const char *linebuf
, const char *field
);
284 char *nameof(struct message
*mp
, int reptype
);
285 char *skip_comment(const char *cp
);
286 char *routeaddr(const char *name
);
287 #define is_fileorpipe_addr(NP) \
288 (((NP)->n_flags & NAME_ADDRSPEC_ISFILEORPIPE) != 0)
289 int is_addr_invalid(struct name
*np
, int putmsg
);
290 char *skinned_name(struct name
*np
);
291 char *skin(char *name
);
292 int addrspec_with_guts(int doskin
, char *name
, struct addrguts
*agp
);
293 char *realname(char *name
);
294 char *name1(struct message
*mp
, int reptype
);
295 int msgidcmp(const char *s1
, const char *s2
);
296 int is_ign(char *field
, size_t fieldlen
, struct ignoretab ignore
[2]);
297 int member(char *realfield
, struct ignoretab
*table
);
298 char *fakefrom(struct message
*mp
);
299 char *fakedate(time_t t
);
300 char *nexttoken(char *cp
);
301 time_t unixtime(char *from
);
302 time_t rfctime(char *date
);
303 time_t combinetime(int year
, int month
, int day
,
304 int hour
, int minute
, int second
);
305 void substdate(struct message
*m
);
306 int check_from_and_sender(struct name
*fromfield
, struct name
*senderfield
);
307 char *getsender(struct message
*m
);
310 enum okay
imap_noop(void);
311 enum okay
imap_select(struct mailbox
*mp
, off_t
*size
, int *count
,
313 int imap_setfile(const char *xserver
, int newmail
, int isedit
);
314 enum okay
imap_header(struct message
*m
);
315 enum okay
imap_body(struct message
*m
);
316 void imap_getheaders(int bot
, int top
);
317 void imap_quit(void);
318 enum okay
imap_undelete(struct message
*m
, int n
);
319 enum okay
imap_unread(struct message
*m
, int n
);
320 int imap_imap(void *vp
);
321 int imap_newmail(int autoinc
);
322 enum okay
imap_append(const char *xserver
, FILE *fp
);
323 void imap_folders(const char *name
, int strip
);
324 enum okay
imap_copy(struct message
*m
, int n
, const char *name
);
325 enum okay
imap_search1(const char *spec
, int f
);
326 int imap_thisaccount(const char *cp
);
327 enum okay
imap_remove(const char *name
);
328 enum okay
imap_rename(const char *old
, const char *new);
329 enum okay
imap_dequeue(struct mailbox
*mp
, FILE *fp
);
330 int cconnect(void *vp
);
331 int cdisconnect(void *vp
);
332 int ccache(void *vp
);
333 time_t imap_read_date_time(const char *cp
);
334 time_t imap_read_date(const char *cp
);
335 const char *imap_make_date_time(time_t t
);
336 char *imap_quotestr(const char *s
);
337 char *imap_unquotestr(const char *s
);
342 enum okay
imap_search(const char *spec
, int f
);
346 int cungood(void *v
);
347 int cunjunk(void *v
);
348 int cclassify(void *v
);
349 int cprobability(void *v
);
352 int setfile(char *name
, int newmail
);
353 int newmailinfo(int omsgCount
);
355 int execute(char *linebuf
, int contxt
, size_t linesize
);
356 void setmsize(int sz
);
358 void announce(int printheaders
);
359 int newfileinfo(void);
360 int getmdot(int newmail
);
361 int pversion(void *v
);
362 void load(char *name
);
363 void initbox(const char *name
);
366 int getmsglist(char *buf
, int *vector
, int flags
);
367 int getrawlist(const char *line
, size_t linesize
,
368 char **argv
, int argc
, int echolist
);
369 int first(int f
, int m
);
370 void mark(int mesg
, int f
);
373 int zwrite(void *cookie
, const char *wbp
, int num
);
374 int zfree(void *cookie
);
375 int zread(void *cookie
, char *rbp
, int num
);
376 void *zalloc(FILE *fp
);
379 int cdefine(void *v
);
380 int define1(const char *name
, int account
);
383 int callaccount(const char *name
);
384 int callhook(const char *name
, int newmail
);
385 int listaccounts(FILE *fp
);
386 int cdefines(void *v
);
387 void delaccount(const char *name
);
390 int maildir_setfile(const char *name
, int newmail
, int isedit
);
391 void maildir_quit(void);
392 enum okay
maildir_append(const char *name
, FILE *fp
);
393 enum okay
maildir_remove(const char *name
);
396 int main(int argc
, char *argv
[]);
399 char *gettcharset(void);
400 char *need_hdrconv(struct header
*hp
, enum gfield w
);
402 iconv_t
iconv_open_ft(const char *tocode
, const char *fromcode
);
403 size_t iconv_ft(iconv_t cd
, char **inb
, size_t *inbleft
,
404 char **outb
, size_t *outbleft
, int tolerant
);
406 enum mimeenc
mime_getenc(char *h
);
407 int mime_getcontent(char *h
);
408 char *mime_getparam(char *param
, char *h
);
409 char *mime_getboundary(char *h
);
410 char *mime_filecontent(char *name
);
411 int get_mime_convert(FILE *fp
, char **contenttype
, char **charset
,
412 enum mimeclean
*isclean
, int dosign
);
413 void mime_fromhdr(struct str
*in
, struct str
*out
, enum tdflags flags
);
414 char *mime_fromaddr(char *name
);
415 size_t prefixwrite(void *ptr
, size_t size
, size_t nmemb
, FILE *f
,
416 char *prefix
, size_t prefixlen
);
417 size_t mime_write(void *ptr
, size_t size
, FILE *f
,
418 enum conversion convert
, enum tdflags dflags
,
419 char *prefix
, size_t prefixlen
, char **rest
, size_t *restsize
);
422 struct name
*nalloc(char *str
, enum gfield ntype
);
423 struct name
*ndup(struct name
*np
, enum gfield ntype
);
424 struct name
*extract(char *line
, enum gfield ntype
);
425 struct name
*sextract(char *line
, enum gfield ntype
);
426 struct name
*lextract(char *line
, enum gfield ntype
);
427 char *detract(struct name
*np
, enum gfield ntype
);
428 struct name
*checkaddrs(struct name
*np
);
429 struct name
*outof(struct name
*names
, FILE *fo
, struct header
*hp
);
430 struct name
*usermap(struct name
*names
);
431 struct name
*cat(struct name
*n1
, struct name
*n2
);
432 char **unpack(struct name
*np
);
433 struct name
*elide(struct name
*names
);
434 int count(struct name
*np
);
435 struct name
*delete_alternates(struct name
*np
);
436 int is_myname(char *name
);
440 enum okay
ssl_open(const char *server
, struct sock
*sp
, const char *uhp
);
441 void nss_gen_err(const char *fmt
, ...);
446 enum okay
ssl_open(const char *server
, struct sock
*sp
, const char *uhp
);
447 void ssl_gen_err(const char *fmt
, ...);
449 int cverify(void *vp
);
450 FILE *smime_sign(FILE *ip
, struct header
*);
451 FILE *smime_encrypt(FILE *ip
, const char *certfile
, const char *to
);
452 struct message
*smime_decrypt(struct message
*m
, const char *to
,
453 const char *cc
, int signcall
);
454 enum okay
smime_certsave(struct message
*m
, int n
, FILE *op
);
457 enum okay
pop3_noop(void);
458 int pop3_setfile(const char *server
, int newmail
, int isedit
);
459 enum okay
pop3_header(struct message
*m
);
460 enum okay
pop3_body(struct message
*m
);
461 void pop3_quit(void);
464 sighandler_type
safe_signal(int signum
, sighandler_type handler
);
465 FILE *safe_fopen(const char *file
, const char *mode
, int *omode
);
466 FILE *Fopen(const char *file
, const char *mode
);
467 FILE *Fdopen(int fd
, const char *mode
);
468 int Fclose(FILE *fp
);
469 FILE *Zopen(const char *file
, const char *mode
, int *compression
);
470 FILE *Popen(const char *cmd
, const char *mode
, const char *shell
, int newfd1
);
471 int Pclose(FILE *ptr
);
472 void close_all_files(void);
473 int run_command(char *cmd
, sigset_t
*mask
, int infd
, int outfd
,
474 char *a0
, char *a1
, char *a2
);
475 int start_command(const char *cmd
, sigset_t
*mask
, int infd
, int outfd
,
476 const char *a0
, const char *a1
, const char *a2
);
477 void prepare_child(sigset_t
*nset
, int infd
, int outfd
);
478 void sigchild(int signo
);
479 void free_child(int pid
);
480 int wait_child(int pid
);
483 int quitcmd(void *v
);
486 enum okay
makembox(void);
487 int savequitflags(void);
488 void restorequitflags(int);
491 char *foldergets(char **s
, size_t *size
, size_t *count
, size_t *llen
,
494 #define send(a, b, c, d, e, f) xsend(a, b, c, d, e, f)
495 int send(struct message
*mp
, FILE *obuf
, struct ignoretab
*doign
,
496 char *prefix
, enum sendaction action
, off_t
*stats
);
499 char *makeboundary(void);
500 int mail(struct name
*to
, struct name
*cc
, struct name
*bcc
,
501 struct name
*smopts
, char *subject
, struct attachment
*attach
,
502 char *quotefile
, int recipient_record
, int tflag
, int Eflag
);
503 int sendmail(void *v
);
504 int Sendmail(void *v
);
505 enum okay
mail1(struct header
*hp
, int printheaders
, struct message
*quote
,
506 char *quotefile
, int recipient_record
, int doprefix
, int tflag
,
508 int mkdate(FILE *fo
, const char *field
);
509 int puthead(struct header
*hp
, FILE *fo
, enum gfield w
,
510 enum sendaction action
, enum conversion convert
,
511 char *contenttype
, char *charset
);
512 enum okay
resend_msg(struct message
*mp
, struct name
*to
, int add_resent
);
515 char *nodename(int mayoverride
);
516 char *myaddrs(struct header
*hp
);
517 char *myorigin(struct header
*hp
);
518 char *smtp_auth_var(const char *type
, const char *addr
);
519 int smtp_mta(char *server
, struct name
*to
, FILE *fi
, struct header
*hp
,
520 const char *user
, const char *password
, const char *skinned
);
523 void ssl_set_vrfy_level(const char *uhp
);
524 enum okay
ssl_vrfy_decide(void);
525 char *ssl_method_string(const char *uhp
);
526 enum okay
smime_split(FILE *ip
, FILE **hp
, FILE **bp
, long xcount
, int keep
);
527 FILE *smime_sign_assemble(FILE *hp
, FILE *bp
, FILE *sp
);
528 FILE *smime_encrypt_assemble(FILE *hp
, FILE *yp
);
529 struct message
*smime_decrypt_assemble(struct message
*m
, FILE *hp
, FILE *bp
);
530 int ccertsave(void *v
);
531 enum okay
rfc2595_hostname_match(const char *host
, const char *pattern
);
534 void *salloc(size_t size
);
535 void *csalloc(size_t nmemb
, size_t size
);
537 void spreserve(void);
538 char *savestr(const char *str
);
539 char *savestrbuf(const char *sbuf
, size_t sbuf_len
);
540 char *save2str(const char *str
, const char *old
);
541 char *savecat(const char *s1
, const char *s2
);
544 FILE *Ftemp(char **fn
, char *prefix
, char *mode
, int bits
, int register_file
);
545 void Ftfree(char **fn
);
549 int thread(void *vp
);
550 int unthread(void *vp
);
551 struct message
*next_in_thread(struct message
*mp
);
552 struct message
*prev_in_thread(struct message
*mp
);
553 struct message
*this_in_thread(struct message
*mp
, long n
);
555 int ccollapse(void *v
);
556 int cuncollapse(void *v
);
557 void uncollapse1(struct message
*m
, int always
);
560 int grabh(struct header
*hp
, enum gfield gflags
, int subjfirst
);
561 char *readtty(char *prefix
, char *string
);
565 void findmail(char *user
, int force
, char *buf
, int size
);
567 char *username(void);
570 void assign(const char *name
, const char *value
);
571 char *vcopy(const char *str
);
572 char *value(const char *name
);
573 struct grouphead
*findgroup(char *name
);
574 void printgroup(char *name
);
575 int hash(const char *name
);
576 int unset_internal(const char *name
);
577 void remove_group(const char *name
);