Commit d56b8243 d56b82437f909ff323d9cd87f2ed9f04322f9966 by Sergey Poznyakoff

Convert to mu_cli: frm, from, messages, mimeview, movemail, readmsg, sieve

* configure.ac (MU_APP_NEW_LIBRARIES): New temp variable.

* include/mailutils/sieve.h (mu_cli_capa_sieve): New extern.
* include/mailutils/tls.h (mu_cli_capa_tls): New extern.

* libmailutils/cli/cli.c: Minor change.
* libmailutils/cli/stdcapa.c: Add "auth" capability.

* libmu_auth/tls.c: provide mu_cli_capa_tls

* dotlock/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* dotlock/dotlock.c

* frm/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* frm/frm.h: Fix includes.
* frm/frm.c: Use mu_cli for optionr&config parsing.
* frm/from.c: Likewise.

* messages/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* messages/messages.c: Use mu_cli for optionr&config parsing.

* mimeview/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* mimeview/mimeview.c: Use mu_cli for optionr&config parsing.

* movemail/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* movemail/movemail.c: Use mu_cli for optionr&config parsing.

* readmsg/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* readmsg/readmsg.c: Use mu_cli for optionr&config parsing.

* sieve/Makefile.am: Link with MU_APP_NEW_LIBRARIES
* sieve/sieve.c: Use mu_cli for optionr&config parsing.
1 parent 260b113a
...@@ -58,6 +58,7 @@ AC_SUBST(MU_SIEVE_MODDIR,'$(libdir)/$(PACKAGE)') ...@@ -58,6 +58,7 @@ AC_SUBST(MU_SIEVE_MODDIR,'$(libdir)/$(PACKAGE)')
58 58
59 AC_SUBST(MU_COMMON_LIBRARIES,'$(LTLIBINTL) $(LTLIBICONV)') 59 AC_SUBST(MU_COMMON_LIBRARIES,'$(LTLIBINTL) $(LTLIBICONV)')
60 AC_SUBST(MU_APP_LIBRARIES,'${top_builddir}/libmu_argp/libmu_argp.la ${top_builddir}/libmu_cfg/libmu_cfg.la ${top_builddir}/lib/libmuaux.la') 60 AC_SUBST(MU_APP_LIBRARIES,'${top_builddir}/libmu_argp/libmu_argp.la ${top_builddir}/libmu_cfg/libmu_cfg.la ${top_builddir}/lib/libmuaux.la')
61 AC_SUBST(MU_APP_NEW_LIBRARIES,'${top_builddir}/lib/libmuaux.la')
61 62
62 # There are two sets of include directories: MU_LIB_COMMON_INCLUDES, used 63 # There are two sets of include directories: MU_LIB_COMMON_INCLUDES, used
63 # by the libraries, and MU_APP_COMMON_INCLUDES, which is used by applications. 64 # by the libraries, and MU_APP_COMMON_INCLUDES, which is used by applications.
......
...@@ -20,7 +20,7 @@ AM_CPPFLAGS = @MU_APP_COMMON_INCLUDES@ ...@@ -20,7 +20,7 @@ AM_CPPFLAGS = @MU_APP_COMMON_INCLUDES@
20 bin_PROGRAMS = dotlock 20 bin_PROGRAMS = dotlock
21 21
22 dotlock_LDADD = \ 22 dotlock_LDADD = \
23 ${MU_APP_LIBRARIES}\ 23 ${MU_APP_NEW_LIBRARIES}\
24 ${MU_LIB_MAILUTILS}\ 24 ${MU_LIB_MAILUTILS}\
25 @MU_COMMON_LIBRARIES@ 25 @MU_COMMON_LIBRARIES@
26 26
......
...@@ -20,49 +20,12 @@ ...@@ -20,49 +20,12 @@
20 #endif 20 #endif
21 21
22 #include <stdlib.h> 22 #include <stdlib.h>
23 #ifdef __EXT_QNX
24 # undef __EXT_QNX
25 #endif
26 #include <unistd.h> 23 #include <unistd.h>
27 24
28 #include <mailutils/errno.h> 25 #include <mailutils/errno.h>
29 #include <mailutils/locker.h> 26 #include <mailutils/locker.h>
30 #include <mailutils/nls.h> 27 #include <mailutils/nls.h>
31 28 #include "mailutils/cli.h"
32 #include "mailutils/libargp.h"
33
34 static char doc[] =
35 N_("GNU dotlock -- lock mail spool files.")
36 "\v"
37 N_("Returns 0 on success, 3 if locking the file fails because\
38 it's already locked, and 1 if some other kind of error occurred.");
39
40 static char args_doc[] = N_("FILE");
41
42 static struct argp_option options[] = {
43 {"unlock", 'u', NULL, 0,
44 N_("unlock"), 0},
45
46 {"force", 'f', N_("MINUTES"), OPTION_ARG_OPTIONAL,
47 N_("forcibly break an existing lock older than a certain time"), 0},
48
49 {"retry", 'r', N_("RETRIES"), OPTION_ARG_OPTIONAL,
50 N_("retry the lock a few times"), 0},
51
52 {"debug", 'd', NULL, 0,
53 N_("print details of failure reasons to stderr"), 0},
54
55 {NULL, 0, NULL, 0, NULL, 0}
56 };
57
58 static error_t parse_opt (int key, char *arg, struct argp_state *state);
59
60 static struct argp argp = {
61 options,
62 parse_opt,
63 args_doc,
64 doc,
65 };
66 29
67 static const char *file; 30 static const char *file;
68 static int unlock; 31 static int unlock;
...@@ -71,55 +34,25 @@ static int retries; ...@@ -71,55 +34,25 @@ static int retries;
71 static time_t force; 34 static time_t force;
72 static int debug; 35 static int debug;
73 36
74 static error_t 37 static struct mu_option dotlock_options[] = {
75 parse_opt (int key, char *arg, struct argp_state *state) 38 { "unlock", 'u', NULL, MU_OPTION_DEFAULT,
76 { 39 N_("unlock"),
77 static mu_list_t lst; 40 mu_c_bool, &unlock },
78 41
79 switch (key) 42 { "force", 'f', N_("MINUTES"), MU_OPTION_ARG_OPTIONAL,
80 { 43 N_("forcibly break an existing lock older than a certain time"),
81 case 'd': 44 mu_c_time, &force },//FIXME: Default value
82 mu_argp_node_list_new (lst, "debug", "yes");
83 break;
84 45
85 case 'u': 46 { "retry", 'r', N_("RETRIES"), MU_OPTION_ARG_OPTIONAL,
86 unlock = 1; 47 N_("retry the lock a few times"),
87 break; 48 mu_c_int, &retries },
88 49
89 case 'r': 50 { "debug", 'd', NULL, MU_OPTION_DEFAULT,
90 if (arg) 51 N_("print details of failure reasons to stderr"),
91 mu_argp_node_list_new (lst, "retry", arg); 52 mu_c_bool, &debug },
92 break;
93
94 case 'f':
95 mu_argp_node_list_new (lst, "force", arg ? arg : "0");
96 break;
97
98 case ARGP_KEY_ARG:
99 if (file)
100 argp_error (state, _("only one FILE can be specified"));
101 file = arg;
102 break;
103
104 case ARGP_KEY_NO_ARGS:
105 if (!mu_help_config_mode)
106 argp_error (state, _("FILE must be specified"));
107 return ARGP_ERR_UNKNOWN;
108
109 case ARGP_KEY_INIT:
110 mu_argp_node_list_init (&lst);
111 break;
112
113 case ARGP_KEY_FINI:
114 mu_argp_node_list_finish (lst, NULL, NULL);
115 break;
116
117 default:
118 return ARGP_ERR_UNKNOWN;
119 }
120 return 0;
121 }
122 53
54 MU_OPTION_END
55 }, *options[] = { dotlock_options, NULL };
123 56
124 struct mu_cfg_param dotlock_cfg_param[] = { 57 struct mu_cfg_param dotlock_cfg_param[] = {
125 { "force", mu_c_time, &force, 0, NULL, 58 { "force", mu_c_time, &force, 0, NULL,
...@@ -131,11 +64,21 @@ struct mu_cfg_param dotlock_cfg_param[] = { ...@@ -131,11 +64,21 @@ struct mu_cfg_param dotlock_cfg_param[] = {
131 { NULL } 64 { NULL }
132 }; 65 };
133 66
67 static struct mu_cli_setup cli = {
68 options,
69 dotlock_cfg_param,
70 N_("GNU dotlock -- lock mail spool files."),
71 //FIXME:
72 /*
73 N_("Returns 0 on success, 3 if locking the file fails because\
74 it's already locked, and 1 if some other kind of error occurred.");
75 */
76 N_("FILE")
77 };
78
134 79
135 80
136 const char *dotlock_capa[] = { 81 char *capa[] = {
137 "mailutils",
138 "common",
139 "debug", 82 "debug",
140 NULL 83 NULL
141 }; 84 };
...@@ -156,12 +99,23 @@ main (int argc, char *argv[]) ...@@ -156,12 +99,23 @@ main (int argc, char *argv[])
156 if (setegid (usergid) < 0) 99 if (setegid (usergid) < 0)
157 return MU_DL_EX_ERROR; 100 return MU_DL_EX_ERROR;
158 101
159 argp_err_exit_status = MU_DL_EX_ERROR; 102 /* FIXME: Force mu_cli to exit with MU_DL_EX_ERROR on errors? */
160 103
161 mu_argp_init (NULL, NULL); 104 mu_cli (argc, argv, &cli, capa, NULL, &argc, &argv);
162 if (mu_app_init (&argp, dotlock_capa, dotlock_cfg_param, 105
163 argc, argv, 0, NULL, NULL)) 106 switch (argc)
164 exit (1); 107 {
108 case 0:
109 mu_error (_("FILE must be specified"));
110 exit (MU_DL_EX_ERROR);
111
112 case 1:
113 file = argv[0];
114 break;
115
116 default:
117 mu_error (_("only one FILE can be specified"));
118 }
165 119
166 if (force) 120 if (force)
167 { 121 {
......
...@@ -27,7 +27,7 @@ frm_LDADD = $(common_ldadd) ...@@ -27,7 +27,7 @@ frm_LDADD = $(common_ldadd)
27 from_LDADD = $(common_ldadd) 27 from_LDADD = $(common_ldadd)
28 28
29 common_ldadd = \ 29 common_ldadd = \
30 ${MU_APP_LIBRARIES}\ 30 ${MU_APP_NEW_LIBRARIES}\
31 ${MU_LIB_MBOX}\ 31 ${MU_LIB_MBOX}\
32 ${MU_LIB_IMAP}\ 32 ${MU_LIB_IMAP}\
33 ${MU_LIB_POP}\ 33 ${MU_LIB_POP}\
......
...@@ -29,8 +29,6 @@ static int align = 0; /* Tidy mode. -t option. */ ...@@ -29,8 +29,6 @@ static int align = 0; /* Tidy mode. -t option. */
29 #define IS_NEW 0x100 29 #define IS_NEW 0x100
30 static int select_attribute; 30 static int select_attribute;
31 31
32 static char doc[] = N_("GNU frm -- display From: lines.");
33
34 static struct attr_tab { 32 static struct attr_tab {
35 char *name; /* Attribute name */ 33 char *name; /* Attribute name */
36 int code; /* Corresponding IS_.* flag */ 34 int code; /* Corresponding IS_.* flag */
...@@ -84,7 +82,7 @@ prepare_attrs (void) ...@@ -84,7 +82,7 @@ prepare_attrs (void)
84 /* Translates the textual status representation to the corresponding 82 /* Translates the textual status representation to the corresponding
85 IS_.* flag */ 83 IS_.* flag */
86 static int 84 static int
87 decode_attr (char *arg) 85 decode_attr (char const *arg)
88 { 86 {
89 struct attr_tab *p; 87 struct attr_tab *p;
90 int len = strlen (arg); 88 int len = strlen (arg);
...@@ -111,105 +109,82 @@ decode_attr (char *arg) ...@@ -111,105 +109,82 @@ decode_attr (char *arg)
111 } 109 }
112 110
113 111
114 112 static void
115 static struct argp_option options[] = { 113 cli_show_field (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
116 {"debug", 'd', NULL, 0, N_("enable debugging output"), 0},
117 {"field", 'f', N_("NAME"), 0, N_("header field to display"), 0},
118 {"to", 'l', NULL, 0, N_("include the To: information"), 0},
119 {"number", 'n', NULL, 0, N_("display message numbers"), 0},
120 {"Quiet", 'Q', NULL, 0, N_("do not display headers"), 0},
121 {"query", 'q', NULL, 0, N_("print a message if the mailbox contains some unread mail"), 0},
122 {"summary",'S', NULL, 0, N_("print a summary of messages"), 0},
123 {"status", 's', N_("STATUS"), 0,
124 /* TRANSLATORS: Please do *not* translate the words "new", "unread",
125 "old" and "read". They are keywords. */
126 N_("select messages with the specific attribute:"
127 " new, unread, old (same as unread) or read (or any unambiguous"
128 " abbreviation of these)"),
129 0},
130 {"align", 't', NULL, 0, N_("tidy mode: align subject lines"), 0},
131 {0, 0, 0, 0}
132 };
133
134 static error_t
135 parse_opt (int key, char *arg, struct argp_state *state)
136 { 114 {
137 switch (key) 115 show_field = mu_strdup (arg);
138 {
139 case 'd':
140 frm_debug++;
141 break;
142
143 case 'f':
144 show_field = arg;
145 align = 0; 116 align = 0;
146 break; 117 }
147
148 case 'l':
149 show_to = 1;
150 break;
151
152 case 'n':
153 show_number = 1;
154 break;
155 118
156 case 'Q': 119 static void
157 /* Very silent. */ 120 cli_Quiet (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
121 {
158 be_quiet += 2; 122 be_quiet += 2;
159 break; 123 }
160 124
161 case 'q': 125 static void
126 cli_query (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
127 {
162 be_quiet++; 128 be_quiet++;
163 show_query = 1; 129 show_query = 1;
164 break; 130 }
165
166 case 'S':
167 show_summary = 1;
168 break;
169 131
170 case 's': 132 static void
133 cli_status (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
134 {
171 select_attribute = decode_attr (arg); 135 select_attribute = decode_attr (arg);
172 break;
173
174 case 't':
175 align = 1;
176 break;
177
178 case ARGP_KEY_FINI:
179 {
180 size_t s;
181 if (align && (s = util_getcols ()))
182 init_output (s);
183 else
184 init_output (0);
185 }
186 break;
187
188 default:
189 return ARGP_ERR_UNKNOWN;
190 }
191 return 0;
192 } 136 }
193 137
194 static struct argp argp = { 138 static struct mu_option frm_options[] = {
139 { "debug", 'd', NULL, MU_OPTION_DEFAULT,
140 N_("enable debugging output"),
141 mu_c_incr, &frm_debug },
142 { "field", 'f', N_("NAME"), MU_OPTION_DEFAULT,
143 N_("header field to display"),
144 mu_c_string, &show_field, cli_show_field },
145 { "to", 'l', NULL, MU_OPTION_DEFAULT,
146 N_("include the To: information"),
147 mu_c_bool, &show_to },
148 { "number", 'n', NULL, MU_OPTION_DEFAULT,
149 N_("display message numbers"),
150 mu_c_bool, &show_number },
151 { "Quiet", 'Q', NULL, MU_OPTION_DEFAULT,
152 N_("do not display headers"),
153 mu_c_int, &be_quiet, cli_Quiet },
154 { "query", 'q', NULL, MU_OPTION_DEFAULT,
155 N_("print a message if the mailbox contains some unread mail"),
156 mu_c_int, &be_quiet, cli_query },
157 { "summary",'S', NULL, MU_OPTION_DEFAULT,
158 N_("print a summary of messages"),
159 mu_c_bool, &show_summary },
160 { "status", 's', N_("STATUS"), 0,
161 /* TRANSLATORS: Please do *not* translate the words "new", "unread",
162 "old" and "read". They are keywords. */
163 N_("select messages with the specific attribute:"
164 " new, unread, old (same as unread) or read (or any unambiguous"
165 " abbreviation of these)"),
166 mu_c_string, NULL, cli_status},
167 { "align", 't', NULL, MU_OPTION_DEFAULT,
168 N_("tidy mode: align subject lines"),
169 mu_c_bool, &align },
170 MU_OPTION_END
171 }, *options[] = { frm_options, NULL };
172
173 static struct mu_cli_setup cli = {
195 options, 174 options,
196 parse_opt,
197 N_("[URL ...]"),
198 doc,
199 NULL, 175 NULL,
200 NULL, NULL 176 N_("GNU frm -- display From: lines."),
177 N_("[URL ...]"),
201 }; 178 };
202 179
203 static const char *frm_argp_capa[] = { 180 static char *frm_argp_capa[] = {
204 "mailutils",
205 "common",
206 "debug", 181 "debug",
207 "mailbox", 182 "mailbox",
208 "locking", 183 "locking",
184 "tls",
209 NULL 185 NULL
210 }; 186 };
211 187
212
213 static struct 188 static struct
214 { 189 {
215 size_t new; 190 size_t new;
...@@ -342,8 +317,8 @@ frm (char *mailbox_name) ...@@ -342,8 +317,8 @@ frm (char *mailbox_name)
342 int 317 int
343 main (int argc, char **argv) 318 main (int argc, char **argv)
344 { 319 {
345 int c;
346 int status = 0; 320 int status = 0;
321 size_t s;
347 322
348 /* Native Language Support */ 323 /* Native Language Support */
349 MU_APP_INIT_NLS (); 324 MU_APP_INIT_NLS ();
...@@ -352,24 +327,29 @@ main (int argc, char **argv) ...@@ -352,24 +327,29 @@ main (int argc, char **argv)
352 327
353 /* register the formats. */ 328 /* register the formats. */
354 mu_register_all_mbox_formats (); 329 mu_register_all_mbox_formats ();
355 #ifdef WITH_TLS
356 mu_gocs_register ("tls", mu_tls_module_init);
357 #endif
358 330
359 mu_argp_init (NULL, NULL); 331 mu_cli_capa_register (&mu_cli_capa_tls);
360 if (mu_app_init (&argp, frm_argp_capa, NULL, argc, argv, 0, &c, NULL)) 332 mu_cli (argc, argv, &cli, frm_argp_capa, NULL, &argc, &argv);
361 exit (1); 333
334 if (align && (s = util_getcols ()))
335 init_output (s);
336 else
337 init_output (0);
362 338
363 /* have an argument */ 339 /* have an argument */
364 if (c == argc) 340 if (argc == 0)
365 status = frm (NULL); 341 status = frm (NULL);
366 else if (c + 1 == argc) 342 else if (argc == 1)
367 status = frm (argv[c]); 343 status = frm (argv[0]);
368 else 344 else
369 for (; c < argc; c++)
370 { 345 {
371 mu_printf ("%s:\n", argv[c]); 346 int i;
372 status = frm (argv[c]); 347
348 for (i = 0; i < argc; i++)
349 {
350 mu_printf ("%s:\n", argv[i]);
351 status = frm (argv[i]);
352 }
373 } 353 }
374 354
375 return status; 355 return status;
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
64 #include <mailutils/util.h> 64 #include <mailutils/util.h>
65 #include <mailutils/mime.h> 65 #include <mailutils/mime.h>
66 66
67 #include "mailutils/libargp.h" 67 #include "mailutils/cli.h"
68 68
69 typedef int (*frm_select_t) (size_t index, mu_message_t msg); 69 typedef int (*frm_select_t) (size_t index, mu_message_t msg);
70 70
......
...@@ -21,58 +21,34 @@ int count_only; ...@@ -21,58 +21,34 @@ int count_only;
21 char *sender_option; 21 char *sender_option;
22 char *mailbox_name; 22 char *mailbox_name;
23 23
24 static char doc[] = N_("GNU from -- display from and subject."); 24 static struct mu_option from_options[] = {
25 25 { "count", 'c', NULL, MU_OPTION_DEFAULT,
26 static struct argp_option options[] = { 26 N_("just print a count of messages and exit"),
27 {"count", 'c', NULL, 0, N_("just print a count of messages and exit")}, 27 mu_c_bool, &count_only },
28 {"sender", 's', N_("ADDRESS"), 0, 28 { "sender", 's', N_("ADDRESS"), MU_OPTION_DEFAULT,
29 N_("print only mail from addresses containing the supplied string") }, 29 N_("print only mail from addresses containing the supplied string"),
30 {"file", 'f', N_("FILE"), 0, 30 mu_c_string, &sender_option },
31 N_("read mail from FILE") }, 31 { "file", 'f', N_("FILE"), MU_OPTION_DEFAULT,
32 {"debug", 'd', NULL, 0, N_("enable debugging output"), 0}, 32 N_("read mail from FILE"),
33 {0, 0, 0, 0} 33 mu_c_string, &mailbox_name },
34 }; 34 { "debug", 'd', NULL, MU_OPTION_DEFAULT,
35 35 N_("enable debugging output"),
36 static error_t 36 mu_c_incr, &frm_debug },
37 parse_opt (int key, char *arg, struct argp_state *state) 37 MU_OPTION_END
38 { 38 }, *options[] = { from_options, NULL };
39 switch (key) 39
40 { 40 static struct mu_cli_setup cli = {
41 case 'c':
42 count_only = 1;
43 break;
44
45 case 's':
46 sender_option = arg;
47 break;
48
49 case 'f':
50 mailbox_name = arg;
51 break;
52
53 case 'd':
54 frm_debug++;
55 break;
56
57 default:
58 return ARGP_ERR_UNKNOWN;
59 }
60 return 0;
61 }
62
63 static struct argp argp = {
64 options, 41 options,
65 parse_opt, 42 NULL,
43 N_("GNU from -- display from and subject."),
66 N_("[OPTIONS] [USER]"), 44 N_("[OPTIONS] [USER]"),
67 doc,
68 }; 45 };
69 46
70 static const char *capa[] = { 47 static char *capa[] = {
71 "mailutils",
72 "common",
73 "debug", 48 "debug",
74 "mailbox", 49 "mailbox",
75 "locking", 50 "locking",
51 "tls",
76 NULL 52 NULL
77 }; 53 };
78 54
...@@ -105,7 +81,6 @@ from_select (size_t index, mu_message_t msg) ...@@ -105,7 +81,6 @@ from_select (size_t index, mu_message_t msg)
105 int 81 int
106 main (int argc, char **argv) 82 main (int argc, char **argv)
107 { 83 {
108 int c;
109 size_t total; 84 size_t total;
110 85
111 /* Native Language Support */ 86 /* Native Language Support */
...@@ -113,20 +88,16 @@ main (int argc, char **argv) ...@@ -113,20 +88,16 @@ main (int argc, char **argv)
113 88
114 /* register the formats. */ 89 /* register the formats. */
115 mu_register_all_mbox_formats (); 90 mu_register_all_mbox_formats ();
116 #ifdef WITH_TLS
117 mu_gocs_register ("tls", mu_tls_module_init);
118 #endif
119 91
120 mu_argp_init (NULL, NULL); 92 mu_cli_capa_register (&mu_cli_capa_tls);
121 if (mu_app_init (&argp, capa, NULL, argc, argv, 0, &c, NULL)) 93 mu_cli (argc, argv, &cli, capa, NULL, &argc, &argv);
122 exit (1);
123 94
124 if (argc - c > 1) 95 if (argc > 1)
125 { 96 {
126 mu_error (_("too many arguments")); 97 mu_error (_("too many arguments"));
127 exit (1); 98 exit (1);
128 } 99 }
129 else if (argc - c > 0) 100 else if (argc > 0)
130 { 101 {
131 if (mailbox_name) 102 if (mailbox_name)
132 { 103 {
...@@ -134,9 +105,9 @@ main (int argc, char **argv) ...@@ -134,9 +105,9 @@ main (int argc, char **argv)
134 exit (1); 105 exit (1);
135 } 106 }
136 107
137 mailbox_name = mu_alloc (strlen (argv[c]) + 2); 108 mailbox_name = mu_alloc (strlen (argv[0]) + 2);
138 mailbox_name[0] = '%'; 109 mailbox_name[0] = '%';
139 strcpy (mailbox_name + 1, argv[c]); 110 strcpy (mailbox_name + 1, argv[0]);
140 } 111 }
141 112
142 init_output (0); 113 init_output (0);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
22 #include <sys/types.h> 22 #include <sys/types.h>
23 #include <stdarg.h> 23 #include <stdarg.h>
24 #include <mailutils/mailutils.h> 24 #include <mailutils/mailutils.h>
25 #include <mailutils/cli.h>
25 26
26 #ifdef __cplusplus 27 #ifdef __cplusplus
27 extern "C" { 28 extern "C" {
...@@ -282,6 +283,8 @@ struct mu_gocs_sieve ...@@ -282,6 +283,8 @@ struct mu_gocs_sieve
282 283
283 int mu_sieve_module_init (enum mu_gocs_op, void *); 284 int mu_sieve_module_init (enum mu_gocs_op, void *);
284 285
286 extern struct mu_cli_capa mu_cli_capa_sieve;
287
285 #ifdef __cplusplus 288 #ifdef __cplusplus
286 } 289 }
287 #endif 290 #endif
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
20 #define _MAILUTILS_TLS_H 20 #define _MAILUTILS_TLS_H
21 21
22 #include <mailutils/types.h> 22 #include <mailutils/types.h>
23 #include <mailutils/cli.h>
23 24
24 #ifdef __cplusplus 25 #ifdef __cplusplus
25 extern "C" { 26 extern "C" {
...@@ -56,6 +57,8 @@ extern void mu_deinit_tls_libs (void); ...@@ -56,6 +57,8 @@ extern void mu_deinit_tls_libs (void);
56 57
57 extern int mu_tls_enable; 58 extern int mu_tls_enable;
58 59
60 extern struct mu_cli_capa mu_cli_capa_tls;
61
59 #ifdef __cplusplus 62 #ifdef __cplusplus
60 } 63 }
61 #endif 64 #endif
......
...@@ -384,7 +384,7 @@ mu_cli (int argc, char **argv, struct mu_cli_setup *setup, char **capa, ...@@ -384,7 +384,7 @@ mu_cli (int argc, char **argv, struct mu_cli_setup *setup, char **capa,
384 optv = init_options (capa, setup, &com_list); 384 optv = init_options (capa, setup, &com_list);
385 385
386 if (mu_parseopt (&po, argc, argv, optv, flags)) 386 if (mu_parseopt (&po, argc, argv, optv, flags))
387 exit (EX_USAGE); 387 exit (po.po_exit_error);
388 388
389 argc -= po.po_arg_start; 389 argc -= po.po_arg_start;
390 argv += po.po_arg_start; 390 argv += po.po_arg_start;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
28 #include <mailutils/mailbox.h> 28 #include <mailutils/mailbox.h>
29 #include <mailutils/registrar.h> 29 #include <mailutils/registrar.h>
30 #include <mailutils/locker.h> 30 #include <mailutils/locker.h>
31 #include <mailutils/mu_auth.h>
31 32
32 /* ************************************************************************* 33 /* *************************************************************************
33 * Logging section 34 * Logging section
...@@ -441,6 +442,105 @@ static struct mu_cfg_param address_cfg[] = { ...@@ -441,6 +442,105 @@ static struct mu_cfg_param address_cfg[] = {
441 { NULL } 442 { NULL }
442 }; 443 };
443 444
445 /* ************************************************************************* *
446 * Authentication & Authorization *
447 * ************************************************************************* */
448 static int
449 cb_authentication (void *data, mu_config_value_t *val)
450 {
451 if (val->type == MU_CFG_STRING)
452 {
453 if (strcmp (val->v.string, "clear") == 0)
454 mu_authentication_clear_list ();
455 else
456 /*FIXME: use err for error reporting*/
457 mu_authentication_add_module_list (val->v.string);
458 }
459 else if (val->type == MU_CFG_LIST)
460 {
461 int i;
462 for (i = 0; i < val->v.arg.c; i++)
463 {
464 if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING))
465 return 1;
466 if (strcmp (val->v.arg.v[i].v.string, "clear") == 0)
467 mu_authentication_clear_list ();
468 else
469 mu_authentication_add_module (val->v.arg.v[i].v.string);
470 }
471 }
472 else
473 {
474 mu_error (_("expected string value"));
475 return 1;
476 }
477 return 0;
478 }
479
480 static int
481 cb_authorization (void *data, mu_config_value_t *val)
482 {
483 if (val->type == MU_CFG_STRING)
484 {
485 if (strcmp (val->v.string, "clear") == 0)
486 mu_authorization_clear_list ();
487 else
488 /*FIXME: use err for error reporting*/
489 mu_authorization_add_module_list (val->v.string);
490 }
491 else if (val->type == MU_CFG_LIST)
492 {
493 int i;
494 for (i = 0; i < val->v.arg.c; i++)
495 {
496 if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING))
497 return 1;
498 if (strcmp (val->v.arg.v[i].v.string, "clear") == 0)
499 mu_authorization_clear_list ();
500 else
501 mu_authorization_add_module (val->v.arg.v[i].v.string);
502 }
503 }
504 else
505 {
506 mu_error (_("expected string value"));
507 return 1;
508 }
509 return 0;
510 }
511
512 static struct mu_cfg_param mu_auth_param[] = {
513 { "authentication", mu_cfg_callback, NULL, 0, cb_authentication,
514 /* FIXME: The description is incomplete. MU-list is also allowed as
515 argument */
516 N_("Set a list of modules for authentication. Modlist is a "
517 "colon-separated list of module names or a word `clear' to "
518 "clear the previously set up values."),
519 N_("modlist") },
520 { "authorization", mu_cfg_callback, NULL, 0, cb_authorization,
521 N_("Set a list of modules for authorization. Modlist is a "
522 "colon-separated list of module names or a word `clear' to "
523 "clear the previously set up values."),
524 N_("modlist") },
525 { NULL }
526 };
527
528 int
529 mu_auth_section_parser
530 (enum mu_cfg_section_stage stage, const mu_cfg_node_t *node,
531 const char *section_label, void **section_data, void *call_data,
532 mu_cfg_tree_t *tree)
533 {
534 switch (stage)
535 {
536 case mu_cfg_section_start:
537 break;
538
539 case mu_cfg_section_end:
540 mu_auth_finish_setup ();
541 }
542 return 0;
543 }
444 544
445 /* ************************************************************************* * 545 /* ************************************************************************* *
446 * Registry of standard mailutils' capabilities * 546 * Registry of standard mailutils' capabilities *
...@@ -453,6 +553,8 @@ struct mu_cli_capa mu_cli_std_capa[] = { ...@@ -453,6 +553,8 @@ struct mu_cli_capa mu_cli_std_capa[] = {
453 { "mailbox", NULL, mailbox_cfg, NULL, NULL }, 553 { "mailbox", NULL, mailbox_cfg, NULL, NULL },
454 { "locking", NULL, locking_cfg, NULL, NULL }, 554 { "locking", NULL, locking_cfg, NULL, NULL },
455 { "address", NULL, address_cfg, NULL, NULL }, 555 { "address", NULL, address_cfg, NULL, NULL },
556 { "auth", NULL, mu_auth_param, mu_auth_section_parser },
557
456 { NULL } 558 { NULL }
457 }; 559 };
458 560
......
...@@ -35,15 +35,36 @@ ...@@ -35,15 +35,36 @@
35 #include <mailutils/errno.h> 35 #include <mailutils/errno.h>
36 #include <mailutils/util.h> 36 #include <mailutils/util.h>
37 #include <mailutils/property.h> 37 #include <mailutils/property.h>
38 #include <mailutils/cli.h>
39
40 #define SSL_CERT_FILE_CHECKS (MU_FILE_SAFETY_GROUP_WRITABLE | \
41 MU_FILE_SAFETY_GROUP_WRITABLE | \
42 MU_FILE_SAFETY_LINKED_WRDIR)
43
44 #define SSL_KEY_FILE_CHECKS (MU_FILE_SAFETY_ALL & \
45 ~MU_FILE_SAFETY_OWNER_MISMATCH)
46
47 #define SSL_CA_FILE_CHECKS (MU_FILE_SAFETY_GROUP_WRITABLE | \
48 MU_FILE_SAFETY_GROUP_WRITABLE | \
49 MU_FILE_SAFETY_LINKED_WRDIR)
38 50
39 struct mu_tls_module_config mu_tls_module_config = { 51 struct mu_tls_module_config mu_tls_module_config = {
40 #ifdef WITH_TLS 52 #ifdef WITH_TLS
41 1 /* enable by default */ 53 1, /* enable by default */
54
55 NULL, /* Certificate file */
56 SSL_CERT_FILE_CHECKS,
57
58 NULL, /* Key file */
59 SSL_KEY_FILE_CHECKS, /* Stringent safety checks for keys */
60
61 NULL, /* CA file */
62 SSL_CA_FILE_CHECKS
42 #else 63 #else
43 0 64 0
44 #endif 65 #endif
45 }; 66 };
46 67 //FIXME: REMOVE
47 int 68 int
48 mu_tls_module_init (enum mu_gocs_op op, void *data) 69 mu_tls_module_init (enum mu_gocs_op op, void *data)
49 { 70 {
...@@ -775,7 +796,91 @@ mu_tls_client_stream_create (mu_stream_t *pstream, ...@@ -775,7 +796,91 @@ mu_tls_client_stream_create (mu_stream_t *pstream,
775 strin, strout, flags); 796 strin, strout, flags);
776 } 797 }
777 798
799 static int
800 cb2_safety_checks (const char *name, void *data)
801 {
802 int defval;
778 803
804 if (data == &mu_tls_module_config.ssl_key_safety_checks)
805 defval = SSL_KEY_FILE_CHECKS;
806 else if (data == &mu_tls_module_config.ssl_cert_safety_checks)
807 defval = SSL_CERT_FILE_CHECKS;
808 else if (data == &mu_tls_module_config.ssl_cafile_safety_checks)
809 defval = SSL_CA_FILE_CHECKS;
810 else
811 {
812 mu_error (_("INTERNAL ERROR at %s:%d: unknown default value?"),
813 __FILE__, __LINE__);
814 defval = MU_FILE_SAFETY_ALL;
815 }
816 if (mu_file_safety_compose (data, name, defval))
817 mu_error (_("unknown keyword: %s"), name);
818 return 0;
819 }
820
821 static int
822 cb_safety_checks (void *data, mu_config_value_t *arg)
823 {
824 return mu_cfg_string_value_cb (arg, cb2_safety_checks, data);
825 }
826
827 static struct mu_cfg_param mu_tls_param[] = {
828 { "enable", mu_c_bool, &mu_tls_module_config.enable, 0, NULL,
829 N_("Enable TLS encryption.") },
830 { "ssl-cert", mu_c_string, &mu_tls_module_config.ssl_cert, 0, NULL,
831 N_("Specify SSL certificate file."),
832 N_("file") },
833 { "ssl-key", mu_c_string, &mu_tls_module_config.ssl_key, 0, NULL,
834 N_("Specify SSL certificate key file."),
835 N_("file") },
836 { "ssl-cafile", mu_c_string, &mu_tls_module_config.ssl_cafile, 0, NULL,
837 N_("Specify trusted CAs file."),
838 N_("file") },
839 { "ssl-priorities", mu_c_string, &mu_tls_module_config.priorities, 0, NULL,
840 N_("Set the priorities to use on the ciphers, key exchange methods, "
841 "macs and compression methods."),
842 NULL },
843 { "key-file-safety-checks", mu_cfg_callback,
844 &mu_tls_module_config.ssl_key_safety_checks, 0,
845 cb_safety_checks,
846 N_("Configure safety checks for SSL key file. Argument is a list or "
847 "sequence of check names optionally prefixed with '+' to enable or "
848 "'-' to disable the corresponding check. Valid check names are:\n"
849 "\n"
850 " none disable all checks\n"
851 " all enable all checks\n"
852 " gwrfil forbid group writable files\n"
853 " awrfil forbid world writable files\n"
854 " grdfil forbid group readable files\n"
855 " ardfil forbid world writable files\n"
856 " linkwrdir forbid symbolic links in group or world writable directories\n"
857 " gwrdir forbid files in group writable directories\n"
858 " awrdir forbid files in world writable directories\n"),
859 N_("arg: list") },
860 { "cert-file-safety-checks", mu_cfg_callback,
861 &mu_tls_module_config.ssl_cert_safety_checks, 0,
862 cb_safety_checks,
863 N_("Configure safety checks for SSL certificate. See above for a description of <arg>."),
864 N_("arg: list") },
865 { "ca-file-safety-checks", mu_cfg_callback,
866 &mu_tls_module_config.ssl_cafile_safety_checks, 0,
867 cb_safety_checks,
868 N_("Configure safety checks for SSL certificate authority file. See above for a description of <arg>."),
869 N_("arg: list") },
870 { NULL }
871 };
872
873 struct mu_cli_capa mu_cli_capa_tls = {
874 "tls",
875 NULL,
876 mu_tls_param,
877 NULL, NULL
878 };
879 #else
880 struct mu_cli_capa mu_cli_capa_tls = {
881 "tls",
882 NULL
883 };
779 #endif /* WITH_TLS */ 884 #endif /* WITH_TLS */
780 885
781 /* EOF */ 886 /* EOF */
......
...@@ -22,7 +22,7 @@ SUBDIRS = . tests ...@@ -22,7 +22,7 @@ SUBDIRS = . tests
22 bin_PROGRAMS = messages 22 bin_PROGRAMS = messages
23 messages_SOURCES = messages.c 23 messages_SOURCES = messages.c
24 messages_LDADD =\ 24 messages_LDADD =\
25 ${MU_APP_LIBRARIES}\ 25 ${MU_APP_NEW_LIBRARIES}\
26 ${MU_LIB_MBOX}\ 26 ${MU_LIB_MBOX}\
27 ${MU_LIB_IMAP}\ 27 ${MU_LIB_IMAP}\
28 ${MU_LIB_POP}\ 28 ${MU_LIB_POP}\
......
...@@ -20,85 +20,44 @@ ...@@ -20,85 +20,44 @@
20 #endif 20 #endif
21 21
22 #include <stdio.h> 22 #include <stdio.h>
23 #ifdef HAVE_MALLOC_H
24 # include <malloc.h>
25 #endif
26 23
27 #include <mailutils/mailutils.h> 24 #include <mailutils/mailutils.h>
28 #include "mailutils/libargp.h" 25 #include <mailutils/cli.h>
29 26
30 static int messages_count (const char *); 27 static int messages_count (const char *);
31 28
32 static char doc[] = N_("GNU messages -- count the number of messages in a mailbox"); 29 /* are we loud or quiet? */
33 static char args_doc[] = N_("[mailbox...]"); 30 static int silent = 0;
34 31
35 static struct argp_option options[] = { 32 static struct mu_option messages_options[] = {
36 { NULL, 0, NULL, 0, 33 { "quiet", 'q', NULL, MU_OPTION_DEFAULT,
37 /* TRANSLATORS: 'messages' is a program name. Do not translate it! */ 34 N_("only display number of messages"),
38 N_("messages specific switches:"), 0}, 35 mu_c_bool, &silent },
39 {"quiet", 'q', NULL, 0, N_("only display number of messages")}, 36 {"silent", 's', NULL, MU_OPTION_ALIAS },
40 {"silent", 's', NULL, OPTION_ALIAS, NULL }, 37 MU_OPTION_END
41 { 0 }
42 }; 38 };
43 39
44 static const char *argp_capa[] = { 40 static char *capa[] = {
45 "mailutils",
46 "common",
47 "debug", 41 "debug",
48 "mailbox", 42 "mailbox",
49 "locking", 43 "locking",
44 "tls",
50 NULL 45 NULL
51 }; 46 };
52 47
53 struct arguments 48 static struct mu_option *options[] = { messages_options, NULL };
54 {
55 int argc;
56 char **argv;
57 };
58
59 /* are we loud or quiet? */
60 static int silent = 0;
61 49
62 static error_t 50 struct mu_cli_setup cli = {
63 parse_opt (int key, char *arg, struct argp_state *state)
64 {
65 struct arguments *args = state->input;
66 switch (key)
67 {
68 case 'q':
69 case 's':
70 silent = 1;
71 break;
72
73 case ARGP_KEY_ARG:
74 args->argv = realloc (args->argv,
75 sizeof (char *) * (state->arg_num + 2));
76 args->argv[state->arg_num] = arg;
77 args->argv[state->arg_num + 1] = NULL;
78 args->argc++;
79 break;
80
81 default:
82 return ARGP_ERR_UNKNOWN;
83 }
84 return 0;
85 }
86
87 static struct argp argp = {
88 options, 51 options,
89 parse_opt,
90 args_doc,
91 doc,
92 NULL, 52 NULL,
93 NULL, NULL 53 N_("GNU messages -- count the number of messages in a mailbox"),
54 N_("[mailbox...]")
94 }; 55 };
95 56
96 int 57 int
97 main (int argc, char **argv) 58 main (int argc, char **argv)
98 { 59 {
99 int i = 1;
100 int err = 0; 60 int err = 0;
101 struct arguments args = {0, NULL};
102 61
103 /* Native Language Support */ 62 /* Native Language Support */
104 MU_APP_INIT_NLS (); 63 MU_APP_INIT_NLS ();
...@@ -106,20 +65,18 @@ main (int argc, char **argv) ...@@ -106,20 +65,18 @@ main (int argc, char **argv)
106 /* register the formats. */ 65 /* register the formats. */
107 mu_register_all_mbox_formats (); 66 mu_register_all_mbox_formats ();
108 67
109 #ifdef WITH_TLS 68 mu_cli_capa_register (&mu_cli_capa_tls);
110 mu_gocs_register ("tls", mu_tls_module_init); 69 mu_cli (argc, argv, &cli, capa, NULL, &argc, &argv);
111 #endif
112 mu_argp_init (NULL, NULL);
113 if (mu_app_init (&argp, argp_capa, NULL, argc, argv, 0, NULL, &args))
114 exit (1);
115 70
116 if (args.argc < 1 && messages_count (NULL) < 0) 71 if (argc == 0 && messages_count (NULL) < 0)
117 err = 1; 72 err = 1;
118 else if (args.argc >= 1) 73 else if (argc >= 1)
119 { 74 {
120 for (i = 0; i < args.argc; i++) 75 size_t i;
76
77 for (i = 0; i < argc; i++)
121 { 78 {
122 if (messages_count (args.argv[i]) < 0) 79 if (messages_count (argv[i]) < 0)
123 err = 1; 80 err = 1;
124 } 81 }
125 } 82 }
......
...@@ -47,7 +47,7 @@ mimetypes-lex.c: $(srcdir)/mimetypes.l mimetypes-decl.h ...@@ -47,7 +47,7 @@ mimetypes-lex.c: $(srcdir)/mimetypes.l mimetypes-decl.h
47 BUILT_SOURCES = mimetypes-gram.c mimetypes-lex.c mimetypes-decl.h 47 BUILT_SOURCES = mimetypes-gram.c mimetypes-lex.c mimetypes-decl.h
48 48
49 mimeview_LDADD = \ 49 mimeview_LDADD = \
50 ${MU_APP_LIBRARIES}\ 50 ${MU_APP_NEW_LIBRARIES}\
51 ${MU_LIB_MAILUTILS}\ 51 ${MU_LIB_MAILUTILS}\
52 @LTLIBINTL@ 52 @LTLIBINTL@
53 53
......
...@@ -26,38 +26,11 @@ ...@@ -26,38 +26,11 @@
26 #include <unistd.h> 26 #include <unistd.h>
27 #include <fcntl.h> 27 #include <fcntl.h>
28 28
29 #include "mailutils/libargp.h" 29 #include "mailutils/cli.h"
30 #include "mailutils/argcv.h" 30 #include "mailutils/argcv.h"
31 31
32 #include "mailcap.h" 32 #include "mailcap.h"
33 33
34 static char doc[] = N_("GNU mimeview -- display files, using mailcap mechanism.")
35 "\v"
36 N_("Default mime.types file is ") DEFAULT_CUPS_CONFDIR "/mime.types"
37 N_("\n\nDebug flags are:\n\
38 g - Mime.types parser traces\n\
39 l - Mime.types lexical analyzer traces\n\
40 0-9 - Set debugging level\n");
41
42 #define OPT_METAMAIL 256
43
44 static struct argp_option options[] = {
45 {"no-ask", 'a', N_("TYPE-LIST"), OPTION_ARG_OPTIONAL,
46 N_("do not ask for confirmation before displaying files, or, if TYPE-LIST is given, do not ask for confirmation before displaying such files whose MIME type matches one of the patterns from TYPE-LIST"), 0},
47 {"no-interactive", 'h', NULL, 0,
48 N_("disable interactive mode"), 0 },
49 {"print", 0, NULL, OPTION_ALIAS, NULL, 0 },
50 {"debug", 'd', N_("FLAGS"), OPTION_ARG_OPTIONAL,
51 N_("enable debugging output"), 0},
52 {"mimetypes", 't', N_("FILE"), 0,
53 N_("use this mime.types file"), 0},
54 {"dry-run", 'n', NULL, 0,
55 N_("do nothing, just print what would have been done"), 0},
56 {"metamail", OPT_METAMAIL, N_("FILE"), OPTION_ARG_OPTIONAL,
57 N_("use metamail to display files"), 0},
58 {0, 0, 0, 0}
59 };
60
61 int debug_level; /* Debugging level set by --debug option */ 34 int debug_level; /* Debugging level set by --debug option */
62 static int dry_run; /* Dry run mode */ 35 static int dry_run; /* Dry run mode */
63 static char *metamail; /* Name of metamail program, if requested */ 36 static char *metamail; /* Name of metamail program, if requested */
...@@ -89,67 +62,61 @@ set_debug_flags (const char *arg) ...@@ -89,67 +62,61 @@ set_debug_flags (const char *arg)
89 } 62 }
90 } 63 }
91 64
92 static error_t 65 static void
93 parse_opt (int key, char *arg, struct argp_state *state) 66 cli_no_ask (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
94 { 67 {
95 static mu_list_t lst; 68 no_ask_types = mu_strdup (arg ? arg : "*");
96
97 switch (key)
98 {
99 case ARGP_KEY_INIT:
100 mimetypes_lex_debug (0);
101 mimetypes_gram_debug (0);
102 if (interactive == -1)
103 interactive = isatty (fileno (stdin));
104 mu_argp_node_list_init (&lst);
105 break;
106
107 case ARGP_KEY_FINI:
108 if (dry_run && !debug_level)
109 debug_level = 1;
110 mu_argp_node_list_finish (lst, NULL, NULL);
111 break;
112
113 case 'a':
114 no_ask_types = arg ? arg : "*";
115 setenv ("MM_NOASK", arg, 1); /* In case we are given --metamail option */ 69 setenv ("MM_NOASK", arg, 1); /* In case we are given --metamail option */
116 break; 70 }
117
118 case 'd':
119 mu_argp_node_list_new (lst, "debug", arg ? arg : "9");
120 break;
121 71
122 case 'h': 72 static void
73 cli_no_interactive (struct mu_parseopt *po, struct mu_option *opt,
74 char const *arg)
75 {
123 interactive = 0; 76 interactive = 0;
124 break; 77 }
125
126 case 'n':
127 dry_run = 1;
128 break;
129
130 case 't':
131 mu_argp_node_list_new (lst, "mimetypes", arg);
132 break;
133
134 case OPT_METAMAIL:
135 mu_argp_node_list_new (lst, "metamail", arg ? arg : "metamail");
136 break;
137 78
138 default: 79 static void
139 return ARGP_ERR_UNKNOWN; 80 cli_debug (struct mu_parseopt *po, struct mu_option *opt,
140 } 81 char const *arg)
141 return 0; 82 {
83 set_debug_flags (arg);
142 } 84 }
143 85
144 static struct argp argp = { 86 static void
145 options, 87 cli_metamail (struct mu_parseopt *po, struct mu_option *opt,
146 parse_opt, 88 char const *arg)
147 N_("FILE [FILE ...]"), 89 {
148 doc, 90 if (!arg)
149 NULL, 91 arg = "metamail";
150 NULL, NULL 92 metamail = mu_strdup (arg);
151 }; 93 }
152 94
95 static struct mu_option mimeview_options[] = {
96 { "no-ask", 'a', N_("TYPE-LIST"), MU_OPTION_ARG_OPTIONAL,
97 N_("do not ask for confirmation before displaying files, or, if TYPE-LIST is given, do not ask for confirmation before displaying such files whose MIME type matches one of the patterns from TYPE-LIST"),
98 mu_c_string, NULL, cli_no_ask },
99 { "no-interactive", 'h', NULL, MU_OPTION_DEFAULT,
100 N_("disable interactive mode"),
101 mu_c_string, NULL, cli_no_interactive },
102 { "print", 0, NULL, MU_OPTION_ALIAS },
103 { "debug", 'd', N_("FLAGS"), MU_OPTION_ARG_OPTIONAL,
104 N_("enable debugging output"),
105 mu_c_string, NULL, cli_debug },
106 { "mimetypes", 't', N_("FILE"), MU_OPTION_DEFAULT,
107 N_("use this mime.types file"),
108 mu_c_string, &mimetypes_config },
109
110 { "dry-run", 'n', NULL, MU_OPTION_DEFAULT,
111 N_("do nothing, just print what would have been done"),
112 mu_c_bool, &dry_run },
113
114 { "metamail", 0, N_("FILE"), MU_OPTION_ARG_OPTIONAL,
115 N_("use metamail to display files"),
116 mu_c_string, NULL, cli_metamail },
117
118 MU_OPTION_END
119 }, *options[] = { mimeview_options, NULL };
153 120
154 static int 121 static int
155 cb_debug (void *data, mu_config_value_t *val) 122 cb_debug (void *data, mu_config_value_t *val)
...@@ -173,11 +140,22 @@ struct mu_cfg_param mimeview_cfg_param[] = { ...@@ -173,11 +140,22 @@ struct mu_cfg_param mimeview_cfg_param[] = {
173 { NULL } 140 { NULL }
174 }; 141 };
175 142
143 struct mu_cli_setup cli = {
144 options,
145 mimeview_cfg_param,
146 N_("GNU mimeview -- display files, using mailcap mechanism."),
147 //FIXME:
148 /*
149 N_("Default mime.types file is ") DEFAULT_CUPS_CONFDIR "/mime.types"
150 N_("\n\nDebug flags are:\n\
151 g - Mime.types parser traces\n\
152 l - Mime.types lexical analyzer traces\n\
153 0-9 - Set debugging level\n");
154 */
155 N_("FILE [FILE ...]")
156 };
176 157
177 158 static char *capa[] = {
178 static const char *capa[] = {
179 "mailutils",
180 "common",
181 "debug", 159 "debug",
182 NULL 160 NULL
183 }; 161 };
...@@ -267,16 +245,15 @@ display_file (const char *type) ...@@ -267,16 +245,15 @@ display_file (const char *type)
267 int 245 int
268 main (int argc, char **argv) 246 main (int argc, char **argv)
269 { 247 {
270 int index;
271
272 MU_APP_INIT_NLS (); 248 MU_APP_INIT_NLS ();
273 mu_argp_init (NULL, NULL);
274 if (mu_app_init (&argp, capa, mimeview_cfg_param,
275 argc, argv, 0, &index, NULL))
276 exit (1);
277 249
278 argc -= index; 250 mimetypes_lex_debug (0);
279 argv += index; 251 mimetypes_gram_debug (0);
252 interactive = isatty (fileno (stdin));
253
254 mu_cli (argc, argv, &cli, capa, NULL, &argc, &argv);
255 if (dry_run && !debug_level)
256 debug_level = 1;
280 257
281 if (argc == 0) 258 if (argc == 0)
282 { 259 {
......
...@@ -19,7 +19,7 @@ AM_CPPFLAGS = @MU_APP_COMMON_INCLUDES@ @MU_AUTHINCS@ ...@@ -19,7 +19,7 @@ AM_CPPFLAGS = @MU_APP_COMMON_INCLUDES@ @MU_AUTHINCS@
19 bin_PROGRAMS = movemail 19 bin_PROGRAMS = movemail
20 20
21 movemail_LDADD = \ 21 movemail_LDADD = \
22 ${MU_APP_LIBRARIES}\ 22 ${MU_APP_NEW_LIBRARIES}\
23 ${MU_LIB_MBOX}\ 23 ${MU_LIB_MBOX}\
24 ${MU_LIB_IMAP}\ 24 ${MU_LIB_IMAP}\
25 ${MU_LIB_POP}\ 25 ${MU_LIB_POP}\
......
...@@ -27,46 +27,9 @@ ...@@ -27,46 +27,9 @@
27 #include <unistd.h> 27 #include <unistd.h>
28 #include <mailutils/mailutils.h> 28 #include <mailutils/mailutils.h>
29 #include <mailutils/tls.h> 29 #include <mailutils/tls.h>
30 #include "mailutils/libargp.h" 30 #include "mailutils/cli.h"
31 #include <muaux.h> 31 #include <muaux.h>
32 32
33 static char doc[] = N_("GNU movemail -- move messages across mailboxes.");
34 static char args_doc[] = N_("inbox-url destfile [POP-password]");
35
36 enum {
37 EMACS_OPTION=256,
38 IGNORE_ERRORS_OPTION,
39 PROGRAM_ID_OPTION,
40 MAX_MESSAGES_OPTION,
41 ONERROR_OPTION,
42 NOTIFY_OPTION
43 };
44
45 static struct argp_option options[] = {
46 { "preserve", 'p', NULL, 0, N_("preserve the source mailbox") },
47 { "keep-messages", 0, NULL, OPTION_ALIAS, NULL },
48 { "reverse", 'r', NULL, 0, N_("reverse the sorting order") },
49 { "emacs", EMACS_OPTION, NULL, 0,
50 N_("output information used by Emacs rmail interface") },
51 { "uidl", 'u', NULL, 0,
52 N_("use UIDLs to avoid downloading the same message twice") },
53 { "verbose", 'v', NULL, 0,
54 N_("increase verbosity level") },
55 { "owner", 'P', N_("MODELIST"), 0,
56 N_("control mailbox ownership") },
57 { "ignore-errors", IGNORE_ERRORS_OPTION, NULL, 0,
58 N_("try to continue after errors") },
59 { "onerror", ONERROR_OPTION, N_("KW[,KW...]"), 0,
60 N_("what to do on errors") },
61 { "program-id", PROGRAM_ID_OPTION, N_("FMT"), 0,
62 N_("set program identifier for diagnostics (default: program name)") },
63 { "max-messages", MAX_MESSAGES_OPTION, N_("NUMBER"), 0,
64 N_("process at most NUMBER messages") },
65 { "notify", NOTIFY_OPTION, NULL, 0,
66 N_("enable biff notification") },
67 { NULL, 0, NULL, 0, NULL, 0 }
68 };
69
70 static int reverse_order; 33 static int reverse_order;
71 static int preserve_mail; 34 static int preserve_mail;
72 static int emacs_mode; 35 static int emacs_mode;
...@@ -136,83 +99,8 @@ mu_kwd_t method_kwd[] = { ...@@ -136,83 +99,8 @@ mu_kwd_t method_kwd[] = {
136 { NULL } 99 { NULL }
137 }; 100 };
138 101
139 static error_t
140 parse_opt (int key, char *arg, struct argp_state *state)
141 {
142 static mu_list_t lst;
143
144 switch (key)
145 {
146 case 'r':
147 mu_argp_node_list_new (lst, "reverse", "yes");
148 break;
149
150 case 'p':
151 mu_argp_node_list_new (lst, "preserve", "yes");
152 break;
153
154 case 'P':
155 mu_argp_node_list_new (lst, "mailbox-ownership", arg);
156 break;
157
158 case 'u':
159 mu_argp_node_list_new (lst, "uidl", "yes");
160 break;
161
162 case 'v':
163 verbose_option++;
164 break;
165
166 case EMACS_OPTION:
167 mu_argp_node_list_new (lst, "emacs", "yes");
168 break;
169
170 case IGNORE_ERRORS_OPTION:
171 mu_argp_node_list_new (lst, "ignore-errors", "yes");
172 break;
173
174 case NOTIFY_OPTION:
175 notify = 1;
176 break;
177
178 case ONERROR_OPTION:
179 mu_argp_node_list_new (lst, "onerror", arg);
180 break;
181
182 case MAX_MESSAGES_OPTION:
183 mu_argp_node_list_new (lst, "max-messages", arg);
184 break;
185
186 case PROGRAM_ID_OPTION:
187 mu_argp_node_list_new (lst, "program-id", arg);
188 break;
189
190 case ARGP_KEY_INIT:
191 mu_argp_node_list_init (&lst);
192 break;
193
194 case ARGP_KEY_FINI:
195 mu_argp_node_list_finish (lst, NULL, NULL);
196 break;
197
198 default:
199 return ARGP_ERR_UNKNOWN;
200 }
201 return 0;
202 }
203
204 static struct argp argp = {
205 options,
206 parse_opt,
207 args_doc,
208 doc,
209 NULL,
210 NULL, NULL
211 };
212
213
214 static int 102 static int
215 _cb_mailbox_ownership (const char *str) 103 set_mailbox_ownership (const char *str)
216 { 104 {
217 if (strcmp (str, "clear") == 0) 105 if (strcmp (str, "clear") == 0)
218 so_method_num = 0; 106 so_method_num = 0;
...@@ -280,18 +168,14 @@ _cb_mailbox_ownership (const char *str) ...@@ -280,18 +168,14 @@ _cb_mailbox_ownership (const char *str)
280 } 168 }
281 169
282 static int 170 static int
283 cb_mailbox_ownership (void *data, mu_config_value_t *val) 171 set_mailbox_ownership_list (char const *str)
284 { 172 {
285 int i;
286
287 if (val->type == MU_CFG_STRING)
288 {
289 const char *str = val->v.string;
290 if (!strchr (str, ',')) 173 if (!strchr (str, ','))
291 return _cb_mailbox_ownership (str); 174 return set_mailbox_ownership (str);
292 else 175 else
293 { 176 {
294 struct mu_wordsplit ws; 177 struct mu_wordsplit ws;
178 size_t i;
295 179
296 ws.ws_delim = ","; 180 ws.ws_delim = ",";
297 if (mu_wordsplit (str, &ws, MU_WRDSF_DEFFLAGS|MU_WRDSF_DELIM)) 181 if (mu_wordsplit (str, &ws, MU_WRDSF_DEFFLAGS|MU_WRDSF_DELIM))
...@@ -302,28 +186,15 @@ cb_mailbox_ownership (void *data, mu_config_value_t *val) ...@@ -302,28 +186,15 @@ cb_mailbox_ownership (void *data, mu_config_value_t *val)
302 } 186 }
303 187
304 for (i = 0; i < ws.ws_wordc; i++) 188 for (i = 0; i < ws.ws_wordc; i++)
305 if (_cb_mailbox_ownership (ws.ws_wordv[i])) 189 if (set_mailbox_ownership (ws.ws_wordv[i]))
306 return 1; 190 return 1;
307 mu_wordsplit_free (&ws); 191 mu_wordsplit_free (&ws);
308 return 0; 192 return 0;
309 } 193 }
310 }
311
312 if (mu_cfg_assert_value_type (val, MU_CFG_LIST))
313 return 1;
314
315 for (i = 0; i < val->v.arg.c; i++)
316 {
317 if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING))
318 return 1;
319 if (_cb_mailbox_ownership (val->v.arg.v[i].v.string))
320 return 1;
321 }
322 return 0;
323 } 194 }
324 195
325 static int 196 static int
326 cb_onerror (void *data, mu_config_value_t *val) 197 set_onerror_action (char const *str)
327 { 198 {
328 struct mu_wordsplit ws; 199 struct mu_wordsplit ws;
329 static struct mu_kwd onerror_kw[] = { 200 static struct mu_kwd onerror_kw[] = {
...@@ -334,15 +205,13 @@ cb_onerror (void *data, mu_config_value_t *val) ...@@ -334,15 +205,13 @@ cb_onerror (void *data, mu_config_value_t *val)
334 }; 205 };
335 int i, flag; 206 int i, flag;
336 207
337 if (mu_cfg_assert_value_type (val, MU_CFG_STRING)) 208 if (strcmp (str, "abort") == 0)
338 return 1;
339 if (strcmp (val->v.string, "abort") == 0)
340 { 209 {
341 onerror_flags = 0; 210 onerror_flags = 0;
342 return 0; 211 return 0;
343 } 212 }
344 ws.ws_delim = ","; 213 ws.ws_delim = ",";
345 if (mu_wordsplit (val->v.string, &ws, 214 if (mu_wordsplit (str, &ws,
346 MU_WRDSF_NOVAR | MU_WRDSF_NOCMD | 215 MU_WRDSF_NOVAR | MU_WRDSF_NOCMD |
347 MU_WRDSF_DELIM | MU_WRDSF_WS)) 216 MU_WRDSF_DELIM | MU_WRDSF_WS))
348 { 217 {
...@@ -370,6 +239,99 @@ cb_onerror (void *data, mu_config_value_t *val) ...@@ -370,6 +239,99 @@ cb_onerror (void *data, mu_config_value_t *val)
370 return 0; 239 return 0;
371 } 240 }
372 241
242 static void
243 cli_mailbox_ownership (struct mu_parseopt *po, struct mu_option *opt,
244 char const *arg)
245 {
246 if (set_mailbox_ownership_list (arg))
247 exit (po->po_exit_error);
248 }
249
250 static void
251 cli_onerror (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
252 {
253 if (set_onerror_action (arg))
254 exit (po->po_exit_error);
255 }
256
257 static struct mu_option movemail_options[] = {
258 { "preserve", 'p', NULL, MU_OPTION_DEFAULT,
259 N_("preserve the source mailbox"),
260 mu_c_bool, &preserve_mail },
261 { "keep-messages", 0, NULL, MU_OPTION_ALIAS },
262
263 { "reverse", 'r', NULL, MU_OPTION_DEFAULT,
264 N_("reverse the sorting order"),
265 mu_c_bool, &reverse_order },
266
267 { "emacs", 0, NULL, MU_OPTION_DEFAULT,
268 N_("output information used by Emacs rmail interface"),
269 mu_c_bool, &emacs_mode },
270
271 { "uidl", 'u', NULL, MU_OPTION_DEFAULT,
272 N_("use UIDLs to avoid downloading the same message twice"),
273 mu_c_bool, &uidl_option },
274
275 { "verbose", 'v', NULL, MU_OPTION_DEFAULT,
276 N_("increase verbosity level"),
277 mu_c_incr, &verbose_option },
278
279 { "owner", 'P', N_("MODELIST"), MU_OPTION_DEFAULT,
280 N_("control mailbox ownership"),
281 mu_c_string, cli_mailbox_ownership },
282
283 { "ignore-errors", 0, NULL, MU_OPTION_DEFAULT,
284 N_("try to continue after errors"),
285 mu_c_bool, &ignore_errors },
286
287 { "onerror", 0, N_("KW[,KW...]"), MU_OPTION_DEFAULT,
288 N_("what to do on errors"),
289 mu_c_string, NULL, cli_onerror },
290
291 { "program-id", 0, N_("FMT"), MU_OPTION_DEFAULT,
292 N_("set program identifier for diagnostics (default: program name)"),
293 mu_c_string, &program_id_option },
294
295 { "max-messages", 0, N_("NUMBER"), MU_OPTION_DEFAULT,
296 N_("process at most NUMBER messages"),
297 mu_c_size, &max_messages_option },
298
299 { "notify", 0, NULL, MU_OPTION_DEFAULT,
300 N_("enable biff notification"),
301 mu_c_bool, &notify },
302
303 MU_OPTION_END
304 }, *options[] = { movemail_options, NULL };
305
306 static int
307 cb_mailbox_ownership (void *data, mu_config_value_t *val)
308 {
309 int i;
310
311 if (val->type == MU_CFG_STRING)
312 set_mailbox_ownership_list (val->v.string);
313
314 if (mu_cfg_assert_value_type (val, MU_CFG_LIST))
315 return 1;
316
317 for (i = 0; i < val->v.arg.c; i++)
318 {
319 if (mu_cfg_assert_value_type (&val->v.arg.v[i], MU_CFG_STRING))
320 return 1;
321 if (set_mailbox_ownership (val->v.arg.v[i].v.string))
322 return 1;
323 }
324 return 0;
325 }
326
327 static int
328 cb_onerror (void *data, mu_config_value_t *val)
329 {
330 if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
331 return 1;
332 return set_onerror_action (val->v.string);
333 }
334
373 struct mu_cfg_param movemail_cfg_param[] = { 335 struct mu_cfg_param movemail_cfg_param[] = {
374 { "preserve", mu_c_bool, &preserve_mail, 0, NULL, 336 { "preserve", mu_c_bool, &preserve_mail, 0, NULL,
375 N_("Do not remove messages from the source mailbox.") }, 337 N_("Do not remove messages from the source mailbox.") },
...@@ -407,14 +369,19 @@ struct mu_cfg_param movemail_cfg_param[] = { ...@@ -407,14 +369,19 @@ struct mu_cfg_param movemail_cfg_param[] = {
407 { NULL } 369 { NULL }
408 }; 370 };
409 371
372 struct mu_cli_setup cli = {
373 options,
374 movemail_cfg_param,
375 N_("GNU movemail -- move messages across mailboxes."),
376 N_("inbox-url destfile [POP-password]")
377 };
410 378
411 static const char *movemail_capa[] = { 379 static char *movemail_capa[] = {
412 "mailutils",
413 "common",
414 "debug", 380 "debug",
415 "locking", 381 "locking",
416 "mailbox", 382 "mailbox",
417 "auth", 383 "auth",
384 "tls",
418 NULL 385 NULL
419 }; 386 };
420 387
...@@ -863,7 +830,6 @@ set_program_id (const char *source_name, const char *dest_name) ...@@ -863,7 +830,6 @@ set_program_id (const char *source_name, const char *dest_name)
863 int 830 int
864 main (int argc, char **argv) 831 main (int argc, char **argv)
865 { 832 {
866 int index;
867 size_t total; 833 size_t total;
868 int rc = 0; 834 int rc = 0;
869 char *source_name, *dest_name; 835 char *source_name, *dest_name;
...@@ -880,16 +846,8 @@ main (int argc, char **argv) ...@@ -880,16 +846,8 @@ main (int argc, char **argv)
880 846
881 /* argument parsing */ 847 /* argument parsing */
882 848
883 #ifdef WITH_TLS 849 mu_cli_capa_register (&mu_cli_capa_tls);
884 mu_gocs_register ("tls", mu_tls_module_init); 850 mu_cli (argc, argv, &cli, movemail_capa, NULL, &argc, &argv);
885 #endif
886 mu_argp_init (NULL, NULL);
887 if (mu_app_init (&argp, movemail_capa, movemail_cfg_param,
888 argc, argv, 0, &index, NULL))
889 exit (1);
890
891 argc -= index;
892 argv += index;
893 851
894 if (argc < 2 || argc > 3) 852 if (argc < 2 || argc > 3)
895 { 853 {
......
...@@ -23,7 +23,7 @@ bin_PROGRAMS = readmsg ...@@ -23,7 +23,7 @@ bin_PROGRAMS = readmsg
23 readmsg_SOURCES = readmsg.c msglist.c readmsg.h 23 readmsg_SOURCES = readmsg.c msglist.c readmsg.h
24 24
25 readmsg_LDADD =\ 25 readmsg_LDADD =\
26 ${MU_APP_LIBRARIES}\ 26 ${MU_APP_NEW_LIBRARIES}\
27 ${MU_LIB_MBOX}\ 27 ${MU_LIB_MBOX}\
28 ${MU_LIB_IMAP}\ 28 ${MU_LIB_IMAP}\
29 ${MU_LIB_POP}\ 29 ${MU_LIB_POP}\
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
20 #endif 20 #endif
21 21
22 #include "readmsg.h" 22 #include "readmsg.h"
23 #include "mailutils/libargp.h" 23 #include "mailutils/cli.h"
24 #include "mu_umaxtostr.h" 24 #include "mu_umaxtostr.h"
25 25
26 #define WEEDLIST_SEPARATOR " :," 26 #define WEEDLIST_SEPARATOR " :,"
...@@ -30,41 +30,6 @@ static void print_header (mu_message_t, int, int, char **); ...@@ -30,41 +30,6 @@ static void print_header (mu_message_t, int, int, char **);
30 static void print_body (mu_message_t); 30 static void print_body (mu_message_t);
31 static int string_starts_with (const char * s1, const char *s2); 31 static int string_starts_with (const char * s1, const char *s2);
32 32
33 static char doc[] = N_("GNU readmsg -- print messages.");
34 static error_t readmsg_parse_opt (int key, char *arg, struct argp_state *astate);
35
36 static struct argp_option options[] =
37 {
38 { "debug", 'd', 0, 0, N_("display debugging information"), 1 },
39 { "header", 'h', 0, 0, N_("display entire header"), 1 },
40 { "weedlist", 'w', N_("LIST"), 0,
41 N_("list of header names separated by whitespace or commas"), 1 },
42 { "folder", 'f', N_("FOLDER"), 0, N_("folder to use"), 1 },
43 { "no-header", 'n', 0, 0, N_("exclude all headers"), 1 },
44 { "form-feeds", 'p', 0, 0, N_("output formfeeds between messages"), 1 },
45 { "show-all-match", 'a', NULL, 0,
46 N_("print all messages matching pattern, not only the first"), 1 },
47 {0, 0, 0, 0}
48 };
49
50 static struct argp argp = {
51 options,
52 readmsg_parse_opt,
53 NULL,
54 doc,
55 NULL,
56 NULL, NULL
57 };
58
59 static const char *readmsg_argp_capa[] = {
60 "mailutils",
61 "common",
62 "debug",
63 "mailbox",
64 "locking",
65 NULL
66 };
67
68 int dbug = 0; 33 int dbug = 0;
69 const char *mailbox_name = NULL; 34 const char *mailbox_name = NULL;
70 const char *weedlist = NULL; 35 const char *weedlist = NULL;
...@@ -73,57 +38,30 @@ int all_header = 0; ...@@ -73,57 +38,30 @@ int all_header = 0;
73 int form_feed = 0; 38 int form_feed = 0;
74 int show_all = 0; 39 int show_all = 0;
75 40
76 static error_t 41 static struct mu_option readmsg_options[] =
77 readmsg_parse_opt (int key, char *arg, struct argp_state *astate)
78 { 42 {
79 static mu_list_t lst; 43 { "debug", 'd', NULL, MU_OPTION_DEFAULT,
80 44 N_("display debugging information"),
81 switch (key) 45 mu_c_incr, &dbug },
82 { 46 { "header", 'h', NULL, MU_OPTION_DEFAULT,
83 case 'd': 47 N_("display entire headers"),
84 dbug++; 48 mu_c_bool, &all_header },
85 break; 49 { "weedlist", 'w', N_("LIST"), MU_OPTION_DEFAULT,
86 50 N_("list of header names separated by whitespace or commas"),
87 case 'h': 51 mu_c_string, &weedlist },
88 mu_argp_node_list_new (lst, "header", "yes"); 52 { "folder", 'f', N_("FOLDER"), MU_OPTION_DEFAULT,
89 break; 53 N_("folder to use"), mu_c_string, &mailbox_name },
90 54 { "no-header", 'n', NULL, MU_OPTION_DEFAULT,
91 case 'f': 55 N_("exclude all headers"),
92 mu_argp_node_list_new (lst, "folder", arg); 56 mu_c_bool, &no_header },
93 break; 57 { "form-feeds", 'p', NULL, MU_OPTION_DEFAULT,
94 58 N_("output formfeeds between messages"),
95 case 'w': 59 mu_c_bool, &form_feed },
96 mu_argp_node_list_new (lst, "weedlist", arg); 60 { "show-all-match", 'a', NULL, MU_OPTION_DEFAULT,
97 break; 61 N_("print all messages matching pattern, not only the first"),
98 62 mu_c_bool, &show_all },
99 case 'n': 63 MU_OPTION_END
100 mu_argp_node_list_new (lst, "no-header", "yes"); 64 }, *options[] = { readmsg_options, NULL };
101 break;
102
103 case 'p':
104 mu_argp_node_list_new (lst, "form-feeds", "yes");
105 break;
106
107 case 'a':
108 mu_argp_node_list_new (lst, "show-all-match", "yes");
109 break;
110
111 case ARGP_KEY_INIT:
112 mu_argp_node_list_init (&lst);
113 break;
114
115 case ARGP_KEY_FINI:
116 if (dbug)
117 mu_argp_node_list_new (lst, "debug", mu_umaxtostr (0, dbug));
118 mu_argp_node_list_finish (lst, NULL, NULL);
119 break;
120
121 default:
122 return ARGP_ERR_UNKNOWN;
123 }
124 return 0;
125 }
126
127 65
128 struct mu_cfg_param readmsg_cfg_param[] = { 66 struct mu_cfg_param readmsg_cfg_param[] = {
129 { "debug", mu_c_int, &dbug, 0, NULL, 67 { "debug", mu_c_int, &dbug, 0, NULL,
...@@ -145,6 +83,21 @@ struct mu_cfg_param readmsg_cfg_param[] = { ...@@ -145,6 +83,21 @@ struct mu_cfg_param readmsg_cfg_param[] = {
145 { NULL } 83 { NULL }
146 }; 84 };
147 85
86 struct mu_cli_setup cli = {
87 options,
88 readmsg_cfg_param,
89 N_("GNU readmsg -- print messages."),
90 NULL
91 };
92
93 static char *readmsg_argp_capa[] = {
94 "debug",
95 "mailbox",
96 "locking",
97 "tls",
98 NULL
99 };
100
148 static int 101 static int
149 string_starts_with (const char * s1, const char *s2) 102 string_starts_with (const char * s1, const char *s2)
150 { 103 {
...@@ -158,7 +111,7 @@ string_starts_with (const char * s1, const char *s2) ...@@ -158,7 +111,7 @@ string_starts_with (const char * s1, const char *s2)
158 111
159 while (*p1 && *p2) 112 while (*p1 && *p2)
160 { 113 {
161 if ((n = toupper (*p1++) - toupper (*p2++)) != 0) 114 if ((n = mu_toupper (*p1++) - mu_toupper (*p2++)) != 0)
162 break; 115 break;
163 } 116 }
164 return (n == 0); 117 return (n == 0);
...@@ -276,7 +229,6 @@ main (int argc, char **argv) ...@@ -276,7 +229,6 @@ main (int argc, char **argv)
276 int *set = NULL; 229 int *set = NULL;
277 int n = 0; 230 int n = 0;
278 int i; 231 int i;
279 int index;
280 mu_mailbox_t mbox = NULL; 232 mu_mailbox_t mbox = NULL;
281 struct mu_wordsplit ws; 233 struct mu_wordsplit ws;
282 char **weedv; 234 char **weedv;
...@@ -290,15 +242,9 @@ main (int argc, char **argv) ...@@ -290,15 +242,9 @@ main (int argc, char **argv)
290 mu_register_all_mbox_formats (); 242 mu_register_all_mbox_formats ();
291 mu_register_extra_formats (); 243 mu_register_extra_formats ();
292 244
293 #ifdef WITH_TLS 245 mu_cli_capa_register (&mu_cli_capa_tls);
294 mu_gocs_register ("tls", mu_tls_module_init);
295 #endif
296 mu_argp_init (NULL, NULL);
297 if (mu_app_init (&argp, readmsg_argp_capa, readmsg_cfg_param,
298 argc, argv, 0, &index, NULL))
299 exit (1);
300 246
301 argc -= index; 247 mu_cli (argc, argv, &cli, readmsg_argp_capa, NULL, &argc, &argv);
302 248
303 if (argc == 0) 249 if (argc == 0)
304 { 250 {
...@@ -376,7 +322,7 @@ main (int argc, char **argv) ...@@ -376,7 +322,7 @@ main (int argc, char **argv)
376 } 322 }
377 323
378 /* Build an array containing the message number. */ 324 /* Build an array containing the message number. */
379 msglist (mbox, show_all, argc, &argv[index], &set, &n); 325 msglist (mbox, show_all, argc, argv, &set, &n);
380 326
381 for (i = 0; i < n; ++i) 327 for (i = 0; i < n; ++i)
382 { 328 {
......
...@@ -22,7 +22,7 @@ EXTRA_DIST = examples ...@@ -22,7 +22,7 @@ EXTRA_DIST = examples
22 bin_PROGRAMS = sieve 22 bin_PROGRAMS = sieve
23 sieve_SOURCES = sieve.c 23 sieve_SOURCES = sieve.c
24 sieve_LDADD =\ 24 sieve_LDADD =\
25 ${MU_APP_LIBRARIES}\ 25 ${MU_APP_NEW_LIBRARIES}\
26 ${MU_LIB_SIEVE}\ 26 ${MU_LIB_SIEVE}\
27 ${MU_LIB_MBOX}\ 27 ${MU_LIB_MBOX}\
28 ${MU_LIB_IMAP}\ 28 ${MU_LIB_IMAP}\
......
...@@ -43,64 +43,10 @@ ...@@ -43,64 +43,10 @@
43 #include <mailutils/stream.h> 43 #include <mailutils/stream.h>
44 #include <mailutils/nls.h> 44 #include <mailutils/nls.h>
45 #include <mailutils/tls.h> 45 #include <mailutils/tls.h>
46 46 #include <mailutils/cli.h>
47 #include "mailutils/libargp.h"
48
49 static char doc[] =
50 N_("GNU sieve -- a mail filtering tool.")
51 "\v"
52 N_("Debug flags:\n\
53 g - main parser traces\n\
54 T - mailutils traces (same as --debug-level=sieve.trace0-trace1)\n\
55 P - network protocols (same as --debug-level=sieve.=prot)\n\
56 t - sieve trace (MU_SIEVE_DEBUG_TRACE)\n\
57 i - sieve instructions trace (MU_SIEVE_DEBUG_INSTR)\n");
58 47
59 #define D_DEFAULT "TPt" 48 #define D_DEFAULT "TPt"
60 49
61 #define ARG_LINE_INFO 257
62 #define ARG_NO_PROGRAM_NAME 258
63
64 static struct argp_option options[] =
65 {
66 {"no-actions", 'n', 0, 0,
67 N_("do not execute any actions, just print what would be done"), 0},
68 {"dry-run", 0, NULL, OPTION_ALIAS, NULL },
69 {"keep-going", 'k', 0, 0,
70 N_("keep on going if execution fails on a message"), 0},
71
72 {"compile-only", 'c', 0, 0,
73 N_("compile script and exit"), 0},
74
75 {"dump", 'D', 0, 0,
76 N_("compile script, dump disassembled sieve code to terminal and exit"), 0 },
77
78 {"mbox-url", 'f', N_("MBOX"), 0,
79 N_("mailbox to sieve (defaults to user's mail spool)"), 0},
80
81 {"ticket", 't', N_("TICKET"), 0,
82 N_("ticket file for user authentication"), 0},
83
84 {"debug", 'd', N_("FLAGS"), OPTION_ARG_OPTIONAL,
85 N_("debug flags (defaults to \"" D_DEFAULT "\")"), 0},
86
87 {"verbose", 'v', NULL, 0,
88 N_("log all actions"), 0},
89
90 {"line-info", ARG_LINE_INFO, N_("BOOL"), OPTION_ARG_OPTIONAL,
91 N_("print source location along with action logs (default)") },
92
93 {"email", 'e', N_("ADDRESS"), 0,
94 N_("override user email address"), 0},
95 {"expression", 'E', NULL, 0,
96 N_("treat SCRIPT as Sieve program text"), 0},
97
98 {"no-program-name", ARG_NO_PROGRAM_NAME, NULL, 0,
99 N_("do not prefix diagnostic messages with the program name"), 0},
100
101 {0}
102 };
103
104 int keep_going; 50 int keep_going;
105 int compile_only; 51 int compile_only;
106 char *mbox_url; 52 char *mbox_url;
...@@ -112,17 +58,6 @@ int expression_option; ...@@ -112,17 +58,6 @@ int expression_option;
112 static int sieve_print_locus = 1; /* Should the log messages include the 58 static int sieve_print_locus = 1; /* Should the log messages include the
113 locus */ 59 locus */
114 60
115 static int
116 is_true_p (char *p)
117 {
118 int rc;
119 if (!p)
120 return 1;
121 if ((rc = mu_true_answer_p (p)) == -1)
122 return 0;
123 return rc;
124 }
125
126 static void 61 static void
127 set_debug_level (const char *arg) 62 set_debug_level (const char *arg)
128 { 63 {
...@@ -164,99 +99,89 @@ set_debug_level (const char *arg) ...@@ -164,99 +99,89 @@ set_debug_level (const char *arg)
164 } 99 }
165 } 100 }
166 101
167 int 102 static void
168 mu_compat_printer (void *data, mu_log_level_t level, const char *buf) 103 cli_dry_run (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
169 { 104 {
170 fputs (buf, stderr); 105 sieve_debug |= MU_SIEVE_DRY_RUN;
171 return 0; 106 verbose = 1;
172 } 107 }
173 108
174 static error_t 109 static void
175 parser (int key, char *arg, struct argp_state *state) 110 cli_compile_and_dump (struct mu_parseopt *po, struct mu_option *opt,
111 char const *arg)
176 { 112 {
177 static mu_list_t lst;
178
179 switch (key)
180 {
181 case 'E':
182 expression_option = 1;
183 break;
184
185 case 'e':
186 mu_argp_node_list_new (lst, "email", arg);
187 break;
188
189 case 'n':
190 sieve_debug |= MU_SIEVE_DRY_RUN;
191 mu_argp_node_list_new (lst, "verbose", "yes");
192 break;
193
194 case 'k':
195 mu_argp_node_list_new (lst, "keep-going", "yes");
196 break;
197
198 case 'c':
199 compile_only = 1;
200 break;
201
202 case 'D':
203 compile_only = 2; 113 compile_only = 2;
204 break; 114 }
205
206 case 'f':
207 mu_argp_node_list_new (lst, "mbox-url", arg);
208 break;
209
210 case 't':
211 mu_argp_node_list_new (lst, "ticket", arg);
212 break;
213
214 case 'd':
215 mu_argp_node_list_new (lst, "debug", arg ? arg : D_DEFAULT);
216 break;
217 115
218 case 'v': 116 static void
219 mu_argp_node_list_new (lst, "verbose", "yes"); 117 cli_debug (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
220 break; 118 {
119 set_debug_level (arg);
120 }
221 121
222 case ARG_LINE_INFO: 122 static void
223 mu_argp_node_list_new (lst, "line-info", 123 cli_email (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
224 is_true_p (arg) ? "yes" : "no"); 124 {
225 break; 125 int rc = mu_set_user_email (arg);
126 if (rc)
127 mu_parseopt_error (po, _("invalid email: %s"), mu_strerror (rc));
128 }
226 129
227 case ARG_NO_PROGRAM_NAME: 130 static void
131 cli_no_program_name (struct mu_parseopt *po, struct mu_option *opt,
132 char const *arg)
133 {
228 mu_log_tag = NULL; 134 mu_log_tag = NULL;
229 break; 135 }
230
231 case ARGP_KEY_ARG:
232 if (script)
233 argp_error (state, _("Only one SCRIPT can be specified"));
234 script = mu_tilde_expansion (arg, MU_HIERARCHY_DELIMITER, NULL);
235 break;
236
237 case ARGP_KEY_INIT:
238 mu_argp_node_list_init (&lst);
239 break;
240
241 case ARGP_KEY_FINI:
242 mu_argp_node_list_finish (lst, NULL, NULL);
243 break;
244 136
245 default: 137 static struct mu_option sieve_options[] = {
246 return ARGP_ERR_UNKNOWN; 138 { "no-actions", 'n', NULL, MU_OPTION_DEFAULT,
247 } 139 N_("do not execute any actions, just print what would be done"),
140 mu_c_string, NULL, cli_dry_run },
141 { "dry-run", 0, NULL, MU_OPTION_ALIAS },
142 { "keep-going", 'k', NULL, MU_OPTION_DEFAULT,
143 N_("keep on going if execution fails on a message"),
144 mu_c_bool, &keep_going },
145 { "compile-only", 'c', NULL, MU_OPTION_DEFAULT,
146 N_("compile script and exit"),
147 mu_c_bool, &compile_only },
148 { "dump", 'D', NULL, MU_OPTION_DEFAULT,
149 N_("compile script, dump disassembled sieve code to terminal and exit"),
150 mu_c_string, NULL, cli_compile_and_dump },
151 { "mbox-url", 'f', N_("MBOX"), MU_OPTION_DEFAULT,
152 N_("mailbox to sieve (defaults to user's mail spool)"),
153 mu_c_string, &mbox_url },
154 { "ticket", 't', N_("TICKET"), MU_OPTION_DEFAULT,
155 N_("ticket file for user authentication"),
156 mu_c_string, &mu_ticket_file },
157 { "debug", 'd', N_("FLAGS"), MU_OPTION_ARG_OPTIONAL,
158 N_("debug flags (defaults to \"" D_DEFAULT "\")"),
159 mu_c_string, NULL, cli_debug },
160 { "verbose", 'v', NULL, MU_OPTION_DEFAULT,
161 N_("log all actions"),
162 mu_c_bool, &verbose },
163 { "line-info", 0, N_("BOOL"), MU_OPTION_DEFAULT,
164 N_("print source location along with action logs (default)"),
165 mu_c_bool, &sieve_print_locus },
166 { "email", 'e', N_("ADDRESS"), MU_OPTION_DEFAULT,
167 N_("override user email address"),
168 mu_c_string, NULL, cli_email },
169 { "expression", 'E', NULL, MU_OPTION_DEFAULT,
170 N_("treat SCRIPT as Sieve program text"),
171 mu_c_bool, &expression_option },
172 { "no-program-name", 0, NULL, MU_OPTION_DEFAULT,
173 N_("do not prefix diagnostic messages with the program name"),
174 mu_c_string, NULL, cli_no_program_name },
175 MU_OPTION_END
176 }, *options[] = { sieve_options, NULL };
248 177
178 int
179 mu_compat_printer (void *data, mu_log_level_t level, const char *buf)
180 {
181 fputs (buf, stderr);
249 return 0; 182 return 0;
250 } 183 }
251 184
252 static struct argp argp =
253 {
254 options,
255 parser,
256 N_("SCRIPT"),
257 doc
258 };
259
260 185
261 static int 186 static int
262 cb_debug (void *data, mu_config_value_t *val) 187 cb_debug (void *data, mu_config_value_t *val)
...@@ -307,18 +232,24 @@ static struct mu_cfg_param sieve_cfg_param[] = { ...@@ -307,18 +232,24 @@ static struct mu_cfg_param sieve_cfg_param[] = {
307 }; 232 };
308 233
309 234
310 static const char *sieve_argp_capa[] = 235 static char *sieve_argp_capa[] = {
311 {
312 "mailutils",
313 "common",
314 "debug", 236 "debug",
315 "mailbox", 237 "mailbox",
316 "locking", 238 "locking",
317 "logging", 239 "logging",
318 "mailer", 240 "mailer",
241 "tls",
242 "sieve",
319 NULL 243 NULL
320 }; 244 };
321 245
246 static struct mu_cli_setup cli = {
247 options,
248 sieve_cfg_param,
249 N_("GNU sieve -- a mail filtering tool."),
250 "SCRIPT"
251 };
252
322 static void 253 static void
323 _sieve_action_log (void *unused, 254 _sieve_action_log (void *unused,
324 mu_stream_t stream, size_t msgno, 255 mu_stream_t stream, size_t msgno,
...@@ -456,24 +387,28 @@ main (int argc, char *argv[]) ...@@ -456,24 +387,28 @@ main (int argc, char *argv[])
456 /* Native Language Support */ 387 /* Native Language Support */
457 MU_APP_INIT_NLS (); 388 MU_APP_INIT_NLS ();
458 389
459 mu_argp_init (NULL, NULL); 390 mu_cli_capa_register (&mu_cli_capa_tls);
460 #ifdef WITH_TLS 391 mu_cli_capa_register (&mu_cli_capa_sieve);
461 mu_gocs_register ("tls", mu_tls_module_init);
462 #endif
463 mu_gocs_register ("sieve", mu_sieve_module_init);
464 mu_sieve_debug_init (); 392 mu_sieve_debug_init ();
465 393
466 mu_register_all_formats (); 394 mu_register_all_formats ();
467 395
468 if (mu_app_init (&argp, sieve_argp_capa, sieve_cfg_param, 396 mu_cli (argc, argv, &cli, sieve_argp_capa, NULL, &argc, &argv);
469 argc, argv, ARGP_IN_ORDER, NULL, NULL))
470 exit (EX_USAGE);
471 397
472 if (!script) 398 if (argc == 0)
473 { 399 {
474 mu_error (_("script must be specified")); 400 mu_error (_("script must be specified"));
475 exit (EX_USAGE); 401 exit (EX_USAGE);
476 } 402 }
403 else if (argc == 1)
404 {
405 script = mu_tilde_expansion (argv[0], MU_HIERARCHY_DELIMITER, NULL);
406 }
407 else
408 {
409 mu_error (_("only one SCRIPT can be specified"));
410 exit (EX_USAGE);
411 }
477 412
478 /* Sieve interpreter setup. */ 413 /* Sieve interpreter setup. */
479 rc = mu_sieve_machine_init (&mach); 414 rc = mu_sieve_machine_init (&mach);
......