summary refs log tree commit diff
path: root/sunrpc/rpc_clntout.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-10-17 01:51:38 +0000
committerUlrich Drepper <drepper@redhat.com>1996-10-17 01:51:38 +0000
commit0d204b0a522b9fef2168e1808a0566c9209d0893 (patch)
tree70ea6e1aec8f2cc5ab9b53f4ef15f24a9503fd5a /sunrpc/rpc_clntout.c
parentb207ff4bd88564215ef7c68e61ec46aa4cb461c1 (diff)
downloadglibc-0d204b0a522b9fef2168e1808a0566c9209d0893.tar.gz
glibc-0d204b0a522b9fef2168e1808a0566c9209d0893.tar.xz
glibc-0d204b0a522b9fef2168e1808a0566c9209d0893.zip
update from main archive 961016 cvs/libc-961019 cvs/libc-961018 cvs/libc-961017
Thu Oct 17 01:55:34 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sunrpc/Makefile ($(objpfx)rpcsvc/%.h, $(objpfx)x%.c): Write
	output to $@T and move to $@ later since the new rpcgen will not
	overwrite existing files.

	* po/Makefile (libc.pot): Fix typo.

Sun Oct 13 20:52:07 1996  Thorsten Kukuk  <kukuk@weber.uni-paderborn.de>

	Update rpcgen program to TI-rpc code.
	* sunrpc/Makefile (rpcgen-objs): Add rpc_tblout.o and rpc_sample.o.
	(distribute): Add proto.h.
	* sunrpc/proto.h: New file.  Prototypes for all the RPC functions.
	* sunrpc/rpc_clntout.c: Change to allow generation of ISO C code.
	* sunrpc/rpc_cout.c: Likewise.
	* sunrpc/rpc_hout.c: Likewise.
	* sunrpc/rpc_main.c: Likewise.
	* sunrpc/rpc_parse.c: Likewise.
	* sunrpc/rpc_parse.h: Likewise.
	* sunrpc/rpc_scan.c: Likewise.
	* sunrpc/rpc_scan.h: Likewise.
	* sunrpc/rpc_svcout.c: Likewise.
	* sunrpc/rpc_util.c: Likewise.
	* sunrpc/rpc_util.h: Likewise.

	* sunrpc/rpc_tblout.c: New file.
	* sunrpc/rpc_sample.c: Likewise.

Thu Oct 17 00:26:20 1996  NIIBE Yutaka  <gniibe@mri.co.jp>

	* sysdeps/unix/opendir.c: Add semicolon for consistency.

Wed Oct 16 12:26:53 1996  Sven Verdoolaege  <skimo@breughel.ufsia.ac.be>

	* locale/progams/localedef.c (main): Test with -1 to find out
 	whether read failed.

Wed Oct 16 14:54:59 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/i386/clone.S: Use JUMPTARGET and
 	PSEUDO_END macro.

Tue Oct 15 21:27:42 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/m68k/sigcontext.h: Removed.

Tue Oct 15 15:52:29 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/m68k/clone.S: Add CALL_MCOUNT.
	* sysdeps/unix/sysv/linux/m68k/mmap.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/sigreturn.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/socket.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/sysdep.S (__errno_location):
	Likewise.
	* sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.
	Correct generation of system call.

Tue Oct 15 15:13:16 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makerules (sysd-Makefile): Fix command so that it works in the
	subdirectories.
	(BUILD_CFLAGS): Change back using $(..) instead of
	$(common-objpfx), the latter fails in the toplevel directory when
	$(objdir) is relative.
	(common-objdir-compile): Run compiler in $(objdir).
	* sysdeps/posix/Makefile (mk-stdiolim): Likewise.

Tue Oct 15 23:39:48 1996  Ulrich Drepper  <drepper@cygnus.com>

	* string/string.h [__USE_SVID]: Add prototype for swab.
	* time/sys/time.h [__USE_BSD]: Add prototype for ualarm.
	Reported by Andreas Jaeger.

	The available nlist implementation is not generally usable.
  	Especially on the currently supported ELF systems the nlist
 	function comes with the libelf.
	* misc/Makefile (headers): Remove nlist.h.
	(routines): Remove nlist.

	* Makefile ($(objpfx)version-info.h): Include information about
	system the libc is built on in version-info.h file.

	* po/Makefile (distribute): Add header.pot.

Tue Oct 15 16:34:15 1996  Andreas Jaeger  <aj@arthur.pfalz.de>

	* sysdeps/unix/sysv/linux/sleep.c: Include file with prototype.
	* sysdeps/unix/sysv/linux/reboot.c: Likewise.
	* misc/error.c: Likewise.

Tue Oct 15 22:41:27 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/syscalls.list: Add {get,set}resuid.

Tue Oct 15 08:06:02 1996  Andreas Jaeger  <aj@arthur.pfalz.de>

	* crypt/Makefiel (rpath-link): Extend search path to current directory.

Fri Oct 11 09:18:06 1996  Sven Verdoolaege  <skimo@breughel.ufsia.ac.be>

	* sysdeps/i386/i586/strlen.S: Correct handling of prolog for
	aligning pointer.

Tue Oct 15 02:13:21 1996  Ulrich Drepper  <drepper@cygnus.com>

	* stdio-common/vfprintf.c: Don't declare __flockfile as weak.

	* crypt/md5-crypt.c (md5_crypt_r): Add cast to prevent warning.

Sun Oct 13 19:16:10 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/m68k/sysdep.h (POUND): Macro removed,
	replaced by `&'.
	(PSEUDO_END): Provide definition to use .size directive.
	(PSEUDO): Don't interpret negative return values less than -128 as
	syscall error.
	* sysdeps/unix/sysv/linux/m68k/syscall.S (syscall): Likewise.

	* sysdeps/m68k/bsd-_setjmp.S: Use PSEUDO_END macro to provide
	.size directive.
	* sysdeps/m68k/bsd-setjmp.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/clone.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/mmap.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/sigreturn.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/socket.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/syscall.S: Likewise.
	* sysdeps/unix/sysv/linux/m68k/sysdep.S: Use PSEUDO_END instead of
	explicit .size directive.

	* libio/iogets.c: Warn when gets is used.
cd	* time/strptime.c: Recognize %s, %u, %g, and %G format.
Diffstat (limited to 'sunrpc/rpc_clntout.c')
-rw-r--r--sunrpc/rpc_clntout.c179
1 files changed, 138 insertions, 41 deletions
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);
 	}
 }
+