blob: 62057db5ce18264d6eedb0e11b4b6bd0643271b2 [file] [log] [blame]
#include "FileFunctions.hpp"
#include "MissingCFunctions.hpp"
#include "AxisConfigurationLibraries.hpp"
bool ReadFilenamesInaDirectory( char * pszDirName, LIST * psFileNameList)
{
bool bSuccess = false;
#if WIN32 // Start WINDOWS code
#if defined(_MSC_VER) && _MSC_VER >= 1300 // Start MSVC verison number > 7.0
intptr_t lFindFile;
#else // Else !(MSVC verison number > 7.0)
long lFindFile;
#endif // End MSVC verison number
struct _finddata_t sFindData;
if( (lFindFile = _findfirst( pszDirName, &sFindData)) != -1)
{
if( sFindData.name[0] == '.' && sFindData.attrib & _A_SUBDIR)
{
bSuccess = true;
}
do
{
if( !(sFindData.attrib & _A_SUBDIR))
{
AddFilenameToList( psFileNameList, sFindData.name);
}
} while( _findnext( lFindFile, &sFindData) == 0);
_findclose( lFindFile);
}
#else // Else !(WINDOWS code)
DIR * psDIR;
struct dirent* pDirEnt;
if( (psDIR = opendir( pszDirName)) == NULL)
{
return bSuccess;
}
while( (pDirEnt = readdir( psDIR)) != NULL)
{
AddFilenameToList( psFileNameList, pDirEnt->d_name);
}
if( closedir( psDIR) == -1)
{
return bSuccess;
}
else
{
bSuccess = true;
}
#endif // End WINDOWS code
return bSuccess;
}
bool CheckAxisBinDirectoryExists( char * pszAxisCpp_Deploy, char * pszAxis_Bin, char * pszAxis_Bin_Default, LIST * psDLLNames, LIST * psFileNameList)
{
bool bFound = false;
if( strlen( pszAxis_Bin) < 2)
{
strcpy( pszAxis_Bin, pszAxis_Bin_Default);
}
char szFilename[512];
char szFileDirAndName[512];
#if WIN32
sprintf( szFilename, "%s\\%s\\*.*", pszAxisCpp_Deploy, pszAxis_Bin);
#else
sprintf( szFilename, "%s/%s/.", pszAxisCpp_Deploy, pszAxis_Bin);
#endif
if( (bFound = ReadFilenamesInaDirectory( szFilename, psFileNameList)) == true)
{
int iIndex = 0;
do
{
char * pExtn = (char *) psFileNameList->ppArray[iIndex];
do
{
if( (pExtn = strchr( pExtn, '.')) != NULL)
{
pExtn++;
#if WIN32
if( StringCompare( pExtn, "DLL"))
#else
if( StringCompare( pExtn, "SO"))
#endif
{
DLLNAMEINFO * psDLLNameInfo = (DLLNAMEINFO *) GetNextListElement( psDLLNames, sizeof( DLLNAMEINFO));
psDLLNameInfo->pszDLLName = (char *) malloc( strlen( (char *) psFileNameList->ppArray[iIndex]) + 1);
strcpy( psDLLNameInfo->pszDLLName, (char *) psFileNameList->ppArray[iIndex]);
StringToUpper( psDLLNameInfo->pszDLLName);
#if WIN32
sprintf( szFileDirAndName, "%s\\%s\\%s", pszAxisCpp_Deploy, pszAxis_Bin, (char *) psFileNameList->ppArray[iIndex]);
#else
sprintf( szFileDirAndName, "%s/%s/%s", pszAxisCpp_Deploy, pszAxis_Bin, (char *) psFileNameList->ppArray[iIndex]);
#endif
psDLLNameInfo->pszDLLFilename = (char *) malloc( strlen( szFileDirAndName) + 1);
strcpy( psDLLNameInfo->pszDLLFilename, szFileDirAndName);
break;
}
}
} while( pExtn != NULL);
iIndex++;
} while( iIndex < psFileNameList->iCount);
}
if( !bFound)
{
cout << endl << "The directory " << pszAxis_Bin << " was not found." << endl << endl;
}
return bFound;
}
void WriteAxisConfigFile( LIST * psDLLNames, int * piConfigInfoArray, CHOICELIST * psChoiceList, bool bMerge, char * pszAxisCpp_Deploy, char cSlash, bool bBackup)
{
char szFilename[256];
sprintf( szFilename, "%s%caxiscpp.conf", pszAxisCpp_Deploy, cSlash);
cout << endl << "Configuration complete." << endl << endl;
if( bBackup)
{
BackUpExistingConfigFile( pszAxisCpp_Deploy, szFilename, cSlash);
}
if( bMerge)
{
char * pszData = NULL;
long lFileLength = 0;
if( (lFileLength = ReadFileContents( szFilename, &pszData)) > -1)
{
FILE * pFile = fopen( szFilename, "w");
if( lFileLength < 5)
{
char szConfigData[512];
sprintf( szConfigData, "# This header file was created by AxisConfiguration on %s", TimeNow());
WriteLineToFile( pFile, szConfigData);
WriteLineToFile( pFile, "# The comment character is '#'\n");
WriteLineToFile( pFile, "# Available directives are as follows\n");
WriteLineToFile( pFile, "#(Some of these directives may not be implemented yet)\n");
WriteLineToFile( pFile, "#\n");
}
for( int ieConfigType = eHTTPTransport; ieConfigType < eConfigMax; ieConfigType++)
{
int iChoiceIndex = GetChoiceIndexForConfigType( psChoiceList, (ECONFIGTYPE) ieConfigType);
if( iChoiceIndex != -1)
{
char * psTag = strstr( pszData, psChoiceList[iChoiceIndex].pszConfigName);
if( psTag)
{
char * psTagLineStart = strchr( psTag, ':');
char * psTagLineEnd = psTag;
if( psTagLineStart != NULL)
{
psTagLineStart++;
while( *psTagLineEnd != '\n' &&
*psTagLineEnd != '\r' &&
*psTagLineEnd != '\0' &&
psTagLineEnd - pszData < lFileLength)
{
psTagLineEnd++;
}
int iTagValueLength = (int) (psTagLineEnd - psTagLineStart);
char * pszTagValue = GetTagValue( psDLLNames, piConfigInfoArray, (ECONFIGTYPE) ieConfigType);
if( pszTagValue != NULL)
{
if( (int) strlen( pszTagValue) == iTagValueLength)
{
if( StringCompare( psTagLineStart, pszTagValue))
{
// No change
}
else
{
memcpy( psTagLineStart, pszTagValue, iTagValueLength);
}
}
else if( (int) strlen( pszTagValue) > iTagValueLength)
{
// New tag value is longer than current tag.
int iTagValueLengthDiff = (int) strlen( pszTagValue) - iTagValueLength;
int iTagValueOffset = (int) (psTagLineStart - pszData);
pszData = (char *) realloc( pszData, strlen( pszData) + iTagValueLengthDiff + 1);
memmove( pszData + iTagValueOffset + iTagValueLength + iTagValueLengthDiff,
pszData + iTagValueOffset + iTagValueLength,
strlen( pszData + iTagValueOffset + iTagValueLength) + 1);
memcpy( pszData + iTagValueOffset,
pszTagValue,
strlen( pszTagValue));
}
else
{
// New tag value is shorter than current tag.
int iTagValueLengthDiff = iTagValueLength - (int) strlen( pszTagValue);
int iTagValueOffset = (int) (psTagLineStart - pszData);
memmove( pszData + iTagValueOffset + iTagValueLength - iTagValueLengthDiff,
pszData + iTagValueOffset + iTagValueLength,
strlen( pszData + iTagValueOffset + iTagValueLength) + 1);
memcpy( pszData + iTagValueOffset,
pszTagValue,
strlen( pszTagValue));
}
}
}
}
else
{
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, (ECONFIGTYPE) ieConfigType));
}
}
else
{
// No choice information
}
}
WriteLineToFile( pFile, pszData);
free( pszData);
fclose( pFile);
}
else
{
cout << "Error - The existing configuration file (" << szFilename << ")" << endl
<< " could not be read/found. The new configuration data has" << endl
<< " not been written." << endl;
}
}
else
{
FILE * pFile = fopen( szFilename, "w");
char szConfigData[512];
sprintf( szConfigData, "# This header file was created by AxisConfiguration on %s", TimeNow());
WriteLineToFile( pFile, szConfigData);
WriteLineToFile( pFile, "# The comment character is '#'\n");
WriteLineToFile( pFile, "# Available directives are as follows\n");
WriteLineToFile( pFile, "#(Some of these directives may not be implemented yet)\n");
WriteLineToFile( pFile, "#\n");
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eServerLog));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eServerWSDD));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eClientLog));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eClientWSDD));
WriteLineToFile( pFile, "#Node name.\n");
WriteLineToFile( pFile, "#NodeName: <not set>\n\n");
WriteLineToFile( pFile, "#Listening port.\n");
WriteLineToFile( pFile, "#ListenPort: <not set>\n\n");
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eHTTPTransport));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eSMTPTransport));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eXMLParser));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eHTTPChannel));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eHTTPSSLChannel));
WriteLineToFile( pFile, CreateConfigElement( psDLLNames, piConfigInfoArray, psChoiceList, eSSLOptions));
fclose( pFile);
}
}
bool BackUpExistingConfigFile( char * pszAxisCpp_Deploy, char * pszFilename, char cSlash)
{
bool bSuccess = false;
if( FileExists( pszFilename))
{
int iBackCount = -1;
char szBackFilename[256];
do
{
iBackCount++;
sprintf( szBackFilename, "%s%caxiscpp.conf.backup_%04d", pszAxisCpp_Deploy, cSlash, iBackCount);
} while( FileExists( szBackFilename));
FILE * pFileFrom = fopen( pszFilename, "r");
FILE * pFileTo = fopen( szBackFilename, "w");
if( pFileFrom != NULL && pFileTo != NULL)
{
long lFileLength = GetFileLength( pFileFrom);
char szBackupHeader[256];
sprintf( szBackupHeader, "# This header file was automatically backed up by AxisConfiguration on %s", TimeNow());
char * pFileContent = (char *) malloc( lFileLength + strlen( szBackupHeader) + 2);
pFileContent[lFileLength + strlen( szBackupHeader) + 1] = '\0';
strcpy( pFileContent, szBackupHeader);
fread( pFileContent + strlen( szBackupHeader), sizeof( char), lFileLength, pFileFrom);
fwrite( pFileContent, sizeof( char), lFileLength + strlen(szBackupHeader) + 1, pFileTo);
fclose( pFileFrom);
fclose( pFileTo);
pFileTo = NULL;
pFileFrom = NULL;
free( pFileContent);
bSuccess = true;
}
if( pFileTo != NULL)
{
fclose( pFileTo);
}
if( pFileFrom != NULL)
{
fclose( pFileFrom);
}
}
return bSuccess;
}
void WriteLineToFile( FILE * pFile, char * pszData)
{
fwrite( pszData, sizeof( char), strlen( pszData), pFile);
}
long GetFileLength( FILE * pFile)
{
fseek( pFile, 0, SEEK_END);
long lFileLength = ftell( pFile);
rewind( pFile);
return lFileLength;
}
long ReadFileContents( char * pszFilename, char ** ppszData)
{
long lFileLength = -1;
if( FileExists( pszFilename))
{
FILE * pFile = fopen( pszFilename, "r");
if( pFile != NULL)
{
lFileLength = GetFileLength( pFile);
*ppszData = (char *) malloc( lFileLength + 1);
memset( *ppszData, 0, lFileLength + 1);
fread( *ppszData, sizeof( char), lFileLength, pFile);
fclose( pFile);
}
}
return lFileLength;
}