1
0
Files
irix-657m-src/irix/cmd/netman/netlook/node.c++
2022-09-29 17:59:04 +03:00

257 lines
5.1 KiB
C++

/*
* Copyright 1989-1992 Silicon Graphics, Inc. All rights reserved.
*
* Node class member functions
*
* $Revision: 1.10 $
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
extern "C" {
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netdb.h>
#include <string.h>
#include <bstring.h>
#include <snoopstream.h>
#include "protocols/decnet.h"
}
#include <tuGLGadget.h>
#include <gl/gl.h>
#include "netlook.h"
#include "conntable.h"
#include "network.h"
#include "node.h"
#include "hidegadget.h"
#include "nis.h"
#define HOSTCOLOR GREEN
#define SNOOPCOLOR MAGENTA
#define GATEWAYCOLOR CYAN
#define YPMASTERCOLOR YELLOW
#define YPSERVERCOLOR WHITE
#define FONTMINSIZE 0.2 /* Scale value to cheat at */
// XXX get rid of this
extern NetLook *netlook;
extern HideGadget *hidegadget;
Node::Node(void)
{
display = NULL;
timestamp = 0;
info = 0;
stringwidth = 0;
connections = 0;
interface = 0;
}
Node::Node(InterfaceNode *i)
{
display = NULL;
timestamp = 0;
info = 0;
stringwidth = 0;
connections = 0;
add(i);
}
Node::~Node(void)
{
if ((info & SNOOPHOST) != 0)
netlook->stopSnoop(this);
if ((info & HIDDEN) != 0)
hidegadget->remove(this);
if (display != 0)
delete display;
if (connections != 0)
netlook->getConnectionTable()->clear();
}
void
Node::add(InterfaceNode *i)
{
interface = i;
YPCheck(this);
getNetwork()->nnodes++;
newInfo();
}
void
Node::render(unsigned int complex)
{
if (netlook->getNodeShow() == ACTIVE
&& connections == 0
&& (info & (NODEPICKED | CONNPICKED)) == 0)
return;
pushmatrix();
if (info & NODEPICKED)
color(netlook->getSelectColor());
else if (info & ADJUST)
color(netlook->getAdjustColor());
else if (info & SNOOPHOST)
color(netlook->getActiveDataStationColor());
else if (info & GATEWAY)
color(netlook->getGatewayColor());
else if (info & YPMASTER)
color(netlook->getNISMasterColor());
else if (info & YPSERVER)
color(netlook->getNISSlaveColor());
else
color(netlook->getStandardNodeColor());
translate(position.position[X], position.position[Y], 0.0);
rotate(angle, 'Z');
if (complex != 0) {
if (position.position[X] <= 0.0)
DrawStringCenterRight(display);
else
DrawStringCenterLeft(display);
} else {
move2(0.0, 0.0);
if (position.position[X] <= 0.0)
draw2((Coord) -StringWidth(display), 0.0);
else
draw2((Coord) StringWidth(display), 0.0);
}
popmatrix();
}
void
Node::newInfo(void)
{
int maxstringlen = 0;
for (int i = 1; i <= DMMAX; i++) {
char* s = label(i);
int l = StringWidth(s);
if (l > stringwidth)
stringwidth = l;
l = strlen(s);
if (l > maxstringlen)
maxstringlen = l;
}
if (display != NULL) {
if (maxstringlen > strlen(display)) {
delete display;
display = new char[maxstringlen + 1];
}
} else
display = new char[maxstringlen + 1];
updateDisplayString();
}
void
Node::updateDisplayString(void)
{
strcpy(display, label());
}
char *
Node::label(unsigned int dm)
{
static char s[64];
char *n;
if (dm == 0)
dm = netlook->getNodeDisplay();
switch (dm) {
case DMFULLNAME:
case DMNODENAME:
n = interface->getName();
if (n != NULL) {
int c;
if (dm == DMFULLNAME)
return n;
c = strcspn(n, ".");
strncpy(s, n, c);
s[c] = '\0';
return s;
}
/* Fall through... */
case DMINETADDR:
n = interface->ipaddr.getString();
if (n != 0) {
strcpy(s, n);
return s;
}
/* Fall through... */
case DMDECNETADDR:
n = interface->dnaddr.getString();
if (n != 0) {
strcpy(s, n);
return(s);
}
/* Fall through... */
case DMVENDOR:
n = interface->physaddr.getString();
if (n == 0) {
n = interface->ipaddr.getString();
if (n == 0) {
n = interface->getName();
if (n == 0)
return "error";
}
strcpy(s, n);
} else {
char *v = ether_vendor((struct etheraddr *)
interface->physaddr.getAddr());
if (v == 0)
strcpy(s, n);
else {
char t[12];
sscanf(n, "%*x:%*x:%*x:%s", t);
sprintf(s, "%s:%s", v, t);
}
}
return s;
case DMPHYSADDR:
n = interface->physaddr.getString();
if (n == 0) {
n = interface->ipaddr.getString();
if (n == 0) {
n = interface->getName();
if (n == 0)
return "error";
}
}
strcpy(s, n);
return s;
default:
fprintf(stderr, "Bad node display mode\n");
exit(-1);
}
}
int
Node::getSnoopSocket(void)
{
return snoopstream == 0 ? -1 : snoopstream->ss_sock;
}