Home | History | Annotate | Download | only in rpc01
      1 #include <sys/ioctl.h>
      2 #include <stdio.h>
      3 #include <netdb.h>
      4 #include <errno.h>
      5 #include <fcntl.h>
      6 #include <stdlib.h>
      7 #include <unistd.h>
      8 #include <rpc/rpc.h>
      9 #include "librpc01.h"
     10 
     11 int debug = 0;
     12 int program = 2000333;
     13 int version = 10;
     14 
     15 void breakpoint(void);
     16 void service_request(struct svc_req *rqstp, SVCXPRT * transp);
     17 
     18 int main(int argc, char *argv[])
     19 {
     20 	SVCXPRT *transp;
     21 	int i, n;
     22 
     23 	for (i = 1; i < argc; i++) {
     24 		if (!strcmp(argv[i], "-d"))
     25 			debug = 1;
     26 		if (!strcmp(argv[i], "-p")) {
     27 			if (++i >= argc) {
     28 				fprintf(stderr, "%s: -p requires an argument\n",
     29 					argv[0]);
     30 				exit(1);
     31 			}
     32 			n = sscanf(argv[i], "%d", &program);
     33 			if (n != 1) {
     34 				fprintf(stderr,
     35 					"%s: -p requires an numeric argument\n",
     36 					argv[0]);
     37 				exit(1);
     38 			}
     39 		}
     40 		if (!strcmp(argv[i], "-v")) {
     41 			if (++i >= argc) {
     42 				fprintf(stderr, "%s: -v requires an argument\n",
     43 					argv[0]);
     44 				exit(1);
     45 			}
     46 			n = sscanf(argv[i], "%d", &version);
     47 			if (n != 1) {
     48 				fprintf(stderr,
     49 					"%s: -v requires an numeric argument\n",
     50 					argv[0]);
     51 				exit(1);
     52 			}
     53 		}
     54 	}
     55 
     56 	if (!debug) {
     57 		if ((n = fork()) < 0) {
     58 			fprintf(stderr, "%s: Can't fork\n", argv[0]);
     59 			exit(1);
     60 		}
     61 
     62 		if (n > 0)
     63 			exit(0);
     64 
     65 		i = 50;
     66 		while (--i >= 0)
     67 			close(i);
     68 		open("/dev/null", O_RDONLY);
     69 		open("/dev/null", O_WRONLY);
     70 		i = dup(1);
     71 
     72 		if ((i = open("/dev/tty", O_RDWR)) >= 0) {
     73 			ioctl(i, TIOCNOTTY, 0);
     74 			close(i);
     75 		}
     76 	}
     77 
     78 	pmap_unset(program, version);
     79 	transp = svcudp_create(RPC_ANYSOCK);
     80 	svc_register(transp, program, version, service_request, IPPROTO_UDP);
     81 	transp = svctcp_create(RPC_ANYSOCK, 0, 0);
     82 	svc_register(transp, program, version, service_request, IPPROTO_TCP);
     83 	svc_run();
     84 	exit(1);
     85 }
     86 
     87 void service_request(struct svc_req *rqstp, SVCXPRT * transp)
     88 {
     89 	struct data *buffer;
     90 
     91 	switch (rqstp->rq_proc) {
     92 	case 0:
     93 		svc_sendreply(transp, (xdrproc_t)xdr_void, NULL);
     94 		breakpoint();
     95 		return;
     96 
     97 	case 99:
     98 		exit(0);
     99 
    100 	case 1:
    101 		svc_getargs(transp, (xdrproc_t)xdr_receive_data,
    102 				(char *)&buffer);
    103 		svc_sendreply(transp, (xdrproc_t)xdr_send_data,
    104 				(char *)buffer);
    105 		free(buffer->data);
    106 		free(buffer);
    107 		return;
    108 
    109 	default:
    110 		svcerr_noproc(transp);
    111 		return;
    112 	}
    113 }
    114 
    115 void breakpoint(void)
    116 {
    117 	if (debug)
    118 		printf("breakpoint\n");
    119 }
    120