1 /* GNU Mailutils -- a suite of utilities for electronic mail
2    Copyright (C) 1999-2021 Free Software Foundation, Inc.
3 
4    GNU Mailutils is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3, or (at your option)
7    any later version.
8 
9    GNU Mailutils is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with GNU Mailutils.  If not, see <http://www.gnu.org/licenses/>. */
16 
17 #ifndef _MAIL_H
18 #define _MAIL_H 1
19 
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23 
24 #ifdef DMALLOC
25 # include <dmalloc.h>
26 #endif
27 
28 #include <errno.h>
29 #include <limits.h>
30 #ifndef _GNU_SOURCE
31 # define _GNU_SOURCE
32 #endif
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <unistd.h>
36 #include <string.h>
37 #ifdef HAVE_STRINGS_H
38 # include <strings.h>
39 #endif
40 #include <sys/wait.h>
41 #include <sys/types.h>
42 #include <stdarg.h>
43 #include <signal.h>
44 
45 #include <confpaths.h>
46 
47 #ifdef HAVE_READLINE_READLINE_H
48 # include <readline/readline.h>
49 # include <readline/history.h>
50 #endif
51 
52 #include <mailutils/address.h>
53 #include <mailutils/alloc.h>
54 #include <mailutils/assoc.h>
55 #include <mailutils/attribute.h>
56 #include <mailutils/body.h>
57 #include <mailutils/debug.h>
58 #include <mailutils/errno.h>
59 #include <mailutils/error.h>
60 #include <mailutils/envelope.h>
61 #include <mailutils/filter.h>
62 #include <mailutils/header.h>
63 #include <mailutils/iterator.h>
64 #include <mailutils/list.h>
65 #include <mailutils/mailbox.h>
66 #include <mailutils/mailer.h>
67 #include <mailutils/message.h>
68 #include <mailutils/util.h>
69 #include <mailutils/datetime.h>
70 #include <mailutils/registrar.h>
71 #include <mailutils/stream.h>
72 #include <mailutils/url.h>
73 #include <mailutils/nls.h>
74 #include <mailutils/tls.h>
75 #include <mailutils/argcv.h>
76 #include <mailutils/wordsplit.h>
77 #include <mailutils/cctype.h>
78 #include <mailutils/cstr.h>
79 #include <mailutils/io.h>
80 #include <mailutils/stdstream.h>
81 #include <mailutils/prog.h>
82 
83 #ifdef __cplusplus
84 extern "C" {
85 #endif
86 
87 /* Type definitions */
88 #ifndef function_t
89 typedef int function_t (int, char **);
90 #endif
91 
92 /* Values for mail_command_entry.flags */
93 #define EF_REG    0x00    /* Regular command */
94 #define EF_FLOW   0x01    /* Flow control command */
95 #define EF_SEND   0x02    /* Send command */
96 #define EF_HIDDEN 0x04    /* Hiddent command */
97 
98 typedef struct compose_env
99 {
100   mu_header_t header;   /* The message headers */
101   mu_stream_t compstr;  /* Temporary compose stream */
102   char **outfiles;      /* Names of the output files. The message is to be
103 		           saved in each of these. */
104   int nfiles;           /* Number of output files */
105   int alt;              /* Use multipart/alternative type */
106   mu_list_t attlist;    /* Attachments */
107   mu_mime_t mime;       /* Associated MIME object */
108 } compose_env_t;
109 
110 #define MAIL_COMMAND_COMMON_MEMBERS \
111   const char *shortname;\
112   const char *longname;\
113   const char *synopsis
114 
115 struct mail_command
116 {
117   MAIL_COMMAND_COMMON_MEMBERS;
118 };
119 
120 struct mail_command_entry
121 {
122   MAIL_COMMAND_COMMON_MEMBERS;
123   int flags;
124   int (*func) (int, char **);
125   char **(*command_completion) (int argc, char **argv, int ws);
126 };
127 
128 struct mail_escape_entry
129 {
130   const char *shortname;
131   const char *longname;
132   const char *synopsis;
133   int (*escfunc) (int, char **, compose_env_t *);
134 };
135 
136 enum mailvar_type
137   {
138     mailvar_type_whatever,
139     mailvar_type_number,
140     mailvar_type_string,
141     mailvar_type_boolean
142   };
143 
144 union mailvar_value
145 {
146   char *string;
147   int number;
148   int bool;
149 };
150 
151 struct mailvar_variable
152 {
153   char *name;
154   enum mailvar_type type;
155   int set;
156   union mailvar_value value;
157 };
158 
159 /* Internal variable names */
160 #define mailvar_name_allnet                     "allnet"
161 #define mailvar_name_append                     "append"
162 #define mailvar_name_appenddeadletter           "appenddeadletter"
163 #define mailvar_name_askbcc                     "askbcc"
164 #define mailvar_name_askcc                      "askcc"
165 #define mailvar_name_ask                        "ask"
166 #define mailvar_name_asksub                     "asksub"
167 #define mailvar_name_autoinc                    "autoinc"
168 #define mailvar_name_autoprint                  "autoprint"
169 #define mailvar_name_bang                       "bang"
170 #define mailvar_name_charset                    "charset"
171 #define mailvar_name_cmd                        "cmd"
172 #define mailvar_name_columns                    "columns"
173 #define mailvar_name_crt                        "crt"
174 #define mailvar_name_datefield                  "datefield"
175 #define mailvar_name_debug                      "debug"
176 #define mailvar_name_decode_fallback            "decode-fallback"
177 #define mailvar_name_dot                        "dot"
178 #define mailvar_name_editheaders                "editheaders"
179 #define mailvar_name_emptystart                 "emptystart"
180 #define mailvar_name_escape                     "escape"
181 #define mailvar_name_flipr                      "flipr"
182 #define mailvar_name_folder                     "folder"
183 #define mailvar_name_fromfield                  "fromfield"
184 #define mailvar_name_fullnames                  "fullnames"
185 #define mailvar_name_gnu_last_command           "gnu-last-command"
186 #define mailvar_name_header                     "header"
187 #define mailvar_name_headline                   "headline"
188 #define mailvar_name_hold                       "hold"
189 #define mailvar_name_ignore                     "ignore"
190 #define mailvar_name_ignoreeof                  "ignoreeof"
191 #define mailvar_name_indentprefix               "indentprefix"
192 #define mailvar_name_inplacealiases             "inplacealiases"
193 #define mailvar_name_keep                       "keep"
194 #define mailvar_name_keepsave                   "keepsave"
195 #define mailvar_name_mailx                      "mailx"
196 #define mailvar_name_metamail                   "metamail"
197 #define mailvar_name_metoo                      "metoo"
198 #define mailvar_name_mimenoask                  "mimenoask"
199 #define mailvar_name_mode                       "mode"
200 #define mailvar_name_nullbody                   "nullbody"
201 #define mailvar_name_nullbodymsg                "nullbodymsg"
202 #define mailvar_name_outfilename                "outfilename"
203 #define mailvar_name_outfolder                  "outfolder"
204 #define mailvar_name_page                       "page"
205 #define mailvar_name_prompt                     "prompt"
206 #define mailvar_name_quit                       "quit"
207 #define mailvar_name_rc                         "rc"
208 #define mailvar_name_readonly                   "readonly"
209 #define mailvar_name_record                     "record"
210 #define mailvar_name_recursivealiases           "recursivealiases"
211 #define mailvar_name_regex                      "regex"
212 #define mailvar_name_replyprefix                "replyprefix"
213 #define mailvar_name_replyregex                 "replyregex"
214 #define mailvar_name_return_address             "return-address"
215 #define mailvar_name_save                       "save"
216 #define mailvar_name_screen                     "screen"
217 #define mailvar_name_sendmail                   "sendmail"
218 #define mailvar_name_sendwait                   "sendwait"
219 #define mailvar_name_sign                       "sign"
220 #define mailvar_name_Sign                       "Sign"
221 #define mailvar_name_showenvelope               "showenvelope"
222 #define mailvar_name_showto                     "showto"
223 #define mailvar_name_toplines                   "toplines"
224 #define mailvar_name_variable_pretty_print      "variable-pretty-print"
225 #define mailvar_name_varpp                      "varpp"
226 #define mailvar_name_variable_strict            "variable-strict"
227 #define mailvar_name_varstrict                  "varstrict"
228 #define mailvar_name_verbose                    "verbose"
229 #define mailvar_name_xmailer                    "xmailer"
230 #define mailvar_name_mime                       "mime"
231 #define mailvar_name_onehop                     "onehop"
232 #define mailvar_name_quiet                      "quiet"
233 #define mailvar_name_PID                        "PID"
234 #define mailvar_name_useragent                  "useragent"
235 
236 typedef struct message_set msgset_t;
237 
238 struct message_set
239 {
240   msgset_t *next;       /* Link to the next message set */
241   mu_coord_t crd;
242 };
243 
244 typedef int (*msg_handler_t) (msgset_t *mp, mu_message_t mesg, void *data);
245 
246 /* Global variables and constants*/
247 extern mu_mailbox_t mbox;
248 extern size_t total;
249 extern int interactive;
250 extern mu_url_t secondary_url;
251 extern const char *program_version;
252 extern char *default_encoding;
253 extern char *default_content_type;
254 extern int skip_empty_attachments;
255 extern int multipart_alternative;
256 
257 /* Functions */
258 int mail_alias (int argc, char **argv);
259 int mail_alt (int argc, char **argv);	/* command alternates */
260 int mail_cd (int argc, char **argv);
261 int mail_copy (int argc, char **argv);
262 int mail_decode (int argc, char **argv);
263 int mail_delete (int argc, char **argv);
264 int mail_discard (int argc, char **argv);
265 int mail_dp (int argc, char **argv);
266 int mail_echo (int argc, char **argv);
267 int mail_edit (int argc, char **argv);
268 int mail_else (int argc, char **argv);
269 int mail_endif (int argc, char **argv);
270 int mail_exit (int argc, char **argv);
271 int mail_file (int argc, char **argv);
272 int mail_folders (int argc, char **argv);
273 int mail_followup (int argc, char **argv);
274 int mail_from (int argc, char **argv);
275 int mail_from0 (msgset_t *mspec, mu_message_t msg, void *data);
276 void mail_compile_headline (char const *str);
277 
278 int mail_headers (int argc, char **argv);
279 int mail_hold (int argc, char **argv);
280 int mail_help (int argc, char **argv);
281 int mail_if (int argc, char **argv);
282 int mail_inc (int argc, char **argv);
283 int mail_list (int argc, char **argv);
284 int mail_send (int argc, char **argv);	/* command mail */
285 int mail_mbox (int argc, char **argv);
286 int mail_next (int argc, char **argv);
287 int mail_nounfold (int argc, char **argv);
288 int mail_variable (int argc, char **argv);
289 int mail_pipe (int argc, char **argv);
290 int mail_previous (int argc, char **argv);
291 int mail_print (int argc, char **argv);
292 int mail_quit (int argc, char **argv);
293 int mail_reply (int argc, char **argv);
294 int mail_retain (int argc, char **argv);
295 int mail_save (int argc, char **argv);
296 int mail_sendheader (int argc, char **argv);
297 int mail_set (int argc, char **argv);
298 int mail_shell (int argc, char **argv);
299 int mail_execute (int shell, char *progname, int argc, char **argv);
300 int mail_size (int argc, char **argv);
301 int mail_source (int argc, char **argv);
302 int mail_summary (int argc, char **argv);
303 int mail_tag (int argc, char **argv);
304 int mail_top (int argc, char **argv);
305 int mail_touch (int argc, char **argv);
306 int mail_unalias (int argc, char **argv);
307 int mail_undelete (int argc, char **argv);
308 int mail_unfold (int argc, char **argv);
309 int mail_unset (int argc, char **argv);
310 int mail_version (int argc, char **argv);
311 int mail_visual (int argc, char **argv);
312 int mail_warranty (int argc, char **argv);
313 int mail_write (int argc, char **argv);
314 int mail_z (int argc, char **argv);
315 int mail_eq (int argc, char **argv);	/* command = */
316 int mail_setenv (int argc, char **argv);
317 int mail_envelope (int argc, char **argv);
318 int print_stream_envelope (mu_stream_t str, msgset_t *mspec, mu_message_t msg,
319 			   char const *pfx);
320 int mail_struct (int argc, char **argv);
321 
322 int if_cond (void);
323 
324 void mail_mainloop (char *(*input) (void *, int), void *closure, int do_history);
325 int mail_copy0 (int argc, char **argv, int mark);
326 int mail_compose_send (compose_env_t *env, int save_to);
327 void free_env_headers (compose_env_t *env);
328 
329 /*extern void print_message (mu_message_t mesg, char *prefix, int all_headers, FILE *file);*/
330 
331 int mail_mbox_commit (void);
332 int mail_is_my_name (const char *name);
333 void mail_set_my_name (char *name);
334 char *mail_whoami (void);
335 int mail_header_is_visible (const char *str);
336 int mail_header_is_unfoldable (const char *str);
337 int mail_mbox_close (void);
338 int mail_expand_name (const char *name, mu_url_t *purl);
339 
340 void send_append_header (char const *text);
341 void send_append_header2 (char const *name, char const *value, int mode);
342 int send_attach_file (int fd,
343 		      const char *filename,
344 		      const char *content_filename,
345 		      const char *content_name,
346 		      const char *content_type, const char *encoding);
347 
348 int escape_check_args (int argc, char **argv, int minargs, int maxargs);
349 
350 int escape_shell (int argc, char **argv, compose_env_t *env);
351 int escape_command (int argc, char **argv, compose_env_t *env);
352 int escape_help (int argc, char **argv, compose_env_t *env);
353 int escape_sign (int argc, char **argv, compose_env_t *env);
354 int escape_bcc (int argc, char **argv, compose_env_t *env);
355 int escape_cc (int argc, char **argv, compose_env_t *env);
356 int escape_deadletter (int argc, char **argv, compose_env_t *env);
357 int escape_editor (int argc, char **argv, compose_env_t *env);
358 int escape_print (int argc, char **argv, compose_env_t *env);
359 int escape_headers (int argc, char **argv, compose_env_t *env);
360 int escape_insert (int argc, char **argv, compose_env_t *env);
361 int escape_quote (int argc, char **argv, compose_env_t *env);
362 int escape_type_input (int argc, char **argv, compose_env_t *env);
363 int escape_read (int argc, char **argv, compose_env_t *env);
364 int escape_subj (int argc, char **argv, compose_env_t *env);
365 int escape_to (int argc, char **argv, compose_env_t *env);
366 int escape_visual (int argc, char **argv, compose_env_t *env);
367 int escape_write (int argc, char **argv, compose_env_t *env);
368 int escape_exit (int argc, char **argv, compose_env_t *env);
369 int escape_pipe (int argc, char **argv, compose_env_t *env);
370 int escape_list_attachments  (int argc, char **argv, compose_env_t *env);
371 int escape_attach (int argc, char **argv, compose_env_t *env);
372 int escape_remove_attachment (int argc, char **argv, compose_env_t *env);
373 int escape_toggle_multipart_type (int argc, char **argv, compose_env_t *env);
374 
375 enum
376   {
377     parse_headers_ok,
378     parse_headers_error,
379     parse_headers_fatal
380   };
381 
382 int parse_headers (mu_stream_t input, compose_env_t *env);
383 
384 /* Cursor */
385 void set_cursor (unsigned value);
386 size_t get_cursor (void);
387 void page_invalidate (int hard);
388 void cond_page_invalidate (size_t value);
389 void page_do (msg_handler_t func, void *data);
390 size_t page_move (off_t offset);
391 int is_current_message (size_t n);
392 
393 /* msgsets */
394 void msgset_free (msgset_t *msg_set);
395 msgset_t *msgset_make_1 (size_t number);
396 msgset_t *msgset_append (msgset_t *one, msgset_t *two);
397 void msgset_remove (msgset_t **pset, size_t n);
398 msgset_t *msgset_range (int low, int high);
399 msgset_t *msgset_expand (msgset_t *set, msgset_t *expand_by);
400 msgset_t *msgset_dup (const msgset_t *set);
401 int msgset_parse (const int argc, char **argv, int flags, msgset_t **mset);
402 int msgset_member (msgset_t *set, size_t n);
403 msgset_t *msgset_negate (msgset_t *set);
404 size_t msgset_count (msgset_t *set);
405 static inline size_t
msgset_length(msgset_t * set)406 msgset_length (msgset_t *set)
407 {
408   return mu_coord_length (set->crd);
409 }
410 static inline size_t
msgset_msgno(msgset_t * set)411 msgset_msgno (msgset_t *set)
412 {
413   return set->crd[1];
414 }
415 static inline char *
msgset_part_str(const msgset_t * set,size_t n)416 msgset_part_str (const msgset_t *set, size_t n)
417 {
418   return mu_coord_part_string (set->crd, n);
419 }
420 static inline char *
msgset_str(const msgset_t * set)421 msgset_str (const msgset_t *set)
422 {
423   return mu_coord_string (set->crd);
424 }
425 
426 /* Constants for naming outgoing mail files */
427 enum
428   {
429     outfilename_local, /* File is named by local part of the recipient email. */
430     outfilename_email, /* File is named by entire email. */
431     outfilename_domain /* File is named by domain part. */
432   };
433 extern int outfilename_mode;
434 
435 #define MDHINT_SELECTED_HEADERS 0x1
436 
437 struct mime_descend_closure
438 {
439   int hints;
440   const msgset_t *msgset;
441   mu_message_t message;
442   const char *type;
443   const char *encoding;
444   const struct mime_descend_closure *parent;
445 };
446 
447 typedef int (*mime_descend_fn) (struct mime_descend_closure *closure,
448 				void *data);
449 
450 int mime_descend (struct mime_descend_closure *closure,
451 		  mime_descend_fn fun, void *data);
452 
453 
454 
455 int util_do_command (const char *cmd, ...) MU_PRINTFLIKE(1,2);
456 
457 int util_foreach_msg (int argc, char **argv, int flags,
458 		      msg_handler_t func, void *data);
459 size_t util_range_msg (size_t low, size_t high, int flags,
460 		       msg_handler_t func, void *data);
461 
462 function_t *util_command_get (const char *cmd);
463 
464 void *util_find_entry (void *table, size_t nmemb, size_t size,
465 		       const char *cmd);
466 int util_help (void *table, size_t nmemb, size_t size, const char *word);
467 int util_command_list (void *table, size_t nmemb, size_t size);
468 
469 const struct mail_command_entry *mail_find_command (const char *cmd);
470 const struct mail_escape_entry *mail_find_escape (const char *cmd);
471 int mail_command_help (const char *command);
472 int mail_escape_help (const char *command);
473 void mail_command_list (void);
474 const struct mail_command *mail_command_name (int i);
475 
476 int util_getcols (void);
477 int util_getlines (void);
478 int util_screen_lines (void);
479 int util_screen_columns (void);
480 int util_get_crt (void);
481 struct mailvar_variable *mailvar_find_variable (const char *var, int create);
482 int mailvar_get (void *ptr, const char *variable,
483 		 enum mailvar_type type, int warn);
484 int mailvar_is_true (char const *name);
485 
486 void mailvar_print (int set);
487 void mailvar_variable_format (mu_stream_t,
488 			      const struct mailvar_variable *,
489 			      const char *defval);
490 
491 #define MOPTF_OVERWRITE 0x001
492 #define MOPTF_QUIET     0x002
493 #define MOPTF_UNSET     0x004
494 int mailvar_set (const char *name, void *value,
495 		 enum mailvar_type type, int flags);
496 int util_isdeleted (size_t msgno);
497 char *util_get_homedir (void);
498 char *util_fullpath (const char *inpath);
499 char *util_folder_path (const char *name);
500 char *util_get_sender (int msgno, int strip);
501 char *util_message_sender (mu_message_t msg, int strip);
502 
503 void util_slist_print (mu_list_t list, int nl);
504 int util_slist_lookup (mu_list_t list, const char *str);
505 void util_slist_add (mu_list_t *list, char *value);
506 void util_slist_remove (mu_list_t *list, char *value);
507 void util_slist_destroy (mu_list_t *list);
508 char *util_slist_to_string (mu_list_t list, const char *delim);
509 void util_strcat (char **dest, const char *str);
510 char *util_outfilename (mu_address_t addr);
511 char *util_outfolder_name (char *str);
512 void util_save_outgoing (mu_message_t msg, char *savefile);
513 int util_error_range (size_t msgno);
514 void util_noapp (void);
515 int util_tempfile (char **namep);
516 void util_msgset_iterate (msgset_t *msgset,
517 			  int (*fun) (mu_message_t, msgset_t *, void *),
518 			  void *closure);
519 void util_get_content_type (mu_header_t hdr, char **value, char **args);
520 void util_get_hdr_value (mu_header_t hdr, const char *name, char **value);
521 int util_merge_addresses (char **addr_str, const char *value);
522 void util_address_expand_aliases (mu_address_t *paddr);
523 int util_header_expand_aliases (mu_header_t *hdr);
524 int util_get_message (mu_mailbox_t mbox, size_t msgno, mu_message_t *msg);
525 int util_get_message_part (mu_mailbox_t mbox, msgset_t *msgset,
526 			   mu_message_t *ret_msg);
527 
528 void util_cache_command (mu_list_t *list, const char *fmt, ...)
529   MU_PRINTFLIKE(2,3);
530 void util_run_cached_commands (mu_list_t *list);
531 const char *util_reply_prefix (void);
532 void util_rfc2047_decode (char **value);
533 char *util_get_charset (void);
534 
535 void util_mark_read (mu_message_t msg);
536 
537 const char *util_url_to_string (mu_url_t url);
538 
539 mu_stream_t open_pager (size_t lines);
540 
541 int print_message_body (mu_message_t msg, mu_stream_t out, size_t *stat);
542 
543 char *sender_string (mu_message_t msg);
544 
545 int is_address_field (const char *name);
546 
547 int ml_got_interrupt (void);
548 void ml_clear_interrupt (void);
549 void ml_readline_init (void);
550 int ml_reread (const char *prompt, char **text);
551 char *ml_readline (const char *prompt);
552 char *ml_readline_with_intr (const char *prompt);
553 
554 char *alias_expand (const char *name);
555 void alias_destroy (const char *name);
556 
557 typedef struct alias_iterator *alias_iterator_t;
558 char *alias_find_first (const char *prefix, alias_iterator_t *itr);
559 const char *alias_iterate_next (alias_iterator_t itr);
560 const char *alias_iterate_first (const char *p, alias_iterator_t *itr);
561 void alias_iterate_end (alias_iterator_t *itr);
562 
563 /* Auxiliary functions for accessing folders */
564 enum
565   {
566     any_folder,
567     local_folder
568   };
569 
570 int util_get_folder (mu_folder_t *pfolder, mu_url_t url, int type);
571 
572 int mail_sender    (int argc, char **argv);
573 int mail_nosender  (int argc, char **argv);
574 mu_address_t get_sender_address (mu_message_t msg);
575 
576 #define COMPOSE_APPEND      0
577 #define COMPOSE_REPLACE     1
578 #define COMPOSE_SINGLE_LINE 2
579 
580 void compose_init (compose_env_t *env);
581 int compose_header_set (compose_env_t *env, const char *name,
582 		        const char *value, int replace);
583 char const *compose_header_get (compose_env_t *env, char *name, char *defval);
584 void compose_destroy (compose_env_t *env);
585 
586 #ifndef HAVE_READLINE_READLINE_H
587 char *readline (char *prompt);
588 #endif
589 
590 /* Flags for util_get_message */
591 #define MSG_ALL       0
592 #define MSG_NODELETED 0x0001
593 #define MSG_SILENT    0x0002
594 #define MSG_COUNT     0x0004
595 
596 /* Message attributes */
597 #define MAIL_ATTRIBUTE_MBOXED   0x0001
598 #define MAIL_ATTRIBUTE_PRESERVED 0x0002
599 #define MAIL_ATTRIBUTE_SAVED    0x0004
600 #define MAIL_ATTRIBUTE_TAGGED   0x0008
601 #define MAIL_ATTRIBUTE_SHOWN    0x0010
602 #define MAIL_ATTRIBUTE_TOUCHED  0x0020
603 
604 void ml_attempted_completion_over (void);
605 void ml_set_completion_append_character (int);
606 
607 /* Flags for per-command completion functions */
608 enum
609   {
610     COMPL_DFL     = 0x0, /* Nothing special */
611     COMPL_WS      = 0x1, /* Cursor pointing to a whitespace character
612 			    at the start of input or past another whitespace */
613     COMPL_LASTARG = 0x2  /* Cursor pointing at or past the last argument */
614   };
615 
616 #ifdef WITH_READLINE
617 char **file_compl (int argc, char **argv, int ws);
618 char **no_compl (int argc, char **argv, int ws);
619 char **msglist_compl (int argc, char **argv, int ws);
620 char **msglist_file_compl (int argc, char **argv, int ws);
621 char **dir_compl (int argc, char **argv, int ws);
622 char **command_compl (int argc, char **argv, int ws);
623 char **alias_compl (int argc, char **argv, int ws);
624 char **mailvar_set_compl (int argc, char **argv, int ws);
625 char **exec_compl (int argc, char **argv, int ws);
626 char **shell_compl (int argc, char **argv, int ws);
627 char *msgtype_generator (const char *text, int state);
628 #else
629 # define file_compl NULL
630 # define no_compl NULL
631 # define msglist_compl NULL
632 # define msglist_file_compl NULL
633 # define dir_compl NULL
634 # define command_compl NULL
635 # define alias_compl NULL
636 # define var_compl NULL
637 # define exec_compl NULL
638 # define shell_compl NULL
639 # define mailvar_set_compl NULL
640 #endif
641 
642 #ifdef __cplusplus
643 }
644 #endif
645 
646 #endif /* _MAIL_H */
647