Files
sics/synchronize.c
cvs bae18e8686 - Various little fixes to the TAS software
- Added a sync command for synchronizing a simulation server with the
  master server.
2001-03-16 16:09:33 +00:00

226 lines
4.8 KiB
C

/*
S y n c h r o n i z e
Synchronize parameters in this server with parameters from another
SICS server.
Mark Koennecke, March 2001
*/
#include "sics.h"
#include "network.h"
#include "synchronize.h"
/*-----------------------------------------------------------------------
Some file statics which hold the connection parameters
------------------------------------------------------------------------*/
static char *hostname, *looser, *password;
static int port;
static mkChannel *connection = NULL;
/*-----------------------------------------------------------------------*/
static void syncLogin()
{
int test, i;
char pBueffel[1024], pRead[80];
/*
connect
*/
connection = NETConnect(hostname, port);
NETRead(connection,pBueffel,1020,10*1000);
if(connection != NULL)
{
/*
try a login
*/
sprintf(pBueffel,"%s %s\n", looser, password);
test = NETWrite(connection,pBueffel,strlen(pBueffel));
if(test != 1)
{
printf("Failed at writing user/password\n");
NETClosePort(connection);
free(connection);
connection = NULL;
}
pBueffel[0] = '\0';
for(i = 0; i < 10; i++)
{
test = NETRead(connection,pRead,70,10*1000);
if(test < 0)
{
NETClosePort(connection);
free(connection);
connection = NULL;
}
else
{
strcat(pBueffel,pRead);
}
if(strstr(pBueffel,"Login OK") == NULL)
{
test = 0;
}
else
{
test = 1;
}
SicsWait(1);
}
if(!test)
{
printf("Bad reply to login: %s\n",pBueffel);
NETClosePort(connection);
free(connection);
connection = NULL;
}
}
}
/*---------------------------------------------------------------------*/
static void killSync(void *pData)
{
if(connection)
{
NETClosePort(connection);
free(connection);
}
if(hostname)
free(hostname);
if(looser)
free(looser);
if(password)
free(password);
}
/*----------------------------------------------------------------------*/
int MakeSync(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
char pBueffel[256];
int iRet;
/*
check arguments: we need host, port, user and passwd
*/
if(argc < 5)
{
SCWrite(pCon,
"ERROR: need parameters: host port user passwd : for sync creation",
eError);
return 0;
}
/*
copy parameters
*/
hostname = strdup(argv[1]);
port = atof(argv[2]);
looser = strdup(argv[3]);
password = strdup(argv[4]);
pServ->simMode = 1;
/*
add the command to the Interpreter
*/
iRet = AddCommand(pSics,"sync",Synchronize,killSync,NULL);
if(!iRet)
{
sprintf(pBueffel,"ERROR: duplicate command sync not created");
killSync(NULL);
SCWrite(pCon,pBueffel,eError);
return 0;
}
return 1;
}
/*----------------------------------------------------------------------*/
int Synchronize(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[])
{
char pBueffel[1024];
char pRead[80];
int test,i;
/*
check for connection
*/
if(connection == NULL)
{
syncLogin();
if(connection == NULL)
{
sprintf(pBueffel,"ERROR: failed to connect to %s, %d for sync 'ing",
hostname, port);
SCWrite(pCon,pBueffel, eError);
return 0;
}
}
/*
first tell the remote server to backup
*/
strcpy(pBueffel,"transact backup\n");
test = NETWrite(connection,pBueffel,strlen(pBueffel));
if(test != 1)
{
NETClosePort(connection);
free(connection);
connection = NULL;
SCWrite(pCon,"ERROR: Failed to contact sync server",eError);
SCWrite(pCon,"Try again in order to reconnect before giving up",eWarning);
return 0;
}
/*
wait 10 seconds for correct message
*/
pBueffel[0] = '\0';
for(i = 0; i < 10; i++)
{
test = NETRead(connection,pRead,75,20*1000);
if(test < 0)
{
NETClosePort(connection);
free(connection);
connection = NULL;
SCWrite(pCon,"ERROR: Failed to contact sync server",eError);
SCWrite(pCon,
"Try again in order to reconnect before giving up",eWarning);
return 0;
}
else
{
strcat(pBueffel,pRead);
}
if(strstr(pBueffel,"TRANSACTIONFINISHED") == NULL)
{
test = 1;
break;
}
else
{
test = 0;
}
SicsWait(1);
}
if(!test)
{
SCWrite(pCon,"WARNING: sync server may not have exectued backup",
eWarning);
}
/*
now read the backup file and we are done
*/
test = InterpExecute(pSics,pCon,"restore");
if(test != 1)
{
SCWrite(pCon,"ERROR: Failed to read sync information",eError);
return 0;
}
/*
tell everybody that we have sync'ed
*/
ServerWriteGlobal("Simulation Server has SYNCHRONIZED!",eWarning);
return 1;
}