Re: [PATCH] Add checks for new and tmp directories to mx_is_maildir()

Fabian Groffen via Mutt-dev <[email protected]>
Newsgroups gmane.mail.mutt.devel
Message-ID <[email protected]>
On 09-02-2026 00:51:00 +0100, Gero Treuner wrote:
[...]
> I generalized the patch to cover subpaths of different lengths and also
> applied the optimization to mx_is_mh() .
> 
> IMO code clarity is sufficient. The array declarations could be moved
> inside the function, if that might further improve it. Repeated function
> calls are avoided, CPU cycles probably similar, and size of binary
> slightly reduced: ~100 Bytes for stripped mh.o and also affecting the
> final binary (not stripped) on my Debian Linux amd64 machine. But I
> assume that with different compilers, optimization flags and machines
> results vary.
> I decided against the proposed fstatat(), because most likely there are
> some mutt users on machines not supporting it. Adding detection and
> alternative code should be overengineering.
> 
> The code is custom-made to fit to the current buffer code. (Extending it
> would not be an option in an exercise to minimize code.)

I like this a lot.  It's clear and easily extendable.

Fabian


> This is low priority. I felt like having some diversion.
> 
> Here is the patch:
> 
> diff --git a/buffer.h b/buffer.h
> index e16c11db..dc8ffa7f 100644
> --- a/buffer.h
> +++ b/buffer.h
> @@ -31,6 +31,10 @@ typedef struct
>  /* Convert a buffer to a const char * "string" */
>  #define mutt_b2s(b) (b->data ? (const char *)b->data : "")
>  
> +/* For probing of base paths with varying sub parts (or similar) */
> +#define mutt_buffer_path_prepare(buf, path, saved_pos) (saved_pos = mutt_buffer_printf (buf, "%s/", path))
> +#define mutt_buffer_path_add(buf, s, saved_pos) (buf->dptr = buf->data + saved_pos, mutt_buffer_addstr (buf, s))
> +
>  BUFFER *mutt_buffer_new (void);
>  BUFFER *mutt_buffer_init (BUFFER *);
>  void mutt_buffer_free (BUFFER **);
> diff --git a/mh.c b/mh.c
> index b048a791..f03028df 100644
> --- a/mh.c
> +++ b/mh.c
> @@ -2742,26 +2742,25 @@ int mh_check_empty (const char *path)
>    return r;
>  }
>  
> +static const char * const maildir_subdirs[] = { "cur", "new", "tmp" };
> +
>  int mx_is_maildir (const char *path)
>  {
>    BUFFER *tmp = NULL;
>    struct stat st;
>    int rc = 0;
> +  int saved_pos;
> +  int i;
>  
>    tmp = mutt_buffer_pool_get ();
>  
> -  mutt_buffer_printf (tmp, "%s/cur", path);
> -  if (stat (mutt_b2s (tmp), &st) != 0 || !S_ISDIR (st.st_mode))
> -    goto out;
> -
> -  mutt_buffer_printf (tmp, "%s/new", path);
> -  if (stat (mutt_b2s (tmp), &st) != 0 || !S_ISDIR (st.st_mode))
> -    goto out;
> -
> -  mutt_buffer_printf (tmp, "%s/tmp", path);
> -  if (stat (mutt_b2s (tmp), &st) != 0 || !S_ISDIR (st.st_mode))
> -    goto out;
> -
> +  mutt_buffer_path_prepare (tmp, path, saved_pos);
> +  for (i = 0; i < mutt_array_size (maildir_subdirs); i++)
> +  {
> +    mutt_buffer_path_add(tmp, maildir_subdirs[i], saved_pos);
> +    if (stat (mutt_b2s (tmp), &st) != 0 || !S_ISDIR (st.st_mode))
> +      goto out;
> +  }
>    rc = 1;
>  
>  out:
> @@ -2769,42 +2768,35 @@ out:
>    return rc;
>  }
>  
> +static const char * const mh_files[] = {
> +  ".mh_sequences",
> +  ".xmhcache",
> +  ".mew_cache",
> +  ".mew-cache",
> +  ".sylpheed_cache",
> +  /*
> +   * ok, this isn't an mh folder, but mh mode can be used to read
> +   * Usenet news from the spool. ;-)
> +   */
> +  ".overview"
> +};
> +
>  int mx_is_mh (const char *path)
>  {
>    BUFFER *tmp = NULL;
>    int rc = 1;
> +  int saved_pos;
> +  int i;
>  
>    tmp = mutt_buffer_pool_get ();
>  
> -  mutt_buffer_printf (tmp, "%s/.mh_sequences", path);
> -  if (access (mutt_b2s (tmp), F_OK) == 0)
> -    goto out;
> -
> -  mutt_buffer_printf (tmp, "%s/.xmhcache", path);
> -  if (access (mutt_b2s (tmp), F_OK) == 0)
> -    goto out;
> -
> -  mutt_buffer_printf (tmp, "%s/.mew_cache", path);
> -  if (access (mutt_b2s (tmp), F_OK) == 0)
> -    goto out;
> -
> -  mutt_buffer_printf (tmp, "%s/.mew-cache", path);
> -  if (access (mutt_b2s (tmp), F_OK) == 0)
> -    goto out;
> -
> -  mutt_buffer_printf (tmp, "%s/.sylpheed_cache", path);
> -  if (access (mutt_b2s (tmp), F_OK) == 0)
> -    goto out;
> -
> -  /*
> -   * ok, this isn't an mh folder, but mh mode can be used to read
> -   * Usenet news from the spool. ;-)
> -   */
> -
> -  mutt_buffer_printf (tmp, "%s/.overview", path);
> -  if (access (mutt_b2s (tmp), F_OK) == 0)
> -    goto out;
> -
> +  mutt_buffer_path_prepare (tmp, path, saved_pos);
> +  for (i = 0; i < mutt_array_size (mh_files); i++)
> +  {
> +    mutt_buffer_path_add(tmp, mh_files[i], saved_pos);
> +    if (access (mutt_b2s (tmp), F_OK) == 0)
> +      goto out;
> +  }
>    rc = 0;
>  
>  out:
> 
> 
> 
> 
> Kind regards,
>    Gero
signature.asc (application/pgp-signature, 265 B)
-----BEGIN PGP SIGNATURE-----

iJEEABYKADkWIQTVZ7uEvqwb4Fv6o7r1Tg7q2DMGLwUCaYmjpxsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMSwwLDMACgkQ9U4O6tgzBi+6EgEAp9pCI0X+l8KU02ONlc6i
1aZU6xm4zNwQr8TsVMh3ckkBAMXVSgcmLSa7OIpjwZtKpUeEOemU6gk+u4WydRPT
2rIC
=DdhL
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.