Home | History | Annotate | Line # | Download | only in rpcgen
rpc_svcout.c revision 1.7
      1  1.7     pk /*	$NetBSD: rpc_svcout.c,v 1.7 1995/06/24 14:59:59 pk Exp $	*/
      2  1.1  glass /*
      3  1.1  glass  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      4  1.1  glass  * unrestricted use provided that this legend is included on all tape
      5  1.1  glass  * media and as a part of the software program in whole or part.  Users
      6  1.1  glass  * may copy or modify Sun RPC without charge, but are not authorized
      7  1.1  glass  * to license or distribute it to anyone else except as part of a product or
      8  1.6     pk  * program developed by the user or with the express written consent of
      9  1.6     pk  * Sun Microsystems, Inc.
     10  1.6     pk  *
     11  1.1  glass  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     12  1.1  glass  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     13  1.1  glass  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     14  1.6     pk  *
     15  1.1  glass  * Sun RPC is provided with no support and without any obligation on the
     16  1.1  glass  * part of Sun Microsystems, Inc. to assist in its use, correction,
     17  1.1  glass  * modification or enhancement.
     18  1.6     pk  *
     19  1.1  glass  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     20  1.1  glass  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     21  1.1  glass  * OR ANY PART THEREOF.
     22  1.6     pk  *
     23  1.1  glass  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     24  1.1  glass  * or profits or other special, indirect and consequential damages, even if
     25  1.1  glass  * Sun has been advised of the possibility of such damages.
     26  1.6     pk  *
     27  1.1  glass  * Sun Microsystems, Inc.
     28  1.1  glass  * 2550 Garcia Avenue
     29  1.1  glass  * Mountain View, California  94043
     30  1.1  glass  */
     31  1.6     pk 
     32  1.1  glass #ifndef lint
     33  1.6     pk  static char sccsid[] = "@(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI";
     34  1.1  glass #endif
     35  1.1  glass 
     36  1.1  glass /*
     37  1.1  glass  * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler
     38  1.1  glass  */
     39  1.6     pk #include <sys/cdefs.h>
     40  1.1  glass #include <stdio.h>
     41  1.6     pk #include <string.h>
     42  1.1  glass #include "rpc_parse.h"
     43  1.1  glass #include "rpc_util.h"
     44  1.1  glass 
     45  1.1  glass static char RQSTP[] = "rqstp";
     46  1.1  glass static char TRANSP[] = "transp";
     47  1.1  glass static char ARG[] = "argument";
     48  1.1  glass static char RESULT[] = "result";
     49  1.1  glass static char ROUTINE[] = "local";
     50  1.1  glass 
     51  1.6     pk char _errbuf[256];	/* For all messages */
     52  1.6     pk 
     53  1.6     pk void internal_proctype __P((proc_list *));
     54  1.6     pk static write_real_program __P((definition *));
     55  1.6     pk static write_program __P((definition *, char *));
     56  1.6     pk static printerr __P((char *, char *));
     57  1.6     pk static printif __P((char *, char *, char *, char *));
     58  1.6     pk static write_inetmost __P((char *));
     59  1.6     pk static print_return __P((char *));
     60  1.6     pk static print_pmapunset __P((char *));
     61  1.6     pk static print_err_message __P((char *));
     62  1.6     pk static write_timeout_func __P((void));
     63  1.6     pk static write_pm_most __P((char *, int));
     64  1.6     pk static write_caller_func __P((void));
     65  1.6     pk static write_rpc_svc_fg __P((char *, char *));
     66  1.6     pk static open_log_file __P((char *, char *));
     67  1.6     pk 
     68  1.6     pk static
     69  1.6     pk p_xdrfunc( rname, typename )
     70  1.6     pk char* rname;
     71  1.6     pk char* typename;
     72  1.6     pk {
     73  1.6     pk   if( Cflag )
     74  1.6     pk     f_print(fout, "\t\txdr_%s = (xdrproc_t) xdr_%s;\n", rname,
     75  1.6     pk 	    stringfix(typename) );
     76  1.6     pk   else
     77  1.6     pk     f_print(fout, "\t\txdr_%s = xdr_%s;\n", rname, stringfix(typename) );
     78  1.6     pk }
     79  1.6     pk 
     80  1.6     pk void
     81  1.6     pk internal_proctype(plist)
     82  1.6     pk 	proc_list *plist;
     83  1.6     pk {
     84  1.6     pk 	f_print(fout, "static ");
     85  1.6     pk 	ptype( plist->res_prefix, plist->res_type, 1 );
     86  1.6     pk 	f_print( fout, "*" );
     87  1.6     pk }
     88  1.6     pk 
     89  1.6     pk 
     90  1.1  glass /*
     91  1.1  glass  * write most of the service, that is, everything but the registrations.
     92  1.1  glass  */
     93  1.1  glass void
     94  1.6     pk write_most(infile, netflag, nomain)
     95  1.6     pk 	char *infile;		/* our name */
     96  1.6     pk 	int netflag;
     97  1.6     pk         int nomain;
     98  1.6     pk {
     99  1.6     pk 	if (inetdflag || pmflag) {
    100  1.6     pk 	        char* var_type;
    101  1.6     pk 		var_type = (nomain? "extern" : "static");
    102  1.6     pk 		f_print(fout, "%s int _rpcpmstart;", var_type );
    103  1.6     pk 		f_print(fout, "\t\t/* Started by a port monitor ? */\n");
    104  1.6     pk 		f_print(fout, "%s int _rpcfdtype;", var_type );
    105  1.6     pk 		f_print(fout, "\t\t/* Whether Stream or Datagram ? */\n");
    106  1.6     pk 		if (timerflag) {
    107  1.6     pk 			f_print(fout, "%s int _rpcsvcdirty;", var_type );
    108  1.6     pk 			f_print(fout, "\t/* Still serving ? */\n");
    109  1.6     pk 		}
    110  1.6     pk 		write_svc_aux( nomain );
    111  1.6     pk 	}
    112  1.6     pk 	/* write out dispatcher and stubs */
    113  1.6     pk 	write_programs( nomain? (char *)NULL : "static" );
    114  1.6     pk 
    115  1.6     pk         if( nomain )
    116  1.6     pk 	  return;
    117  1.6     pk 
    118  1.6     pk 	f_print(fout, "\nmain()\n");
    119  1.6     pk 	f_print(fout, "{\n");
    120  1.6     pk 	if (inetdflag) {
    121  1.6     pk 		write_inetmost(infile); /* Includes call to write_rpc_svc_fg() */
    122  1.6     pk 	} else {
    123  1.6     pk 	  if( tirpcflag ) {
    124  1.6     pk 		if (netflag) {
    125  1.6     pk 			f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
    126  1.6     pk 			f_print(fout, "\tstruct netconfig *nconf = NULL;\n");
    127  1.6     pk 		}
    128  1.6     pk 		f_print(fout, "\tpid_t pid;\n");
    129  1.6     pk 		f_print(fout, "\tint i;\n");
    130  1.6     pk 		f_print(fout, "\tchar mname[FMNAMESZ + 1];\n\n");
    131  1.6     pk 		write_pm_most(infile, netflag);
    132  1.6     pk 		f_print(fout, "\telse {\n");
    133  1.6     pk 		write_rpc_svc_fg(infile, "\t\t");
    134  1.6     pk 		f_print(fout, "\t}\n");
    135  1.6     pk 	      } else {
    136  1.6     pk 		f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
    137  1.6     pk 		f_print(fout, "\n");
    138  1.6     pk 		print_pmapunset("\t");
    139  1.6     pk 	      }
    140  1.6     pk 	}
    141  1.6     pk 
    142  1.6     pk 	if (logflag && !inetdflag) {
    143  1.6     pk 		open_log_file(infile, "\t");
    144  1.6     pk 	}
    145  1.6     pk }
    146  1.6     pk 
    147  1.6     pk /*
    148  1.6     pk  * write a registration for the given transport
    149  1.6     pk  */
    150  1.6     pk void
    151  1.6     pk write_netid_register(transp)
    152  1.6     pk 	char *transp;
    153  1.1  glass {
    154  1.1  glass 	list *l;
    155  1.1  glass 	definition *def;
    156  1.1  glass 	version_list *vp;
    157  1.6     pk 	char *sp;
    158  1.6     pk 	char tmpbuf[32];
    159  1.1  glass 
    160  1.6     pk 	sp = "";
    161  1.1  glass 	f_print(fout, "\n");
    162  1.6     pk 	f_print(fout, "%s\tnconf = getnetconfigent(\"%s\");\n", sp, transp);
    163  1.6     pk 	f_print(fout, "%s\tif (nconf == NULL) {\n", sp);
    164  1.6     pk 	(void) sprintf(_errbuf, "cannot find %s netid.", transp);
    165  1.6     pk 	sprintf(tmpbuf, "%s\t\t", sp);
    166  1.6     pk 	print_err_message(tmpbuf);
    167  1.6     pk 	f_print(fout, "%s\t\texit(1);\n", sp);
    168  1.6     pk 	f_print(fout, "%s\t}\n", sp);
    169  1.6     pk 	f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n",
    170  1.6     pk 			sp, TRANSP, transp);
    171  1.6     pk 	f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
    172  1.6     pk 	(void) sprintf(_errbuf, "cannot create %s service.", transp);
    173  1.6     pk 	print_err_message(tmpbuf);
    174  1.6     pk 	f_print(fout, "%s\t\texit(1);\n", sp);
    175  1.6     pk 	f_print(fout, "%s\t}\n", sp);
    176  1.6     pk 
    177  1.1  glass 	for (l = defined; l != NULL; l = l->next) {
    178  1.1  glass 		def = (definition *) l->val;
    179  1.1  glass 		if (def->def_kind != DEF_PROGRAM) {
    180  1.1  glass 			continue;
    181  1.1  glass 		}
    182  1.1  glass 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    183  1.6     pk 			f_print(fout,
    184  1.6     pk 				"%s\t(void) rpcb_unset(%s, %s, nconf);\n",
    185  1.6     pk 				sp, def->def_name, vp->vers_name);
    186  1.6     pk 			f_print(fout,
    187  1.6     pk 				"%s\tif (!svc_reg(%s, %s, %s, ",
    188  1.6     pk 				sp, TRANSP, def->def_name, vp->vers_name);
    189  1.6     pk 			pvname(def->def_name, vp->vers_num);
    190  1.6     pk 			f_print(fout, ", nconf)) {\n");
    191  1.6     pk 			(void) sprintf(_errbuf, "unable to register (%s, %s, %s).",
    192  1.6     pk 					def->def_name, vp->vers_name, transp);
    193  1.6     pk 			print_err_message(tmpbuf);
    194  1.6     pk 			f_print(fout, "%s\t\texit(1);\n", sp);
    195  1.6     pk 			f_print(fout, "%s\t}\n", sp);
    196  1.1  glass 		}
    197  1.1  glass 	}
    198  1.6     pk 	f_print(fout, "%s\tfreenetconfigent(nconf);\n", sp);
    199  1.1  glass }
    200  1.1  glass 
    201  1.1  glass /*
    202  1.6     pk  * write a registration for the given transport for TLI
    203  1.1  glass  */
    204  1.1  glass void
    205  1.6     pk write_nettype_register(transp)
    206  1.1  glass 	char *transp;
    207  1.1  glass {
    208  1.1  glass 	list *l;
    209  1.1  glass 	definition *def;
    210  1.1  glass 	version_list *vp;
    211  1.1  glass 
    212  1.1  glass 	for (l = defined; l != NULL; l = l->next) {
    213  1.1  glass 		def = (definition *) l->val;
    214  1.1  glass 		if (def->def_kind != DEF_PROGRAM) {
    215  1.1  glass 			continue;
    216  1.1  glass 		}
    217  1.1  glass 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    218  1.6     pk 			f_print(fout, "\tif (!svc_create(");
    219  1.1  glass 			pvname(def->def_name, vp->vers_num);
    220  1.6     pk 			f_print(fout, ", %s, %s, \"%s\")) {\n ",
    221  1.1  glass 				def->def_name, vp->vers_name, transp);
    222  1.6     pk 			(void) sprintf(_errbuf,
    223  1.6     pk 				"unable to create (%s, %s) for %s.",
    224  1.6     pk 					def->def_name, vp->vers_name, transp);
    225  1.6     pk 			print_err_message("\t\t");
    226  1.1  glass 			f_print(fout, "\t\texit(1);\n");
    227  1.1  glass 			f_print(fout, "\t}\n");
    228  1.1  glass 		}
    229  1.1  glass 	}
    230  1.1  glass }
    231  1.1  glass 
    232  1.1  glass /*
    233  1.1  glass  * write the rest of the service
    234  1.1  glass  */
    235  1.1  glass void
    236  1.1  glass write_rest()
    237  1.1  glass {
    238  1.6     pk 	f_print(fout, "\n");
    239  1.6     pk 	if (inetdflag) {
    240  1.6     pk 		f_print(fout, "\tif (%s == (SVCXPRT *)NULL) {\n", TRANSP);
    241  1.6     pk 		(void) sprintf(_errbuf, "could not create a handle");
    242  1.6     pk 		print_err_message("\t\t");
    243  1.6     pk 		f_print(fout, "\t\texit(1);\n");
    244  1.6     pk 		f_print(fout, "\t}\n");
    245  1.6     pk 		if (timerflag) {
    246  1.6     pk 			f_print(fout, "\tif (_rpcpmstart) {\n");
    247  1.6     pk 			f_print(fout,
    248  1.6     pk 				"\t\t(void) signal(SIGALRM, %s closedown);\n",
    249  1.6     pk 				Cflag? "(SIG_PF)" : "(void(*)())" );
    250  1.6     pk 			f_print(fout, "\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
    251  1.6     pk 			f_print(fout, "\t}\n");
    252  1.6     pk 		}
    253  1.6     pk 	}
    254  1.1  glass 	f_print(fout, "\tsvc_run();\n");
    255  1.6     pk 	(void) sprintf(_errbuf, "svc_run returned");
    256  1.6     pk 	print_err_message("\t");
    257  1.1  glass 	f_print(fout, "\texit(1);\n");
    258  1.6     pk 	f_print(fout, "\t/* NOTREACHED */\n");
    259  1.1  glass 	f_print(fout, "}\n");
    260  1.1  glass }
    261  1.1  glass 
    262  1.1  glass void
    263  1.1  glass write_programs(storage)
    264  1.1  glass 	char *storage;
    265  1.1  glass {
    266  1.1  glass 	list *l;
    267  1.1  glass 	definition *def;
    268  1.1  glass 
    269  1.6     pk 	/* write out stubs for procedure  definitions */
    270  1.6     pk 	for (l = defined; l != NULL; l = l->next) {
    271  1.6     pk 		def = (definition *) l->val;
    272  1.6     pk 		if (def->def_kind == DEF_PROGRAM) {
    273  1.6     pk 			write_real_program(def);
    274  1.6     pk 		}
    275  1.6     pk 	}
    276  1.6     pk 
    277  1.6     pk 	/* write out dispatcher for each program */
    278  1.1  glass 	for (l = defined; l != NULL; l = l->next) {
    279  1.1  glass 		def = (definition *) l->val;
    280  1.1  glass 		if (def->def_kind == DEF_PROGRAM) {
    281  1.1  glass 			write_program(def, storage);
    282  1.1  glass 		}
    283  1.1  glass 	}
    284  1.6     pk 
    285  1.6     pk 
    286  1.1  glass }
    287  1.1  glass 
    288  1.6     pk /* write out definition of internal function (e.g. _printmsg_1(...))
    289  1.6     pk    which calls server's defintion of actual function (e.g. printmsg_1(...)).
    290  1.6     pk    Unpacks single user argument of printmsg_1 to call-by-value format
    291  1.6     pk    expected by printmsg_1. */
    292  1.6     pk static
    293  1.6     pk write_real_program(def)
    294  1.6     pk 	definition *def;
    295  1.6     pk {
    296  1.6     pk 	version_list *vp;
    297  1.6     pk 	proc_list *proc;
    298  1.6     pk 	decl_list *l;
    299  1.1  glass 
    300  1.6     pk 	if( !newstyle ) return;  /* not needed for old style */
    301  1.6     pk 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    302  1.6     pk 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    303  1.6     pk 			f_print(fout, "\n");
    304  1.6     pk 			internal_proctype(proc);
    305  1.6     pk 			f_print(fout, "\n_");
    306  1.6     pk 			pvname(proc->proc_name, vp->vers_num);
    307  1.6     pk 			if( Cflag ) {
    308  1.6     pk 			  f_print(fout, "(" );
    309  1.6     pk 			  /* arg name */
    310  1.6     pk 			  if (proc->arg_num > 1)
    311  1.6     pk 			    f_print(fout, proc->args.argname);
    312  1.6     pk 			  else
    313  1.6     pk 			    ptype(proc->args.decls->decl.prefix,
    314  1.6     pk 				  proc->args.decls->decl.type, 0);
    315  1.6     pk 			  f_print(fout, " *argp, struct svc_req *%s)\n",
    316  1.6     pk 				  RQSTP);
    317  1.6     pk 			} else {
    318  1.6     pk 			  f_print(fout, "(argp, %s)\n", RQSTP );
    319  1.6     pk 			  /* arg name */
    320  1.6     pk 			  if (proc->arg_num > 1)
    321  1.6     pk 			    f_print(fout, "\t%s *argp;\n", proc->args.argname);
    322  1.6     pk 			  else {
    323  1.6     pk 			    f_print(fout, "\t");
    324  1.6     pk 			    ptype(proc->args.decls->decl.prefix,
    325  1.6     pk 				  proc->args.decls->decl.type, 0);
    326  1.6     pk 			    f_print(fout, " *argp;\n");
    327  1.6     pk 			  }
    328  1.6     pk 			  f_print(fout, "	struct svc_req *%s;\n", RQSTP);
    329  1.6     pk 			}
    330  1.6     pk 
    331  1.6     pk 			f_print(fout, "{\n");
    332  1.6     pk 			f_print(fout, "\treturn(");
    333  1.7     pk 			pvname_svc(proc->proc_name, vp->vers_num);
    334  1.6     pk 			f_print(fout, "(");
    335  1.6     pk 			if (proc->arg_num < 2) { /* single argument */
    336  1.6     pk 			  if (!streq( proc->args.decls->decl.type, "void"))
    337  1.6     pk 			    f_print(fout, "*argp, ");  /* non-void */
    338  1.6     pk 			} else {
    339  1.6     pk 			  for (l = proc->args.decls;  l != NULL; l = l->next)
    340  1.6     pk 			    f_print(fout, "argp->%s, ", l->decl.name);
    341  1.6     pk 			}
    342  1.6     pk 			f_print(fout, "%s));\n}\n", RQSTP);
    343  1.6     pk 		}
    344  1.6     pk 	}
    345  1.6     pk }
    346  1.6     pk 
    347  1.6     pk static
    348  1.1  glass write_program(def, storage)
    349  1.1  glass 	definition *def;
    350  1.1  glass 	char *storage;
    351  1.1  glass {
    352  1.1  glass 	version_list *vp;
    353  1.1  glass 	proc_list *proc;
    354  1.1  glass 	int filled;
    355  1.1  glass 
    356  1.1  glass 	for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    357  1.1  glass 		f_print(fout, "\n");
    358  1.1  glass 		if (storage != NULL) {
    359  1.1  glass 			f_print(fout, "%s ", storage);
    360  1.1  glass 		}
    361  1.1  glass 		f_print(fout, "void\n");
    362  1.1  glass 		pvname(def->def_name, vp->vers_num);
    363  1.6     pk 
    364  1.6     pk 		if (Cflag) {
    365  1.6     pk 		   f_print(fout, "(struct svc_req *%s, ", RQSTP);
    366  1.6     pk 		   f_print(fout, "register SVCXPRT *%s)\n", TRANSP);
    367  1.6     pk 		} else {
    368  1.6     pk 		   f_print(fout, "(%s, %s)\n", RQSTP, TRANSP);
    369  1.6     pk 		   f_print(fout, "	struct svc_req *%s;\n", RQSTP);
    370  1.6     pk 		   f_print(fout, "	register SVCXPRT *%s;\n", TRANSP);
    371  1.6     pk 		}
    372  1.6     pk 
    373  1.1  glass 		f_print(fout, "{\n");
    374  1.1  glass 
    375  1.1  glass 		filled = 0;
    376  1.1  glass 		f_print(fout, "\tunion {\n");
    377  1.1  glass 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    378  1.6     pk 			if (proc->arg_num < 2) { /* single argument */
    379  1.6     pk 				if (streq(proc->args.decls->decl.type,
    380  1.6     pk 					  "void")) {
    381  1.6     pk 					continue;
    382  1.6     pk 				}
    383  1.6     pk 				filled = 1;
    384  1.6     pk 				f_print(fout, "\t\t");
    385  1.6     pk 				ptype(proc->args.decls->decl.prefix,
    386  1.6     pk 				      proc->args.decls->decl.type, 0);
    387  1.6     pk 				pvname(proc->proc_name, vp->vers_num);
    388  1.6     pk 				f_print(fout, "_arg;\n");
    389  1.6     pk 
    390  1.6     pk 			}
    391  1.6     pk 			else {
    392  1.6     pk 				filled = 1;
    393  1.6     pk 				f_print(fout, "\t\t%s", proc->args.argname);
    394  1.6     pk 				f_print(fout, " ");
    395  1.6     pk 				pvname(proc->proc_name, vp->vers_num);
    396  1.6     pk 				f_print(fout, "_arg;\n");
    397  1.1  glass 			}
    398  1.1  glass 		}
    399  1.1  glass 		if (!filled) {
    400  1.1  glass 			f_print(fout, "\t\tint fill;\n");
    401  1.1  glass 		}
    402  1.1  glass 		f_print(fout, "\t} %s;\n", ARG);
    403  1.1  glass 		f_print(fout, "\tchar *%s;\n", RESULT);
    404  1.6     pk 
    405  1.6     pk 		if (Cflag) {
    406  1.6     pk 		    f_print(fout, "\txdrproc_t xdr_%s, xdr_%s;\n", ARG, RESULT);
    407  1.6     pk 		    f_print(fout,
    408  1.6     pk 			    "\tchar *(*%s)(char *, struct svc_req *);\n",
    409  1.6     pk 			    ROUTINE);
    410  1.6     pk 		} else {
    411  1.6     pk 		    f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT);
    412  1.6     pk 		    f_print(fout, "\tchar *(*%s)();\n", ROUTINE);
    413  1.6     pk 		}
    414  1.6     pk 
    415  1.1  glass 		f_print(fout, "\n");
    416  1.6     pk 
    417  1.6     pk 		if (callerflag)
    418  1.6     pk 			f_print(fout, "\tcaller = transp;\n"); /*EVAS*/
    419  1.6     pk 		if (timerflag)
    420  1.6     pk 			f_print(fout, "\t_rpcsvcdirty = 1;\n");
    421  1.1  glass 		f_print(fout, "\tswitch (%s->rq_proc) {\n", RQSTP);
    422  1.1  glass 		if (!nullproc(vp->procs)) {
    423  1.1  glass 			f_print(fout, "\tcase NULLPROC:\n");
    424  1.6     pk 			f_print(fout,
    425  1.6     pk 			Cflag
    426  1.6     pk 			? "\t\t(void) svc_sendreply(%s, (xdrproc_t) xdr_void, (char *)NULL);\n"
    427  1.6     pk 			: "\t\t(void) svc_sendreply(%s, xdr_void, (char *)NULL);\n",
    428  1.6     pk 					TRANSP);
    429  1.6     pk 			print_return("\t\t");
    430  1.6     pk 			f_print(fout, "\n");
    431  1.1  glass 		}
    432  1.1  glass 		for (proc = vp->procs; proc != NULL; proc = proc->next) {
    433  1.1  glass 			f_print(fout, "\tcase %s:\n", proc->proc_name);
    434  1.6     pk 			if (proc->arg_num < 2) { /* single argument */
    435  1.6     pk 			  p_xdrfunc( ARG, proc->args.decls->decl.type);
    436  1.6     pk 			} else {
    437  1.6     pk 			  p_xdrfunc( ARG, proc->args.argname);
    438  1.6     pk 			}
    439  1.6     pk 			p_xdrfunc( RESULT, proc->res_type);
    440  1.6     pk 			if( Cflag )
    441  1.6     pk 			    f_print(fout,
    442  1.6     pk 				    "\t\t%s = (char *(*)(char *, struct svc_req *)) ",
    443  1.6     pk 				    ROUTINE);
    444  1.6     pk 			else
    445  1.6     pk 			    f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE);
    446  1.6     pk 
    447  1.6     pk 			if (newstyle) { /* new style: calls internal routine */
    448  1.6     pk 				f_print(fout,"_");
    449  1.6     pk 			}
    450  1.7     pk 			if (!newstyle )
    451  1.6     pk 			  pvname_svc(proc->proc_name, vp->vers_num);
    452  1.6     pk 			else
    453  1.6     pk 			  pvname(proc->proc_name, vp->vers_num);
    454  1.1  glass 			f_print(fout, ";\n");
    455  1.1  glass 			f_print(fout, "\t\tbreak;\n\n");
    456  1.1  glass 		}
    457  1.1  glass 		f_print(fout, "\tdefault:\n");
    458  1.1  glass 		printerr("noproc", TRANSP);
    459  1.6     pk 		print_return("\t\t");
    460  1.1  glass 		f_print(fout, "\t}\n");
    461  1.1  glass 
    462  1.6     pk 		f_print(fout, "\t(void) memset((char *)&%s, 0, sizeof (%s));\n", ARG, ARG);
    463  1.7     pk 		printif("getargs", TRANSP, "(caddr_t) &", ARG);
    464  1.1  glass 		printerr("decode", TRANSP);
    465  1.6     pk 		print_return("\t\t");
    466  1.1  glass 		f_print(fout, "\t}\n");
    467  1.1  glass 
    468  1.6     pk 		if (Cflag)
    469  1.6     pk 		    f_print(fout, "\t%s = (*%s)((char *)&%s, %s);\n",
    470  1.6     pk 			    RESULT, ROUTINE, ARG, RQSTP);
    471  1.6     pk 		else
    472  1.6     pk 		    f_print(fout, "\t%s = (*%s)(&%s, %s);\n",
    473  1.6     pk 			    RESULT, ROUTINE, ARG, RQSTP);
    474  1.1  glass 		f_print(fout,
    475  1.1  glass 			"\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n",
    476  1.1  glass 			RESULT, TRANSP, RESULT, RESULT);
    477  1.1  glass 		printerr("systemerr", TRANSP);
    478  1.1  glass 		f_print(fout, "\t}\n");
    479  1.1  glass 
    480  1.7     pk 		printif("freeargs", TRANSP, "(caddr_t) &", ARG);
    481  1.6     pk 		(void) sprintf(_errbuf, "unable to free arguments");
    482  1.6     pk 		print_err_message("\t\t");
    483  1.1  glass 		f_print(fout, "\t\texit(1);\n");
    484  1.1  glass 		f_print(fout, "\t}\n");
    485  1.6     pk 		print_return("\t");
    486  1.6     pk 		f_print(fout, "}\n");
    487  1.1  glass 	}
    488  1.1  glass }
    489  1.1  glass 
    490  1.1  glass static
    491  1.1  glass printerr(err, transp)
    492  1.1  glass 	char *err;
    493  1.1  glass 	char *transp;
    494  1.1  glass {
    495  1.1  glass 	f_print(fout, "\t\tsvcerr_%s(%s);\n", err, transp);
    496  1.1  glass }
    497  1.1  glass 
    498  1.1  glass static
    499  1.1  glass printif(proc, transp, prefix, arg)
    500  1.1  glass 	char *proc;
    501  1.1  glass 	char *transp;
    502  1.1  glass 	char *prefix;
    503  1.1  glass 	char *arg;
    504  1.1  glass {
    505  1.1  glass 	f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n",
    506  1.1  glass 		proc, transp, arg, prefix, arg);
    507  1.1  glass }
    508  1.1  glass 
    509  1.1  glass nullproc(proc)
    510  1.1  glass 	proc_list *proc;
    511  1.1  glass {
    512  1.1  glass 	for (; proc != NULL; proc = proc->next) {
    513  1.1  glass 		if (streq(proc->proc_num, "0")) {
    514  1.1  glass 			return (1);
    515  1.1  glass 		}
    516  1.1  glass 	}
    517  1.1  glass 	return (0);
    518  1.6     pk }
    519  1.6     pk 
    520  1.6     pk static
    521  1.6     pk write_inetmost(infile)
    522  1.6     pk 	char *infile;
    523  1.6     pk {
    524  1.6     pk 	f_print(fout, "\tregister SVCXPRT *%s;\n", TRANSP);
    525  1.6     pk 	f_print(fout, "\tint sock;\n");
    526  1.6     pk 	f_print(fout, "\tint proto;\n");
    527  1.6     pk 	f_print(fout, "\tstruct sockaddr_in saddr;\n");
    528  1.6     pk 	f_print(fout, "\tint asize = sizeof (saddr);\n");
    529  1.6     pk 	f_print(fout, "\n");
    530  1.6     pk 	f_print(fout,
    531  1.6     pk 	"\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n");
    532  1.6     pk 	f_print(fout, "\t\tint ssize = sizeof (int);\n\n");
    533  1.6     pk 	f_print(fout, "\t\tif (saddr.sin_family != AF_INET)\n");
    534  1.6     pk 	f_print(fout, "\t\t\texit(1);\n");
    535  1.6     pk 	f_print(fout, "\t\tif (getsockopt(0, SOL_SOCKET, SO_TYPE,\n");
    536  1.6     pk 	f_print(fout, "\t\t\t\t(char *)&_rpcfdtype, &ssize) == -1)\n");
    537  1.6     pk 	f_print(fout, "\t\t\texit(1);\n");
    538  1.6     pk 	f_print(fout, "\t\tsock = 0;\n");
    539  1.6     pk 	f_print(fout, "\t\t_rpcpmstart = 1;\n");
    540  1.6     pk 	f_print(fout, "\t\tproto = 0;\n");
    541  1.6     pk 	open_log_file(infile, "\t\t");
    542  1.6     pk 	f_print(fout, "\t} else {\n");
    543  1.6     pk 	write_rpc_svc_fg(infile, "\t\t");
    544  1.6     pk 	f_print(fout, "\t\tsock = RPC_ANYSOCK;\n");
    545  1.6     pk 	print_pmapunset("\t\t");
    546  1.6     pk 	f_print(fout, "\t}\n");
    547  1.6     pk }
    548  1.6     pk 
    549  1.6     pk static
    550  1.6     pk print_return(space)
    551  1.6     pk 	char *space;
    552  1.6     pk {
    553  1.6     pk 	if (exitnow)
    554  1.6     pk 		f_print(fout, "%sexit(0);\n", space);
    555  1.6     pk 	else {
    556  1.6     pk 		if (timerflag)
    557  1.6     pk 			f_print(fout, "%s_rpcsvcdirty = 0;\n", space);
    558  1.6     pk 		f_print(fout, "%sreturn;\n", space);
    559  1.6     pk 	}
    560  1.6     pk }
    561  1.6     pk 
    562  1.6     pk static
    563  1.6     pk print_pmapunset(space)
    564  1.6     pk 	char *space;
    565  1.6     pk {
    566  1.6     pk 	list *l;
    567  1.6     pk 	definition *def;
    568  1.6     pk 	version_list *vp;
    569  1.6     pk 
    570  1.6     pk 	for (l = defined; l != NULL; l = l->next) {
    571  1.6     pk 		def = (definition *) l->val;
    572  1.6     pk 		if (def->def_kind == DEF_PROGRAM) {
    573  1.6     pk 			for (vp = def->def.pr.versions; vp != NULL;
    574  1.6     pk 					vp = vp->next) {
    575  1.6     pk 				f_print(fout, "%s(void) pmap_unset(%s, %s);\n",
    576  1.6     pk 					space, def->def_name, vp->vers_name);
    577  1.6     pk 			}
    578  1.6     pk 		}
    579  1.6     pk 	}
    580  1.6     pk }
    581  1.6     pk 
    582  1.6     pk static
    583  1.6     pk print_err_message(space)
    584  1.6     pk 	char *space;
    585  1.6     pk {
    586  1.6     pk 	if (logflag)
    587  1.6     pk 		f_print(fout, "%ssyslog(LOG_ERR, \"%s\");\n", space, _errbuf);
    588  1.6     pk 	else if (inetdflag || pmflag)
    589  1.6     pk 		f_print(fout, "%s_msgout(\"%s\");\n", space, _errbuf);
    590  1.6     pk 	else
    591  1.6     pk 		f_print(fout, "%sfprintf(stderr, \"%s\");\n", space, _errbuf);
    592  1.6     pk }
    593  1.6     pk 
    594  1.6     pk /*
    595  1.6     pk  * Write the server auxiliary function ( _msgout, timeout)
    596  1.6     pk  */
    597  1.6     pk void
    598  1.6     pk write_svc_aux( nomain )
    599  1.6     pk      int nomain;
    600  1.6     pk {
    601  1.6     pk 	if (!logflag)
    602  1.6     pk 		write_msg_out();
    603  1.6     pk 	if( !nomain )
    604  1.6     pk 	  write_timeout_func();
    605  1.6     pk 	if (callerflag)			/*EVAS*/
    606  1.6     pk 		write_caller_func();	/*EVAS*/
    607  1.6     pk }
    608  1.6     pk 
    609  1.6     pk /*
    610  1.6     pk  * Write the _msgout function
    611  1.6     pk  */
    612  1.6     pk 
    613  1.6     pk write_msg_out()
    614  1.6     pk {
    615  1.6     pk 	f_print(fout, "\n");
    616  1.6     pk 	f_print(fout, "static\n");
    617  1.6     pk 	if( !Cflag ) {
    618  1.6     pk 	  f_print(fout, "void _msgout(msg)\n");
    619  1.6     pk 	  f_print(fout, "\tchar *msg;\n");
    620  1.6     pk 	} else {
    621  1.6     pk 	  f_print(fout, "void _msgout(char* msg)\n");
    622  1.6     pk 	}
    623  1.6     pk 	f_print(fout, "{\n");
    624  1.6     pk 	f_print(fout, "#ifdef RPC_SVC_FG\n");
    625  1.6     pk 	if (inetdflag || pmflag)
    626  1.6     pk 		f_print(fout, "\tif (_rpcpmstart)\n");
    627  1.6     pk 	f_print(fout, "\t\tsyslog(LOG_ERR, msg);\n");
    628  1.6     pk 	f_print(fout, "\telse\n");
    629  1.6     pk 	f_print(fout, "\t\t(void) fprintf(stderr, \"%%s\\n\", msg);\n");
    630  1.6     pk 	f_print(fout, "#else\n");
    631  1.6     pk 	f_print(fout, "\tsyslog(LOG_ERR, msg);\n");
    632  1.6     pk 	f_print(fout, "#endif\n");
    633  1.6     pk 	f_print(fout, "}\n");
    634  1.6     pk }
    635  1.6     pk 
    636  1.6     pk /*
    637  1.6     pk  * Write the timeout function
    638  1.6     pk  */
    639  1.6     pk static
    640  1.6     pk write_timeout_func()
    641  1.6     pk {
    642  1.6     pk 	if (!timerflag)
    643  1.6     pk 		return;
    644  1.6     pk 	f_print(fout, "\n");
    645  1.6     pk 	f_print(fout, "static void\n");
    646  1.6     pk 	f_print(fout, "closedown()\n");
    647  1.6     pk 	f_print(fout, "{\n");
    648  1.6     pk 	f_print(fout, "\tif (_rpcsvcdirty == 0) {\n");
    649  1.6     pk 	f_print(fout, "\t\textern fd_set svc_fdset;\n");
    650  1.6     pk 	f_print(fout, "\t\tstatic int size;\n");
    651  1.6     pk 	f_print(fout, "\t\tint i, openfd;\n");
    652  1.6     pk 	if (tirpcflag && pmflag) {
    653  1.6     pk 		f_print(fout, "\t\tstruct t_info tinfo;\n\n");
    654  1.6     pk 		f_print(fout, "\t\tif (!t_getinfo(0, &tinfo) && (tinfo.servtype == T_CLTS))\n");
    655  1.6     pk 	} else {
    656  1.6     pk 		f_print(fout, "\n\t\tif (_rpcfdtype == SOCK_DGRAM)\n");
    657  1.6     pk 	}
    658  1.6     pk 	f_print(fout, "\t\t\texit(0);\n");
    659  1.6     pk 	f_print(fout, "\t\tif (size == 0) {\n");
    660  1.6     pk 	if( tirpcflag ) {
    661  1.6     pk 	  f_print(fout, "\t\t\tstruct rlimit rl;\n\n");
    662  1.6     pk 	  f_print(fout, "\t\t\trl.rlim_max = 0;\n");
    663  1.6     pk 	  f_print(fout, "\t\t\tgetrlimit(RLIMIT_NOFILE, &rl);\n");
    664  1.6     pk 	  f_print(fout, "\t\t\tif ((size = rl.rlim_max) == 0)\n");
    665  1.6     pk 	  f_print(fout, "\t\t\t\treturn;\n");
    666  1.6     pk 	} else {
    667  1.6     pk 	  f_print(fout, "\t\t\tsize = getdtablesize();\n");
    668  1.6     pk 	}
    669  1.6     pk 	f_print(fout, "\t\t}\n");
    670  1.6     pk 	f_print(fout, "\t\tfor (i = 0, openfd = 0; i < size && openfd < 2; i++)\n");
    671  1.6     pk 	f_print(fout, "\t\t\tif (FD_ISSET(i, &svc_fdset))\n");
    672  1.6     pk 	f_print(fout, "\t\t\t\topenfd++;\n");
    673  1.6     pk 	f_print(fout, "\t\tif (openfd <= (_rpcpmstart?0:1))\n");
    674  1.6     pk 	f_print(fout, "\t\t\texit(0);\n");
    675  1.6     pk 	f_print(fout, "\t}\n");
    676  1.6     pk 	f_print(fout, "\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
    677  1.6     pk 	f_print(fout, "}\n");
    678  1.6     pk }
    679  1.6     pk 
    680  1.6     pk static
    681  1.6     pk write_caller_func()			/*EVAS*/
    682  1.6     pk {
    683  1.6     pk #define	P(s)	f_print(fout, s);
    684  1.6     pk 
    685  1.6     pk P("\n");
    686  1.6     pk P("char *svc_caller()\n");
    687  1.6     pk P("{\n");
    688  1.6     pk P("	struct sockaddr_in actual;\n");
    689  1.6     pk P("	struct hostent *hp;\n");
    690  1.6     pk P("	static struct in_addr prev;\n");
    691  1.6     pk P("	static char cname[128];\n\n");
    692  1.6     pk 
    693  1.6     pk P("	actual = *svc_getcaller(caller);\n\n");
    694  1.6     pk 
    695  1.6     pk P("	if (memcmp((char *)&actual.sin_addr, (char *)&prev,\n");
    696  1.6     pk P("		 sizeof(struct in_addr)) == 0)\n");
    697  1.6     pk P("		return (cname);\n\n");
    698  1.6     pk 
    699  1.6     pk P("	prev = actual.sin_addr;\n\n");
    700  1.6     pk 
    701  1.6     pk P("	hp = gethostbyaddr((char *) &actual.sin_addr, sizeof(actual.sin_addr), AF_INET);\n");
    702  1.6     pk P("	if (hp == NULL) {                       /* dummy one up */\n");
    703  1.6     pk P("		extern char *inet_ntoa();\n");
    704  1.6     pk P("		strcpy(cname, inet_ntoa(actual.sin_addr));\n");
    705  1.6     pk P("	} else {\n");
    706  1.6     pk P("		strcpy(cname, hp->h_name);\n");
    707  1.6     pk P("	}\n\n");
    708  1.6     pk 
    709  1.6     pk P("	return (cname);\n");
    710  1.6     pk P("}\n");
    711  1.6     pk 
    712  1.6     pk #undef P
    713  1.6     pk }
    714  1.6     pk 
    715  1.6     pk /*
    716  1.6     pk  * Write the most of port monitor support
    717  1.6     pk  */
    718  1.6     pk static
    719  1.6     pk write_pm_most(infile, netflag)
    720  1.6     pk 	char *infile;
    721  1.6     pk 	int netflag;
    722  1.6     pk {
    723  1.6     pk 	list *l;
    724  1.6     pk 	definition *def;
    725  1.6     pk 	version_list *vp;
    726  1.6     pk 
    727  1.6     pk 	f_print(fout, "\tif (!ioctl(0, I_LOOK, mname) &&\n");
    728  1.6     pk 	f_print(fout, "\t\t(!strcmp(mname, \"sockmod\") ||");
    729  1.6     pk 	f_print(fout, " !strcmp(mname, \"timod\"))) {\n");
    730  1.6     pk 	f_print(fout, "\t\tchar *netid;\n");
    731  1.6     pk 	if (!netflag) {	/* Not included by -n option */
    732  1.6     pk 		f_print(fout, "\t\tstruct netconfig *nconf = NULL;\n");
    733  1.6     pk 		f_print(fout, "\t\tSVCXPRT *%s;\n", TRANSP);
    734  1.6     pk 	}
    735  1.6     pk 	if( timerflag )
    736  1.6     pk 	  f_print(fout, "\t\tint pmclose;\n");
    737  1.6     pk /* not necessary, defined in /usr/include/stdlib */
    738  1.6     pk /*	f_print(fout, "\t\textern char *getenv();\n");*/
    739  1.6     pk 	f_print(fout, "\n");
    740  1.6     pk 	f_print(fout, "\t\t_rpcpmstart = 1;\n");
    741  1.6     pk 	if (logflag)
    742  1.6     pk 		open_log_file(infile, "\t\t");
    743  1.6     pk 	f_print(fout, "\t\tif ((netid = getenv(\"NLSPROVIDER\")) == NULL) {\n");
    744  1.6     pk 	sprintf(_errbuf, "cannot get transport name");
    745  1.6     pk 	print_err_message("\t\t\t");
    746  1.6     pk 	f_print(fout, "\t\t} else if ((nconf = getnetconfigent(netid)) == NULL) {\n");
    747  1.6     pk 	sprintf(_errbuf, "cannot get transport info");
    748  1.6     pk 	print_err_message("\t\t\t");
    749  1.6     pk 	f_print(fout, "\t\t}\n");
    750  1.6     pk 	/*
    751  1.6     pk 	 * A kludgy support for inetd services. Inetd only works with
    752  1.6     pk 	 * sockmod, and RPC works only with timod, hence all this jugglery
    753  1.6     pk 	 */
    754  1.6     pk 	f_print(fout, "\t\tif (strcmp(mname, \"sockmod\") == 0) {\n");
    755  1.6     pk 	f_print(fout, "\t\t\tif (ioctl(0, I_POP, 0) || ioctl(0, I_PUSH, \"timod\")) {\n");
    756  1.6     pk 	sprintf(_errbuf, "could not get the right module");
    757  1.6     pk 	print_err_message("\t\t\t\t");
    758  1.6     pk 	f_print(fout, "\t\t\t\texit(1);\n");
    759  1.6     pk 	f_print(fout, "\t\t\t}\n");
    760  1.6     pk 	f_print(fout, "\t\t}\n");
    761  1.6     pk 	if( timerflag )
    762  1.6     pk 	  f_print(fout, "\t\tpmclose = (t_getstate(0) != T_DATAXFER);\n");
    763  1.6     pk 	f_print(fout, "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) {\n",
    764  1.6     pk 			TRANSP);
    765  1.6     pk 	sprintf(_errbuf, "cannot create server handle");
    766  1.6     pk 	print_err_message("\t\t\t");
    767  1.6     pk 	f_print(fout, "\t\t\texit(1);\n");
    768  1.6     pk 	f_print(fout, "\t\t}\n");
    769  1.6     pk 	f_print(fout, "\t\tif (nconf)\n");
    770  1.6     pk 	f_print(fout, "\t\t\tfreenetconfigent(nconf);\n");
    771  1.6     pk 	for (l = defined; l != NULL; l = l->next) {
    772  1.6     pk 		def = (definition *) l->val;
    773  1.6     pk 		if (def->def_kind != DEF_PROGRAM) {
    774  1.6     pk 			continue;
    775  1.6     pk 		}
    776  1.6     pk 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    777  1.6     pk 			f_print(fout,
    778  1.6     pk 				"\t\tif (!svc_reg(%s, %s, %s, ",
    779  1.6     pk 				TRANSP, def->def_name, vp->vers_name);
    780  1.6     pk 			pvname(def->def_name, vp->vers_num);
    781  1.6     pk 			f_print(fout, ", 0)) {\n");
    782  1.6     pk 			(void) sprintf(_errbuf, "unable to register (%s, %s).",
    783  1.6     pk 					def->def_name, vp->vers_name);
    784  1.6     pk 			print_err_message("\t\t\t");
    785  1.6     pk 			f_print(fout, "\t\t\texit(1);\n");
    786  1.6     pk 			f_print(fout, "\t\t}\n");
    787  1.6     pk 		}
    788  1.6     pk 	}
    789  1.6     pk 	if (timerflag) {
    790  1.6     pk 		f_print(fout, "\t\tif (pmclose) {\n");
    791  1.6     pk 		f_print(fout, "\t\t\t(void) signal(SIGALRM, %s closedown);\n",
    792  1.6     pk 				Cflag? "(SIG_PF)" : "(void(*)())" );
    793  1.6     pk 		f_print(fout, "\t\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n");
    794  1.6     pk 		f_print(fout, "\t\t}\n");
    795  1.6     pk 	}
    796  1.6     pk 	f_print(fout, "\t\tsvc_run();\n");
    797  1.6     pk 	f_print(fout, "\t\texit(1);\n");
    798  1.6     pk 	f_print(fout, "\t\t/* NOTREACHED */\n");
    799  1.6     pk 	f_print(fout, "\t}\n");
    800  1.6     pk }
    801  1.6     pk 
    802  1.6     pk /*
    803  1.6     pk  * Support for backgrounding the server if self started.
    804  1.6     pk  */
    805  1.6     pk static
    806  1.6     pk write_rpc_svc_fg(infile, sp)
    807  1.6     pk 	char *infile;
    808  1.6     pk 	char *sp;
    809  1.6     pk {
    810  1.6     pk 	f_print(fout, "#ifndef RPC_SVC_FG\n");
    811  1.6     pk 	f_print(fout, "%sint size;\n", sp);
    812  1.6     pk 	if( tirpcflag )
    813  1.6     pk 	        f_print(fout, "%sstruct rlimit rl;\n", sp);
    814  1.6     pk 	if (inetdflag)
    815  1.6     pk 		f_print(fout, "%sint pid, i;\n\n", sp);
    816  1.6     pk 	f_print(fout, "%spid = fork();\n", sp);
    817  1.6     pk 	f_print(fout, "%sif (pid < 0) {\n", sp);
    818  1.6     pk 	f_print(fout, "%s\tperror(\"cannot fork\");\n", sp);
    819  1.6     pk 	f_print(fout, "%s\texit(1);\n", sp);
    820  1.6     pk 	f_print(fout, "%s}\n", sp);
    821  1.6     pk 	f_print(fout, "%sif (pid)\n", sp);
    822  1.6     pk 	f_print(fout, "%s\texit(0);\n", sp);
    823  1.6     pk 	/* get number of file descriptors */
    824  1.6     pk 	if( tirpcflag ) {
    825  1.6     pk 	  f_print(fout, "%srl.rlim_max = 0;\n", sp);
    826  1.6     pk 	  f_print(fout, "%sgetrlimit(RLIMIT_NOFILE, &rl);\n", sp);
    827  1.6     pk 	  f_print(fout, "%sif ((size = rl.rlim_max) == 0)\n", sp);
    828  1.6     pk 	  f_print(fout, "%s\texit(1);\n", sp);
    829  1.6     pk 	} else {
    830  1.6     pk 	  f_print(fout, "%ssize = getdtablesize();\n", sp);
    831  1.6     pk 	}
    832  1.6     pk 
    833  1.6     pk 	f_print(fout, "%sfor (i = 0; i < size; i++)\n", sp);
    834  1.6     pk 	f_print(fout, "%s\t(void) close(i);\n", sp);
    835  1.6     pk 	/* Redirect stderr and stdout to console */
    836  1.6     pk 	f_print(fout, "%si = open(\"/dev/console\", 2);\n", sp);
    837  1.6     pk 	f_print(fout, "%s(void) dup2(i, 1);\n", sp);
    838  1.6     pk 	f_print(fout, "%s(void) dup2(i, 2);\n", sp);
    839  1.6     pk 	/* This removes control of the controlling terminal */
    840  1.6     pk 	if( tirpcflag )
    841  1.6     pk 	  f_print(fout, "%ssetsid();\n", sp);
    842  1.6     pk 	else {
    843  1.6     pk 	  f_print(fout, "%si = open(\"/dev/tty\", 2);\n", sp);
    844  1.6     pk 	  f_print(fout, "%sif (i >= 0) {\n", sp);
    845  1.6     pk 	  f_print(fout, "%s\t(void) ioctl(i, TIOCNOTTY, (char *)NULL);\n", sp);;
    846  1.6     pk 	  f_print(fout, "%s\t(void) close(i);\n", sp);
    847  1.6     pk 	  f_print(fout, "%s}\n", sp);
    848  1.6     pk 	}
    849  1.6     pk 	if (!logflag)
    850  1.6     pk 		open_log_file(infile, sp);
    851  1.6     pk 	f_print(fout, "#endif\n");
    852  1.6     pk 	if (logflag)
    853  1.6     pk 		open_log_file(infile, sp);
    854  1.6     pk }
    855  1.6     pk 
    856  1.6     pk static
    857  1.6     pk open_log_file(infile, sp)
    858  1.6     pk 	char *infile;
    859  1.6     pk 	char *sp;
    860  1.6     pk {
    861  1.6     pk 	char *s;
    862  1.6     pk 
    863  1.6     pk 	s = strrchr(infile, '.');
    864  1.6     pk 	if (s)
    865  1.6     pk 		*s = '\0';
    866  1.6     pk 	f_print(fout,"%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile);
    867  1.6     pk 	if (s)
    868  1.6     pk 		*s = '.';
    869  1.6     pk }
    870  1.6     pk 
    871  1.6     pk 
    872  1.6     pk 
    873  1.6     pk 
    874  1.6     pk /*
    875  1.6     pk  * write a registration for the given transport for Inetd
    876  1.6     pk  */
    877  1.6     pk void
    878  1.6     pk write_inetd_register(transp)
    879  1.6     pk 	char *transp;
    880  1.6     pk {
    881  1.6     pk 	list *l;
    882  1.6     pk 	definition *def;
    883  1.6     pk 	version_list *vp;
    884  1.6     pk 	char *sp;
    885  1.6     pk 	int isudp;
    886  1.6     pk 	char tmpbuf[32];
    887  1.6     pk 
    888  1.6     pk 	if (inetdflag)
    889  1.6     pk 		sp = "\t";
    890  1.6     pk 	else
    891  1.6     pk 		sp = "";
    892  1.6     pk 	if (streq(transp, "udp"))
    893  1.6     pk 		isudp = 1;
    894  1.6     pk 	else
    895  1.6     pk 		isudp = 0;
    896  1.6     pk 	f_print(fout, "\n");
    897  1.6     pk 	if (inetdflag) {
    898  1.6     pk 		f_print(fout, "\tif ((_rpcfdtype == 0) || (_rpcfdtype == %s)) {\n",
    899  1.6     pk 				isudp ? "SOCK_DGRAM" : "SOCK_STREAM");
    900  1.6     pk 	}
    901  1.6     pk 	if (inetdflag && streq(transp, "tcp")) {
    902  1.6     pk 		f_print(fout, "%s\tif (_rpcpmstart)\n", sp);
    903  1.6     pk 
    904  1.6     pk 		f_print(fout, "%s\t\t%s = svc%s_create(%s",
    905  1.6     pk 			sp, TRANSP, "fd", inetdflag? "sock": "RPC_ANYSOCK");
    906  1.6     pk 		if (!isudp)
    907  1.6     pk 			f_print(fout, ", 0, 0");
    908  1.6     pk 		f_print(fout, ");\n");
    909  1.6     pk 
    910  1.6     pk 		f_print(fout, "%s\telse\n", sp);
    911  1.6     pk 
    912  1.6     pk 		f_print(fout, "%s\t\t%s = svc%s_create(%s",
    913  1.6     pk 			sp, TRANSP, transp, inetdflag? "sock": "RPC_ANYSOCK");
    914  1.6     pk 		if (!isudp)
    915  1.6     pk 			f_print(fout, ", 0, 0");
    916  1.6     pk 		f_print(fout, ");\n");
    917  1.6     pk 
    918  1.6     pk 	} else {
    919  1.6     pk 		f_print(fout, "%s\t%s = svc%s_create(%s",
    920  1.6     pk 			sp, TRANSP, transp, inetdflag? "sock": "RPC_ANYSOCK");
    921  1.6     pk 		if (!isudp)
    922  1.6     pk 			f_print(fout, ", 0, 0");
    923  1.6     pk 		f_print(fout, ");\n");
    924  1.6     pk 	}
    925  1.6     pk 	f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP);
    926  1.6     pk 	(void) sprintf(_errbuf, "cannot create %s service.", transp);
    927  1.6     pk 	(void) sprintf(tmpbuf, "%s\t\t", sp);
    928  1.6     pk 	print_err_message(tmpbuf);
    929  1.6     pk 	f_print(fout, "%s\t\texit(1);\n", sp);
    930  1.6     pk 	f_print(fout, "%s\t}\n", sp);
    931  1.6     pk 
    932  1.6     pk 	if (inetdflag) {
    933  1.6     pk 		f_print(fout, "%s\tif (!_rpcpmstart)\n\t", sp);
    934  1.6     pk 		f_print(fout, "%s\tproto = IPPROTO_%s;\n",
    935  1.6     pk 				sp, isudp ? "UDP": "TCP");
    936  1.6     pk 	}
    937  1.6     pk 	for (l = defined; l != NULL; l = l->next) {
    938  1.6     pk 		def = (definition *) l->val;
    939  1.6     pk 		if (def->def_kind != DEF_PROGRAM) {
    940  1.6     pk 			continue;
    941  1.6     pk 		}
    942  1.6     pk 		for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) {
    943  1.6     pk 			f_print(fout, "%s\tif (!svc_register(%s, %s, %s, ",
    944  1.6     pk 				sp, TRANSP, def->def_name, vp->vers_name);
    945  1.6     pk 			pvname(def->def_name, vp->vers_num);
    946  1.6     pk 			if (inetdflag)
    947  1.6     pk 				f_print(fout, ", proto)) {\n");
    948  1.6     pk 			else
    949  1.6     pk 				f_print(fout, ", IPPROTO_%s)) {\n",
    950  1.6     pk 					isudp ? "UDP": "TCP");
    951  1.6     pk 			(void) sprintf(_errbuf, "unable to register (%s, %s, %s).",
    952  1.6     pk 					def->def_name, vp->vers_name, transp);
    953  1.6     pk 			print_err_message(tmpbuf);
    954  1.6     pk 			f_print(fout, "%s\t\texit(1);\n", sp);
    955  1.6     pk 			f_print(fout, "%s\t}\n", sp);
    956  1.6     pk 		}
    957  1.6     pk 	}
    958  1.6     pk 	if (inetdflag)
    959  1.6     pk 		f_print(fout, "\t}\n");
    960  1.1  glass }
    961