diff options
-rw-r--r-- | imap4d/list.c | 23 | ||||
-rw-r--r-- | include/mailutils/sys/imap.h | 4 | ||||
-rw-r--r-- | libmailutils/cli/stdcapa.c | 2 | ||||
-rw-r--r-- | libmailutils/mailbox/fsfolder.c | 8 | ||||
-rw-r--r-- | libmailutils/mailbox/mbx_default.c | 2 | ||||
-rw-r--r-- | libmailutils/string/mkfilename.c | 63 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder.c | 8 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder00.at | 22 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder02.at | 2 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder03.at | 14 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder04.at | 12 | ||||
-rw-r--r-- | libproto/imap/folder.c | 141 | ||||
-rw-r--r-- | libproto/imap/genlist.c | 2 | ||||
-rw-r--r-- | libproto/imap/tests/imapfolder.c | 2 | ||||
-rw-r--r-- | mail/folders.c | 100 | ||||
-rw-r--r-- | mail/mail.h | 9 | ||||
-rw-r--r-- | mail/mailline.c | 80 | ||||
-rw-r--r-- | mail/util.c | 59 |
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; +} + |