CASA/c_adlib/ad_ff/native/DataManager.cpp
2006-03-10 18:39:22 +00:00

609 lines
12 KiB
C++

/***********************************************************************
*
* Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, Novell, Inc.
*
* To contact Novell about this file by physical or electronic mail,
* you may find current contact information at www.novell.com.
*
***********************************************************************/
#include "DataManager.h"
DataManager::DataManager()
{
hostList = NULL;
rejectHostList = NULL;
}
DataManager::~DataManager()
{
}
int DataManager::AddRejectHost(char *hostName)
{
RejectHost *t;
if( hostName == NULL || hostName[0] == 0 )
{
PrintMessage(MESG_ERROR, "\n DataManager : Host name is NULL or empty ");
// Just ignore this..
return FPM_TRUE;
}
// check if the specified host is already present
for(t=rejectHostList; t ; t = t->next)
{
if( STRCMPI(hostName, t->hostName) == 0 )
{
PrintMessage(MESG_DEBUG, "\n DataManager : Specified hostname [%s] is already present ", hostName);
return FPM_TRUE;
}
}
// Create new Host element for new host
RejectHost *tempHost = (RejectHost *) malloc(sizeof(RejectHost));
if( tempHost )
tempHost->hostName = (char*) malloc(strlen(hostName) + 1);
if( !tempHost || !tempHost->hostName)
{
PrintMessage(MESG_ERROR, "\n DataManager : Failed to add reject host due to insufficient memory ");
return FPM_INSUFFICIENT_MEMORY;
}
strcpy(tempHost->hostName, hostName);
tempHost->next = NULL;
if( rejectHostList == NULL )
rejectHostList = tempHost;
else
{ // Add new host at the end
for(t=rejectHostList; t->next ; t=t->next);
t->next = tempHost;
}
return FPM_TRUE;
}
//invoked from outside
int DataManager::RemoveRejectHost(char *hostName)
{
RejectHost *prev = NULL;
if( !hostName )
{
PrintMessage(MESG_ERROR, "\n DataManager : Host name is Null ....");
return FPM_FALSE;
}
// Find out and destroy it..!
for(RejectHost *t=rejectHostList; t ; prev=t,t=t->next)
{
if( STRCMPI(hostName, t->hostName) == 0 )
{
// if this is the first node
if( rejectHostList == t )
rejectHostList = t->next;
else
prev->next = t->next;
free(t->hostName);
free(t);
return FPM_TRUE;
}
}
PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present in the reject host list", hostName);
return FPM_FALSE;
}
void DataManager::PrintAllRejectHosts()
{
PrintMessage(MESG_PRINT, "\n\n ****** List of Reject Hosts ******");
for(RejectHost *t=rejectHostList; t ; t=t->next)
PrintMessage(MESG_PRINT, "\n %s", t->hostName);
}
// internal function
int DataManager::AddHost(char *hostName)
{
Host *host, *t;
if( hostName == NULL || hostName[0] == 0 )
{
PrintMessage(MESG_ERROR, "\n DataManager : Host name is NULL or empty ");
return FPM_ILLEGAL_HOSTNAME;
}
// check if the specified host is already present
for(host=hostList; host ; host = host->next)
{
if( STRCMPI(hostName, host->hostName) == 0 )
{
PrintMessage(MESG_DEBUG, "\n DataManager : Specified hostname [%s] is already present ", hostName);
return FPM_TRUE;
}
}
// Create new Host
Host *tempHost = (Host *) malloc(sizeof(Host));
if( tempHost )
tempHost->hostName = (char*) malloc(strlen(hostName) + 1);
if( !tempHost || !tempHost->hostName)
{
PrintMessage(MESG_ERROR, "\n DataManager : Failed to add host due to insufficient memory ");
return FPM_INSUFFICIENT_MEMORY;
}
strcpy(tempHost->hostName, hostName);
tempHost->child = NULL;
tempHost->next = NULL;
// Now add the new host to the existing store
if( hostList == NULL )
hostList = tempHost;
else
{ // Add new host at the end
for(t=hostList; t->next ; t=t->next);
t->next = tempHost;
}
return FPM_TRUE;
}
// invoked from outside...
int DataManager::ModifyHost(char *oldHostName, char *newHostName)
{
if( !oldHostName || !newHostName )
{
PrintMessage(MESG_ERROR, "\n DataManager : Null parameters passed....");
return FPM_FALSE;
}
for(Host *t=hostList; t ; t=t->next)
{
if( STRCMPI(oldHostName, t->hostName) == 0 )
{
free(t->hostName);
t->hostName = (char*) malloc( strlen(newHostName) + 1 );
if( !t->hostName )
{
PrintMessage(MESG_ERROR, "\n DataManager : Failed to modify host entry due to insufficient memory ");
return FPM_FALSE;
}
strcpy(t->hostName, newHostName);
return FPM_TRUE;
}
}
PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", oldHostName);
return FPM_FALSE;
}
int DataManager::AddHost(Host *host)
{
Host *t;
if( host == NULL )
{
PrintMessage(MESG_ERROR, "\n AddHost : host is NULL....");
return FPM_FALSE;
}
for(t=hostList; t ; t=t->next)
{
if( STRCMPI(host->hostName, t->hostName) == 0 )
{
PrintMessage(MESG_ERROR, "\n AddHost : Specified hostname %s is already present..", host->hostName);
return FPM_FALSE;
}
}
Host *newHost = DuplicateHost(host);
if( newHost == NULL)
{
PrintMessage(MESG_ERROR, "\n AddHost : Insufficient memory");
return FPM_INSUFFICIENT_MEMORY;
}
// Add the new host at the end of the list...
if( hostList == NULL )
hostList = newHost;
else
{
for(t=hostList; t->next ; t=t->next);
t->next = newHost;
}
PrintMessage(MESG_DEBUG, "\n AddHost : Host %s added successfully", newHost->hostName);
return FPM_TRUE;
}
int DataManager::ModifyHost(Host *host)
{
Host *prev = NULL;
if( host == NULL )
{
PrintMessage(MESG_ERROR, "\n ModifyHost : host is NULL....");
return FPM_FALSE;
}
// check if the specified host is present
// If present remove it and add new host ...
for(Host *t=hostList; t ; prev=t,t=t->next)
{
if( STRCMPI(host->hostName, t->hostName) == 0 )
{
Host *newHost = DuplicateHost(host);
if( newHost == NULL )
{
PrintMessage(MESG_ERROR, "\n ModifyHost : Insufficient memory");
return FPM_INSUFFICIENT_MEMORY;
}
// if this is the first node
if( hostList == t )
{
hostList = newHost;
newHost->next = t->next;
}
else
{
prev->next = newHost;
newHost->next = t->next;
}
PrintMessage(MESG_DEBUG, "\n ModifyHost : Host %s modified successfully", newHost->hostName);
return FPM_TRUE;
}
}
PrintMessage(MESG_ERROR, "\n ModifyHost : Specified host %s is not present", host->hostName);
return FPM_HOSTNAME_NOT_PRESENT;
}
//invoked from outside
int DataManager::RemoveHost(char *hostName)
{
Host *prev = NULL;
if( !hostName )
{
PrintMessage(MESG_ERROR, "\n DataManager : Host name is Null ....");
return FPM_ILLEGAL_HOSTNAME;
}
// Find out and destroy it..!
for(Host *t=hostList; t ; prev=t,t=t->next)
{
if( STRCMPI(hostName, t->hostName) == 0 )
{
// if this is the first node
if( hostList == t )
hostList = t->next;
else
prev->next = t->next;
free(t->hostName);
free(t);
return FPM_TRUE;
}
}
PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", hostName);
return FPM_HOSTNAME_NOT_PRESENT;
}
Host* DataManager::DuplicateHost(Host *host)
{
HostElement *prev = NULL;
HostElement *t, *temp;
Host *newHost = (Host *) malloc(sizeof(Host));
if( newHost )
newHost->hostName = (char*) malloc(strlen(host->hostName) + 1);
if( !newHost || !newHost->hostName )
{
PrintMessage(MESG_ERROR, "\n DuplicateHost : Insufficient memory");
return NULL;
}
strcpy(newHost->hostName, host->hostName);
newHost->child = NULL;
newHost->next = NULL;
for(t=host->child; t ; t = t->next)
{
HostElement *nh = (HostElement*) malloc(sizeof(HostElement));
if( nh )
{
nh->name = (char*) malloc(strlen(t->name) + 1 );
nh->value = (char*) malloc(strlen(t->value) + 1);
}
if( !nh || !nh->name || !nh->value)
goto duplicate_error;
nh->isPassword = t->isPassword;
strcpy(nh->name, t->name);
strcpy(nh->value, t->value);
nh->next = NULL;
if( prev == NULL )
newHost->child = nh;
else
prev->next = nh;
prev = nh;
}
return newHost;
duplicate_error:
// cleanup partially loaded data
for(t=newHost->child; t ; )
{
if(t->name) free(t);
if(t->value) free(t);
temp = t;
t = t->next;
free(temp);
}
if(newHost->hostName)
free(newHost->hostName);
free(newHost);
PrintMessage(MESG_ERROR, "\n DuplicateHost : Insufficient memory");
return NULL;
}
void DataManager::PrintAllHosts()
{
PrintMessage(MESG_PRINT, "\n\n List of hosts ");
for(Host *t=hostList; t ; t=t->next)
{
PrintMessage(MESG_PRINT, "\n\n %s", t->hostName);
for(HostElement *h=t->child; h ; h= h->next)
{
PrintMessage(MESG_PRINT, "\n %s : %s ", h->name, h->value);
}
}
}
int DataManager::AddHostElement(char *hostName, char *name, char *value, unsigned char isPassword)
{
Host *host;
HostElement *h, *t;
if( !hostName || !name || !value)
{
PrintMessage(MESG_ERROR, "\n DataManager : Null parameters passed....");
return FPM_SIGNON_FILE_INVALID_DATA;
}
// First find the specified host
for(host = hostList; host ; host = host->next)
{
if( STRCMPI(hostName, host->hostName) == 0 )
break;
}
if( !host )
{
PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", hostName);
return FPM_HOSTNAME_NOT_PRESENT;
}
// check if specified name/value pair exist already....
for(h = host->child; h ; h=h->next)
{
if( (STRCMPI(h->name,name) == 0 ) && (strcmp(h->value, value) == 0 ) )
{
PrintMessage(MESG_ERROR, "\n DataManager : Specified name/value [%s/%s]pair is already present ", name,value);
return FPM_TRUE;
}
}
HostElement *temp = (HostElement *) malloc(sizeof(HostElement));
if( temp )
{
temp->name = (char*) malloc( strlen(name)+1 );
temp->value = (char*) malloc( strlen( value) + 1 );
}
if( !temp || !temp->name || !temp->value )
{
PrintMessage(MESG_ERROR, "\n DataManager : Failed to add name/value due to insufficient memory ");
return FPM_INSUFFICIENT_MEMORY;
}
strcpy(temp->name,name);
strcpy(temp->value, value);
temp->isPassword = isPassword;
temp->next = NULL;
// Now add it to the host...
if( host->child == NULL )
{
host->child = temp;
}
else
{
for(t = host->child; t->next ; t=t->next);
t->next = temp;
}
return FPM_TRUE;
}
// invoked from outside..
int DataManager::RemoveHostElement(char *hostName, char *value)
{
Host *host;
if( !hostName || !value )
{
PrintMessage(MESG_ERROR, "\n DataManager : Null parameters passed....");
return FPM_FALSE;
}
// First find the specified hot
for(host = hostList; host; host = host->next)
{
if( STRCMPI(hostName, host->hostName) == 0 )
break;
}
if( !host )
{
PrintMessage(MESG_ERROR, "\n DataManager : Specified hostname[%s] is not present ", hostName);
return FPM_FALSE;
}
HostElement *prev = host->child;
for(HostElement *h = host->child; h ;prev=h, h=h->next)
{
if( strcmp(h->value, value) == 0 )
{
if( host->child == h )
host->child = h->next;
else
prev->next = h->next;
free(h->value);
free(h->name);
free(h);
return FPM_TRUE;
}
}
return FPM_FALSE;
}
// internal
int DataManager::RemoveAllData()
{
RemoveAllRejectHosts();
RemoveAllHosts();
return FPM_TRUE;
}
int DataManager::RemoveAllRejectHosts()
{
RejectHost *t = rejectHostList;
RejectHost *temp;
for( ; t; )
{
temp = t;
t= t->next;
RemoveRejectHost(temp->hostName);
}
rejectHostList = NULL;
return FPM_TRUE;
}
int DataManager::RemoveAllHosts()
{
Host *t = hostList;
Host *temp;
for( ; t ; )
{
temp = t;
t = t->next;
RemoveHost(temp->hostName);
}
hostList = NULL;
return FPM_TRUE;
}