version 1.9, 2001/11/24 19:19:59 |
version 1.10, 2001/12/05 09:50:31 |
|
|
static open_log_file __P((char *, char *)); |
static open_log_file __P((char *, char *)); |
|
|
static |
static |
p_xdrfunc( rname, typename ) |
p_xdrfunc(rname, typename) |
char* rname; |
char *rname; |
char* typename; |
char *typename; |
{ |
{ |
if( Cflag ) |
if (Cflag) |
f_print(fout, "\t\txdr_%s = (xdrproc_t) xdr_%s;\n", rname, |
f_print(fout, "\t\txdr_%s = (xdrproc_t) xdr_%s;\n", |
stringfix(typename) ); |
rname, stringfix(typename)); |
else |
else |
f_print(fout, "\t\txdr_%s = xdr_%s;\n", rname, stringfix(typename) ); |
f_print(fout, "\t\txdr_%s = xdr_%s;\n", rname, |
} |
stringfix(typename)); |
|
} |
|
|
void |
void |
internal_proctype(plist) |
internal_proctype(plist) |
proc_list *plist; |
proc_list *plist; |
{ |
{ |
f_print(fout, "static "); |
f_print(fout, "static "); |
ptype( plist->res_prefix, plist->res_type, 1 ); |
ptype(plist->res_prefix, plist->res_type, 1); |
f_print( fout, "*" ); |
f_print(fout, "*"); |
} |
} |
|
|
|
|
/* |
/* |
* write most of the service, that is, everything but the registrations. |
* write most of the service, that is, everything but the registrations. |
*/ |
*/ |
void |
void |
write_most(infile, netflag, nomain) |
write_most(infile, netflag, nomain) |
char *infile; /* our name */ |
char *infile; /* our name */ |
int netflag; |
int netflag; |
int nomain; |
int nomain; |
{ |
{ |
if (inetdflag || pmflag) { |
if (inetdflag || pmflag) { |
char* var_type; |
char *var_type; |
var_type = (nomain? "extern" : "static"); |
var_type = (nomain? "extern" : "static"); |
f_print(fout, "%s int _rpcpmstart;", var_type ); |
f_print(fout, "%s int _rpcpmstart;", var_type); |
f_print(fout, "\t\t/* Started by a port monitor ? */\n"); |
f_print(fout, "\t\t/* Started by a port monitor ? */\n"); |
f_print(fout, "%s int _rpcfdtype;", var_type ); |
f_print(fout, "%s int _rpcfdtype;", var_type); |
f_print(fout, "\t\t/* Whether Stream or Datagram ? */\n"); |
f_print(fout, "\t\t/* Whether Stream or Datagram ? */\n"); |
if (timerflag) { |
if (timerflag) { |
f_print(fout, "%s int _rpcsvcdirty;", var_type ); |
f_print(fout, "%s int _rpcsvcdirty;", var_type); |
f_print(fout, "\t/* Still serving ? */\n"); |
f_print(fout, "\t/* Still serving ? */\n"); |
} |
} |
write_svc_aux( nomain ); |
write_svc_aux(nomain); |
} |
} |
/* write out dispatcher and stubs */ |
/* write out dispatcher and stubs */ |
write_programs( nomain? (char *)NULL : "static" ); |
write_programs(nomain? (char *)NULL : "static"); |
|
|
if( nomain ) |
if (nomain) |
return; |
return; |
|
|
f_print(fout, "\nmain()\n"); |
f_print(fout, "\nmain()\n"); |
f_print(fout, "{\n"); |
f_print(fout, "{\n"); |
if (inetdflag) { |
if (inetdflag) { |
write_inetmost(infile); /* Includes call to write_rpc_svc_fg() */ |
write_inetmost(infile); /* Includes call to write_rpc_svc_fg() */ |
} else { |
} else { |
if( tirpcflag ) { |
if (tirpcflag) { |
if (netflag) { |
if (netflag) { |
f_print(fout, "\tSVCXPRT *%s;\n", TRANSP); |
f_print(fout, "\tSVCXPRT *%s;\n", TRANSP); |
f_print(fout, "\tstruct netconfig *nconf = NULL;\n"); |
f_print(fout, "\tstruct netconfig *nconf = NULL;\n"); |
|
|
} |
} |
|
|
/* |
/* |
* write a registration for the given transport |
* write a registration for the given transport |
*/ |
*/ |
void |
void |
write_netid_register(transp) |
write_netid_register(transp) |
|
|
f_print(fout, "%s\tnconf = getnetconfigent(\"%s\");\n", sp, transp); |
f_print(fout, "%s\tnconf = getnetconfigent(\"%s\");\n", sp, transp); |
f_print(fout, "%s\tif (nconf == NULL) {\n", sp); |
f_print(fout, "%s\tif (nconf == NULL) {\n", sp); |
(void) sprintf(_errbuf, "cannot find %s netid.", transp); |
(void) sprintf(_errbuf, "cannot find %s netid.", transp); |
sprintf(tmpbuf, "%s\t\t", sp); |
snprintf(tmpbuf, sizeof tmpbuf, "%s\t\t", sp); |
print_err_message(tmpbuf); |
print_err_message(tmpbuf); |
f_print(fout, "%s\t\texit(1);\n", sp); |
f_print(fout, "%s\t\texit(1);\n", sp); |
f_print(fout, "%s\t}\n", sp); |
f_print(fout, "%s\t}\n", sp); |
f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n", |
f_print(fout, "%s\t%s = svc_tli_create(RPC_ANYFD, nconf, 0, 0, 0);\n", |
sp, TRANSP); |
sp, TRANSP); |
f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP); |
f_print(fout, "%s\tif (%s == NULL) {\n", sp, TRANSP); |
(void) sprintf(_errbuf, "cannot create %s service.", transp); |
(void) sprintf(_errbuf, "cannot create %s service.", transp); |
print_err_message(tmpbuf); |
print_err_message(tmpbuf); |
|
|
|
|
for (l = defined; l != NULL; l = l->next) { |
for (l = defined; l != NULL; l = l->next) { |
def = (definition *) l->val; |
def = (definition *) l->val; |
if (def->def_kind != DEF_PROGRAM) { |
if (def->def_kind != DEF_PROGRAM) |
continue; |
continue; |
} |
|
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
f_print(fout, |
f_print(fout, |
"%s\t(void) rpcb_unset(%s, %s, nconf);\n", |
"%s\t(void) rpcb_unset(%s, %s, nconf);\n", |
sp, def->def_name, vp->vers_name); |
sp, def->def_name, vp->vers_name); |
f_print(fout, |
f_print(fout, |
"%s\tif (!svc_reg(%s, %s, %s, ", |
"%s\tif (!svc_reg(%s, %s, %s, ", |
sp, TRANSP, def->def_name, vp->vers_name); |
sp, TRANSP, def->def_name, vp->vers_name); |
pvname(def->def_name, vp->vers_num); |
pvname(def->def_name, vp->vers_num); |
f_print(fout, ", nconf)) {\n"); |
f_print(fout, ", nconf)) {\n"); |
(void) sprintf(_errbuf, "unable to register (%s, %s, %s).", |
(void) sprintf(_errbuf, "unable to register (%s, %s, %s).", |
def->def_name, vp->vers_name, transp); |
def->def_name, vp->vers_name, transp); |
print_err_message(tmpbuf); |
print_err_message(tmpbuf); |
f_print(fout, "%s\t\texit(1);\n", sp); |
f_print(fout, "%s\t\texit(1);\n", sp); |
f_print(fout, "%s\t}\n", sp); |
f_print(fout, "%s\t}\n", sp); |
|
|
|
|
for (l = defined; l != NULL; l = l->next) { |
for (l = defined; l != NULL; l = l->next) { |
def = (definition *) l->val; |
def = (definition *) l->val; |
if (def->def_kind != DEF_PROGRAM) { |
if (def->def_kind != DEF_PROGRAM) |
continue; |
continue; |
} |
|
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
f_print(fout, "\tif (!svc_create("); |
f_print(fout, "\tif (!svc_create("); |
pvname(def->def_name, vp->vers_num); |
pvname(def->def_name, vp->vers_num); |
f_print(fout, ", %s, %s, \"%s\")) {\n", |
f_print(fout, ", %s, %s, \"%s\")) {\n", |
def->def_name, vp->vers_name, transp); |
def->def_name, vp->vers_name, transp); |
(void) sprintf(_errbuf, |
(void) sprintf(_errbuf, |
"unable to create (%s, %s) for %s.", |
"unable to create (%s, %s) for %s.", |
def->def_name, vp->vers_name, transp); |
def->def_name, vp->vers_name, transp); |
print_err_message("\t\t"); |
print_err_message("\t\t"); |
f_print(fout, "\t\texit(1);\n"); |
f_print(fout, "\t\texit(1);\n"); |
f_print(fout, "\t}\n"); |
f_print(fout, "\t}\n"); |
|
|
} |
} |
|
|
/* |
/* |
* write the rest of the service |
* write the rest of the service |
*/ |
*/ |
void |
void |
write_rest() |
write_rest() |
|
|
f_print(fout, "\t}\n"); |
f_print(fout, "\t}\n"); |
if (timerflag) { |
if (timerflag) { |
f_print(fout, "\tif (_rpcpmstart) {\n"); |
f_print(fout, "\tif (_rpcpmstart) {\n"); |
f_print(fout, |
f_print(fout, |
"\t\t(void) signal(SIGALRM, %s closedown);\n", |
"\t\t(void) signal(SIGALRM, %s closedown);\n", |
Cflag? "(SIG_PF)" : "(void(*)())" ); |
Cflag? "(SIG_PF)" : "(void(*)())"); |
f_print(fout, "\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n"); |
f_print(fout, "\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n"); |
f_print(fout, "\t}\n"); |
f_print(fout, "\t}\n"); |
} |
} |
|
|
write_programs(storage) |
write_programs(storage) |
char *storage; |
char *storage; |
{ |
{ |
list *l; |
|
definition *def; |
definition *def; |
|
list *l; |
|
|
/* write out stubs for procedure definitions */ |
/* write out stubs for procedure definitions */ |
for (l = defined; l != NULL; l = l->next) { |
for (l = defined; l != NULL; l = l->next) { |
def = (definition *) l->val; |
def = (definition *) l->val; |
if (def->def_kind == DEF_PROGRAM) { |
if (def->def_kind == DEF_PROGRAM) |
write_real_program(def); |
write_real_program(def); |
} |
|
} |
} |
|
|
/* write out dispatcher for each program */ |
/* write out dispatcher for each program */ |
for (l = defined; l != NULL; l = l->next) { |
for (l = defined; l != NULL; l = l->next) { |
def = (definition *) l->val; |
def = (definition *) l->val; |
if (def->def_kind == DEF_PROGRAM) { |
if (def->def_kind == DEF_PROGRAM) |
write_program(def, storage); |
write_program(def, storage); |
} |
|
} |
} |
|
|
|
|
} |
} |
|
|
/* write out definition of internal function (e.g. _printmsg_1(...)) |
/* write out definition of internal function (e.g. _printmsg_1(...)) |
|
|
proc_list *proc; |
proc_list *proc; |
decl_list *l; |
decl_list *l; |
|
|
if( !newstyle ) return; /* not needed for old style */ |
if (!newstyle) return; /* not needed for old style */ |
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
for (proc = vp->procs; proc != NULL; proc = proc->next) { |
for (proc = vp->procs; proc != NULL; proc = proc->next) { |
f_print(fout, "\n"); |
f_print(fout, "\n"); |
internal_proctype(proc); |
internal_proctype(proc); |
f_print(fout, "\n_"); |
f_print(fout, "\n_"); |
pvname(proc->proc_name, vp->vers_num); |
pvname(proc->proc_name, vp->vers_num); |
if( Cflag ) { |
if (Cflag) { |
f_print(fout, "(" ); |
f_print(fout, "("); |
/* arg name */ |
/* arg name */ |
if (proc->arg_num > 1) |
if (proc->arg_num > 1) |
f_print(fout, proc->args.argname); |
f_print(fout, proc->args.argname); |
else |
else |
ptype(proc->args.decls->decl.prefix, |
ptype(proc->args.decls->decl.prefix, |
proc->args.decls->decl.type, 0); |
proc->args.decls->decl.type, 0); |
f_print(fout, " *argp, struct svc_req *%s)\n", |
f_print(fout, " *argp, struct svc_req *%s)\n", |
RQSTP); |
RQSTP); |
} else { |
} else { |
f_print(fout, "(argp, %s)\n", RQSTP ); |
f_print(fout, "(argp, %s)\n", RQSTP); |
/* arg name */ |
/* arg name */ |
if (proc->arg_num > 1) |
if (proc->arg_num > 1) |
f_print(fout, "\t%s *argp;\n", proc->args.argname); |
f_print(fout, "\t%s *argp;\n", proc->args.argname); |
else { |
else { |
f_print(fout, "\t"); |
f_print(fout, "\t"); |
ptype(proc->args.decls->decl.prefix, |
ptype(proc->args.decls->decl.prefix, |
proc->args.decls->decl.type, 0); |
proc->args.decls->decl.type, 0); |
f_print(fout, " *argp;\n"); |
f_print(fout, " *argp;\n"); |
} |
} |
|
|
pvname_svc(proc->proc_name, vp->vers_num); |
pvname_svc(proc->proc_name, vp->vers_num); |
f_print(fout, "("); |
f_print(fout, "("); |
if (proc->arg_num < 2) { /* single argument */ |
if (proc->arg_num < 2) { /* single argument */ |
if (!streq( proc->args.decls->decl.type, "void")) |
if (!streq(proc->args.decls->decl.type, "void")) |
f_print(fout, "*argp, "); /* non-void */ |
f_print(fout, "*argp, "); /* non-void */ |
} else { |
} else { |
for (l = proc->args.decls; l != NULL; l = l->next) |
for (l = proc->args.decls; l != NULL; l = l->next) |
f_print(fout, "argp->%s, ", l->decl.name); |
f_print(fout, "argp->%s, ", l->decl.name); |
} |
} |
f_print(fout, "%s));\n}\n", RQSTP); |
f_print(fout, "%s));\n}\n", RQSTP); |
} |
} |
} |
} |
} |
} |
|
|
static |
static |
write_program(def, storage) |
write_program(def, storage) |
definition *def; |
definition *def; |
char *storage; |
char *storage; |
|
|
|
|
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
for (vp = def->def.pr.versions; vp != NULL; vp = vp->next) { |
f_print(fout, "\n"); |
f_print(fout, "\n"); |
if (storage != NULL) { |
if (storage != NULL) |
f_print(fout, "%s ", storage); |
f_print(fout, "%s ", storage); |
} |
|
f_print(fout, "void\n"); |
f_print(fout, "void\n"); |
pvname(def->def_name, vp->vers_num); |
pvname(def->def_name, vp->vers_num); |
|
|
if (Cflag) { |
if (Cflag) { |
f_print(fout, "(struct svc_req *%s, ", RQSTP); |
f_print(fout, "(struct svc_req *%s, ", RQSTP); |
f_print(fout, "register SVCXPRT *%s)\n", TRANSP); |
f_print(fout, "register SVCXPRT *%s)\n", TRANSP); |
} else { |
} else { |
f_print(fout, "(%s, %s)\n", RQSTP, TRANSP); |
f_print(fout, "(%s, %s)\n", RQSTP, TRANSP); |
f_print(fout, " struct svc_req *%s;\n", RQSTP); |
f_print(fout, " struct svc_req *%s;\n", RQSTP); |
f_print(fout, " register SVCXPRT *%s;\n", TRANSP); |
f_print(fout, " register SVCXPRT *%s;\n", TRANSP); |
} |
} |
|
|
f_print(fout, "{\n"); |
f_print(fout, "{\n"); |
|
|
filled = 0; |
filled = 0; |
f_print(fout, "\tunion {\n"); |
f_print(fout, "\tunion {\n"); |
for (proc = vp->procs; proc != NULL; proc = proc->next) { |
for (proc = vp->procs; proc != NULL; proc = proc->next) { |
if (proc->arg_num < 2) { /* single argument */ |
if (proc->arg_num < 2) { /* single argument */ |
if (streq(proc->args.decls->decl.type, |
if (streq(proc->args.decls->decl.type, |
"void")) { |
"void")) |
continue; |
continue; |
} |
|
filled = 1; |
filled = 1; |
f_print(fout, "\t\t"); |
f_print(fout, "\t\t"); |
ptype(proc->args.decls->decl.prefix, |
ptype(proc->args.decls->decl.prefix, |
proc->args.decls->decl.type, 0); |
proc->args.decls->decl.type, 0); |
pvname(proc->proc_name, vp->vers_num); |
pvname(proc->proc_name, vp->vers_num); |
f_print(fout, "_arg;\n"); |
f_print(fout, "_arg;\n"); |
|
|
} |
} else { |
else { |
|
filled = 1; |
filled = 1; |
f_print(fout, "\t\t%s", proc->args.argname); |
f_print(fout, "\t\t%s", proc->args.argname); |
f_print(fout, " "); |
f_print(fout, " "); |
|
|
f_print(fout, "_arg;\n"); |
f_print(fout, "_arg;\n"); |
} |
} |
} |
} |
if (!filled) { |
if (!filled) |
f_print(fout, "\t\tint fill;\n"); |
f_print(fout, "\t\tint fill;\n"); |
} |
|
f_print(fout, "\t} %s;\n", ARG); |
f_print(fout, "\t} %s;\n", ARG); |
f_print(fout, "\tchar *%s;\n", RESULT); |
f_print(fout, "\tchar *%s;\n", RESULT); |
|
|
if (Cflag) { |
if (Cflag) { |
f_print(fout, "\txdrproc_t xdr_%s, xdr_%s;\n", ARG, RESULT); |
f_print(fout, "\txdrproc_t xdr_%s, xdr_%s;\n", ARG, RESULT); |
f_print(fout, |
f_print(fout, |
"\tchar *(*%s)(char *, struct svc_req *);\n", |
"\tchar *(*%s)(char *, struct svc_req *);\n", |
ROUTINE); |
ROUTINE); |
} else { |
} else { |
f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", ARG, RESULT); |
f_print(fout, "\tbool_t (*xdr_%s)(), (*xdr_%s)();\n", |
f_print(fout, "\tchar *(*%s)();\n", ROUTINE); |
ARG, RESULT); |
|
f_print(fout, "\tchar *(*%s)();\n", ROUTINE); |
} |
} |
|
|
f_print(fout, "\n"); |
f_print(fout, "\n"); |
|
|
if (callerflag) |
if (callerflag) |
f_print(fout, "\tcaller = transp;\n"); /*EVAS*/ |
f_print(fout, "\tcaller = transp;\n"); /*EVAS*/ |
if (timerflag) |
if (timerflag) |
f_print(fout, "\t_rpcsvcdirty = 1;\n"); |
f_print(fout, "\t_rpcsvcdirty = 1;\n"); |
|
|
if (!nullproc(vp->procs)) { |
if (!nullproc(vp->procs)) { |
f_print(fout, "\tcase NULLPROC:\n"); |
f_print(fout, "\tcase NULLPROC:\n"); |
f_print(fout, |
f_print(fout, |
Cflag |
Cflag |
? "\t\t(void) svc_sendreply(%s, (xdrproc_t) xdr_void, (char *)NULL);\n" |
? "\t\t(void) svc_sendreply(%s, (xdrproc_t) xdr_void, (char *)NULL);\n" |
: "\t\t(void) svc_sendreply(%s, xdr_void, (char *)NULL);\n", |
: "\t\t(void) svc_sendreply(%s, xdr_void, (char *)NULL);\n", |
TRANSP); |
TRANSP); |
print_return("\t\t"); |
print_return("\t\t"); |
f_print(fout, "\n"); |
f_print(fout, "\n"); |
} |
} |
for (proc = vp->procs; proc != NULL; proc = proc->next) { |
for (proc = vp->procs; proc != NULL; proc = proc->next) { |
f_print(fout, "\tcase %s:\n", proc->proc_name); |
f_print(fout, "\tcase %s:\n", proc->proc_name); |
if (proc->arg_num < 2) { /* single argument */ |
if (proc->arg_num < 2) { /* single argument */ |
p_xdrfunc( ARG, proc->args.decls->decl.type); |
p_xdrfunc(ARG, proc->args.decls->decl.type); |
} else { |
} else { |
p_xdrfunc( ARG, proc->args.argname); |
p_xdrfunc(ARG, proc->args.argname); |
} |
} |
p_xdrfunc( RESULT, proc->res_type); |
p_xdrfunc(RESULT, proc->res_type); |
if( Cflag ) |
if (Cflag) |
f_print(fout, |
f_print(fout, |
"\t\t%s = (char *(*)(char *, struct svc_req *)) ", |
"\t\t%s = (char *(*)(char *, struct svc_req *)) ", |
ROUTINE); |
ROUTINE); |
else |
else |
f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE); |
f_print(fout, "\t\t%s = (char *(*)()) ", ROUTINE); |
|
|
if (newstyle) { /* new style: calls internal routine */ |
if (newstyle) { /* new style: calls internal routine */ |
f_print(fout,"_"); |
f_print(fout,"_"); |
} |
} |
if (!newstyle ) |
if (!newstyle) |
pvname_svc(proc->proc_name, vp->vers_num); |
pvname_svc(proc->proc_name, vp->vers_num); |
else |
else |
pvname(proc->proc_name, vp->vers_num); |
pvname(proc->proc_name, vp->vers_num); |
f_print(fout, ";\n"); |
f_print(fout, ";\n"); |
f_print(fout, "\t\tbreak;\n\n"); |
f_print(fout, "\t\tbreak;\n\n"); |
} |
} |
|
|
f_print(fout, "\t}\n"); |
f_print(fout, "\t}\n"); |
|
|
f_print(fout, "\t(void) memset((char *)&%s, 0, sizeof (%s));\n", ARG, ARG); |
f_print(fout, "\t(void) memset((char *)&%s, 0, sizeof (%s));\n", ARG, ARG); |
printif("getargs", TRANSP, "(caddr_t) &", ARG); |
printif ("getargs", TRANSP, "(caddr_t) &", ARG); |
printerr("decode", TRANSP); |
printerr("decode", TRANSP); |
print_return("\t\t"); |
print_return("\t\t"); |
f_print(fout, "\t}\n"); |
f_print(fout, "\t}\n"); |
|
|
if (Cflag) |
if (Cflag) |
f_print(fout, "\t%s = (*%s)((char *)&%s, %s);\n", |
f_print(fout, "\t%s = (*%s)((char *)&%s, %s);\n", |
RESULT, ROUTINE, ARG, RQSTP); |
RESULT, ROUTINE, ARG, RQSTP); |
else |
else |
f_print(fout, "\t%s = (*%s)(&%s, %s);\n", |
f_print(fout, "\t%s = (*%s)(&%s, %s);\n", |
RESULT, ROUTINE, ARG, RQSTP); |
RESULT, ROUTINE, ARG, RQSTP); |
f_print(fout, |
f_print(fout, |
"\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n", |
"\tif (%s != NULL && !svc_sendreply(%s, xdr_%s, %s)) {\n", |
RESULT, TRANSP, RESULT, RESULT); |
RESULT, TRANSP, RESULT, RESULT); |
printerr("systemerr", TRANSP); |
printerr("systemerr", TRANSP); |
f_print(fout, "\t}\n"); |
f_print(fout, "\t}\n"); |
|
|
printif("freeargs", TRANSP, "(caddr_t) &", ARG); |
printif ("freeargs", TRANSP, "(caddr_t) &", ARG); |
(void) sprintf(_errbuf, "unable to free arguments"); |
(void) sprintf(_errbuf, "unable to free arguments"); |
print_err_message("\t\t"); |
print_err_message("\t\t"); |
f_print(fout, "\t\texit(1);\n"); |
f_print(fout, "\t\texit(1);\n"); |
|
|
} |
} |
|
|
static |
static |
printif(proc, transp, prefix, arg) |
printif (proc, transp, prefix, arg) |
char *proc; |
char *proc; |
char *transp; |
char *transp; |
char *prefix; |
char *prefix; |
char *arg; |
char *arg; |
{ |
{ |
f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n", |
f_print(fout, "\tif (!svc_%s(%s, xdr_%s, %s%s)) {\n", |
proc, transp, arg, prefix, arg); |
proc, transp, arg, prefix, arg); |
} |
} |
|
|
nullproc(proc) |
nullproc(proc) |
proc_list *proc; |
proc_list *proc; |
{ |
{ |
for (; proc != NULL; proc = proc->next) { |
for (; proc != NULL; proc = proc->next) { |
if (streq(proc->proc_num, "0")) { |
if (streq(proc->proc_num, "0")) |
return (1); |
return (1); |
} |
|
} |
} |
return (0); |
return (0); |
} |
} |
|
|
f_print(fout, "\tstruct sockaddr_in saddr;\n"); |
f_print(fout, "\tstruct sockaddr_in saddr;\n"); |
f_print(fout, "\tint asize = sizeof (saddr);\n"); |
f_print(fout, "\tint asize = sizeof (saddr);\n"); |
f_print(fout, "\n"); |
f_print(fout, "\n"); |
f_print(fout, |
f_print(fout, |
"\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n"); |
"\tif (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {\n"); |
f_print(fout, "\t\tint ssize = sizeof (int);\n\n"); |
f_print(fout, "\t\tint ssize = sizeof (int);\n\n"); |
f_print(fout, "\t\tif (saddr.sin_family != AF_INET)\n"); |
f_print(fout, "\t\tif (saddr.sin_family != AF_INET)\n"); |
|
|
print_pmapunset(space) |
print_pmapunset(space) |
char *space; |
char *space; |
{ |
{ |
list *l; |
|
definition *def; |
|
version_list *vp; |
version_list *vp; |
|
definition *def; |
|
list *l; |
|
|
for (l = defined; l != NULL; l = l->next) { |
for (l = defined; l != NULL; l = l->next) { |
def = (definition *) l->val; |
def = (definition *) l->val; |
if (def->def_kind == DEF_PROGRAM) { |
if (def->def_kind == DEF_PROGRAM) { |
for (vp = def->def.pr.versions; vp != NULL; |
for (vp = def->def.pr.versions; vp != NULL; |
vp = vp->next) { |
vp = vp->next) { |
f_print(fout, "%s(void) pmap_unset(%s, %s);\n", |
f_print(fout, "%s(void) pmap_unset(%s, %s);\n", |
space, def->def_name, vp->vers_name); |
space, def->def_name, vp->vers_name); |
} |
} |
} |
} |
} |
} |
|
|
} |
} |
|
|
/* |
/* |
* Write the server auxiliary function ( _msgout, timeout) |
* Write the server auxiliary function (_msgout, timeout) |
*/ |
*/ |
void |
void |
write_svc_aux( nomain ) |
write_svc_aux(nomain) |
int nomain; |
int nomain; |
{ |
{ |
if (!logflag) |
if (!logflag) |
write_msg_out(); |
write_msg_out(); |
if( !nomain ) |
if (!nomain) |
write_timeout_func(); |
write_timeout_func(); |
if (callerflag) /*EVAS*/ |
if (callerflag) /*EVAS*/ |
write_caller_func(); /*EVAS*/ |
write_caller_func(); /*EVAS*/ |
} |
} |
|
|
{ |
{ |
f_print(fout, "\n"); |
f_print(fout, "\n"); |
f_print(fout, "static\n"); |
f_print(fout, "static\n"); |
if( !Cflag ) { |
if (!Cflag) { |
f_print(fout, "void _msgout(msg)\n"); |
f_print(fout, "void _msgout(msg)\n"); |
f_print(fout, "\tchar *msg;\n"); |
f_print(fout, "\tchar *msg;\n"); |
} else { |
} else { |
f_print(fout, "void _msgout(char* msg)\n"); |
f_print(fout, "void _msgout(char *msg)\n"); |
} |
} |
f_print(fout, "{\n"); |
f_print(fout, "{\n"); |
f_print(fout, "#ifdef RPC_SVC_FG\n"); |
f_print(fout, "#ifdef RPC_SVC_FG\n"); |
|
|
f_print(fout, "\t\tstruct netconfig *nconf = NULL;\n"); |
f_print(fout, "\t\tstruct netconfig *nconf = NULL;\n"); |
f_print(fout, "\t\tSVCXPRT *%s;\n", TRANSP); |
f_print(fout, "\t\tSVCXPRT *%s;\n", TRANSP); |
} |
} |
if( timerflag ) |
if (timerflag) |
f_print(fout, "\t\tint pmclose;\n"); |
f_print(fout, "\t\tint pmclose;\n"); |
/* not necessary, defined in /usr/include/stdlib */ |
/* not necessary, defined in /usr/include/stdlib */ |
/* f_print(fout, "\t\textern char *getenv();\n");*/ |
/* f_print(fout, "\t\textern char *getenv();\n");*/ |
|
|
f_print(fout, "\t\t\t\texit(1);\n"); |
f_print(fout, "\t\t\t\texit(1);\n"); |
f_print(fout, "\t\t\t}\n"); |
f_print(fout, "\t\t\t}\n"); |
f_print(fout, "\t\t}\n"); |
f_print(fout, "\t\t}\n"); |
if( timerflag ) |
if (timerflag) |
f_print(fout, "\t\tpmclose = (t_getstate(0) != T_DATAXFER);\n"); |
f_print(fout, "\t\tpmclose = (t_getstate(0) != T_DATAXFER);\n"); |
f_print(fout, "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) {\n", |
f_print(fout, "\t\tif ((%s = svc_tli_create(0, nconf, NULL, 0, 0)) == NULL) {\n", |
TRANSP); |
TRANSP); |
|
|
if (timerflag) { |
if (timerflag) { |
f_print(fout, "\t\tif (pmclose) {\n"); |
f_print(fout, "\t\tif (pmclose) {\n"); |
f_print(fout, "\t\t\t(void) signal(SIGALRM, %s closedown);\n", |
f_print(fout, "\t\t\t(void) signal(SIGALRM, %s closedown);\n", |
Cflag? "(SIG_PF)" : "(void(*)())" ); |
Cflag? "(SIG_PF)" : "(void(*)())"); |
f_print(fout, "\t\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n"); |
f_print(fout, "\t\t\t(void) alarm(_RPCSVC_CLOSEDOWN);\n"); |
f_print(fout, "\t\t}\n"); |
f_print(fout, "\t\t}\n"); |
} |
} |
|
|
{ |
{ |
f_print(fout, "#ifndef RPC_SVC_FG\n"); |
f_print(fout, "#ifndef RPC_SVC_FG\n"); |
f_print(fout, "%sint size;\n", sp); |
f_print(fout, "%sint size;\n", sp); |
if( tirpcflag ) |
if (tirpcflag) |
f_print(fout, "%sstruct rlimit rl;\n", sp); |
f_print(fout, "%sstruct rlimit rl;\n", sp); |
if (inetdflag) |
if (inetdflag) |
f_print(fout, "%sint pid, i;\n\n", sp); |
f_print(fout, "%sint pid, i;\n\n", sp); |
|
|
f_print(fout, "%sif (pid)\n", sp); |
f_print(fout, "%sif (pid)\n", sp); |
f_print(fout, "%s\texit(0);\n", sp); |
f_print(fout, "%s\texit(0);\n", sp); |
/* get number of file descriptors */ |
/* get number of file descriptors */ |
if( tirpcflag ) { |
if (tirpcflag) { |
f_print(fout, "%srl.rlim_max = 0;\n", sp); |
f_print(fout, "%srl.rlim_max = 0;\n", sp); |
f_print(fout, "%sgetrlimit(RLIMIT_NOFILE, &rl);\n", sp); |
f_print(fout, "%sgetrlimit(RLIMIT_NOFILE, &rl);\n", sp); |
f_print(fout, "%sif ((size = rl.rlim_max) == 0)\n", sp); |
f_print(fout, "%sif ((size = rl.rlim_max) == 0)\n", sp); |
|
|
f_print(fout, "%s(void) dup2(i, 1);\n", sp); |
f_print(fout, "%s(void) dup2(i, 1);\n", sp); |
f_print(fout, "%s(void) dup2(i, 2);\n", sp); |
f_print(fout, "%s(void) dup2(i, 2);\n", sp); |
/* This removes control of the controlling terminal */ |
/* This removes control of the controlling terminal */ |
if( tirpcflag ) |
if (tirpcflag) |
f_print(fout, "%ssetsid();\n", sp); |
f_print(fout, "%ssetsid();\n", sp); |
else { |
else { |
f_print(fout, "%si = open(\"/dev/tty\", 2);\n", sp); |
f_print(fout, "%si = open(\"/dev/tty\", 2);\n", sp); |
|
|
char *s; |
char *s; |
|
|
s = strrchr(infile, '.'); |
s = strrchr(infile, '.'); |
if (s) |
if (s) |
*s = '\0'; |
*s = '\0'; |
f_print(fout,"%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile); |
f_print(fout,"%sopenlog(\"%s\", LOG_PID, LOG_DAEMON);\n", sp, infile); |
if (s) |
if (s) |
*s = '.'; |
*s = '.'; |
} |
} |
|
|
|
|
|
|
|
|
/* |
/* |
* write a registration for the given transport for Inetd |
* write a registration for the given transport for Inetd |
*/ |
*/ |
|
|
pvname(def->def_name, vp->vers_num); |
pvname(def->def_name, vp->vers_num); |
if (inetdflag) |
if (inetdflag) |
f_print(fout, ", proto)) {\n"); |
f_print(fout, ", proto)) {\n"); |
else |
else |
f_print(fout, ", IPPROTO_%s)) {\n", |
f_print(fout, ", IPPROTO_%s)) {\n", |
isudp ? "UDP": "TCP"); |
isudp ? "UDP": "TCP"); |
(void) sprintf(_errbuf, "unable to register (%s, %s, %s).", |
(void) sprintf(_errbuf, "unable to register (%s, %s, %s).", |