Home | History | Annotate | Line # | Download | only in rpcgen
      1  1.13  christos /*	$NetBSD: rpc_sample.c,v 1.13 2013/12/15 00:40:17 christos Exp $	*/
      2   1.1        pk /*
      3   1.1        pk  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      4   1.1        pk  * unrestricted use provided that this legend is included on all tape
      5   1.1        pk  * media and as a part of the software program in whole or part.  Users
      6   1.1        pk  * may copy or modify Sun RPC without charge, but are not authorized
      7   1.1        pk  * to license or distribute it to anyone else except as part of a product or
      8   1.1        pk  * program developed by the user or with the express written consent of
      9   1.1        pk  * Sun Microsystems, Inc.
     10   1.1        pk  *
     11   1.1        pk  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     12   1.1        pk  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     13   1.1        pk  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     14   1.1        pk  *
     15   1.1        pk  * Sun RPC is provided with no support and without any obligation on the
     16   1.1        pk  * part of Sun Microsystems, Inc. to assist in its use, correction,
     17   1.1        pk  * modification or enhancement.
     18   1.1        pk  *
     19   1.1        pk  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     20   1.1        pk  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     21   1.1        pk  * OR ANY PART THEREOF.
     22   1.1        pk  *
     23   1.1        pk  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     24   1.1        pk  * or profits or other special, indirect and consequential damages, even if
     25   1.1        pk  * Sun has been advised of the possibility of such damages.
     26   1.1        pk  *
     27   1.1        pk  * Sun Microsystems, Inc.
     28   1.1        pk  * 2550 Garcia Avenue
     29   1.1        pk  * Mountain View, California  94043
     30   1.1        pk  */
     31   1.1        pk 
     32  1.10       jmc #if HAVE_NBTOOL_CONFIG_H
     33  1.10       jmc #include "nbtool_config.h"
     34  1.10       jmc #endif
     35  1.10       jmc 
     36   1.4  christos #include <sys/cdefs.h>
     37   1.9        tv #if defined(__RCSID) && !defined(lint)
     38   1.4  christos #if 0
     39   1.1        pk static char sccsid[] = "@(#)rpc_sample.c  1.1  90/08/30  (C) 1987 SMI";
     40   1.4  christos #else
     41  1.13  christos __RCSID("$NetBSD: rpc_sample.c,v 1.13 2013/12/15 00:40:17 christos Exp $");
     42   1.4  christos #endif
     43   1.1        pk #endif
     44   1.1        pk 
     45   1.1        pk /*
     46   1.1        pk  * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler
     47   1.1        pk  */
     48   1.1        pk 
     49   1.1        pk #include <stdio.h>
     50   1.1        pk #include <string.h>
     51   1.4  christos #include "rpc_scan.h"
     52   1.1        pk #include "rpc_parse.h"
     53   1.1        pk #include "rpc_util.h"
     54   1.1        pk 
     55   1.1        pk static char RQSTP[] = "rqstp";
     56   1.1        pk 
     57  1.13  christos static void write_sample_client(const char *, version_list *);
     58  1.13  christos static void write_sample_server(definition *);
     59  1.13  christos static void return_type(proc_list *);
     60   1.1        pk 
     61   1.1        pk void
     62  1.12  dholland write_sample_svc(definition *def)
     63   1.1        pk {
     64   1.1        pk 
     65   1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     66   1.5     lukem 		return;
     67   1.1        pk 	write_sample_server(def);
     68   1.1        pk }
     69   1.1        pk 
     70   1.1        pk 
     71   1.1        pk int
     72  1.12  dholland write_sample_clnt(definition *def)
     73   1.1        pk {
     74   1.5     lukem 	version_list *vp;
     75   1.5     lukem 	int     count = 0;
     76   1.1        pk 
     77   1.5     lukem 	if (def->def_kind != DEF_PROGRAM)
     78   1.5     lukem 		return (0);
     79   1.1        pk 	/* generate sample code for each version */
     80   1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
     81   1.5     lukem 		write_sample_client(def->def_name, vp);
     82   1.5     lukem 		++count;
     83   1.1        pk 	}
     84   1.5     lukem 	return (count);
     85   1.1        pk }
     86   1.1        pk 
     87   1.1        pk 
     88   1.4  christos static void
     89  1.12  dholland write_sample_client(const char *program_name, version_list *vp)
     90   1.1        pk {
     91   1.5     lukem 	proc_list *proc;
     92   1.5     lukem 	decl_list *l;
     93   1.5     lukem 
     94   1.5     lukem 	f_print(fout, "\n\nvoid\n");
     95   1.5     lukem 	pvname(program_name, vp->vers_num);
     96  1.13  christos 	f_print(fout, "(char *host)\n{\n");
     97   1.5     lukem 	f_print(fout, "\tCLIENT *clnt;\n");
     98   1.5     lukem 
     99   1.5     lukem 	for (proc = vp->procs; proc != NULL; proc = proc->next) {
    100   1.5     lukem 		/* print out declarations for arguments */
    101   1.5     lukem 		if (proc->arg_num < 2 && !newstyle) {
    102   1.5     lukem 			f_print(fout, "\t");
    103   1.6   mycroft 			if (streq(proc->args.decls->decl.type, "void"))
    104   1.8   mycroft 				f_print(fout, "char ");	/* cannot have "void"
    105   1.6   mycroft 							 * type */
    106   1.6   mycroft 			else
    107   1.5     lukem 				ptype(proc->args.decls->decl.prefix, proc->args.decls->decl.type, 1);
    108   1.5     lukem 			pvname(proc->proc_name, vp->vers_num);
    109   1.5     lukem 			f_print(fout, "_arg;\n");
    110   1.6   mycroft 		} else {
    111   1.5     lukem 			if (!streq(proc->args.decls->decl.type, "void")) {
    112   1.5     lukem 				for (l = proc->args.decls; l != NULL; l = l->next) {
    113   1.5     lukem 					f_print(fout, "\t");
    114   1.5     lukem 					ptype(l->decl.prefix, l->decl.type, 1);
    115   1.5     lukem 					pvname(proc->proc_name, vp->vers_num);
    116   1.5     lukem 					f_print(fout, "_%s;\n", l->decl.name);
    117   1.1        pk /*	  pdeclaration(proc->args.argname, &l->decl, 1, ";\n" );*/
    118   1.5     lukem 				}
    119   1.5     lukem 			}
    120   1.6   mycroft 		}
    121   1.6   mycroft 		/* print out declarations for results */
    122   1.6   mycroft 		f_print(fout, "\t");
    123   1.6   mycroft 		if (streq(proc->res_type, "void"))
    124   1.6   mycroft 			f_print(fout, "char");	/* cannot have "void"
    125   1.6   mycroft 						 * type */
    126   1.6   mycroft 		else
    127   1.6   mycroft 			ptype(proc->res_prefix, proc->res_type, 1);
    128   1.6   mycroft 		if (!Mflag)
    129   1.6   mycroft 			f_print(fout, "*");
    130   1.6   mycroft 		pvname(proc->proc_name, vp->vers_num);
    131   1.6   mycroft 		f_print(fout, "_res;\n");
    132   1.1        pk 	}
    133   1.6   mycroft 	f_print(fout, "\n");
    134   1.1        pk 
    135   1.5     lukem 	/* generate creation of client handle */
    136   1.5     lukem 	f_print(fout, "\tclnt = clnt_create(host, %s, %s, \"%s\");\n",
    137   1.5     lukem 	    program_name, vp->vers_name, tirpcflag ? "netpath" : "udp");
    138   1.5     lukem 	f_print(fout, "\tif (clnt == NULL) {\n");
    139   1.5     lukem 	f_print(fout, "\t\tclnt_pcreateerror(host);\n");
    140   1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}\n");
    141   1.5     lukem 
    142   1.5     lukem 	/* generate calls to procedures */
    143   1.5     lukem 	for (proc = vp->procs; proc != NULL; proc = proc->next) {
    144   1.6   mycroft 		if (Mflag)
    145   1.6   mycroft 			f_print(fout, "\tif (");
    146   1.6   mycroft 		else {
    147   1.6   mycroft 			f_print(fout, "\t");
    148   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    149   1.6   mycroft 			f_print(fout, "_res = ");
    150   1.6   mycroft 		}
    151   1.5     lukem 		pvname(proc->proc_name, vp->vers_num);
    152   1.5     lukem 		if (proc->arg_num < 2 && !newstyle) {
    153   1.5     lukem 			f_print(fout, "(");
    154   1.5     lukem 			if (streq(proc->args.decls->decl.type, "void"))	/* cast to void* */
    155   1.6   mycroft 				f_print(fout, "(void *)");
    156   1.5     lukem 			f_print(fout, "&");
    157   1.5     lukem 			pvname(proc->proc_name, vp->vers_num);
    158   1.6   mycroft 			f_print(fout, "_arg, ");
    159   1.6   mycroft 		} else {
    160   1.5     lukem 			if (streq(proc->args.decls->decl.type, "void")) {
    161   1.5     lukem 				f_print(fout, "(clnt);\n");
    162   1.5     lukem 			} else {
    163   1.5     lukem 				f_print(fout, "(");
    164   1.5     lukem 				for (l = proc->args.decls; l != NULL; l = l->next) {
    165   1.5     lukem 					pvname(proc->proc_name, vp->vers_num);
    166   1.5     lukem 					f_print(fout, "_%s, ", l->decl.name);
    167   1.5     lukem 				}
    168   1.5     lukem 			}
    169   1.6   mycroft 		}
    170   1.6   mycroft 		if (Mflag) {
    171   1.6   mycroft 			f_print(fout, "&");
    172   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    173   1.6   mycroft 			f_print(fout, "_res, clnt) != RPC_SUCCESS)\n");
    174   1.6   mycroft 		} else {
    175   1.6   mycroft 			f_print(fout, "clnt);\n");
    176   1.6   mycroft 			f_print(fout, "\tif (");
    177   1.6   mycroft 			pvname(proc->proc_name, vp->vers_num);
    178   1.7   mycroft 			f_print(fout, "_res == NULL)\n");
    179   1.6   mycroft 		}
    180   1.8   mycroft 		f_print(fout, "\t\tclnt_perror(clnt, \"call failed\");\n");
    181   1.1        pk 	}
    182   1.1        pk 
    183   1.6   mycroft 	f_print(fout, "\tclnt_destroy(clnt);\n");
    184   1.5     lukem 	f_print(fout, "}\n");
    185   1.1        pk }
    186   1.1        pk 
    187   1.4  christos static void
    188  1.12  dholland write_sample_server(definition *def)
    189   1.1        pk {
    190   1.1        pk 	version_list *vp;
    191   1.1        pk 	proc_list *proc;
    192   1.1        pk 
    193   1.1        pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    194   1.1        pk 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    195   1.1        pk 			f_print(fout, "\n");
    196   1.6   mycroft 			if (Mflag)
    197   1.6   mycroft 				f_print(fout, "bool_t\n");
    198   1.6   mycroft 			else {
    199   1.6   mycroft 				return_type(proc);
    200   1.6   mycroft 				f_print(fout, "*\n");
    201   1.6   mycroft 			}
    202  1.11   mycroft 			pvname_svc(proc->proc_name, vp->vers_num);
    203   1.6   mycroft 			printarglist(proc, "result", RQSTP, "struct svc_req *");
    204   1.1        pk 
    205   1.1        pk 			f_print(fout, "{\n");
    206   1.6   mycroft 			if (Mflag) {
    207   1.8   mycroft 				f_print(fout, "\tbool_t retval = TRUE;\n");
    208   1.6   mycroft 			} else {
    209   1.6   mycroft 				f_print(fout, "\tstatic ");
    210   1.6   mycroft 				if (streq(proc->res_type, "void"))
    211   1.8   mycroft 					f_print(fout, "char ");	/* cannot have void type */
    212   1.6   mycroft 				else
    213   1.6   mycroft 					return_type(proc);
    214   1.8   mycroft 				f_print(fout, "result;\n");
    215   1.6   mycroft 			}
    216   1.5     lukem 			f_print(fout,
    217   1.5     lukem 			    "\n\t/*\n\t * insert server code here\n\t */\n\n");
    218   1.6   mycroft 			if (Mflag) {
    219   1.6   mycroft 				f_print(fout, "\treturn (retval);\n");
    220   1.6   mycroft 			} else {
    221   1.6   mycroft 				if (streq(proc->res_type, "void"))
    222   1.6   mycroft 					f_print(fout, "\treturn ((void *)&result);\n");
    223   1.6   mycroft 				else
    224   1.6   mycroft 					f_print(fout, "\treturn (&result);\n");
    225   1.6   mycroft 			}
    226   1.6   mycroft 			f_print(fout, "}\n");
    227   1.5     lukem 		}
    228   1.1        pk 	}
    229   1.1        pk }
    230   1.1        pk 
    231   1.4  christos static void
    232  1.12  dholland return_type(proc_list *plist)
    233   1.1        pk {
    234   1.5     lukem 	ptype(plist->res_prefix, plist->res_type, 1);
    235   1.1        pk }
    236   1.1        pk 
    237   1.4  christos void
    238  1.12  dholland add_sample_msg(void)
    239   1.1        pk {
    240   1.1        pk 	f_print(fout, "/*\n");
    241   1.1        pk 	f_print(fout, " * This is sample code generated by rpcgen.\n");
    242   1.1        pk 	f_print(fout, " * These are only templates and you can use them\n");
    243   1.1        pk 	f_print(fout, " * as a guideline for developing your own functions.\n");
    244   1.1        pk 	f_print(fout, " */\n\n");
    245   1.1        pk }
    246   1.1        pk 
    247   1.1        pk void
    248  1.12  dholland write_sample_clnt_main(void)
    249   1.1        pk {
    250   1.5     lukem 	list   *l;
    251   1.5     lukem 	definition *def;
    252   1.5     lukem 	version_list *vp;
    253   1.1        pk 
    254   1.5     lukem 	f_print(fout, "\n\n");
    255  1.13  christos 	f_print(fout, "int\nmain(int argc, char *argv[])\n{\n");
    256   1.5     lukem 	f_print(fout, "\tchar *host;");
    257   1.6   mycroft 	f_print(fout, "\n\n\tif (argc < 2) {");
    258   1.5     lukem 	f_print(fout, "\n\t\tprintf(\"usage: %%s server_host\\n\", argv[0]);\n");
    259   1.5     lukem 	f_print(fout, "\t\texit(1);\n\t}");
    260   1.5     lukem 	f_print(fout, "\n\thost = argv[1];\n");
    261   1.5     lukem 
    262   1.5     lukem 	for (l = defined; l != NULL; l = l->next) {
    263   1.1        pk 		def = l->val;
    264   1.1        pk 		if (def->def_kind != DEF_PROGRAM) {
    265   1.1        pk 			continue;
    266   1.1        pk 		}
    267   1.1        pk 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    268   1.5     lukem 			f_print(fout, "\t");
    269   1.1        pk 			pvname(def->def_name, vp->vers_num);
    270   1.6   mycroft 			f_print(fout, "(host);\n");
    271   1.1        pk 		}
    272   1.5     lukem 	}
    273   1.6   mycroft 	f_print(fout, "\texit(0);\n");
    274   1.5     lukem 	f_print(fout, "}\n");
    275   1.1        pk }
    276