/*  This file is part of lsnet.
    Copyright (C) 2009-2010  Sterling Pickens
    Lsnet 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 3 of the License, or
    (at your option) any later version.

    Lsnet 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 lsnet.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "homedir.h"

/*
struct log_data{
	char *homedir;
        char *conf_file;
	char *web_dir;
        char *cpu_log;
        char *mem_log;
        char *net_log;
        char *cpu_lock;
        char *mem_lock;
        char *net_lock;
}global_strs;
*/

struct log_data global_strs;

int using_alt_conf;

void Aloc_homedir_globals(void){
	//setup global logs/locks //homedir_length + / + suffix len + null

	//log.homedir  = (char *)malloc(strlength + 1);

	size_t strlength = strlen(global_strs.homedir);

	global_strs.cpu_log  = (char *)malloc(strlength + strlen("/lscpu.log") + 1);
	global_strs.mem_log  = (char *)malloc(strlength + strlen("/lsmem.log") + 1);
	global_strs.net_log  = (char *)malloc(strlength + strlen("/lsnet.log") + 1);
	global_strs.cpu_lock = (char *)malloc(strlength + strlen("/cpulock")   + 1);
	global_strs.mem_lock = (char *)malloc(strlength + strlen("/memlock")   + 1);
	global_strs.net_lock = (char *)malloc(strlength + strlen("/netlock")   + 1);
	memset( (void *)global_strs.cpu_log,  '\0', strlength + strlen("/lscpu.log")  + 1);
	memset( (void *)global_strs.mem_log,  '\0', strlength + strlen("/lsmem.log")  + 1);
	memset( (void *)global_strs.net_log,  '\0', strlength + strlen("/lsnet.log")  + 1);
	memset( (void *)global_strs.cpu_lock, '\0', strlength + strlen("/lscpu.lock") + 1);
	memset( (void *)global_strs.mem_lock, '\0', strlength + strlen("/lsmem.lock") + 1);
	memset( (void *)global_strs.net_lock, '\0', strlength + strlen("/lsnet.lock") + 1);


	
/*
	if(!using_alt_conf){
		strlength = strlen( getenv("HOME") );
		dirname = (char *)malloc( strlength );
		if(dirname == NULL){
			printf("%s: malloc - %s\n", program_invocation, strerror(errno) );
			printf("failed to allocate memory, exiting!\n");
			exit(1);
		}
		//dirname is not null terminated
		(void)strncpy(dirname, (const char *)getenv("HOME"), strlength );
		strlength += strlen("/.lsnet");
		dirname = (char *)realloc(dirname, strlength);
		(void)strncat(dirname, "/.lsnet", strlen("/.lsnet") );

		log.conf_file = (char *)malloc(strlength + strlen("/.lsnet"));
		(void)strcpy(log.conf_file, log.homedir, reqlength);
		(void)strncat(log.conf_file, "/.lsnet", strlen("/.lsnet") );
	}
*/

	
	//(void)strncpy(log.homedir,  dirname, strlength);

	(void)strncpy(global_strs.cpu_log,  global_strs.homedir, strlength);
	(void)strncpy(global_strs.mem_log,  global_strs.homedir, strlength);
	(void)strncpy(global_strs.net_log,  global_strs.homedir, strlength);
	(void)strncpy(global_strs.cpu_lock, global_strs.homedir, strlength);
	(void)strncpy(global_strs.mem_lock, global_strs.homedir, strlength);
	(void)strncpy(global_strs.net_lock, global_strs.homedir, strlength);

	(void)strncat(global_strs.cpu_log,  "/lscpu.log", strlen("/lscpu.log") );
	(void)strncat(global_strs.mem_log,  "/lsmem.log", strlen("/lsmem.log") );
	(void)strncat(global_strs.net_log,  "/lsnet.log", strlen("/lsnet.log") );
	(void)strncat(global_strs.cpu_lock, "/cpulock",   strlen("/cpulock")   );
	(void)strncat(global_strs.mem_lock, "/memlock",   strlen("/memlock")   );
	(void)strncat(global_strs.net_lock, "/netlock",   strlen("/netlock")   );

}

