Subject: bin/6788: rpcgen -N generates incorrect prototype
To: None <gnats-bugs@gnats.netbsd.org>
From: None <Valtteri.Vuorikoski@datafellows.com>
List: netbsd-bugs
Date: 01/11/1999 12:45:30
>Number:         6788
>Category:       bin
>Synopsis:       rpcgen -N generates incorrect prototype
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Jan 11 02:50:03 1999
>Last-Modified:
>Originator:     Valtteri Vuorikoski
>Organization:
Data Fellows
>Release:        1.3.2
>Environment:
System: NetBSD xxx 1.3.2 NetBSD 1.3.2 (xxx) #0: Mon Dec 7 17:00:14 EET 1998 vuorva@xxx:xxx i386


>Description:
	rpcgen -N foo.x will generate a prototype in foo.h that does not match the
	function in foo_xdr.c for rpc functions with multiple arguments. The second
	argument of the relevant XDR function should be a pointer, but is not marked
	as such in the header (the output in foo_xdr.c is correct).

	Also tested with -current rpcgen.

>How-To-Repeat:
	rpcgen -N -C the following:

program FOOPROG {
 version FOOVER {
  int foome(int,int) = 1;
 } = 1;
} = 0x2000010;

	Attempt to compile the resulting foo_xdr.c. The result:
foo_xdr.c:10: conflicting types for `xdr_foome_1_argument'
foo.h:22: previous declaration of `xdr_foome_1_argument'

	foo.h has:
extern  bool_t xdr_foome_1_argument(XDR *, foome_1_argument);
	while foo_xdr.c has:
bool_t
xdr_foome_1_argument(XDR *xdrs, foome_1_argument *objp)

>Fix:
	Apply following to rpcgen (this is -current as of 11.1.1999):
*** rpc_hout.c.orig     Mon Jan 11 12:20:48 1999
--- rpc_hout.c  Mon Jan 11 12:26:08 1999
***************
*** 176,182 ****
             }
             f_print(fout, "};\n");
             f_print(fout, "typedef struct %s %s;\n", name, name);
!            pxdrfuncdecl(name, NULL);
             f_print(fout, "\n");
            }
        }
--- 176,182 ----
             }
             f_print(fout, "};\n");
             f_print(fout, "typedef struct %s %s;\n", name, name);
!            pxdrfuncdecl(name, 1);
             f_print(fout, "\n");
            }
        }

	A quick look at rpcgen sources and some testing didn't reveal a care whether
	this would be wrong in some case, but someone who is more intimately familiar
	with rpcgen internals should probably check this.

>Audit-Trail:
>Unformatted: