summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--imap4d/list.c23
-rw-r--r--include/mailutils/sys/imap.h4
-rw-r--r--libmailutils/cli/stdcapa.c2
-rw-r--r--libmailutils/mailbox/fsfolder.c8
-rw-r--r--libmailutils/mailbox/mbx_default.c2
-rw-r--r--libmailutils/string/mkfilename.c63
-rw-r--r--libmailutils/tests/fsfolder.c8
-rw-r--r--libmailutils/tests/fsfolder00.at22
-rw-r--r--libmailutils/tests/fsfolder02.at2
-rw-r--r--libmailutils/tests/fsfolder03.at14
-rw-r--r--libmailutils/tests/fsfolder04.at12
-rw-r--r--libproto/imap/folder.c141
-rw-r--r--libproto/imap/genlist.c2
-rw-r--r--libproto/imap/tests/imapfolder.c2
-rw-r--r--mail/folders.c100
-rw-r--r--mail/mail.h9
-rw-r--r--mail/mailline.c80
-rw-r--r--mail/util.c59
18 files changed, 389 insertions, 164 deletions
diff --git a/imap4d/list.c b/imap4d/list.c
index 5e1aa891e..b5190942b 100644
--- a/imap4d/list.c
+++ b/imap4d/list.c
@@ -23,7 +23,8 @@ struct refinfo
char const *refptr; /* Original reference */
size_t reflen; /* Length of the original reference */
struct namespace_prefix const *pfx;
- size_t dirlen; /* Length of the current directory prefix */
+ int delim; /* If not 0, this character will be inserted between
+ the original reference and mailbox name */
char *buf;
size_t bufsize;
};
@@ -36,7 +37,7 @@ list_fun (mu_folder_t folder, struct mu_list_response *resp, void *data)
size_t size;
char *p;
- name = resp->name + refinfo->dirlen;
+ name = resp->name;
/* There can be only one INBOX */
if (refinfo->reflen == 0 && mu_c_strcasecmp (name, "INBOX") == 0)
@@ -77,12 +78,14 @@ list_fun (mu_folder_t folder, struct mu_list_response *resp, void *data)
{
memcpy (refinfo->buf, refinfo->refptr, refinfo->reflen);
p = refinfo->buf + refinfo->reflen;
+ if (refinfo->delim)
+ *p++ = refinfo->delim;
}
else
p = refinfo->buf;
if (*name)
translate_delim (p, name, refinfo->pfx->delim, resp->separator);
-
+
name = refinfo->buf;
if (strpbrk (name, "\"{}"))
@@ -119,8 +122,6 @@ list_ref (char const *ref, char const *wcard, char const *cwd,
int rc;
struct refinfo refinfo;
mu_folder_t folder;
- char const *dir;
- mu_url_t url;
struct mu_folder_scanner scn = MU_FOLDER_SCANNER_INITIALIZER;
if (!wcard[0])
@@ -168,14 +169,10 @@ list_ref (char const *ref, char const *wcard, char const *cwd,
refinfo.refptr = ref;
refinfo.reflen = strlen (ref);
- mu_folder_get_url (folder, &url);
- mu_url_sget_path (url, &dir);
- refinfo.dirlen = strlen (dir);
-
- if (refinfo.refptr[refinfo.reflen-1] == pfx->delim)
- refinfo.reflen--;
- else if (strcmp (ref, pfx->prefix) == 0)
- refinfo.dirlen++;
+ /* Insert delimiter after the reference prefix, unless the latter already
+ ends with a delimiter or is the same as the namespace prefix. */
+ if (ref[refinfo.reflen-1] != pfx->delim && strcmp (ref, pfx->prefix))
+ refinfo.delim = pfx->delim;
/* The special name INBOX is included in the output from LIST, if
INBOX is supported by this server for this user and if the
diff --git a/include/mailutils/sys/imap.h b/include/mailutils/sys/imap.h
index 381443147..4752b9e71 100644
--- a/include/mailutils/sys/imap.h
+++ b/include/mailutils/sys/imap.h
@@ -110,6 +110,10 @@ struct _mu_imap
int mbox_writable:1; /* Is it open read/write? */
struct mu_imap_stat mbox_stat; /* Stats obtained from it */
+ /* Folder data */
+ int separator; /* Separator character */
+ size_t prefix_len; /* Path prefix length */
+
/* Callbacks */
struct
{
diff --git a/libmailutils/cli/stdcapa.c b/libmailutils/cli/stdcapa.c
index 1d496161c..12a088546 100644
--- a/libmailutils/cli/stdcapa.c
+++ b/libmailutils/cli/stdcapa.c
@@ -466,8 +466,6 @@ cb_locker_type (void *data, mu_config_value_t *val)
static int
cb_locker_external (void *data, mu_config_value_t *val)
{
- int t;
-
if (mu_cfg_assert_value_type (val, MU_CFG_STRING))
return 1;
diff --git a/libmailutils/mailbox/fsfolder.c b/libmailutils/mailbox/fsfolder.c
index 805aea626..0b3e59a4a 100644
--- a/libmailutils/mailbox/fsfolder.c
+++ b/libmailutils/mailbox/fsfolder.c
@@ -146,7 +146,7 @@ _fsfolder_close (mu_folder_t folder MU_ARG_UNUSED)
static int
_fsfolder_rename (mu_folder_t folder, const char *oldpath,
- const char *newpath)
+ const char *newpath)
{
struct _mu_fsfolder *fsfolder = folder->data;
if (oldpath && newpath)
@@ -188,6 +188,7 @@ struct folder_scan_data
mu_folder_t folder;
char *dirname;
size_t dirlen;
+ size_t prefix_len;
size_t errcnt;
};
@@ -376,7 +377,7 @@ list_helper (struct mu_folder_scanner *scn,
}
else
{
- resp->name = fname;
+ resp->name = strdup (fname + data->prefix_len + 1);
resp->depth = depth;
resp->separator = '/';
resp->type = type;
@@ -458,6 +459,9 @@ _fsfolder_list (mu_folder_t folder, struct mu_folder_scanner *scn)
sdata.folder = folder;
sdata.dirname = get_pathname (fsfolder->dirname, scn->refname);
sdata.dirlen = strlen (sdata.dirname);
+ sdata.prefix_len = strlen (fsfolder->dirname);
+ if (sdata.prefix_len > 0 && fsfolder->dirname[sdata.prefix_len-1] == '/')
+ sdata.prefix_len--;
sdata.errcnt = 0;
list_helper (scn, &sdata, &iroot, sdata.dirname, 0);
free (sdata.dirname);
diff --git a/libmailutils/mailbox/mbx_default.c b/libmailutils/mailbox/mbx_default.c
index 389eb6962..2571d21b7 100644
--- a/libmailutils/mailbox/mbx_default.c
+++ b/libmailutils/mailbox/mbx_default.c
@@ -299,7 +299,7 @@ plus_expand (const char *file, char **buf)
else
{
file++;
-
+
if (folder_dir[0] == '/' || mu_is_proto (folder_dir))
{
char *p = mu_make_file_name (folder_dir, file);
diff --git a/libmailutils/string/mkfilename.c b/libmailutils/string/mkfilename.c
index 653ac7a2a..d24d2f48a 100644
--- a/libmailutils/string/mkfilename.c
+++ b/libmailutils/string/mkfilename.c
@@ -21,30 +21,67 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include <mailutils/alloc.h>
#include <mailutils/util.h>
+/*
+ * Given directory name DIR, file name FILE and optional suffix SUF,
+ * return full pathname composed from these three. In the resulting
+ * string, DIR and FILE are separated by '/'. If SUF is supplied, it
+ * is concatenated to the resulting string without additional
+ * separators.
+ *
+ * Corner cases:
+ * all three arguments are NULL or empty
+ * Return NULL and set errno to EINVAL.
+ * dir is NULL
+ * Return FILE and SUF concatenated.
+ * file is NULL, suf is not NULL
+ * Same as mu_make_file_name_suf(dir, suf, NULL);
+ * file is NULL, suf is NULL
+ * Return allocated copy of DIR.
+ */
char *
mu_make_file_name_suf (const char *dir, const char *file, const char *suf)
{
char *tmp;
- size_t dirlen = strlen (dir);
- size_t suflen = suf ? strlen (suf) : 0;
- size_t fillen = strlen (file);
+ size_t dirlen, suflen, fillen;
size_t len;
- while (dirlen > 0 && dir[dirlen-1] == '/')
- dirlen--;
-
- len = dirlen + (dir[0] ? 1 : 0) + fillen + suflen;
- tmp = mu_alloc (len + 1);
+ dirlen = dir ? strlen (dir) : 0;
+ fillen = file ? strlen (file) : 0;
+ suflen = suf ? strlen (suf) : 0;
+
+ len = suflen + fillen;
+ if (dirlen == 0)
+ {
+ if (len == 0)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+ }
+ else
+ {
+ if (len) len++; // account for the '/' separator
+ while (dirlen > 0 && dir[dirlen-1] == '/')
+ dirlen--;
+ }
+ len += dirlen;
+
+ tmp = malloc (len + 1);
if (tmp)
{
- memcpy (tmp, dir, dirlen);
- if (dir[0])
- tmp[dirlen++] = '/';
- memcpy (tmp + dirlen, file, fillen);
- if (suf)
+ if (dirlen)
+ {
+ memcpy (tmp, dir, dirlen);
+ if (fillen || suflen)
+ tmp[dirlen++] = '/';
+ }
+ if (fillen)
+ memcpy (tmp + dirlen, file, fillen);
+ if (suflen)
memcpy (tmp + dirlen + fillen, suf, suflen);
tmp[len] = 0;
}
diff --git a/libmailutils/tests/fsfolder.c b/libmailutils/tests/fsfolder.c
index 6a4a8ec39..3f8333406 100644
--- a/libmailutils/tests/fsfolder.c
+++ b/libmailutils/tests/fsfolder.c
@@ -37,7 +37,6 @@
#include "tesh.h"
int sort_option;
-int prefix_len;
static int
compare_response (void const *a, void const *b)
@@ -81,7 +80,7 @@ com_list (int argc, char **argv, mu_assoc_t options, void *env)
{
if (sort_option)
mu_list_sort (list, compare_response);
- mu_list_foreach (list, _print_list_entry, &prefix_len);
+ mu_list_foreach (list, _print_list_entry, NULL);
mu_list_destroy (&list);
}
return 0;
@@ -211,7 +210,7 @@ com_scan (int argc, char **argv, mu_assoc_t options, void *env)
{
if (sort_option)
mu_list_sort (scn.result, compare_response);
- mu_list_foreach (scn.result, _print_list_entry, &prefix_len);
+ mu_list_foreach (scn.result, _print_list_entry, NULL);
mu_list_destroy (&scn.result);
}
mu_list_destroy (&scn.records);
@@ -347,9 +346,6 @@ main (int argc, char **argv)
if (fname[0] != '/')
{
char *cwd = mu_getcwd ();
- prefix_len = strlen (cwd);
- if (cwd[prefix_len-1] != '/')
- prefix_len++;
fname = mu_make_file_name (cwd, fname);
free (cwd);
}
diff --git a/libmailutils/tests/fsfolder00.at b/libmailutils/tests/fsfolder00.at
index e82ef28b2..574e74068 100644
--- a/libmailutils/tests/fsfolder00.at
+++ b/libmailutils/tests/fsfolder00.at
@@ -34,20 +34,20 @@ fsfolder -name=dir -sort dnl
],
[0],
[listing '' '*'
--f / 0 dir/bar
--f / 0 dir/foo
--f / 0 dir/foo.mbox
-d- / 0 dir/subdir
--f / 1 dir/subdir/baz.mbox
--f / 1 dir/subdir/file
+-f / 0 bar
+-f / 0 foo
+-f / 0 foo.mbox
+d- / 0 subdir
+-f / 1 subdir/baz.mbox
+-f / 1 subdir/file
listing 'subdir' '*'
--f / 0 dir/subdir/baz.mbox
--f / 0 dir/subdir/file
+-f / 0 subdir/baz.mbox
+-f / 0 subdir/file
listing '' '*.mbox'
--f / 0 dir/foo.mbox
--f / 1 dir/subdir/baz.mbox
+-f / 0 foo.mbox
+-f / 1 subdir/baz.mbox
listing 'subdir' '*.mbox'
--f / 0 dir/subdir/baz.mbox
+-f / 0 subdir/baz.mbox
])
AT_CLEANUP
diff --git a/libmailutils/tests/fsfolder02.at b/libmailutils/tests/fsfolder02.at
index f8d3fdfb9..562e7e3e2 100644
--- a/libmailutils/tests/fsfolder02.at
+++ b/libmailutils/tests/fsfolder02.at
@@ -29,7 +29,7 @@ fsfolder -name=dir rename bar baz
[renaming foo to bar
rename successful
listing '' '*'
--f / 0 dir/bar
+-f / 0 bar
renaming bar to baz
],
[fsfolder: mu_folder_rename(bar) failed: File exists
diff --git a/libmailutils/tests/fsfolder03.at b/libmailutils/tests/fsfolder03.at
index 0bee92adb..0b9fd9578 100644
--- a/libmailutils/tests/fsfolder03.at
+++ b/libmailutils/tests/fsfolder03.at
@@ -32,13 +32,13 @@ fsfolder -name=dir -sort scan -maxdepth=2
],
[0],
[maxdepth=1
-d- / 0 dir/a
-d- / 0 dir/b
+d- / 0 a
+d- / 0 b
maxdepth=2
-d- / 0 dir/a
-d- / 0 dir/b
-d- / 1 dir/a/b
-d- / 1 dir/b/b
-d- / 1 dir/b/c
+d- / 0 a
+d- / 0 b
+d- / 1 a/b
+d- / 1 b/b
+d- / 1 b/c
])
AT_CLEANUP
diff --git a/libmailutils/tests/fsfolder04.at b/libmailutils/tests/fsfolder04.at
index 5a6929958..4e08e7db9 100644
--- a/libmailutils/tests/fsfolder04.at
+++ b/libmailutils/tests/fsfolder04.at
@@ -29,13 +29,13 @@ fsfolder -name=dir -sort scan -type=reg
],
[0],
[type=any
--f / 0 dir/1
-d- / 0 dir/a
-d- / 0 dir/b
--f / 1 dir/a/2
+-f / 0 1
+d- / 0 a
+d- / 0 b
+-f / 1 a/2
type=reg
--f / 0 dir/1
--f / 1 dir/a/2
+-f / 0 1
+-f / 1 a/2
])
AT_CLEANUP
diff --git a/libproto/imap/folder.c b/libproto/imap/folder.c
index 94e289c0d..efed97f4d 100644
--- a/libproto/imap/folder.c
+++ b/libproto/imap/folder.c
@@ -261,14 +261,93 @@ _enumerate_helper (void *item, void *data)
return clos->fun (clos->folder, rp, clos->data);
}
+static int
+_mu_imap_folder_separator (mu_folder_t folder, int *sep)
+{
+ mu_imap_t imap = folder->data;
+
+ if (imap->separator == 0)
+ {
+ struct mu_list_response *resp;
+ char const *path;
+ int rc;
+ mu_list_t list;
+
+ if (mu_url_sget_path (folder->url, &path) || strcmp (path, "INBOX") == 0)
+ path = "";
+
+ rc = mu_imap_list_new (imap, path, "%", &list);
+ if (rc)
+ return rc;
+ if (mu_list_head (list, (void**)&resp))
+ return ENOENT; /* FIXME: Better return code? */
+ imap->separator = resp->separator;
+ imap->prefix_len = strlen (path) + 1;
+ mu_list_destroy (&list);
+ }
+
+ if (sep)
+ *sep = imap->separator;
+
+ return 0;
+}
+
+static int
+_mu_imap_folder_pathname (mu_folder_t folder, char const *name, char **retname)
+{
+ char const *folder_path;
+ char *pathname;
+
+ if (mu_url_sget_path (folder->url, &folder_path) ||
+ strcmp (folder_path, "INBOX") == 0)
+ {
+ pathname = strdup (name);
+ }
+ else
+ {
+ int sep;
+ size_t len;
+ int rc;
+
+ rc = _mu_imap_folder_separator (folder, &sep);
+ if (rc)
+ return rc;
+
+ len = strlen (folder_path) + (name ? strlen (name) : 0) + 2;
+ pathname = malloc (len);
+ if (pathname)
+ {
+ char *p = mu_stpcpy (pathname, folder_path);
+ *p++ = sep;
+ if (name)
+ mu_stpcpy (p, name);
+ }
+ }
+
+ if (!pathname)
+ return errno;
+
+ *retname = pathname;
+
+ return 0;
+}
+
/* NOTE: scn->records is ignored */
static int
_mu_imap_folder_list (mu_folder_t folder, struct mu_folder_scanner *scn)
{
mu_imap_t imap = folder->data;
mu_list_t list;
- int rc = mu_imap_list_new (imap, scn->refname, scn->pattern, &list);
+ int rc;
+ char *refname;
+
+ rc = _mu_imap_folder_pathname (folder, scn->refname, &refname);
+ if (rc)
+ return rc;
+ rc = mu_imap_list_new (imap, refname, scn->pattern, &list);
+ free (refname);
+
if (rc)
return rc;
@@ -322,7 +401,15 @@ _mu_imap_folder_lsub (mu_folder_t folder, const char *ref, const char *name,
mu_list_t flist)
{
mu_imap_t imap = folder->data;
- return mu_imap_lsub (imap, ref, name, flist);
+ char *refpath;
+ int rc;
+
+ if ((rc = _mu_imap_folder_pathname (folder, ref, &refpath)) == 0)
+ {
+ rc = mu_imap_lsub (imap, refpath, name, flist);
+ free (refpath);
+ }
+ return rc;
}
/* Subscribe to the named mailbox. */
@@ -330,14 +417,30 @@ static int
_mu_imap_folder_subscribe (mu_folder_t folder, const char *name)
{
mu_imap_t imap = folder->data;
- return mu_imap_subscribe (imap, name);
+ char *path;
+ int rc;
+
+ if ((rc = _mu_imap_folder_pathname (folder, name, &path)) == 0)
+ {
+ rc = mu_imap_subscribe (imap, path);
+ free (path);
+ }
+ return rc;
}
/* Unsubscribe from the mailbox. */
static int
_mu_imap_folder_unsubscribe (mu_folder_t folder, const char *name)
{
mu_imap_t imap = folder->data;
- return mu_imap_unsubscribe (imap, name);
+ char *path;
+ int rc;
+
+ if ((rc = _mu_imap_folder_pathname (folder, name, &path)) == 0)
+ {
+ rc = mu_imap_unsubscribe (imap, path);
+ free (path);
+ }
+ return rc;
}
/* Remove a mailbox. */
@@ -345,16 +448,36 @@ static int
_mu_imap_folder_delete (mu_folder_t folder, const char *name)
{
mu_imap_t imap = folder->data;
- return mu_imap_delete (imap, name);
+ char *path;
+ int rc;
+
+ if ((rc = _mu_imap_folder_pathname (folder, name, &path)) == 0)
+ {
+ rc = mu_imap_delete (imap, path);
+ free (path);
+ }
+ return rc;
}
-/* Rename OLDPATH to NEWPATH */
+/* Rename OLDNAME to NEWNAME */
static int
-_mu_imap_folder_rename (mu_folder_t folder, const char *oldpath,
- const char *newpath)
+_mu_imap_folder_rename (mu_folder_t folder, const char *oldname,
+ const char *newname)
{
mu_imap_t imap = folder->data;
- return mu_imap_rename (imap, oldpath, newpath);
+ char *oldpath, *newpath;
+ int rc;
+
+ if ((rc = _mu_imap_folder_pathname (folder, oldname, &oldpath)) == 0)
+ {
+ if ((rc = _mu_imap_folder_pathname (folder, newname, &newpath)) == 0)
+ {
+ rc = mu_imap_rename (imap, oldpath, newpath);
+ free (newpath);
+ }
+ free (oldpath);
+ }
+ return rc;
}
typedef int (*auth_method_t) (mu_authority_t);
diff --git a/libproto/imap/genlist.c b/libproto/imap/genlist.c
index 5d9ba1be3..f55c79333 100644
--- a/libproto/imap/genlist.c
+++ b/libproto/imap/genlist.c
@@ -95,7 +95,7 @@ list_untagged_handler (mu_imap_t imap, mu_list_t resp, void *data)
elt = _mu_imap_list_at (resp, 3);
if (!(elt && elt->type == imap_eltype_string))
return;
- rp->name = strdup (elt->v.string);
+ rp->name = strdup (elt->v.string + imap->prefix_len);
if (!rp->name)
{
free (rp);
diff --git a/libproto/imap/tests/imapfolder.c b/libproto/imap/tests/imapfolder.c
index f01ef0513..6d0e11dd0 100644
--- a/libproto/imap/tests/imapfolder.c
+++ b/libproto/imap/tests/imapfolder.c
@@ -192,7 +192,7 @@ main (int argc, char **argv)
if (!fname)
{
- mu_error ("URL not specified");
+ usage ();
exit (1);
}
diff --git a/mail/folders.c b/mail/folders.c
index c85feeb46..217a653b0 100644
--- a/mail/folders.c
+++ b/mail/folders.c
@@ -15,33 +15,103 @@
along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
#include "mail.h"
+#include <mailutils/folder.h>
-/*
- * folders
- */
+static int
+list_response_printer (void *item, void *data)
+{
+ struct mu_list_response *resp = item;
+
+ mu_printf ("%s", resp->name);
+ if (resp->type & MU_FOLDER_ATTRIBUTE_DIRECTORY)
+ mu_printf ("%c", resp->separator);
+ mu_printf ("\n");
+ return 0;
+}
+
+static int
+show_folders (mu_folder_t folder)
+{
+ mu_list_t list;
+
+ if (mu_folder_is_local (folder))
+ {
+ char *lister = getenv ("LISTER");
+ if (lister && *lister)
+ {
+ char const *path;
+ mu_url_t url;
+ int rc;
+
+ mu_folder_get_url (folder, &url);
+ if ((rc = mu_url_sget_path (url, &path)) == 0)
+ {
+ util_do_command("! %s '%s'", getenv ("LISTER"), path);
+ return 0;
+ }
+ else
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_url_sget_path", NULL, rc);
+ /* Retry using standard folder lister */
+ }
+ }
+ }
+
+ if (mu_folder_list (folder, "", "%", 1, &list) == 0)
+ {
+ mu_list_foreach (list, list_response_printer, NULL);
+ mu_list_destroy (&list);
+ }
+
+ return 0;
+}
int
mail_folders (int argc MU_ARG_UNUSED, char **argv MU_ARG_UNUSED)
{
- char *path;
-
- if (mailvar_get (&path, mailvar_name_folder, mailvar_type_string, 1))
+ int rc;
+ mu_folder_t folder;
+ mu_url_t url;
+ char *folder_path, *temp_folder_path = NULL;
+
+ if (mailvar_get (&folder_path, mailvar_name_folder, mailvar_type_string, 1))
return 1;
- if (path[0] != '/' && path[0] != '~')
+ if (!mu_is_proto (folder_path) && folder_path[0] != '/' &&
+ folder_path[0] != '~')
{
- char *tmp = mu_alloc (strlen (path) + 3);
+ char *tmp = mu_alloc (strlen (folder_path) + 3);
tmp[0] = '~';
tmp[1] = '/';
- strcpy (tmp + 2, path);
- path = util_fullpath (tmp);
+ strcpy (tmp + 2, folder_path);
+ temp_folder_path = util_fullpath (tmp);
+ folder_path = temp_folder_path;
free (tmp);
}
- else
- path = util_fullpath (path);
- util_do_command("! %s '%s'", getenv ("LISTER"), path);
- free (path);
+ rc = mu_url_create (&url, folder_path);
+ if (rc == 0)
+ {
+ rc = util_get_folder (&folder, url, any_folder);
+ if (rc == 0)
+ {
+ url = NULL; /* Prevent double free: folder steals url */
+ rc = show_folders (folder);
+ mu_folder_destroy (&folder);
+ }
+ else
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_mailbox_get_folder",
+ folder_path, rc);
+ }
+ }
+ else
+ {
+ mu_diag_funcall (MU_DIAG_ERROR, "mu_url_create", folder_path, rc);
+ }
- return 0;
+ free (temp_folder_path);
+ mu_url_destroy (&url);
+ return rc;
}
+
diff --git a/mail/mail.h b/mail/mail.h
index 8ca2d8ecd..d12e4429c 100644
--- a/mail/mail.h
+++ b/mail/mail.h
@@ -546,6 +546,15 @@ const char *alias_iterate_next (alias_iterator_t itr);
const char *alias_iterate_first (const char *p, alias_iterator_t *itr);
void alias_iterate_end (alias_iterator_t *itr);
+/* Auxiliary functions for accessing folders */
+enum
+ {
+ any_folder,
+ local_folder
+ };
+
+int util_get_folder (mu_folder_t *pfolder, mu_url_t url, int type);
+
int mail_sender (int argc, char **argv);
int mail_nosender (int argc, char **argv);
mu_address_t get_sender_address (mu_message_t msg);
diff --git a/mail/mailline.c b/mail/mailline.c
index 0b57cbece..c6ecdf1df 100644
--- a/mail/mailline.c
+++ b/mail/mailline.c
@@ -18,7 +18,6 @@
#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);
@@ -476,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;
};
@@ -487,69 +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)
- {
- /* TRANSLATORS: The subject of this sentence ("folder") is the
- name of the variable. Don't translate it. */
- 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)
@@ -583,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)
@@ -605,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;
}
@@ -620,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);
@@ -648,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);
}
}
diff --git a/mail/util.c b/mail/util.c
index f92f91e36..bc79ad178 100644
--- a/mail/util.c
+++ b/mail/util.c
@@ -17,6 +17,8 @@
#include "mail.h"
#include <mailutils/util.h>
#include <mailutils/mime.h>
+#include <mailutils/folder.h>
+#include <mailutils/auth.h>
#include <pwd.h>
#ifdef HAVE_TERMIOS_H
# include <termios.h>
@@ -1204,3 +1206,60 @@ open_pager (size_t lines)
}
return str;
}
+
+int
+util_get_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)
+ {
+ /* TRANSLATORS: The subject of this sentence ("folder") is the
+ name of the variable. Don't translate it. */
+ 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;
+}
+

Return to:

Send suggestions and report system problems to the System administrator.