Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Dec 2015 15:59:07 -0500
From:      Kurt Lidl <lidl@pix.net>
To:        freebsd-hackers@freebsd.org
Subject:   Re: <rpc/rpc.h> and rpc_createerr
Message-ID:  <566B391B.7090100@pix.net>
In-Reply-To: <9CDA60925D09954CA4BAD0284E2DFC43025552@MX204CL01.corp.emc.com>
References:  <9CDA60925D09954CA4BAD0284E2DFC43024EDE@MX204CL01.corp.emc.com> <1449811260.30424.50.camel@michaeleichorn.com> <9CDA60925D09954CA4BAD0284E2DFC43025552@MX204CL01.corp.emc.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 12/11/15 10:22 AM, Heyman, Jerrold wrote:
> Originally posted to freebsd-questions, which recommended I come here
>
> I've just installed FreeBSD 10.2 in order to determine the portability
> of my companies code.  Built gcc4.6 out of the ports/lang area, but
> see the same issue using /usr/bin/cc (clang 3.4.1).
>
> in /usr/include/rpc/clnt.h the following snippet:
>
> /*
> * If a creation fails, the following allows the user to figure out why.
> */
> struct rpc_createerr {
>          enum clnt_stat cf_stat;
>          struct rpc_err cf_error;  /* userful when cf_stat == RPC_PMAPFAILURE */
> };
>
> __BEGIN_DECLS
> extern struct rpc_createerr    *__rpc_createeer(void);
> __END_DECLS
> #define rpc_createerr          (*(__rpc_createeerr()))
>
> Note that the #define becomes active once the file is included, and in
> my source code I have multiple
>
>     struct rpc_createerr *ce;
>
> declarations.  Both cc and gcc cite this as an error, though for different reasons.
>
> gcc complains that a '(' is found where a '{' is expected.
> The cc error message is 'error: declaration of anyonymous struct must be a definition'.
>
> My other ports - Linux, AIX, Solaris, Mac OSX, do not have the #define in /usr/include/rpc/clnt.h.
> The HP-UX does, but it is encapsulated within a #ifdef _REENTRANT / #endif block.
>
> Is this an actual error, or is there something on FreeBSD that I need
> to do that is different than the other platforms?

Well, the rpc_clnt_client(3) manpage says:

>      struct rpc_createerr rpc_createerr;
>               A global variable whose value is set by any RPC client handle
>               creation routine that fails.  It is used by the routine
>               clnt_pcreateerror() to print the reason for the failure.

As a global variable, I'm not sure how you're going to have multiple
different ones...

The following code compiles with no warnings -- note that the
rpc_createerr structure isn't allocated (explictly) in this code.

#include <rpc/rpc.h>
int main(int argc, char *argv[])
{
	CLIENT *client = NULL;

	client = clnt_create("localhost", 1, 1, "udp");

	if (client == NULL)
		return ((int)rpc_createerr.cf_stat);

	return 0;
}

-Kurt






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?566B391B.7090100>