mdmn_commd_service.c revision b6c8bd52ccb0f3491c2bd1f5867985cef630564a
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
#include <stdio.h>
#include <stdlib.h> /* getenv, exit */
#include <signal.h>
#include <unistd.h>
#include <memory.h>
#include <stropts.h>
#include <netconfig.h>
#include <syslog.h>
#include <meta.h>
#ifdef DEBUG
#define RPC_SVC_FG
#endif
/*
* This means we shutdown rpc.mdcommd at some time in the window
* after 1201 seconds and before 2400 seconds of inactivity.
*/
#define _RPCSVC_CLOSEDOWN 2400
#ifdef RPC_SVC_FG
static int _rpcpmstart; /* Started by a port monitor ? */
#endif /* RPC_SVC_FG */
/* States a server can be in wrt request */
#define _IDLE 0
#define _SERVED 1
static int _rpcsvccount = 0; /* Number of requests being serviced */
extern md_mn_result_t *mdmn_send_svc_1();
extern int *mdmn_work_svc_1();
extern int *mdmn_wakeup_initiator_svc_1();
extern int *mdmn_wakeup_master_svc_1();
extern int *mdmn_comm_lock_svc_1();
extern int *mdmn_comm_unlock_svc_1();
extern int *mdmn_comm_suspend_svc_1();
extern int *mdmn_comm_resume_svc_1();
extern int *mdmn_comm_reinit_set_svc_1();
extern int *mdmn_comm_msglock_svc_1();
static void
char *msg;
{
#ifdef RPC_SVC_FG
if (_rpcpmstart)
else
#else
#endif
}
static void
closedown(void)
{
int size;
int i, openfd = 0;
if (svc_pollfd[i].fd >= 0)
openfd++;
if (openfd <= 1)
exit(0);
} else
}
static void
{
union {
} argument;
char *result;
char *(*local)();
int free_result = 0;
_rpcsvccount++;
case NULLPROC:
(char *)NULL);
_rpcsvccount--;
return;
case mdmn_send:
_rpcsvccount--;
return;
}
/*
* mdmn_send_1 will not always do a sendreply.
* it will register in a table and let the mdmn_wakeup1
* do the sendreply for that call.
* in order to register properly we need the transp handle
*/
return; /* xdr_free is called by mdmn_wakeup_initiator_svc_1 */
case mdmn_work:
local = (char *(*)()) mdmn_work_svc_1;
free_result = 1;
break;
case mdmn_wakeup_master:
local = (char *(*)()) mdmn_wakeup_master_svc_1;
free_result = 1;
break;
case mdmn_wakeup_initiator:
local = (char *(*)()) mdmn_wakeup_initiator_svc_1;
free_result = 1;
break;
case mdmn_comm_lock:
local = (char *(*)()) mdmn_comm_lock_svc_1;
break;
case mdmn_comm_unlock:
local = (char *(*)()) mdmn_comm_unlock_svc_1;
break;
case mdmn_comm_suspend:
local = (char *(*)()) mdmn_comm_suspend_svc_1;
break;
case mdmn_comm_resume:
local = (char *(*)()) mdmn_comm_resume_svc_1;
break;
case mdmn_comm_reinit_set:
local = (char *(*)()) mdmn_comm_reinit_set_svc_1;
break;
case mdmn_comm_msglock:
local = (char *(*)()) mdmn_comm_msglock_svc_1;
break;
default:
_rpcsvccount--;
return;
}
_rpcsvccount--;
return;
}
}
exit(1);
}
if (free_result == 1) {
}
_rpcsvccount--;
}
/*
* atexit handler to flag the lack of commd to the kernel so that we don't
* panic due to RPC failures when the commd has been killed.
*/
static void
{
}
/* ARGSUSED */
int
main()
{
int i;
/*
* If stdin looks like a TLI endpoint, we assume
* that we were started by a port monitor. If
* t_getstate fails with TBADF, this is not a
* TLI endpoint.
*/
char *netid;
int pmclose;
#ifdef RPC_SVC_FG
_rpcpmstart = 1;
#endif /* RPC_SVC_FG */
/* started from inetd */
pmclose = 1;
} else {
}
exit(1);
}
if (nconf)
"unable to register (MDMN_COMMD, ONE)."));
exit(1);
}
if (pmclose) {
}
"rpc.mdcommd");
svc_run();
exit(1);
/* NOTREACHED */
} else {
#ifndef RPC_SVC_FG
/* LINTED */
extern void closefrom();
int size;
if (pid < 0) {
exit(1);
}
if (pid)
exit(0);
closefrom(0);
else {
exit(1);
for (i = 0; i < size; i++)
(void) close(i);
}
(void) dup2(i, 1);
(void) dup2(i, 2);
setsid();
#endif
}
exit(1);
}
"rpc.mdcommd");
svc_run();
return (1);
}