Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Dec 2015 21:41:51 +0000
From:      "Heyman, Jerrold" <Jerrold.Heyman@emc.com>
To:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   RE: <rpc/rpc.h> and rpc_createerr
Message-ID:  <9CDA60925D09954CA4BAD0284E2DFC4302585E@MX204CL01.corp.emc.com>
In-Reply-To: <566B391B.7090100@pix.net>
References:  <9CDA60925D09954CA4BAD0284E2DFC43024EDE@MX204CL01.corp.emc.com> <1449811260.30424.50.camel@michaeleichorn.com> <9CDA60925D09954CA4BAD0284E2DFC43025552@MX204CL01.corp.emc.com> <566B391B.7090100@pix.net>

next in thread | previous in thread | raw e-mail | index | archive | help
> -----Original Message-----
> From: owner-freebsd-hackers@freebsd.org [mailto:owner-freebsd-hackers@fre=
ebsd.org] On Behalf Of Kurt
> Lidl
> Sent: Friday, December 11, 2015 3:59 PM
> To: freebsd-hackers@freebsd.org
> Subject: Re: <rpc/rpc.h> and rpc_createerr
>=20
> 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 =3D=3D
> > 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 differ=
ent reasons.
> >
> > gcc complains that a '(' is found where a '{' is expected.
> > The cc error message is 'error: declaration of anyonymous struct must b=
e 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 / #en=
dif block.
> >
> > Is this an actual error, or is there something on FreeBSD that I need
> > to do that is different than the other platforms?
>=20
> Well, the rpc_clnt_client(3) manpage says:
>=20
> >      struct rpc_createerr rpc_createerr;
> >               A global variable whose value is set by any RPC client ha=
ndle
> >               creation routine that fails.  It is used by the routine
> >               clnt_pcreateerror() to print the reason for the failure.
>=20
> As a global variable, I'm not sure how you're going to have multiple diff=
erent ones...
>=20
> The following code compiles with no warnings -- note that the rpc_createe=
rr structure isn't allocated (explictly) in
> this code.
>=20
> #include <rpc/rpc.h>
> int main(int argc, char *argv[])
> {
> 	CLIENT *client =3D NULL;
>=20
> 	client =3D clnt_create("localhost", 1, 1, "udp");
>=20
> 	if (client =3D=3D NULL)
> 		return ((int)rpc_createerr.cf_stat);
>=20
> 	return 0;
> }

Kurt,

Compiling the above example code with -E gives the following for the return=
((int)rpc_createerr.cf_stat); line

return ((int)(*(__rpc_createerr())).cf_stat);

which is what is expected based on the #define.

Adding a declaration, 'struct rpc_createerr *ce;' results in the generation=
 of

struct (*(__rpc_createerr())) *ce;

Using (-E) compile option.  Again, correct textual substitution for the #de=
fine, but when compiling with -c I get the following=20

tester.c:6:4 error: declaration of anonymous struct must be a definition
     struct rpc_createerr *ce;
     ^
tester.c:6:4: warning: declaration does not declare anything [-Wmissing-dec=
larations]
    struct rpc_createerr *ce;
    ^^^^^

Jerry
Jerry Heyman                            |=20
Principal Software Engineer             |   Software is the difference betw=
een
EMC Data Domain                         |    hardware and reality
Jerrold.Heyman@emc.com / 919.597.7812   |





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