dannyb@kulcs.uucp (Danny Backx) (06/16/88)
The RPCGEN compiler provided with SUNRPC 3.9 does not allow writing servers suitable for use with inetd(8). The changes that have to be applied to rpcgen's output are minimal, though. (See the manual pages for inetd). The diffs provided here are minimal changes to the original rpcgen, in order to generate C programs for use with inetd directly. An option "-i" is added to rpcgen. If invoked, the generated programs are slightly different. No fundamentals in rpcgen's internals are changed. (Only a few printf's). The diffs are listed below. I used this for making a TCP-based server. If you do this, beware ! Your server should contain code to kill itself after it has provided you with the last answer. In my case, this means that the end of one of my service routines looks like this: %% #ifdef INETD %% alarm(5); %% signal(SIGALRM, exit); %% #endif INETD %% %% res = 1 ; %% return &res ; %% } <<< diff for rpc_main.c >>> 53a54 > int iflag; 64a66 > static int inetd = 0; 75c77 < "usage: %s infile\n", cmdname); --- > "usage: %s [-i] infile\n", cmdname); 77c79 < " %s [-c | -h | -l | -m] [-o outfile] [infile]\n", --- > " %s [-i] [-c | -h | -l | -m] [-o outfile] [infile]\n", 80c82 < " %s [-s udp|tcp]* [-o outfile] [infile]\n", --- > " %s [-i] [-s udp|tcp]* [-o outfile] [infile]\n", 83a86,87 > if (cmd.iflag) > inetd = 1; 285c289 < write_most(); --- > write_most(inetd); 337c341 < write_register(argv[i + 1]); --- > write_register(argv[i + 1], inetd); 369a374 > flag['i'] = 0; 383a389 > case 'i': 424a431 > cmd->iflag = flag['i']; <<< diff for rpc_svcout.c >>> 54c54,55 < write_most() --- > write_most(inetd) > int inetd; 74a76,79 > > if (inetd) > return; /* only 'pmap_unset' behind this */ > 91c96 < write_register(transp) --- > write_register(transp, inetd) 92a98 > int inetd; 99c105,108 < f_print(fout, "\t%s = svc%s_create(RPC_ANYSOCK", TRANSP, transp); --- > if (inetd) > f_print(fout, "\t%s = svc%s_create(0", TRANSP, transp); > else > f_print(fout, "\t%s = svc%s_create(RPC_ANYSOCK", TRANSP, transp); 119,120c128,132 < f_print(fout, ", IPPROTO_%s)) {\n", < streq(transp, "udp") ? "UDP" : "TCP"); --- > if (inetd) > f_print(fout, ", 0)) {\n"); > else > f_print(fout, ", IPPROTO_%s)) {\n", > streq(transp, "udp") ? "UDP" : "TCP"); -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Danny Backx | mail: Katholieke Universiteit Leuven Tel: +32 16 200656 x 3544 | Dept. Computer Science E-mail: dannyb@kulcs.UUCP | Celestijnenlaan 200 A ... mcvax!prlb2!kulcs!dannyb | B-3030 Leuven dannyb@blekul60.BITNET | Belgium