This is pcnfsd_svc.c in view mode; [Download] [Up]
/* RE_SID: @(%)/tmp_mnt/vol/dosnfs/shades_SCCS/unix/pcnfsd/v2/src/SCCS/s.pcnfsd_svc.c 1.5 92/08/18 12:53:42 SMI */
/*
* This file has been edited by hand.
* It was generated using rpcgen.
*/
/* The following was added to conform with SVR4 */
#define PORTMAP
/* End inclusions */
#include <stdio.h>
#include <rpc/rpc.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
/* The following changes for Ultrix 4.2 were suggested by various users */
#ifndef ULTRIX
#include <syslog.h>
#else /* ULTRIX */
#include <sys/time.h>
#include <sys/syslog.h>
#endif /* ULTRIX */
/* End of Ultrix changes */
/* The following was added to conform with SVR4 */
#include <netinet/in.h>
#include <sys/resource.h>
/* End inclusions */
#include <netdb.h>
#include "pcnfsd.h"
#ifdef DEBUG
#define RPC_SVC_FG
#endif
#define _RPCSVC_CLOSEDOWN 120
static _msgout();
#if 1
void msg_out(msg) char *msg; {_msgout(msg);}
#endif
#if RPC_HDR
extern void msg_out();
#endif
static void pcnfsdprog_1();
static void pcnfsdprog_2();
static void closedown();
static int _rpcpmstart; /* Started by a port monitor ? */
static int _rpcfdtype; /* Whether Stream or Datagram ? */
static int _rpcsvcdirty; /* Still serving ? */
/*
** The following was added by hand:
*/
SVCXPRT *caller;
extern void config_from_file();
main()
{
register SVCXPRT *transp;
int sock;
int proto;
struct sockaddr_in saddr;
int asize = sizeof(saddr);
if (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {
int ssize = sizeof(int);
if (saddr.sin_family != AF_INET)
exit(1);
if (getsockopt(0, SOL_SOCKET, SO_TYPE,
(char *)&_rpcfdtype, &ssize) == -1)
exit(1);
sock = 0;
_rpcpmstart = 1;
proto = 0;
openlog("pcnfsd", LOG_PID, LOG_DAEMON);
} else {
#ifndef RPC_SVC_FG
int i, pid;
pid = fork();
if (pid < 0) {
perror("cannot fork");
exit(1);
}
if (pid)
exit(0);
for (i = 0 ; i < 20; i++)
(void) close(i);
#ifdef TIOCNOTTY
i = open("/dev/console", 2);
(void) dup2(i, 1);
(void) dup2(i, 2);
i = open("/dev/tty", 2);
if (i >= 0) {
(void) ioctl(i, TIOCNOTTY, (char *)NULL);
(void) close(i);
}
#else TIOCNOTTY
(void)setsid();
#endif TIOCNOTTY
openlog("pcnfsd", LOG_PID, LOG_DAEMON);
#endif RPC_SVC_FG
sock = RPC_ANYSOCK;
(void) pmap_unset(PCNFSDPROG, PCNFSDVERS);
(void) pmap_unset(PCNFSDPROG, PCNFSDV2);
}
if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_DGRAM)) {
transp = svcudp_create(sock);
if (transp == NULL) {
_msgout("cannot create udp service.");
exit(1);
}
if (!_rpcpmstart)
proto = IPPROTO_UDP;
if (!svc_register(transp, PCNFSDPROG, PCNFSDVERS, pcnfsdprog_1, proto)) {
_msgout("unable to register (PCNFSDPROG, PCNFSDVERS, udp).");
exit(1);
}
if (!svc_register(transp, PCNFSDPROG, PCNFSDV2, pcnfsdprog_2, proto)) {
_msgout("unable to register (PCNFSDPROG, PCNFSDV2, udp).");
exit(1);
}
}
if ((_rpcfdtype == 0) || (_rpcfdtype == SOCK_STREAM)) {
transp = svctcp_create(sock, 0, 0);
if (transp == NULL) {
_msgout("cannot create tcp service.");
exit(1);
}
if (!_rpcpmstart)
proto = IPPROTO_TCP;
if (!svc_register(transp, PCNFSDPROG, PCNFSDVERS, pcnfsdprog_1, proto)) {
_msgout("unable to register (PCNFSDPROG, PCNFSDVERS, tcp).");
exit(1);
}
if (!svc_register(transp, PCNFSDPROG, PCNFSDV2, pcnfsdprog_2, proto)) {
_msgout("unable to register (PCNFSDPROG, PCNFSDV2, tcp).");
exit(1);
}
}
if (transp == (SVCXPRT *)NULL) {
_msgout("could not create a handle");
exit(1);
}
if (_rpcpmstart) {
(void) signal(SIGALRM, closedown);
(void) alarm(_RPCSVC_CLOSEDOWN);
}
/*
** The following was added by hand:
*/
config_from_file();
#ifdef RPC_SVC_FG
_msgout("rpc.pcnfsd version 2 ready to service requests");
#endif RPC_SVC_FG
svc_run();
_msgout("svc_run returned");
exit(1);
/* NOTREACHED */
}
static void
pcnfsdprog_1(rqstp, transp)
struct svc_req *rqstp;
register SVCXPRT *transp;
{
union {
auth_args pcnfsd_auth_1_arg;
pr_init_args pcnfsd_pr_init_1_arg;
pr_start_args pcnfsd_pr_start_1_arg;
} argument;
char *result;
bool_t (*xdr_argument)(), (*xdr_result)();
char *(*local)();
/*
** The following was added by hand:
*/
caller = transp;
_rpcsvcdirty = 1;
switch (rqstp->rq_proc) {
case PCNFSD_NULL:
xdr_argument = xdr_void;
xdr_result = xdr_void;
local = (char *(*)()) pcnfsd_null_1;
break;
case PCNFSD_AUTH:
xdr_argument = xdr_auth_args;
xdr_result = xdr_auth_results;
local = (char *(*)()) pcnfsd_auth_1;
break;
case PCNFSD_PR_INIT:
xdr_argument = xdr_pr_init_args;
xdr_result = xdr_pr_init_results;
local = (char *(*)()) pcnfsd_pr_init_1;
break;
case PCNFSD_PR_START:
xdr_argument = xdr_pr_start_args;
xdr_result = xdr_pr_start_results;
local = (char *(*)()) pcnfsd_pr_start_1;
break;
default:
svcerr_noproc(transp);
_rpcsvcdirty = 0;
return;
}
(void) memset((char *)&argument, 0, sizeof (argument));
if (!svc_getargs(transp, xdr_argument, (caddr_t)&argument)) {
svcerr_decode(transp);
_rpcsvcdirty = 0;
return;
}
result = (*local)(&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
svcerr_systemerr(transp);
}
if (!svc_freeargs(transp, xdr_argument, (caddr_t)&argument)) {
_msgout("unable to free arguments");
exit(1);
}
_rpcsvcdirty = 0;
return;
}
static void
pcnfsdprog_2(rqstp, transp)
struct svc_req *rqstp;
register SVCXPRT *transp;
{
union {
v2_info_args pcnfsd2_info_2_arg;
v2_pr_init_args pcnfsd2_pr_init_2_arg;
v2_pr_start_args pcnfsd2_pr_start_2_arg;
v2_pr_queue_args pcnfsd2_pr_queue_2_arg;
v2_pr_status_args pcnfsd2_pr_status_2_arg;
v2_pr_cancel_args pcnfsd2_pr_cancel_2_arg;
v2_pr_admin_args pcnfsd2_pr_admin_2_arg;
v2_pr_requeue_args pcnfsd2_pr_requeue_2_arg;
v2_pr_hold_args pcnfsd2_pr_hold_2_arg;
v2_pr_release_args pcnfsd2_pr_release_2_arg;
v2_mapid_args pcnfsd2_mapid_2_arg;
v2_auth_args pcnfsd2_auth_2_arg;
v2_alert_args pcnfsd2_alert_2_arg;
} argument;
char *result;
bool_t (*xdr_argument)(), (*xdr_result)();
char *(*local)();
/*
** The following was added by hand:
*/
caller = transp;
_rpcsvcdirty = 1;
switch (rqstp->rq_proc) {
case PCNFSD2_NULL:
xdr_argument = xdr_void;
xdr_result = xdr_void;
local = (char *(*)()) pcnfsd2_null_2;
break;
case PCNFSD2_INFO:
xdr_argument = xdr_v2_info_args;
xdr_result = xdr_v2_info_results;
local = (char *(*)()) pcnfsd2_info_2;
break;
case PCNFSD2_PR_INIT:
xdr_argument = xdr_v2_pr_init_args;
xdr_result = xdr_v2_pr_init_results;
local = (char *(*)()) pcnfsd2_pr_init_2;
break;
case PCNFSD2_PR_START:
xdr_argument = xdr_v2_pr_start_args;
xdr_result = xdr_v2_pr_start_results;
local = (char *(*)()) pcnfsd2_pr_start_2;
break;
case PCNFSD2_PR_LIST:
xdr_argument = xdr_void;
xdr_result = xdr_v2_pr_list_results;
local = (char *(*)()) pcnfsd2_pr_list_2;
break;
case PCNFSD2_PR_QUEUE:
xdr_argument = xdr_v2_pr_queue_args;
xdr_result = xdr_v2_pr_queue_results;
local = (char *(*)()) pcnfsd2_pr_queue_2;
break;
case PCNFSD2_PR_STATUS:
xdr_argument = xdr_v2_pr_status_args;
xdr_result = xdr_v2_pr_status_results;
local = (char *(*)()) pcnfsd2_pr_status_2;
break;
case PCNFSD2_PR_CANCEL:
xdr_argument = xdr_v2_pr_cancel_args;
xdr_result = xdr_v2_pr_cancel_results;
local = (char *(*)()) pcnfsd2_pr_cancel_2;
break;
case PCNFSD2_PR_ADMIN:
xdr_argument = xdr_v2_pr_admin_args;
xdr_result = xdr_v2_pr_admin_results;
local = (char *(*)()) pcnfsd2_pr_admin_2;
break;
case PCNFSD2_PR_REQUEUE:
xdr_argument = xdr_v2_pr_requeue_args;
xdr_result = xdr_v2_pr_requeue_results;
local = (char *(*)()) pcnfsd2_pr_requeue_2;
break;
case PCNFSD2_PR_HOLD:
xdr_argument = xdr_v2_pr_hold_args;
xdr_result = xdr_v2_pr_hold_results;
local = (char *(*)()) pcnfsd2_pr_hold_2;
break;
case PCNFSD2_PR_RELEASE:
xdr_argument = xdr_v2_pr_release_args;
xdr_result = xdr_v2_pr_release_results;
local = (char *(*)()) pcnfsd2_pr_release_2;
break;
case PCNFSD2_MAPID:
xdr_argument = xdr_v2_mapid_args;
xdr_result = xdr_v2_mapid_results;
local = (char *(*)()) pcnfsd2_mapid_2;
break;
case PCNFSD2_AUTH:
xdr_argument = xdr_v2_auth_args;
xdr_result = xdr_v2_auth_results;
local = (char *(*)()) pcnfsd2_auth_2;
break;
case PCNFSD2_ALERT:
xdr_argument = xdr_v2_alert_args;
xdr_result = xdr_v2_alert_results;
local = (char *(*)()) pcnfsd2_alert_2;
break;
default:
svcerr_noproc(transp);
_rpcsvcdirty = 0;
return;
}
(void) memset((char *)&argument, 0, sizeof (argument));
if (!svc_getargs(transp, xdr_argument, (caddr_t)&argument)) {
svcerr_decode(transp);
_rpcsvcdirty = 0;
return;
}
result = (*local)(&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
svcerr_systemerr(transp);
}
if (!svc_freeargs(transp, xdr_argument, (caddr_t)&argument)) {
_msgout("unable to free arguments");
exit(1);
}
_rpcsvcdirty = 0;
return;
}
static
_msgout(msg)
char *msg;
{
#ifdef RPC_SVC_FG
if (_rpcpmstart)
syslog(LOG_ERR, msg);
else
(void) fprintf(stderr, "%s\n", msg);
#else
syslog(LOG_ERR, msg);
#endif
return(0);
}
static void
closedown()
{
if (_rpcsvcdirty == 0) {
extern fd_set svc_fdset;
static int size;
int i, openfd;
if (_rpcfdtype == SOCK_DGRAM)
exit(0);
#ifdef RLIMIT_NOFILE
if (size == 0) {
struct rlimit rl;
rl.rlim_max = 0;
getrlimit(RLIMIT_NOFILE, &rl);
if ((size = rl.rlim_max) == 0)
return;
}
#else RLIMIT_NOFILE
/* XXX could use getdtablesize() here, but I don't know who uses it */
size = 20;
#endif RLIMIT_NOFILE
for (i = 0, openfd = 0; i < size && openfd < 2; i++)
if (FD_ISSET(i, &svc_fdset))
openfd++;
if (openfd <= 1)
exit(0);
}
(void) alarm(_RPCSVC_CLOSEDOWN);
}
/*
** The following was added by hand.
*/
char *
getcallername()
{
struct sockaddr_in actual;
struct hostent *hp;
static struct in_addr prev;
static char cname[128];
actual = *svc_getcaller(caller);
if (memcmp((char *)&actual.sin_addr, (char *)&prev,
sizeof(struct in_addr)) == 0)
return (cname);
prev = actual.sin_addr;
hp = gethostbyaddr((char *) &actual.sin_addr, sizeof(actual.sin_addr),
AF_INET);
if (hp == NULL) { /* dummy one up */
extern char *inet_ntoa();
strcpy(cname, inet_ntoa(actual.sin_addr));
} else {
strcpy(cname, hp->h_name);
}
return (cname);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.