|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 5445 (0x1545)
Types: TextFile
Names: »sma.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z«
└─⟦d846658bd⟧
└─⟦this⟧ »osimis/sma/sma.c«
/*
* Copyright (c) 1988 University College London
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the Department of Computer Science, University College London.
* The name of the University may not be used to
* endorse or promote products derived from this software without
* specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/* System Management Agent main program */
/*
* By Simon Walton, October 1988
* Modified by George Pavlou, April 1990
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netdb.h>
#include <netinet/in.h>
#include <signal.h>
#include <errno.h>
#include "isode/rosap.h"
#include "isode/tsap.h"
#include "isode/mpkt.h"
#include "msap.h"
#include "smi.h"
#include "config.h"
char *context = "management";
char *service = "SMA";
int cmip_init(), cmip_lose(), cmip_work(), ipc_check();
static int ManSoc;
struct ManagedObject MIBrootnode, * MIBroot = &MIBrootnode;
extern struct ManagedObject * findcomp(), * forccomp();
extern time_t time();
extern OID oid_copy();
extern EntInv_check();
main()
{
AEI aei;
struct TSAPdisconnect tds;
char * myhost;
static struct sigvec handlechld =
{
EntInv_check,
sigmask(SIGEMT),
0
};
static struct itimerval looktime =
{
{10, 0}, /* every 10 seconds */
{10, 0}
};
isodesetailor("./smatailor");
fill_MO_init();
if (initialize_localport() == -1) exit(1);
if (initialize_MIB() == -1) exit(1);
sigvec(SIGALRM, &handlechld, (struct sigvec*) 0);
sigsetmask(sigblock(0) & ~sigmask(SIGALRM));
setitimer(ITIMER_REAL, &looktime, NULL);
myhost = PLocalHostName();
if ((aei = str2aei(myhost, service)) == NULLAEI)
fatal("unknown application entity info %s-%s",
PLocalHostName(), service);
quipu_syntaxes();
load_oid_table(strcat(ETCDIR, "oidtable"));
if (server(0, NULLVP, aei, cmip_init, cmip_work, cmip_lose,
ipc_check, &tds ) == NOTOK)
{
if (tds.td_cc > 0)
fatal("smap: isode error: [%s] %*.*s",
TErrString(tds.td_reason), tds.td_cc, tds.td_cc, tds.td_data);
else
fatal("smap: isode error: [%s]", TErrString(tds.td_reason));
}
exit(0);
}
/* ARGSUSED */
int server (argc, argv, aei, initfnx, workfnx, losefnx, localfnx, td)
int argc;
char **argv;
AEI aei;
IFP initfnx, workfnx, losefnx, localfnx;
struct TSAPdisconnect *td;
{
fd_set ifds, xfds, mask;
int fd, vecp, nfds;
char *vec[4];
struct PSAPaddr *pa;
if (argc > 1)
fatal("static server: should be started without args");
if ((pa = aei2addr(aei)) == NULLPA)
return tsaplose (td, DR_ADDRESS, NULLCP,
"address translation failed");
if (TNetListen(&pa->pa_addr.sa_addr, td) == NOTOK)
return NOTOK;
FD_ZERO(&mask);
FD_SET(ManSoc, &mask);
nfds = ManSoc + 1;
isodetailor(service, 0);
for (;;) {
xfds = ifds = mask;
if (TNetAccept(&vecp, vec, nfds, &ifds, NULL, &xfds, NOTOK, td)
== NOTOK) {
if (errno == EINTR)
continue;
mask.fds_bits[0] &= ~(ifds.fds_bits[0]);
FD_SET(ManSoc, &mask);
(void) (*losefnx)(td);
continue;
}
if (vecp > 0 && (fd = (*initfnx)(vecp, vec)) != NOTOK) {
if (fd >= nfds)
nfds = fd + 1;
FD_SET(fd, &mask);
}
if FD_ISSET(ManSoc, &ifds)
{
(*localfnx)();
FD_CLR(ManSoc, &ifds);
}
for (fd = 0; fd < nfds; fd++)
if ( FD_ISSET(fd, &ifds) && (*workfnx)(fd) == NOTOK) {
if (nfds == fd + 1) {
int tfd;
for (tfd = fd - 1; tfd >= 0; tfd--)
if (FD_ISSET (tfd, &mask))
break;
nfds = tfd + 1;
}
FD_CLR(fd, &mask);
}
}
}
initialize_localport()
{
struct servent * sp;
struct sockaddr_in sin;
if ((sp = getservbyname("manager", (char*) 0)) == 0)
return (fprintf(stderr,"smap: No netmanage port\n"), -1);
if ((ManSoc = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
return (perror("smap"), -1);
sin.sin_family = AF_INET;
sin.sin_port = sp->s_port;
sin.sin_addr.s_addr = INADDR_ANY;
if (bind(ManSoc, &sin, sizeof (sin)) < 0)
return (perror("smap"), -1);
listen(ManSoc, 5);
return (0);
}
ipc_check()
{
int signalmask;
struct MReport Mins;
struct MReport * Min = &Mins;
read(ManSoc, (caddr_t)Min, sizeof (*Min));
fprintf(stderr, "Management Packet Received\n");
signalmask = sigblock(sigmask(SIGALRM)); /* block alarm signals */
(void) MIB_update(Min);
sigsetmask(signalmask);
}
struct MO_ID
isodelayer =
{
NULLCP, {0},
6, "\1isode"
},
tlayer =
{
&isodelayer, {0,0},
0, ""},
thesystem =
{
&tlayer, {0,0},
0, "" };
static initialize_MIB()
{
oid_copy(str2oid("2.37.1.1.1"), &thesystem.rdntype);
oid_copy(str2oid("2.37.1.2.1"), &tlayer.rdntype);
oid_copy(str2oid("2.37.1.3.1"), &isodelayer.rdntype);
/* create first MO, the managed system */
if (forccomp(MIBroot, &thesystem) == NULL) return (1);
return (0);
}
/* VARARGS1 */
static fatal (s, a, b, c, d, e)
char * s;
caddr_t a, b, c, d, e;
{
fprintf(stderr, s, a, b, c, d, e);
fputc('\n',stderr);
exit (-1);
}