/************************************************************************/
/*      Copyright (C) 2004  Michael C. Shultz                           */
/*                                                                      */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License, or (at*/
/* your option) any later version.                                      */
/*                                                                      */
/* This program 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 General Public License for more details.                         */
/*                                                                      */
/* You should have received a copy of the GNU General Public License    */
/* along with this program; if not, write to the Free Software          */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA            */
/*  02111-1307, USA.                                                    */
/*                                                                      */
/* Michael C. Shultz                                                    */
/* ringworm@inbox.lv                                                    */
/* Box 3238 Landers, CA 92285                                           */
/************************************************************************/
#include	<PMGRrReadConfigure.h>
int	pipeToNull( char* );

int	PMGRrReadConfigure( void )
{
	FILE*			StreamConfig;
	MGsDb			config_db;

	char			ConfigFileName_OLD[]	= LOCALBASE"etc/portmanager/portmanager.conf";

	char			ConfigFileNameSAMPLE[]	= LOCALBASE"etc/portmanager/pm-020.conf.SAMPLE";
	char			ConfigFileName[]	= LOCALBASE"etc/portmanager/pm-020.conf";

	char			config_db_fileTemp[]	= DATADIR"configure.db.temp";
	char			config_db_file[]	= DATADIR"configure.db";
	char*			ConfigBuffer;
	char			id[]			= "PMGRrReadConfigure";
	int			idx			= 0;
	int			idx2			= 0;
	unsigned	int	bufferSize		= 0;
	unsigned	int	fileSize		= 0;
	unsigned	int	idx1			= 0;

	/* update old conf file if it exists */
	if( MGrIfFileExist( ConfigFileName_OLD ) == 1 )
	{
		ConfigBuffer	= (char*)malloc( strlen( "mv " )
				+ (strlen(ConfigFileName_OLD)*2) + strlen("_OLD") + 3 );
		strncpy( ConfigBuffer, "mv ", strlen( "mv " ) + 1 );
		strncat( ConfigBuffer, ConfigFileName_OLD, strlen(ConfigFileName_OLD) + 1 );
		strncat( ConfigBuffer, " ", 2 );
		strncat( ConfigBuffer, ConfigFileName_OLD, strlen(ConfigFileName_OLD) + 1 );
		strncat( ConfigBuffer, "_OLD", strlen("_OLD") + 1 );
		fprintf( stdout, "moving %s to %s%s\n", ConfigFileName_OLD, ConfigFileName_OLD, "_OLD" );
		fprintf( stdout, "portmanager configuration file is now called %s. Please review %s and %s and make any nessesary changes.\n",
			ConfigFileName, ConfigFileNameSAMPLE, ConfigFileName_OLD);
		system( ConfigBuffer );		
	}
	
	if( MGrIfFileExist( ConfigFileName ) == 0 )
	{
		ConfigBuffer	= (char*)malloc(strlen("cp ")+strlen(ConfigFileNameSAMPLE)+strlen(" ")+strlen(ConfigFileName)+1); 
		strncpy( ConfigBuffer, "cp ", strlen("cp ")+1 );
		strncat( ConfigBuffer, ConfigFileNameSAMPLE, strlen(ConfigFileNameSAMPLE)+1);
		strncat( ConfigBuffer, " ", strlen(" ")+1);
		strncat( ConfigBuffer, ConfigFileName, strlen(ConfigFileName)+1);
		system( ConfigBuffer );
		free( ConfigBuffer );
	}
	fileSize = MGrFileSize( ConfigFileName );
	fprintf( stdout, "reading %s, size %d\n", ConfigFileName, fileSize );
	ConfigBuffer		= ( char* )malloc( fileSize + 1 );

	if( ( StreamConfig = fopen( ConfigFileName, "r" ) ) != 0 )
	{
		fread( ConfigBuffer, fileSize, 1, StreamConfig);
		fclose( StreamConfig );
	}
	ConfigBuffer[fileSize]		= '\n';
	ConfigBuffer[fileSize+1]	= 0;

	while( ( bufferSize = MGrStripComment( ConfigBuffer, (char)'#' ) ) != 0 )
	{
		ConfigBuffer = ( char* )realloc( ConfigBuffer, bufferSize + 1 );
		ConfigBuffer[bufferSize]	= 0;
		fileSize			= bufferSize;
	}

	while( pipeToNull( ConfigBuffer ) != 0 );
	/* clean out extra linefeeds */
	idx = 0;
	while( idx < fileSize + 1 )
	{
		if( ConfigBuffer[idx] == 10 && (ConfigBuffer[idx-1] != 0 || idx == 0) )
		{
			idx1 = idx;
			while( idx1 < fileSize )
			{
				ConfigBuffer[idx1] = ConfigBuffer[idx1+1];
				idx1++;
			}
			ConfigBuffer = ( char* )realloc( ConfigBuffer, idx1-2 );
			fileSize--;
			continue;
		}
		idx++;
	}
	/* change every other NULL to NULL LF */
	idx = 0;
	while( idx < fileSize + 1 )
	{
		if( ConfigBuffer[idx] == 0 )
		{
			idx++;
			while( ConfigBuffer[idx] != 0 && idx < fileSize + 1 )
			{
				idx++;
			}
			if( ConfigBuffer[idx+1] == '\t' || ConfigBuffer[idx+1] == ' ' )
			{
				ConfigBuffer[idx+1] = 10;
			}
		}
		idx++;
	}
	/* tidy up end of file */
	while( ConfigBuffer[fileSize-2] != 0 && ConfigBuffer[fileSize-1] != '\n' )
	{
		ConfigBuffer[fileSize-1] = -1;
		fileSize--;
	}
	
	
        if( !( StreamConfig = fopen( config_db_fileTemp, "w" ) ) )
        {
                fprintf( stderr, "%s %s error: unable to open %s for write\n",
                        id,  ver,  config_db_fileTemp );
                fprintf( stderr, "you must run this program as root\n" );
                perror( "system message" );
                return( 1 );
        }
	else
	{
		fwrite( ConfigBuffer, 1, fileSize, StreamConfig );
		fclose( StreamConfig );
	}
	StreamConfig = fopen( config_db_file, "w" );

	MGmDbArray( config_db, config_db_fileTemp, "r" );
	idx = 0;
	idx1 = 0;
	idx2 = 0;
	while( idx < config_db.recordQty )
	{
		/* trim leading whitespace */
		while( config_db.array[idx][0][idx1] == ' '	||
			config_db.array[idx][0][idx1] == '\n'	||
			config_db.array[idx][0][idx1] == '\t' )
		{
			idx1++;
		}
		while( config_db.array[idx][1][idx2] == ' '	||
			config_db.array[idx][1][idx2] == '\n'	||
			config_db.array[idx][1][idx2] == '\t' )
		{
			idx2++;
		}

		fprintf( StreamConfig, "%s%c%s%c\n", 
			config_db.array[idx][0]+idx1, 0, config_db.array[idx][1]+idx2, 0 );
		idx++;
	}
	fclose( StreamConfig );
	MGmDbArrayFree(config_db);
	free(ConfigBuffer);

/*
	MGmDbArray( config_db, config_db_file, "r" );
	idx = 0;
	while( idx < config_db.recordQty )
	{
		fprintf( stdout, "key:%s data:%s\n",
			config_db.array[idx][0], config_db.array[idx][1] );
		idx++;
	}
	MGmDbArrayFree(config_db);
*/
	return( 0 );
}

int	pipeToNull( char* buffer )
{
	char* toNull;
	if( ( toNull = strrchr( buffer, '|' ) ) != NULL )
	{
		toNull[0] = 0; 
		return( 1 );
	} 
	return( 0 );
}