diff options
Diffstat (limited to 'mail/mailline.c')
-rw-r--r-- | mail/mailline.c | 115 |
1 files changed, 37 insertions, 78 deletions
diff --git a/mail/mailline.c b/mail/mailline.c index 24c7e6e04..b5f1cf6eb 100644 --- a/mail/mailline.c +++ b/mail/mailline.c @@ -1,5 +1,5 @@ /* GNU Mailutils -- a suite of utilities for electronic mail - Copyright (C) 1999-2019 Free Software Foundation, Inc. + Copyright (C) 1999-2024 Free Software Foundation, Inc. GNU Mailutils is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,16 +18,18 @@ #include <sys/stat.h> #include <dirent.h> #include <mailutils/folder.h> -#include <mailutils/auth.h> #ifdef WITH_READLINE static char **ml_command_completion (char *cmd, int start, int end); static char *ml_command_generator (const char *text, int state); +static void ml_sig_handler (int); +#else +# define ml_sig_handler(n) #endif static volatile int _interrupted; -static RETSIGTYPE +static void sig_handler (int signo) { switch (signo) @@ -37,6 +39,7 @@ sig_handler (int signo) exit (0); _interrupted++; break; + #if defined (SIGWINCH) case SIGWINCH: util_do_command ("set screen=%d", util_getlines ()); @@ -45,6 +48,7 @@ sig_handler (int signo) break; #endif } + ml_sig_handler (signo); #ifndef HAVE_SIGACTION signal (signo, sig_handler); #endif @@ -96,6 +100,7 @@ ml_readline_init (void) rl_attempted_completion_function = (rl_completion_func_t*) ml_command_completion; rl_getc_function = ml_getc; + rl_catch_signals = 0; #endif #ifdef HAVE_SIGACTION { @@ -135,7 +140,10 @@ ml_readline_internal (void) return NULL; } if (n == 0) - return NULL; + { + free (buf); + return NULL; + } mu_rtrim_cset (buf, "\n"); return buf; } @@ -143,7 +151,7 @@ ml_readline_internal (void) char * ml_readline (const char *prompt) { - if (interactive) + if (interactive) return readline (prompt); return ml_readline_internal (); } @@ -159,6 +167,25 @@ ml_readline_with_intr (const char *prompt) #ifdef WITH_READLINE +/* Readline-specific signal handling */ +static void +ml_sig_handler (int sig) +{ + switch (sig) + { + case SIGINT: + rl_free_line_state (); + break; + +#if defined (SIGWINCH) + case SIGWINCH: + rl_resize_terminal (); + break; +#endif + } + rl_reset_after_signal (); +} + static char *insert_text; static int @@ -448,7 +475,6 @@ struct filegen mu_iterator_t itr; /* Iterator over this list */ size_t prefix_len; /* Length of initial prefix */ char repl; /* Character to replace initial prefix with */ - size_t path_len; /* Length of pathname part */ int flags; }; @@ -459,67 +485,7 @@ filegen_free (struct filegen *fg) mu_list_destroy (&fg->list); } -enum - { - any_folder, - local_folder - }; - -#define PREFIX_AUTO ((size_t)-1) - -static int -new_folder (mu_folder_t *pfolder, mu_url_t url, int type) -{ - mu_folder_t folder; - int rc; - - rc = mu_folder_create_from_record (&folder, url, NULL); - if (rc) - { - mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_create", - mu_url_to_string (url), rc); - return -1; - } - - if (!mu_folder_is_local (folder)) - { - if (type == local_folder) - { - mu_error ("%s", _("folder must be set to a local folder")); - mu_folder_destroy (&folder); - return -1; - } - - /* Set ticket for a remote folder */ - rc = mu_folder_attach_ticket (folder); - if (rc) - { - mu_authority_t auth = NULL; - - if (mu_folder_get_authority (folder, &auth) == 0 && auth) - { - mu_ticket_t tct; - mu_noauth_ticket_create (&tct); - rc = mu_authority_set_ticket (auth, tct); - if (rc) - mu_diag_funcall (MU_DIAG_ERROR, "mu_authority_set_ticket", - NULL, rc); - } - } - } - - rc = mu_folder_open (folder, MU_STREAM_READ); - if (rc) - { - mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_open", - mu_url_to_string (url), rc); - mu_folder_destroy (&folder); - return -1; - } - - *pfolder = folder; - return 0; -} +#define PREFIX_AUTO 0 static int folder_match_url (mu_folder_t folder, mu_url_t url) @@ -553,7 +519,6 @@ filegen_init (struct filegen *fg, mu_url_t url; int rc; int free_folder; - char const *urlpath; rc = mu_url_create (&url, folder_path); if (rc) @@ -575,7 +540,7 @@ filegen_init (struct filegen *fg, if (!folder) { - if (new_folder (&folder, url, type)) + if (util_get_folder (&folder, url, type)) return -1; free_folder = 1; } @@ -590,14 +555,7 @@ filegen_init (struct filegen *fg, strcat (wcard, "%"); pathref[i] = 0; - mu_url_sget_path (url, &urlpath); - fg->path_len = strlen (urlpath); - if (fg->path_len > 0 && urlpath[fg->path_len - 1] != '/') - fg->path_len++; - if (prefix_len == PREFIX_AUTO) - fg->prefix_len = fg->path_len; - else - fg->prefix_len = prefix_len; + fg->prefix_len = prefix_len; mu_folder_list (folder, pathref, wcard, 1, &fg->list); free (wcard); @@ -618,7 +576,7 @@ filegen_init (struct filegen *fg, struct mu_list_response *resp; mu_list_head (fg->list, (void**)&resp); if ((resp->type & MU_FOLDER_ATTRIBUTE_DIRECTORY) - && strcmp (resp->name + fg->path_len, text) == 0) + && strcmp (resp->name, text) == 0) ml_set_completion_append_character (resp->separator); } } @@ -735,6 +693,7 @@ header_generator (const char *text, int state) MU_HEADER_DELIVERY_DATE, MU_HEADER_ENVELOPE_TO, MU_HEADER_X_EXPIRE_TIMESTAMP, + MU_HEADER_USER_AGENT, NULL }; |