[prev in list] [next in list] [prev in thread] [next in thread]
List: freebsd-hackers
Subject: RE: <rpc/rpc.h> and rpc_createerr
From: "Heyman, Jerrold" <Jerrold.Heyman () emc ! com>
Date: 2015-12-11 21:41:51
Message-ID: 9CDA60925D09954CA4BAD0284E2DFC4302585E () MX204CL01 ! corp ! emc ! com
[Download RAW message or body]
> -----Original Message-----
> From: owner-freebsd-hackers@freebsd.org [mailto:owner-freebsd-hackers@freebsd.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
>
> 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,
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 #define, but \
when compiling with -c I get the following
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-declarations]
struct rpc_createerr *ce;
^^^^^
Jerry
Jerry Heyman |
Principal Software Engineer | Software is the difference between
EMC Data Domain | hardware and reality
Jerrold.Heyman@emc.com / 919.597.7812 |
_______________________________________________
freebsd-hackers@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic