2021-10-11 18:37:13 -03:00

152 lines
3.0 KiB
C

#ifndef lint
static char sccsid[] = "@(#)bootparam_svc.c 1.1 94/10/31 SMI";
#endif
/*
* Main program of the bootparam server.
*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/file.h>
#include <rpc/rpc.h>
#include <rpcsvc/bootparam.h>
extern int debug;
static void background();
static void bootparamprog_1();
main(argc, argv)
int argc;
char **argv;
{
SVCXPRT *transp;
if (argc > 1) {
if (strncmp(argv[1], "-d", 2) == 0) {
debug++;
fprintf(stderr, "In debug mode\n");
} else {
fprintf(stderr, "usage: %s [-d]\n", argv[0]);
exit(1);
}
}
if (! issock(0)) {
/*
* Started by user.
*/
if (!debug)
background();
pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS);
if ((transp = svcudp_create(RPC_ANYSOCK)) == NULL) {
fprintf(stderr, "cannot create udp service.\n");
exit(1);
}
if (! svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS,
bootparamprog_1, IPPROTO_UDP)) {
fprintf(stderr, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp).\n");
exit(1);
}
} else {
/*
* Started by inetd.
*/
if ((transp = svcudp_create(0)) == NULL) {
fprintf(stderr, "cannot create udp service.\n");
exit(1);
}
if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS,
bootparamprog_1, 0)) {
fprintf(stderr, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp).\n");
exit(1);
}
}
/*
* Start serving
*/
init_nlist(); /* nlist the kernel */
svc_run();
fprintf(stderr, "svc_run returned\n");
exit(1);
/* NOTREACHED */
}
static void
background()
{
#ifndef DEBUG
if (fork())
exit(0);
{ int s;
for (s = 0; s < 10; s++)
(void) close(s);
}
(void) open("/", O_RDONLY);
(void) dup2(0, 1);
(void) dup2(0, 2);
#endif
{ int tt = open("/dev/tty", O_RDWR);
if (tt > 0) {
ioctl(tt, TIOCNOTTY, 0);
close(tt);
}
}
}
static void
bootparamprog_1(rqstp, transp)
struct svc_req *rqstp;
SVCXPRT *transp;
{
union {
bp_whoami_arg bootparamproc_whoami_1_arg;
bp_getfile_arg bootparamproc_getfile_1_arg;
} argument;
char *result;
bool_t (*xdr_argument)(), (*xdr_result)();
char *(*local)();
extern bp_whoami_res *bootparamproc_whoami_1();
extern bp_getfile_res *bootparamproc_getfile_1();
switch (rqstp->rq_proc) {
case NULLPROC:
svc_sendreply(transp, xdr_void, NULL);
return;
case BOOTPARAMPROC_WHOAMI:
xdr_argument = xdr_bp_whoami_arg;
xdr_result = xdr_bp_whoami_res;
local = (char *(*)()) bootparamproc_whoami_1;
break;
case BOOTPARAMPROC_GETFILE:
xdr_argument = xdr_bp_getfile_arg;
xdr_result = xdr_bp_getfile_res;
local = (char *(*)()) bootparamproc_getfile_1;
break;
default:
svcerr_noproc(transp);
return;
}
bzero(&argument, sizeof(argument));
if (! svc_getargs(transp, xdr_argument, &argument)) {
svcerr_decode(transp);
return;
}
if ((result = (*local)(&argument)) != NULL) {
if (! svc_sendreply(transp, xdr_result, result)) {
svcerr_systemerr(transp);
}
}
if (! svc_freeargs(transp, xdr_argument, &argument)) {
fprintf(stderr,"unable to free arguments\n");
exit(1);
}
}