proboard/NODELIST.CPP

233 lines
4.3 KiB
C++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "proboard.hpp"
static void near
getnode(char *temp,node_entry& n)
{
char *options[]={"ZONE","REGION","HOST","HUB","PVT","DOWN","HOLD"};
char slices[6][100];
for(int i=0;i<6;i++)
{
int y=0;
while (*temp!=',') if (*temp!='_') slices[i][y++]=*temp++;
else {slices[i][y++]=' '; temp++;}
temp++;
slices[i][y]='\0';
}
for(i=0;i<7;i++) if(!strcmpl(slices[0],options[i])) break;
n.type=i+1;
strcpy(n.name,slices[2]);
strcpy(n.city,slices[3]);
switch(i+1)
{
case NODE_ZONE : n.zone=atoi(slices[1]);
case NODE_REGION : n.region=atoi(slices[1]);
case NODE_HOST : {
n.net=atoi(slices[1]);
n.node=0;
} break;
default : n.node=atoi(slices[1]);
break;
}
}
struct node_index
{
byte type;
long offset;
union
{
int zone,net;
};
int cost;
long fill;
};
#define NODE_ZONE 1
#define NODE_REGION 2
#define NODE_HOST 3
#define NODE_HUB 4
#define NODE_PVT 5
#define NODE_DOWN 6
#define NODE_HOLD 7
#define NODE_NODE 7
#define LISTNODE_SINGLE 1
#define LISTNODE_MULTIPLE 2
static int near
list_node(node_index& idx,char *fname,char mode)
{
char *types[]={ "","ZONE","REGION","NET","HUB","PVT","DOWN","HOLD","" };
File fp(FileName(cfg.nodelistdir,fname),fmode_read | fmode_text);
if(!fp.opened()) return -1;
fp.seek(idx.offset);
node_entry n;
n.net=idx.net;
for(;;)
{
int num;
char s[300];
if(!fp.readLine(s,299)) break;
if(s[0]==';') continue;
getnode(s,n);
if(mode==LISTNODE_MULTIPLE && n.net!=idx.net) break;
switch(n.type)
{
case NODE_ZONE : num=n.zone; break;
case NODE_REGION: num=n.region; break;
case NODE_HOST : num=n.net; break;
default : num=n.node; break;
}
io.enablestop();
stopped=0;
io << form("\2 %-6s \3%5d \7%-28.28s \6%-28.28s \3%4d\n",types[n.type],num,n.name,n.city,idx.cost);
io.disablestop();
if(stopped || linecounter()) return -1;
if(mode==LISTNODE_SINGLE) break;
}
return 0;
}
int
node_entry::read(char *s)
{
char nodenr[14];
char *tmp=nodenr;
int point=0;
strcpy(nodenr,s);
if((s=strchr(tmp,'.'))!=NULL)
{
point=atoi(s+1);
*s=0;
}
if((s=strchr(tmp,':'))!=NULL)
{
*s++=0;
zone=atoi(tmp);
tmp=s;
}
else if(tmp[0]=='?') zone=-1;
if((s=strchr(tmp,'/'))!=NULL)
{
*s++=0;
if(tmp[0]!='?') net=atoi(tmp);
else net=-1;
tmp=s;
}
else if(tmp[0]=='?') net=-1;
if(tmp[0]!='?') node=atoi(tmp);
else node=-1;
node_index idx;
char nl_name[13];
File f(FileName(syspath,"NODE_IDX.PRO"),fmode_read,512);
if(!f.opened()) return -1;
char xor[13]={ 234,123,76,245,87,12,43,56,23,12,98,55,34 };
int curzone=0;
if(zone==-1)
io << S_ZONELIST_HEADER << '\n';
else if(net==-1)
io << S_NETLIST_HEADER(form("%d",zone)) << '\n';
else if(node==-1)
{
char *s=form("%d:%d",zone,net);
io << S_NODELIST_HEADER(s) << '\n';
}
linecounter(2);
for(;;)
{
if(f.read(&idx,sizeof(idx))!=sizeof(idx)) break;
char *ptr=(char *)&idx;
for(int i=0;i<13;i++) ptr[i]^=xor[i];
if(idx.type>10) { strcpy(nl_name,ptr); continue; }
if(idx.type==NODE_ZONE)
{
curzone=idx.zone;
if(zone==-1)
{
if(list_node(idx,nl_name,LISTNODE_SINGLE)<0) break;
continue;
}
idx.net=curzone;
if(curzone!=zone) continue;
}
if(curzone==zone && net==-1)
{
if(list_node(idx,nl_name,LISTNODE_SINGLE)<0) break;
continue;
}
if(idx.net==net && zone==curzone)
{
if(node==-1)
{
if(list_node(idx,nl_name,LISTNODE_MULTIPLE)<0) return -1;
break;
}
node_entry tmp;
tmp.zone=curzone;
tmp.net=idx.net;
tmp.cost=idx.cost;
File fp(FileName(cfg.nodelistdir,nl_name),fmode_read | fmode_text);
if(!fp.opened()) return -1;
fp.seek(idx.offset);
for(;;)
{
char s[300];
if(fp.readLine(s,299)==NULL) break;
if(s[0]==';') continue;
getnode(s,tmp);
if(tmp.type<NODE_HUB && tmp.net!=net) break;
if(tmp.node==node)
{
(*this)=tmp;
return point;
}
}
fp.close();
break;
}
}
if(zone!=-1 && net!=-1 && node!=-1) io << S_NODE_NUMBER_NOT_FOUND;
return -1;
}