summaryrefslogtreecommitdiff
path: root/mail/mailline.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mailline.c')
-rw-r--r--mail/mailline.c115
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
};

Return to:

Send suggestions and report system problems to the System administrator.