void Homedir(void){
        //char *dirname;
        //char *name_tmp;
        char *envptr;
        size_t strlength = 0;
        size_t reqlength = 0;
        DIR *dirptr;
        FILE *out;
        int ret_val = 0;

	if(global_strs.homedir == NULL){

		strlength = strlen( getenv("HOME") );
		global_strs.homedir = (char *)malloc( strlength + strlen("/.lsnet") + 1);
		(void)memset( (void *)global_strs.homedir, '\0', strlength + strlen("/.lsnet")  + 1);
		if(global_strs.homedir == NULL){
			printf("%s: malloc - %s\n", program_invocation, strerror(errno) );
			printf("failed to allocate memory, exiting!\n");
			exit(1);
		}
		(void)strncpy(global_strs.homedir, (const char *)getenv("HOME"), strlength );
		if( global_strs.homedir[strlength] == '\n' ){
			//just incase getenv inserts a newline
			global_strs.homedir[strlength] = '\0';
		}
		(void)strncat(global_strs.homedir, "/.lsnet", strlen("/.lsnet") );
	}
	//	printf("%s: homedir - improper function call\n\tglobal_strs.homedir must not be set yet\n", program_invocation);
	//	exit(1); 
	//}
/*
	}else{
		strlength = strlen(log.homedir) + 1;
		dirname = (char *)malloc( strlength );
		if(dirname == NULL){
			printf("%s: malloc - %s\n", program_invocation, strerror(errno) );
			printf("failed to allocate memory, exiting!\n");
			exit(1);
		}
		(void)strncpy(dirname, (const char *)log.homedir, strlength );
	}
*/
	
	dirptr = opendir(global_strs.homedir);
	if(dirptr == NULL){
		printf("%s: opendir - %s\n", program_invocation, strerror(errno) );
		printf("creating lsnet local dir: %s\n", global_strs.homedir);
		ret_val = mkdir((const char *)global_strs.homedir, S_IRWXU | S_IRGRP | S_IROTH | S_IXGRP | S_IXOTH); //returns 0 for success
		if(ret_val != 0){
			printf("%s: mkdir - %s\n", program_invocation, strerror(errno) );
			printf("Error: cannot create directory %s , exiting!\n", global_strs.homedir);
			exit(1);
		}
	}else{
		if( closedir(dirptr) != 0){
			printf("%s: closedir - %s\n", program_invocation, strerror(errno) );
			printf("Error: cannot close directory %s, exiting!\n", global_strs.homedir);
			exit(1);
		}

	}

	//reqlength = strlength + strlen("/lsnet.conf");
	//name_tmp = (char *)malloc( reqlength );
	//(void)strncpy(name_tmp, (const char *)dirname, strlength );
	//(void)strncat(name_tmp, "/lsnet.conf", strlen("/lsnet.conf") );

	//Aloc_homedir_globals();

/*
	strlength += strlen("/cache");
	dirname = (char *)realloc(dirname, strlength);
	(void)strncat(dirname, "/cache", strlen("/cache") );

	dirptr = opendir(dirname);
	if(dirptr == NULL){
		printf("%s: opendir - %s\n", program_invocation, strerror(errno) );
		printf("creating directory: %s\n", dirname);
		ret_val = mkdir((const char *)dirname, S_IRWXU | S_IRGRP | S_IROTH | S_IXGRP | S_IXOTH); //returns 0 for success
		if(ret_val != 0){
			printf("%s: mkdir - %s\n", program_invocation, strerror(errno) );
			printf("Error: cannot create directory %s, exiting!\n", dirname);
			exit(1);
		}
	}else{
		//unistd.h
		//int access(const char *path, int amode); //returns 0 for success
		if( closedir(dirptr) != 0){
			printf("%s: closedir - %s\n", program_invocation, strerror(errno) );
			printf("Error: cannot close directory %s, exiting!\n", dirname);
			exit(1);
		}
	}
*/

}
