aboutsummaryrefslogtreecommitdiff
path: root/sunrpc
diff options
context:
space:
mode:
Diffstat (limited to 'sunrpc')
-rw-r--r--sunrpc/Makefile32
-rw-r--r--sunrpc/proto.h53
-rw-r--r--sunrpc/rpc_clntout.c179
-rw-r--r--sunrpc/rpc_cout.c660
-rw-r--r--sunrpc/rpc_hout.c320
-rw-r--r--sunrpc/rpc_main.c930
-rw-r--r--sunrpc/rpc_parse.c395
-rw-r--r--sunrpc/rpc_parse.h85
-rw-r--r--sunrpc/rpc_sample.c253
-rw-r--r--sunrpc/rpc_scan.c220
-rw-r--r--sunrpc/rpc_scan.h40
-rw-r--r--sunrpc/rpc_svcout.c848
-rw-r--r--sunrpc/rpc_tblout.c170
-rw-r--r--sunrpc/rpc_util.c283
-rw-r--r--sunrpc/rpc_util.h119
15 files changed, 3642 insertions, 945 deletions
diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index 7612f1a567..5bd8f9bb01 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -21,13 +21,15 @@
#
subdir := sunrpc
-# The code in this subdirectory is taken verbatim from Sun's RPCSRC-4.0
-# distribution. A few files needed trivial modifications to compile in the
-# GNU environment; these changes are marked by comments that say
-# `roland@gnu'. All the code from Sun's rpc, etc, and rpcgen
-# subdirectories is in this directory; the rpc subdirectory contains only
-# the header files. Other than that, several files were renamed so as not
-# to exceed 14-character file name limits:
+# The code in this subdirectory is taken from Sun's RPCSRC-4.0
+# distribution with some additional changes from the TI-RPC package
+# which is also available from Sun. A few files needed trivial
+# modifications to compile in the GNU environment; these changes are
+# marked by comments that say `roland@gnu'. All the code from Sun's
+# rpc, etc, and rpcgen subdirectories is in this directory; the rpc
+# subdirectory contains only the header files. Other than that,
+# several files were renamed so as not to exceed 14-character file
+# name limits:
#
# authunix_prot.c -> authuxprot.c
# bindresvport.c -> bindrsvprt.c
@@ -68,9 +70,11 @@ others := portmap rpcinfo
install-bin := rpcgen
install-sbin := rpcinfo portmap
rpcgen-objs = rpc_main.o rpc_hout.o rpc_cout.o rpc_parse.o \
- rpc_scan.o rpc_util.o rpc_svcout.o rpc_clntout.o
+ rpc_scan.o rpc_util.o rpc_svcout.o rpc_clntout.o \
+ rpc_tblout.o rpc_sample.o
# These headers are part of rpcgen.
-distribute := rpc_util.h rpc_parse.h rpc_scan.h $(rpcgen-objs:.o=.c) etc.rpc
+distribute := proto.h rpc_util.h rpc_parse.h rpc_scan.h \
+ $(rpcgen-objs:.o=.c) etc.rpc
extra-objs = $(rpcgen-objs)
all: # Make this the default target; it will be defined in Rules.
@@ -112,10 +116,16 @@ defines := $(defines) -D_PATH_RPC='"$(sysconfdir)/rpc"'
# Generate the rpcsvc headers with rpcgen.
$(objpfx)rpcsvc/%.h: rpcsvc/%.x $(objpfx)rpcgen
$(make-target-directory)
- $(rpcgen-cmd) -h $< -o $@
+ -@rm -f $@T
+ $(rpcgen-cmd) -h $< -o $@T
+ mv -f $@T $@
+
# Generate the rpcsvc XDR functions with rpcgen.
$(objpfx)x%.c: rpcsvc/%.x $(objpfx)rpcgen
- $(rpcgen-cmd) -c $< -o $@
+ -@rm -f $@T
+ $(rpcgen-cmd) -c $< -o $@T
+ mv -f $@T $@
+
# The generated source files depend on the corresponding generated headers.
# Gratuitous dependency on generated .c file here just gets it mentioned to
# avoid being an intermediate file and getting removed.
diff --git a/sunrpc/proto.h b/sunrpc/proto.h
new file mode 100644
index 0000000000..ed010f8fab
--- /dev/null
+++ b/sunrpc/proto.h
@@ -0,0 +1,53 @@
+/****** rpc_clntout.c ******/
+
+void write_stubs(void);
+void printarglist(proc_list *proc,
+ const char *addargname, const char *addargtype);
+
+/****** rpc_cout.c ******/
+
+void emit(definition *def);
+void emit_inline(declaration *decl, int flag);
+void emit_single_in_line(declaration *decl, int flag, relation rel);
+
+/****** rpc_hout.c ******/
+
+void print_datadef(definition *def);
+void print_funcdef(definition *def);
+void pxdrfuncdecl(const char *name, int pointerp);
+void pprocdef(proc_list *proc, version_list *vp,
+ const char *addargtype, int server_p, int mode);
+void pdeclaration(const char *name, declaration *dec, int tab,
+ const char *separator);
+
+/****** rpc_main.c ******/
+ /* nil */
+
+/****** rpc_parse.c ******/
+definition *get_definition(void);
+
+/****** rpc_sample.c ******/
+void write_sample_svc(definition *def);
+int write_sample_clnt(definition *def);
+void add_sample_msg(void);
+void write_sample_clnt_main(void);
+
+/****** rpc_scan.c ******/
+ /* see rpc_scan.h */
+
+/****** rpc_svcout.c ******/
+int nullproc(proc_list *proc);
+void write_svc_aux(int nomain);
+void write_msg_out(void);
+
+/****** rpc_tblout.c ******/
+void write_tables(void);
+
+/****** rpc_util.c ******/
+void reinitialize(void);
+int streq(const char *a, const char *b);
+void error(const char *msg);
+void crash(void);
+void tabify(FILE *f, int tab);
+char *make_argname(const char *pname, const char *vname);
+void add_type(int len, const char *type);
diff --git a/sunrpc/rpc_clntout.c b/sunrpc/rpc_clntout.c
index 555681bd2a..7bfe491d9e 100644
--- a/sunrpc/rpc_clntout.c
+++ b/sunrpc/rpc_clntout.c
@@ -1,56 +1,68 @@
-/* @(#)rpc_clntout.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_clntout.c 1.2 87/06/24 (C) 1987 SMI";
-#endif
+
+/*
+ * From: @(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI
+ */
+char clntout_rcsid[] =
+ "$Id$";
/*
* rpc_clntout.c, Client-stub outputter for the RPC protocol compiler
* Copyright (C) 1987, Sun Microsytsems, Inc.
*/
#include <stdio.h>
-#include <strings.h>
+#include <string.h>
+#include <rpc/types.h>
#include "rpc_parse.h"
#include "rpc_util.h"
+#include "proto.h"
#define DEFAULT_TIMEOUT 25 /* in seconds */
+static char RESULT[] = "clnt_res";
+
+static void write_program(definition *def);
+static void printbody(proc_list *proc);
+static const char *ampr(const char *type);
+static void printbody(proc_list *proc);
+
void
-write_stubs()
+write_stubs(void)
{
list *l;
definition *def;
- f_print(fout,
- "\n/* Default timeout can be changed using clnt_control() */\n");
- f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
+ f_print(fout,
+ "\n/* Default timeout can be changed using clnt_control() */\n");
+ f_print(fout, "static struct timeval TIMEOUT = { %d, 0 };\n",
DEFAULT_TIMEOUT);
for (l = defined; l != NULL; l = l->next) {
def = (definition *) l->val;
@@ -60,10 +72,8 @@ write_stubs()
}
}
-
-static
-write_program(def)
- definition *def;
+static void
+write_program(definition *def)
{
version_list *vp;
proc_list *proc;
@@ -74,21 +84,73 @@ write_program(def)
ptype(proc->res_prefix, proc->res_type, 1);
f_print(fout, "*\n");
pvname(proc->proc_name, vp->vers_num);
- f_print(fout, "(argp, clnt)\n");
- f_print(fout, "\t");
- ptype(proc->arg_prefix, proc->arg_type, 1);
- f_print(fout, "*argp;\n");
- f_print(fout, "\tCLIENT *clnt;\n");
+ printarglist( proc, "clnt", "CLIENT *" );
f_print(fout, "{\n");
printbody(proc);
- f_print(fout, "}\n\n");
+ f_print(fout, "}\n");
}
}
}
-static char *
-ampr(type)
- char *type;
+/* Writes out declarations of procedure's argument list.
+ In either ANSI C style, in one of old rpcgen style (pass by reference),
+ or new rpcgen style (multiple arguments, pass by value);
+ */
+
+/* sample addargname = "clnt"; sample addargtype = "CLIENT * " */
+
+void printarglist(proc_list *proc,
+ const char *addargname, const char *addargtype)
+{
+
+ decl_list *l;
+
+ if (!newstyle) { /* old style: always pass argument by reference */
+ if (Cflag) { /* C++ style heading */
+ f_print(fout, "(");
+ ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
+ f_print(fout, "*argp, %s%s)\n", addargtype, addargname );
+ }
+ else {
+ f_print(fout, "(argp, %s)\n", addargname);
+ f_print(fout, "\t");
+ ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
+ f_print(fout, "*argp;\n");
+ }
+ } else if (streq( proc->args.decls->decl.type, "void")) {
+ /* newstyle, 0 argument */
+ if( Cflag )
+ f_print(fout, "(%s%s)\n", addargtype, addargname );
+ else
+ f_print(fout, "(%s)\n", addargname);
+ } else {
+ /* new style, 1 or multiple arguments */
+ if( !Cflag ) {
+ f_print(fout, "(");
+ for (l = proc->args.decls; l != NULL; l = l->next)
+ f_print(fout, "%s, ", l->decl.name);
+ f_print(fout, "%s)\n", addargname );
+ for (l = proc->args.decls; l != NULL; l = l->next) {
+ pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );
+ }
+ } else { /* C++ style header */
+ f_print(fout, "(");
+ for(l = proc->args.decls; l != NULL; l = l->next) {
+ pdeclaration(proc->args.argname, &l->decl, 0, ", " );
+ }
+ f_print(fout, " %s%s)\n", addargtype, addargname );
+ }
+ }
+
+ if( !Cflag )
+ f_print(fout, "\t%s%s;\n", addargtype, addargname );
+}
+
+
+
+static
+const char *
+ampr(const char *type)
{
if (isvectordef(type, REL_ALIAS)) {
return ("");
@@ -97,30 +159,65 @@ ampr(type)
}
}
-static
-printbody(proc)
- proc_list *proc;
+static void
+printbody(proc_list *proc)
{
+ decl_list *l;
+ bool_t args2 = (proc->arg_num > 1);
+/* int i; */
+
+ /* For new style with multiple arguments, need a structure in which
+ to stuff the arguments. */
+ if ( newstyle && args2) {
+ f_print(fout, "\t%s", proc->args.argname);
+ f_print(fout, " arg;\n");
+ }
f_print(fout, "\tstatic ");
if (streq(proc->res_type, "void")) {
f_print(fout, "char ");
} else {
ptype(proc->res_prefix, proc->res_type, 0);
}
- f_print(fout, "res;\n");
+ f_print(fout, "%s;\n",RESULT);
f_print(fout, "\n");
- f_print(fout, "\tbzero((char *)%sres, sizeof(res));\n",
- ampr(proc->res_type));
- f_print(fout,
- "\tif (clnt_call(clnt, %s, xdr_%s, argp, xdr_%s, %sres, TIMEOUT) != RPC_SUCCESS) {\n",
- proc->proc_name, stringfix(proc->arg_type),
- stringfix(proc->res_type), ampr(proc->res_type));
+ f_print(fout, "\tmemset((char *)%s%s, 0, sizeof(%s));\n",
+ ampr(proc->res_type ), RESULT, RESULT);
+ if (newstyle && !args2 && (streq( proc->args.decls->decl.type, "void"))) {
+ /* newstyle, 0 arguments */
+ f_print(fout,
+ "\tif (clnt_call(clnt, %s, xdr_void", proc->proc_name);
+ f_print(fout,
+ ", NULL, xdr_%s, %s,%s, TIMEOUT) != RPC_SUCCESS) {\n",
+ stringfix(proc->res_type), ampr(proc->res_type), RESULT);
+
+ } else if ( newstyle && args2) {
+ /* newstyle, multiple arguments: stuff arguments into structure */
+ for (l = proc->args.decls; l != NULL; l = l->next) {
+ f_print(fout, "\targ.%s = %s;\n",
+ l->decl.name, l->decl.name);
+ }
+ f_print(fout,
+ "\tif (clnt_call(clnt, %s, xdr_%s", proc->proc_name,
+ proc->args.argname);
+ f_print(fout,
+ ", &arg, xdr_%s, %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
+ stringfix(proc->res_type), ampr(proc->res_type), RESULT);
+ } else { /* single argument, new or old style */
+ f_print(fout,
+ "\tif (clnt_call(clnt, %s, xdr_%s, %s%s, xdr_%s, %s%s, TIMEOUT) != RPC_SUCCESS) {\n",
+ proc->proc_name,
+ stringfix(proc->args.decls->decl.type),
+ (newstyle ? "&" : ""),
+ (newstyle ? proc->args.decls->decl.name : "argp"),
+ stringfix(proc->res_type), ampr(proc->res_type),RESULT);
+ }
f_print(fout, "\t\treturn (NULL);\n");
f_print(fout, "\t}\n");
if (streq(proc->res_type, "void")) {
- f_print(fout, "\treturn ((void *)%sres);\n",
- ampr(proc->res_type));
+ f_print(fout, "\treturn ((void *)%s%s);\n",
+ ampr(proc->res_type),RESULT);
} else {
- f_print(fout, "\treturn (%sres);\n", ampr(proc->res_type));
+ f_print(fout, "\treturn (%s%s);\n", ampr(proc->res_type),RESULT);
}
}
+
diff --git a/sunrpc/rpc_cout.c b/sunrpc/rpc_cout.c
index 86d38652f5..378a686fa7 100644
--- a/sunrpc/rpc_cout.c
+++ b/sunrpc/rpc_cout.c
@@ -1,55 +1,92 @@
-/* @(#)rpc_cout.c 2.1 88/08/01 4.0 RPCSRC */
/*
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
* unrestricted use provided that this legend is included on all tape
* media and as a part of the software program in whole or part. Users
* may copy or modify Sun RPC without charge, but are not authorized
* to license or distribute it to anyone else except as part of a product or
- * program developed by the user.
- *
+ * program developed by the user or with the express written consent of
+ * Sun Microsystems, Inc.
+ *
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- *
+ *
* Sun RPC is provided with no support and without any obligation on the
* part of Sun Microsystems, Inc. to assist in its use, correction,
* modification or enhancement.
- *
+ *
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
* OR ANY PART THEREOF.
- *
+ *
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
* or profits or other special, indirect and consequential damages, even if
* Sun has been advised of the possibility of such damages.
- *
+ *
* Sun Microsystems, Inc.
* 2550 Garcia Avenue
* Mountain View, California 94043
*/
-#ifndef lint
-static char sccsid[] = "@(#)rpc_cout.c 1.8 87/06/24 (C) 1987 SMI";
-#endif
/*
- * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
+ * From: @(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI
+ */
+char cout_rcsid[] =
+ "$Id$";
+
+/*
+ * rpc_cout.c, XDR routine outputter for the RPC protocol compiler
*/
+#include <ctype.h>
#include <stdio.h>
-#include <strings.h>
-#include "rpc_util.h"
+#include <string.h>
#include "rpc_parse.h"
+#include "rpc_util.h"
+#include "proto.h"
+
+static void emit_enum(definition *def);
+static void emit_program(definition *def);
+static void emit_union(definition *def);
+static void emit_struct(definition *def);
+static void emit_typedef(definition *def);
+static int findtype(const definition *def, const char *type);
+static int undefined(const char *type);
+static void print_generic_header(const char *procname, int pointerp);
+static void print_ifopen(int indent, const char *name);
+static void print_ifarg(const char *arg);
+static void print_ifsizeof(const char *prefix, const char *type);
+static void print_ifclose(int indent);
+static void print_ifstat(int indent, const char *prefix, const char *type,
+ relation rel, const char *amax,
+ const char *objname, const char *name);
+static void print_stat(int indent, declaration *dec);
+static void print_header(definition *def);
+static void print_trailer(void);
+static char *upcase(const char *str);
/*
- * Emit the C-routine for the given definition
+ * Emit the C-routine for the given definition
*/
void
-emit(def)
- definition *def;
+emit(definition *def)
{
- if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
+ if (def->def_kind == DEF_CONST) {
return;
}
+ if (def->def_kind == DEF_PROGRAM) {
+ emit_program(def);
+ return;
+ }
+ if(def->def_kind == DEF_TYPEDEF)
+ {
+ /* now we need to handle declarations like
+ struct typedef foo foo;
+ since we dont want this to be expanded into 2 calls to xdr_foo */
+
+ if(strcmp(def->def.ty.old_type,def->def_name)==0)
+ return;
+ };
+
print_header(def);
switch (def->def_kind) {
case DEF_UNION:
@@ -64,15 +101,16 @@ emit(def)
case DEF_TYPEDEF:
emit_typedef(def);
break;
+ default:
+ /* can't happen */
}
print_trailer();
}
-static
-findtype(def, type)
- definition *def;
- char *type;
+static int
+findtype(const definition *def, const char *type)
{
+
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
return (0);
} else {
@@ -80,105 +118,121 @@ findtype(def, type)
}
}
-static
-undefined(type)
- char *type;
+static int
+undefined(const char *type)
{
definition *def;
def = (definition *) FINDVAL(defined, type, findtype);
+
+
return (def == NULL);
}
-static
-print_header(def)
- definition *def;
+static void
+print_generic_header(const char *procname, int pointerp)
{
- space();
+ f_print(fout, "\n");
f_print(fout, "bool_t\n");
- f_print(fout, "xdr_%s(xdrs, objp)\n", def->def_name);
- f_print(fout, "\tXDR *xdrs;\n");
- f_print(fout, "\t%s ", def->def_name);
- if (def->def_kind != DEF_TYPEDEF ||
- !isvectordef(def->def.ty.old_type, def->def.ty.rel)) {
- f_print(fout, "*");
+ if (Cflag) {
+ f_print(fout, "xdr_%s(", procname);
+ f_print(fout, "XDR *xdrs, ");
+ f_print(fout, "%s ", procname);
+ if( pointerp )
+ f_print(fout, "*");
+ f_print(fout, "objp)\n{\n\n");
+ } else {
+ f_print(fout, "xdr_%s(xdrs, objp)\n", procname);
+ f_print(fout, "\tXDR *xdrs;\n");
+ f_print(fout, "\t%s ", procname);
+ if( pointerp )
+ f_print(fout, "*");
+ f_print(fout, "objp;\n{\n\n");
}
- f_print(fout, "objp;\n");
- f_print(fout, "{\n");
}
-static
-print_trailer()
+static void
+print_header(definition *def)
+{
+
+/*
+ decl_list *dl;
+ bas_type *ptr;
+ int i;
+ */
+
+ print_generic_header( def->def_name,
+ def->def_kind != DEF_TYPEDEF ||
+ !isvectordef(def->def.ty.old_type, def->def.ty.rel));
+
+ /* Now add Inline support */
+
+
+ if(inlineflag == 0 )
+ return;
+ /*May cause lint to complain. but ... */
+f_print(fout, "\t register long *buf;\n\n");
+
+}
+
+static void
+print_prog_header(proc_list *plist)
+{
+ print_generic_header( plist->args.argname, 1 );
+}
+
+static void
+print_trailer(void)
{
f_print(fout, "\treturn (TRUE);\n");
f_print(fout, "}\n");
- space();
}
-static
-print_ifopen(indent, name)
- int indent;
- char *name;
+static void
+print_ifopen(int indent, const char *name)
{
tabify(fout, indent);
- f_print(fout, "if (!xdr_%s(xdrs", name);
+ f_print(fout, " if (!xdr_%s(xdrs", name);
}
-
-static
-print_ifarg(arg)
- char *arg;
+static void
+print_ifarg(const char *arg)
{
f_print(fout, ", %s", arg);
}
-
-static
-print_ifsizeof(prefix, type)
- char *prefix;
- char *type;
+static void
+print_ifsizeof(const char *prefix, const char *type)
{
if (streq(type, "bool")) {
- f_print(fout, ", sizeof(bool_t), xdr_bool");
- } else {
+ f_print(fout, ", sizeof(bool_t), (xdrproc_t)xdr_bool");
+ }
+ else {
f_print(fout, ", sizeof(");
if (undefined(type) && prefix) {
f_print(fout, "%s ", prefix);
}
- f_print(fout, "%s), xdr_%s", type, type);
+ f_print(fout, "%s), (xdrproc_t)xdr_%s", type, type);
}
}
-static
-print_ifclose(indent)
- int indent;
+static void
+print_ifclose(int indent)
{
f_print(fout, ")) {\n");
tabify(fout, indent);
- f_print(fout, "\treturn (FALSE);\n");
+ f_print(fout, "\t return (FALSE);\n");
tabify(fout, indent);
- f_print(fout, "}\n");
-}
-
-static
-space()
-{
- f_print(fout, "\n\n");
+ f_print(fout, " }\n");
}
-static
-print_ifstat(indent, prefix, type, rel, amax, objname, name)
- int indent;
- char *prefix;
- char *type;
- relation rel;
- char *amax;
- char *objname;
- char *name;