On Thu, Jul 13, 2023 at 07:10:50PM +0200, Laszlo Ersek wrote:
> Consider the following inverted call tree (effectively a dependency tree
> -- callees are at the top and near the left margin):
> 
>   lazy_make_tmpdir()                  [lib/tmpdirs.c]
>     guestfs_int_lazy_make_tmpdir()    [lib/tmpdirs.c]
>       guestfs_int_make_temp_path()    [lib/tmpdirs.c]
>     guestfs_int_lazy_make_sockdir()   [lib/tmpdirs.c]
>       guestfs_int_create_socketname() [lib/launch.c]
> 
> lazy_make_tmpdir() is our common workhorse / helper function that
> centralizes the mkdtemp() function call.
> 
> guestfs_int_lazy_make_tmpdir() and guestfs_int_lazy_make_sockdir() are the
> next level functions, both calling lazy_make_tmpdir(), just feeding it
> different dirname generator functions, and different "is_runtime_dir"
> qualifications. These functions create temp dirs for various, more
> specific, purposes (see the manual and "lib/guestfs-internal.h" for more
> details).
> 
> On a yet higher level are guestfs_int_make_temp_path() and
> guestfs_int_create_socketname() -- they serve for creating *entries* in
> those specific temp directories.
> 
> The discrepancy here is that, although all the other functions live in
> "lib/tmpdirs.c", guestfs_int_create_socketname() is defined in
> "lib/launch.c". That makes for a confusing code reading; move the function
> to "lib/tmpdirs.c", just below its sibling function
> guestfs_int_make_temp_path().
> 
> While at it, correct the leading comment on
> guestfs_int_create_socketname() -- the socket pathname is created in the
> socket directory, not in the temporary directory.
> 
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2184967
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
>  lib/guestfs-internal.h |  2 +-
>  lib/launch.c           | 26 --------------------
>  lib/tmpdirs.c          | 26 ++++++++++++++++++++
>  3 files changed, 27 insertions(+), 27 deletions(-)
> 
> diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
> index a6c4266ad3fe..2ee16ea1e75a 100644
> --- a/lib/guestfs-internal.h
> +++ b/lib/guestfs-internal.h
> @@ -668,6 +668,7 @@ extern int guestfs_int_set_env_runtimedir (guestfs_h *g, 
> const char *envname, co
>  extern int guestfs_int_lazy_make_tmpdir (guestfs_h *g);
>  extern int guestfs_int_lazy_make_sockdir (guestfs_h *g);
>  extern char *guestfs_int_make_temp_path (guestfs_h *g, const char *name, 
> const char *extension);
> +extern int guestfs_int_create_socketname (guestfs_h *g, const char 
> *filename, char (*sockname)[UNIX_PATH_MAX]);
>  extern char *guestfs_int_lazy_make_supermin_appliance_dir (guestfs_h *g);
>  extern void guestfs_int_remove_tmpdir (guestfs_h *g);
>  extern void guestfs_int_remove_sockdir (guestfs_h *g);
> @@ -700,7 +701,6 @@ extern int guestfs_int_get_uefi (guestfs_h *g, char 
> *const *firmwares, const cha
>  extern int64_t guestfs_int_timeval_diff (const struct timeval *x, const 
> struct timeval *y);
>  extern void guestfs_int_launch_send_progress (guestfs_h *g, int perdozen);
>  extern void guestfs_int_unblock_sigterm (void);
> -extern int guestfs_int_create_socketname (guestfs_h *g, const char 
> *filename, char (*sockname)[UNIX_PATH_MAX]);
>  extern void guestfs_int_register_backend (const char *name, const struct 
> backend_ops *);
>  extern int guestfs_int_set_backend (guestfs_h *g, const char *method);
>  extern bool guestfs_int_passt_runnable (guestfs_h *g);
> diff --git a/lib/launch.c b/lib/launch.c
> index 94c8f676d8bd..a0a8e1c45a51 100644
> --- a/lib/launch.c
> +++ b/lib/launch.c
> @@ -310,32 +310,6 @@ guestfs_impl_config (guestfs_h *g,
>    return 0;
>  }
>  
> -/**
> - * Create the path for a socket with the selected filename in the
> - * tmpdir.
> - */
> -int
> -guestfs_int_create_socketname (guestfs_h *g, const char *filename,
> -                               char (*sockpath)[UNIX_PATH_MAX])
> -{
> -  int r;
> -
> -  if (guestfs_int_lazy_make_sockdir (g) == -1)
> -    return -1;
> -
> -  r = snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", g->sockdir, filename);
> -  if (r >= UNIX_PATH_MAX) {
> -    error (g, _("socket path too long: %s/%s"), g->sockdir, filename);
> -    return -1;
> -  }
> -  if (r < 0) {
> -    perrorf (g, _("%s"), g->sockdir);
> -    return -1;
> -  }
> -
> -  return 0;
> -}
> -
>  /**
>   * When the library is loaded, each backend calls this function to
>   * register itself in a global list.
> diff --git a/lib/tmpdirs.c b/lib/tmpdirs.c
> index b8e19de2bf9e..24adf98daee0 100644
> --- a/lib/tmpdirs.c
> +++ b/lib/tmpdirs.c
> @@ -253,6 +253,32 @@ guestfs_int_make_temp_path (guestfs_h *g,
>                          extension ? extension : "");
>  }
>  
> +/**
> + * Create the path for a socket with the selected filename in the
> + * sockdir.
> + */
> +int
> +guestfs_int_create_socketname (guestfs_h *g, const char *filename,
> +                               char (*sockpath)[UNIX_PATH_MAX])
> +{
> +  int r;
> +
> +  if (guestfs_int_lazy_make_sockdir (g) == -1)
> +    return -1;
> +
> +  r = snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", g->sockdir, filename);
> +  if (r >= UNIX_PATH_MAX) {
> +    error (g, _("socket path too long: %s/%s"), g->sockdir, filename);
> +    return -1;
> +  }
> +  if (r < 0) {
> +    perrorf (g, _("%s"), g->sockdir);
> +    return -1;
> +  }
> +
> +  return 0;
> +}
> +
>  /**
>   * Create the supermin appliance directory under cachedir, if it does
>   * not exist.

This code evolved over at least a decade, hence the sometimes
inconsistent function names and placement.

Reviewed-by: Richard W.M. Jones <rjo...@redhat.com>

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to