blob: aac713d0b701d77cdd5b2f1fd07d0ce0a5e7249e [file] [log] [blame]
#include <config.h>
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#if HAVE_FCNTL_H
#include <fcntl.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include <sys/socket.h>
#include <net/if.h>
#if HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#include "asn1.h"
#include "context.h"
#include "system.h"
#define TRUE 1
#define FALSE 0
#define IDENTITY_STATE 1
#define VIEW_STATE 2
#define PROXY_STATE 3
static error_exit(str, linenumber, filename)
char *str;
int linenumber;
char *filename;
{
fprintf(stderr, "%s on line %d of %s\n", str, linenumber, filename);
exit(1);
}
int
read_context_database(filename)
char *filename;
{
FILE *fp;
char buf[256], buf1[256], buf2[256], buf3[256];
char *cp;
int blank, nonhex;
int linenumber = 0, chars = 0, clock_pos;
int state = IDENTITY_STATE;
oid contextid[64];
int contextidlen;
int view, entityLen, time;
u_char entity[64];
int dstParty, srcParty, proxyIdLen;
oid proxyId[64];
char name[64]; /* friendly name */
struct contextEntry *cxp, *rp;
u_long myaddr;
int diff;
fp = fopen(filename, "r");
if (fp == NULL)
return -1;
while (fgets(buf, 256, fp)){
linenumber++;
if (strlen(buf) > 250)
error_exit("Line longer than 250 bytes", linenumber, filename);
chars += strlen(buf);
if (buf[0] == '#')
continue;
blank = TRUE;
for(cp = buf; *cp; cp++)
if (!isspace(*cp)){
blank = FALSE;
break;
}
if (blank)
continue;
switch(state){
case IDENTITY_STATE:
if (sscanf(buf, "%s %s", name, buf1) != 2)
error_exit("Bad parse", linenumber, filename);
contextidlen = 64;
if (!read_objid(buf1, contextid, &contextidlen))
error_exit("Bad object identifier", linenumber, filename);
state = VIEW_STATE;
break;
case VIEW_STATE:
if (sscanf(buf, "%s %s %s", buf1, entity, buf3) != 3)
error_exit("Bad parse", linenumber, filename);
for(cp = buf1; *cp; cp++)
if (!isdigit(*cp))
error_exit("Not a view index", linenumber, filename);
view = atoi(buf1);
if (!strcasecmp(entity, "Null"))
entityLen = 0;
if (!strcasecmp(buf3, "currentTime"))
time = CURRENTTIME;
else if (!strcasecmp(buf3, "restartTime"))
time = RESTARTTIME;
else
error_exit("Bad local time", linenumber, filename);
state = PROXY_STATE;
break;
case PROXY_STATE:
if (sscanf(buf, "%s %s %s", buf1, buf2, buf3) != 3)
error_exit("Bad parse", linenumber, filename);
for(cp = buf1; *cp; cp++)
if (!isdigit(*cp))
error_exit("Bad destination party index", linenumber,
filename);
dstParty = atoi(buf1);
for(cp = buf1; *cp; cp++)
if (!isdigit(*cp))
error_exit("Bad source party index", linenumber, filename);
srcParty = atoi(buf2);
proxyIdLen = 64;
if (!read_objid(buf3, proxyId, &proxyIdLen))
error_exit("Bad object identifier", linenumber, filename);
state = IDENTITY_STATE;
cxp = context_getEntry(contextid, contextidlen);
if (!cxp)
cxp = context_createEntry(contextid, contextidlen);
rp = cxp->reserved;
strcpy(cxp->contextName, name);
myaddr = get_myaddr();
/* XXX It's bogus to figure out if it is local
by testing the ipaddress in the context - fix this XXX */
diff = ((myaddr & 0xFF000000) >> 24) ^ contextid[9];
diff |= ((myaddr & 0x00FF0000) >> 16) ^ contextid[10];
diff |= ((myaddr & 0x0000FF00) >> 8) ^ contextid[11];
diff |= (myaddr & 0x000000FF) ^ contextid[12];
if (!diff){
/* context is local */
cxp->contextLocal = 1; /* TRUE */
} else {
cxp->contextLocal = 2; /* FALSE */
}
cxp->contextViewIndex = view;
#ifdef SVR4
memmove(cxp->contextLocalEntity, entity, entityLen);
#else
bcopy(entity, cxp->contextLocalEntity, entityLen);
#endif
cxp->contextLocalEntityLen = entityLen;
cxp->contextLocalTime = time;
cxp->contextDstPartyIndex = dstParty;
cxp->contextSrcPartyIndex = srcParty;
#ifdef SVR4
memmove(cxp->contextProxyContext, proxyId, proxyIdLen * sizeof(oid));
#else
bcopy(proxyId, cxp->contextProxyContext, proxyIdLen * sizeof(oid));
#endif
cxp->contextProxyContextLen = proxyIdLen;
cxp->contextStorageType = 2;
cxp->contextStatus = rp->contextStatus = CONTEXTACTIVE;
#define CONTEXTCOMPLETE_MASK 0x03FF
/* all collumns - from context_vars.c XXX */
cxp->contextBitMask = rp->contextBitMask = CONTEXTCOMPLETE_MASK;
break;
default:
error_exit("unknown state", linenumber, filename);
}
}
if (state != IDENTITY_STATE)
error_exit("Unfinished entry at EOF", linenumber, filename);
fclose(fp);
return 0;
}