Re: [Libguestfs] [PATCH 3/3] lib: Add third, zero parameter to xdrproc_t

Richard W.M. Jones
Thu, 12 Feb 2015 20:33:32 -0000

On Thu, Feb 12, 2015 at 05:28:48PM +0000, Margaret Lewicka
wrote:
> As advised by Daniel P. Berrange, the third parameter can be passed on all
> platforms rather than specifically Mac.
>
> Quoting a libvirt commit rationale after Daniel:
>
>  commit 9fa3a8ab6fd82ad2f5a14b490696085061418718
>  Author: Doug Goldstein <cardoe@cardoe.com>
>  Date:   Wed Oct 30 11:22:58 2013 -0500
>
>    MacOS: Handle changes to xdrproc_t definition
>
>    With Mac OS X 10.9, xdrproc_t is no longer defined as:
>
>    typedef bool_t (*xdrproc_t)(XDR *, ...);
>
>    but instead as:
>
>    typedef bool_t (*xdrproc_t)(XDR *, void *, unsigned int);
>
>    For reference, Linux systems typically define it as:
>
>    typedef bool_t (*xdrproc_t)(XDR *, void *, ...);
>
>    The rationale explained in the header is that using a vararg is
>    incorrect and has a potential to change the ABI slightly do to compiler
>    optimizations taken and the undefined behavior. They decided
>    to specify the exact number of parameters and for compatibility with old
>    code decided to make the signature require 3 arguments. The third
>    argument is ignored for cases that its not used and its recommended to
>    supply a 0.
> ---
>  src/proto.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/src/proto.c b/src/proto.c
> index 92ae84d..e229abb 100644
> --- a/src/proto.c
> +++ b/src/proto.c
> @@ -252,7 +252,7 @@ guestfs___send (guestfs_h *g, int proc_nr,
>     * have no parameters.
>     */
>    if (xdrp) {
> -    if (!(*xdrp) (&xdr, args)) {
> +    if (!(*xdrp) (&xdr, args, 0)) {
>        error (g, _("dispatch failed to marshal args"));
>        return -1;
>      }
> @@ -681,7 +681,7 @@ guestfs___recv (guestfs_h *g, const char *fn,
>        return -1;
>      }
>    } else {
> -    if (xdrp && ret && !xdrp (&xdr, ret)) {
> +    if (xdrp && ret && !xdrp (&xdr, ret, 0)) {
>        error (g, "%s: failed to parse reply", fn);
>        xdr_destroy (&xdr);
>        return -1;
> --
> 1.9.3

This works fine for me, so pushed.

Thanks,

Rich.

--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org