Files
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

178 lines
4.5 KiB
C

static char sccsid[] = "@(#)33 1.10 src/bos/usr/ccs/lib/libsrc/srcstop.c, libsrc, bos411, 9428A410j 2/2/94 12:38:16";
/*
* COMPONENT_NAME: (cmdsrc) System Resource Controller
*
* FUNCTIONS:
* srcstop
*
* ORIGINS: 27
*
* IBM CONFIDENTIAL -- (IBM Confidential Restricted when
* combined with the aggregate modules for this product)
* SOURCE MATERIALS
* (C) COPYRIGHT International Business Machines Corp. 1984,1994
* All Rights Reserved
*
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
/*
** IDENTIFICATION:
** Name: srcstop
** Title: Send Stop Subsystem Request To SRC
** PURPOSE:
** To send a stop subsystem request packet to SRC and waits for a
** reply from SRC, the subsystem, or both.
**
** SYNTAX:
** srcstop(host, name, svr_pid, stoptype, replen, svrreply, stopfrom)
** Parameters:
** i char *host - target host for subsystem request
** i char *name - subsystem name
** i int svr_pid - subsystem pid
** i short stoptype - normal, forced, or cancel
** i int stopfrom - SSHELL or SDAEMON
** o short *replen - reply buffer length
** o char *svrreply - reply buffer space
**
** INPUT/OUTPUT SECTION:
** UDP Socket
**
** PROCESSING:
** Send stop request packet to SRC on the proper host.
** Wait for SRC/subsystem stop reply packets.
**
** PROGRAMS/FUNCTIONS CALLED:
**
** OTHER:
** These are the vaild responces from SRC/subsystem
** short error packet
** srvreply error packet
** srvreply responce packet
**
** RETURNS:
** SRC_OK on success
** Error code on failure
**
**/
#include "src.h"
#include <netinet/in.h>
#include "src10.h"
#include "srcsocket.h"
srcstop(host, name, svr_pid, stoptype, replen, svrreply, stopfrom)
char *host;
char *name;
int svr_pid;
short stoptype;
short *replen;
char *svrreply;
int stopfrom;
{
int rc;
int count;
int msgs;
struct svrreply *replyptr;
/* comunication file descriptor (socket) */
int fd;
struct src_socket src_socket;
struct sockaddr_un src_sock_addr;
struct sockaddr_un sockaddr;
int sockaddrsz;
struct srcrep rtlreply;
struct stopstat stopbuf;
replyptr = (struct svrreply *)svrreply;
/* no stop type specified is a normal stop */
if (stoptype == 0)
stoptype = NORMAL;
/* must have a valid stop type */
if (stoptype != NORMAL && stoptype != CANCEL && stoptype != FORCED)
return(SRC_PARM);
/* setup socket to send request through and get address of SRC
** if request stays on local host will check to
** make sure if local SRC is running
**/
fd=srcsockset(&src_socket,&src_sock_addr,host,MAXSOCKBUFSIZE,sizeof(stopbuf));
if(fd<0)
return(fd);
/* build the stop subsystem request to be send to SRC */
bzero(&stopbuf,sizeof(stopbuf));
stopbuf.demnreq.action = STOP;
stopbuf.demnreq.dversion = SRCMSGBASE;
stopbuf.parm1 = stoptype;
stopbuf.demnreq.pid = svr_pid;
strcpy(stopbuf.demnreq.subsysname, name);
/* Forward stop request to proper SRC daemon */
rc=srcsendpkt(fd,&stopbuf,sizeof(stopbuf),0,&src_sock_addr,src_what_sockaddr_size(&src_sock_addr));
if(rc<0)
{
src_close_socket(&src_socket);
return(SRC_SOCK);
}
/* get count of subsystems from SRC daemon */
sockaddrsz=sizeof(sockaddr);
rc=srcrecvpkt(fd,svrreply,(int)(*replen),0,&sockaddr,&sockaddrsz,REPLYLIMIT);
if(rc<0)
{
src_close_socket(&src_socket);
return(rc);
}
/* short error packet was returned as status */
if (replyptr->rtncode < 0)
{
src_close_socket(&src_socket);
return((int) replyptr->rtncode);
}
/* receive all the stop responces */
for(count=(int)replyptr->rtncode,msgs=0; msgs < count; msgs++)
{
/* receive the stop status could be from whom?
** SRC daemon
** subsystem
**/
sockaddrsz=sizeof(sockaddr);
rc=srcrecvpkt(fd,&rtlreply,sizeof(rtlreply),0,&sockaddr,&sockaddrsz,REPLYLIMIT);
/* error on receipt of packet? */
if(rc<0)
{
src_close_socket(&src_socket);
return(rc);
}
/* was a short error packet received? */
if(rc==sizeof(short))
rc=(int)*(short *)&rtlreply;
/* might there be an error pakcet returning? */
else if (rtlreply.svrreply.rtncode < SRC_OK)
rc = rtlreply.svrreply.rtncode;
else
/* the stop of the subsystem was ok */
rc = SRC_STPOK;
/* print the error msg if we are from SSHELL commands */
if (stopfrom == SSHELL)
{
srcerr(SUBSYS_BASE,rc,SSHELL,rtlreply.svrreply.objname,0,0,rtlreply.svrreply.rtnmsg);
rc = SRC_OK;
}
}
src_close_socket(&src_socket);
return(rc);
} /* END srcstop */