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>