comsat: minor changes
* libmailutils/mailbox/mailbox.c (mu_mailbox_open): Fix error checking condition. * comsat/action.c (act_getline): Remove. (open_rc): Return mu_stream_t. Use linecon filter.
Showing
2 changed files
with
47 additions
and
66 deletions
... | @@ -17,6 +17,7 @@ | ... | @@ -17,6 +17,7 @@ |
17 | 17 | ||
18 | #include "comsat.h" | 18 | #include "comsat.h" |
19 | #include <mailutils/io.h> | 19 | #include <mailutils/io.h> |
20 | #include <mailutils/filter.h> | ||
20 | #define obstack_chunk_alloc malloc | 21 | #define obstack_chunk_alloc malloc |
21 | #define obstack_chunk_free free | 22 | #define obstack_chunk_free free |
22 | #include <obstack.h> | 23 | #include <obstack.h> |
... | @@ -39,52 +40,6 @@ | ... | @@ -39,52 +40,6 @@ |
39 | number of characters and lines in the expansion. | 40 | number of characters and lines in the expansion. |
40 | When omitted, they default to 400, 5. */ | 41 | When omitted, they default to 400, 5. */ |
41 | 42 | ||
42 | static unsigned | ||
43 | act_getline (FILE *fp, char **sptr, size_t *size) | ||
44 | { | ||
45 | char buf[256]; | ||
46 | int cont = 1; | ||
47 | size_t used = 0; | ||
48 | unsigned lines = 0; | ||
49 | |||
50 | if (feof (fp)) | ||
51 | return 0; | ||
52 | |||
53 | while (cont && fgets (buf, sizeof buf, fp)) | ||
54 | { | ||
55 | int len = strlen (buf); | ||
56 | if (buf[len-1] == '\n') | ||
57 | { | ||
58 | lines++; | ||
59 | buf[--len] = 0; | ||
60 | if (buf[len-1] == '\\') | ||
61 | { | ||
62 | buf[--len] = 0; | ||
63 | cont = 1; | ||
64 | } | ||
65 | else | ||
66 | cont = 0; | ||
67 | } | ||
68 | else | ||
69 | cont = 1; | ||
70 | |||
71 | if (len + used + 1 > *size) | ||
72 | { | ||
73 | *sptr = realloc (*sptr, len + used + 1); | ||
74 | if (!*sptr) | ||
75 | return 0; | ||
76 | *size = len + used + 1; | ||
77 | } | ||
78 | memcpy (*sptr + used, buf, len); | ||
79 | used += len; | ||
80 | } | ||
81 | |||
82 | if (*sptr) | ||
83 | (*sptr)[used] = 0; | ||
84 | |||
85 | return lines; | ||
86 | } | ||
87 | |||
88 | static int | 43 | static int |
89 | expand_escape (char **pp, mu_message_t msg, struct obstack *stk) | 44 | expand_escape (char **pp, mu_message_t msg, struct obstack *stk) |
90 | { | 45 | { |
... | @@ -331,12 +286,14 @@ action_exec (FILE *tty, int argc, char **argv) | ... | @@ -331,12 +286,14 @@ action_exec (FILE *tty, int argc, char **argv) |
331 | } | 286 | } |
332 | } | 287 | } |
333 | 288 | ||
334 | static FILE * | 289 | static mu_stream_t |
335 | open_rc (const char *filename, FILE *tty) | 290 | open_rc (const char *filename, FILE *tty) |
336 | { | 291 | { |
337 | struct stat stb; | 292 | struct stat stb; |
338 | struct passwd *pw = getpwnam (username); | 293 | struct passwd *pw = getpwnam (username); |
339 | 294 | mu_stream_t stream, input; | |
295 | int rc; | ||
296 | |||
340 | /* To be on the safe side, we do not allow root to have his .biffrc */ | 297 | /* To be on the safe side, we do not allow root to have his .biffrc */ |
341 | if (!allow_biffrc || pw->pw_uid == 0) | 298 | if (!allow_biffrc || pw->pw_uid == 0) |
342 | return NULL; | 299 | return NULL; |
... | @@ -357,21 +314,45 @@ open_rc (const char *filename, FILE *tty) | ... | @@ -357,21 +314,45 @@ open_rc (const char *filename, FILE *tty) |
357 | return NULL; | 314 | return NULL; |
358 | } | 315 | } |
359 | } | 316 | } |
360 | return fopen (filename, "r"); | 317 | rc = mu_file_stream_create (&input, filename, MU_STREAM_READ); |
318 | if (rc) | ||
319 | { | ||
320 | if (rc != ENOENT) | ||
321 | { | ||
322 | fprintf (tty, _("Cannot open .biffrc file: %s\r\n"), | ||
323 | mu_strerror (rc)); | ||
324 | mu_diag_output (MU_DIAG_NOTICE, _("cannot open %s for %s: %s"), | ||
325 | filename, username, mu_strerror (rc)); | ||
326 | } | ||
327 | return NULL; | ||
328 | } | ||
329 | rc = mu_filter_create (&stream, input, "LINECON", MU_FILTER_DECODE, | ||
330 | MU_STREAM_READ); | ||
331 | mu_stream_unref (input); | ||
332 | if (rc) | ||
333 | { | ||
334 | fprintf (tty, _("Cannot create filter for your .biffrc file: %s\r\n"), | ||
335 | mu_strerror (rc)); | ||
336 | mu_diag_output (MU_DIAG_NOTICE, | ||
337 | _("cannot create filter for file %s of %s: %s"), | ||
338 | filename, username, mu_strerror (rc)); | ||
339 | return NULL; | ||
340 | } | ||
341 | return stream; | ||
361 | } | 342 | } |
362 | 343 | ||
363 | void | 344 | void |
364 | run_user_action (FILE *tty, const char *cr, mu_message_t msg) | 345 | run_user_action (FILE *tty, const char *cr, mu_message_t msg) |
365 | { | 346 | { |
366 | FILE *fp; | 347 | mu_stream_t input; |
367 | int nact = 0; | 348 | int nact = 0; |
368 | char *stmt = NULL; | 349 | |
369 | size_t size = 0; | 350 | input = open_rc (BIFF_RC, tty); |
370 | 351 | if (input) | |
371 | fp = open_rc (BIFF_RC, tty); | ||
372 | if (fp) | ||
373 | { | 352 | { |
374 | unsigned n; | 353 | char *stmt = NULL; |
354 | size_t size = 0; | ||
355 | size_t n; | ||
375 | char *cwd = mu_getcwd (); | 356 | char *cwd = mu_getcwd (); |
376 | char *rcname; | 357 | char *rcname; |
377 | struct mu_locus locus; | 358 | struct mu_locus locus; |
... | @@ -380,20 +361,20 @@ run_user_action (FILE *tty, const char *cr, mu_message_t msg) | ... | @@ -380,20 +361,20 @@ run_user_action (FILE *tty, const char *cr, mu_message_t msg) |
380 | free (cwd); | 361 | free (cwd); |
381 | if (!rcname) | 362 | if (!rcname) |
382 | { | 363 | { |
383 | mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM); | 364 | mu_diag_funcall (MU_DIAG_ERROR, "mu_make_file_name", NULL, ENOMEM); |
384 | fclose (fp); | 365 | locus.mu_file = BIFF_RC; |
385 | return; | ||
386 | } | 366 | } |
387 | 367 | else | |
388 | locus.mu_file = rcname; | 368 | locus.mu_file = rcname; |
389 | locus.mu_line = 1; | 369 | locus.mu_line = 1; |
390 | locus.mu_col = 0; | 370 | locus.mu_col = 0; |
391 | while ((n = act_getline (fp, &stmt, &size))) | 371 | while (mu_stream_getline (input, &stmt, &size, &n) == 0 && n > 0) |
392 | { | 372 | { |
393 | struct mu_wordsplit ws; | 373 | struct mu_wordsplit ws; |
394 | 374 | ||
395 | ws.ws_comment = "#"; | 375 | ws.ws_comment = "#"; |
396 | if (mu_wordsplit (stmt, &ws, MU_WRDSF_DEFFLAGS | MU_WRDSF_COMMENT) | 376 | if (mu_wordsplit (stmt, &ws, |
377 | MU_WRDSF_DEFFLAGS | MU_WRDSF_COMMENT) == 0 | ||
397 | && ws.ws_wordc) | 378 | && ws.ws_wordc) |
398 | { | 379 | { |
399 | mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, | 380 | mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, |
... | @@ -443,9 +424,9 @@ run_user_action (FILE *tty, const char *cr, mu_message_t msg) | ... | @@ -443,9 +424,9 @@ run_user_action (FILE *tty, const char *cr, mu_message_t msg) |
443 | } | 424 | } |
444 | } | 425 | } |
445 | mu_wordsplit_free (&ws); | 426 | mu_wordsplit_free (&ws); |
446 | locus.mu_line += n; | 427 | locus.mu_line++; |
447 | } | 428 | } |
448 | fclose (fp); | 429 | mu_stream_destroy (&input); |
449 | mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, | 430 | mu_stream_ioctl (mu_strerr, MU_IOCTL_LOGSTREAM, |
450 | MU_IOCTL_LOGSTREAM_SET_LOCUS, NULL); | 431 | MU_IOCTL_LOGSTREAM_SET_LOCUS, NULL); |
451 | free (rcname); | 432 | free (rcname); | ... | ... |
... | @@ -278,7 +278,7 @@ mu_mailbox_open (mu_mailbox_t mbox, int flag) | ... | @@ -278,7 +278,7 @@ mu_mailbox_open (mu_mailbox_t mbox, int flag) |
278 | if (flag & MU_STREAM_QACCESS) | 278 | if (flag & MU_STREAM_QACCESS) |
279 | { | 279 | { |
280 | /* Quick access mailboxes are read-only */ | 280 | /* Quick access mailboxes are read-only */ |
281 | if (flag & (MU_STREAM_WRITE | MU_STREAM_RDWR | 281 | if (flag & (MU_STREAM_WRITE |
282 | | MU_STREAM_APPEND | MU_STREAM_CREAT)) | 282 | | MU_STREAM_APPEND | MU_STREAM_CREAT)) |
283 | return EINVAL; /* FIXME: Better error code, please? */ | 283 | return EINVAL; /* FIXME: Better error code, please? */ |
284 | } | 284 | } | ... | ... |
-
Please register or sign in to post a comment