[Libguestfs] [PATCH] inspect: improve canonical_mountpoint implementation

Richard W.M. Jones rjones at redhat.com
Fri Dec 9 13:15:21 UTC 2016


On Fri, Dec 09, 2016 at 02:02:51PM +0100, Pino Toscano wrote:
> Use a simplier version using a loop, skipping multiple '/' at once,
> reducing the amount of memmove and strlen needed.
> 
> Updates commit 865d070ddcbb071a919614f45c8eef8fcb4497ff.
> ---
>  src/inspect-fs-unix.c | 56 ++++++++++++++++++---------------------------------
>  1 file changed, 20 insertions(+), 36 deletions(-)
> 
> diff --git a/src/inspect-fs-unix.c b/src/inspect-fs-unix.c
> index 49ac3f9..7e940d6 100644
> --- a/src/inspect-fs-unix.c
> +++ b/src/inspect-fs-unix.c
> @@ -2130,44 +2130,28 @@ make_augeas_path_expression (guestfs_h *g, const char **configfiles)
>   * the same length or shorter than the argument passed.
>   */
>  static void
> -drop_char (char *mp)
> +canonical_mountpoint (char *s)
>  {
> -  size_t len = strlen (mp);
> -  memmove (&mp[0], &mp[1], len);
> -}
> +  size_t len = strlen (s);
> +  char *orig = s;
>  
> -static void
> -canonical_mountpoint_recursive (char *mp)
> -{
> -  if (mp[0] == '\0')
> -    return;
> +  s = strchr (s, '/');
> +  while (s != NULL && *s != 0) {
> +    char *pos = s + 1;
> +    char *p = pos;
> +    /* Find how many consecutive slashes are there after the one found,
> +     * and shift the characters after them accordingly. */
> +    while (*p == '/')
> +      ++p;
> +    if (p - pos > 0) {
> +      memmove (pos, p, len - (p - orig) + 1);
> +      len -= p - pos;
> +    }
>  
> -  /* Remove trailing slashes. */
> -  if (mp[0] == '/' && mp[1] == '\0') {
> -    mp[0] = '\0';
> -    return;
> +    s = strchr (pos, '/');
>    }
> -
> -  /* Replace multiple slashes with single slashes. */
> -  if (mp[0] == '/' && mp[1] == '/') {
> -    drop_char (mp);
> -    canonical_mountpoint_recursive (mp);
> -    return;
> -  }
> -
> -  canonical_mountpoint_recursive (&mp[1]);
> -}
> -
> -static void
> -canonical_mountpoint (char *mp)
> -{
> -  /* Collapse multiple leading slashes into a single slash ... */
> -  while (mp[0] == '/' && mp[1] == '/')
> -    drop_char (mp);
> -
> -  /* ... and then continue, skipping the leading slash. */
> -  if (mp[0] == '/')
> -    canonical_mountpoint_recursive (&mp[1]);
> -  else
> -    canonical_mountpoint_recursive (mp);
> +  /* Ignore the trailing slash, but avoid removing it for "/". */
> +  if (len > 1 && orig[len-1] == '/')
> +    --len;
> +  orig[len] = 0;
>  }

ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html




More information about the Libguestfs mailing list