#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <exec/exec.h>
#include <dos/dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ZeladorAREXXinterface.h"

/* variáveis desse trecho..	*/
/* long int CodRetorno;	 código de retorno do último comando Execute (....)	*/
char *pEnvVariavel;		/* usado p/ armazenar código de retorno do rexx	*/
/* anteriormente definido como 10	*/
#define tamanhoEnvVariavel 256
#define CodRetornoNulo 65535
#define StrCodRetornoNulo "65535"
char NomeEnvVariavel[30];	/* nome da variavel que irá armazenar o valor acima	*/

/* 0 - ok   <>0 - erro. não inicializado.	*/
int InicializaREXX (void)
{
	/* ATENCAO -- aqui deveria gerar um ID único (caso se rode 2x Zelador)	*/
	/* chuncho temporário	*/
	strcpy (NomeEnvVariavel, "ZEL_00000000"); /* <--- aqui o chuncho	*/
	if (!(pEnvVariavel = AllocVec (tamanhoEnvVariavel, MEMF_PUBLIC)))
		return(1);

	/*	CodRetorno = 0; (agora não é mais uma variável normal C)	*/
	strcpy (pEnvVariavel, "0");
	SetVar (NomeEnvVariavel, pEnvVariavel, tamanhoEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);

	return (0);
}

void EnviaComandoREXX (char * HostDestino, char * Comando)
{
	char frasetemp [255] = "run >NIL: execute >NIL: scrp \"";

	/* equivalente ao rexx: "ADDRESS command setenv ZEL_xxxxxxxx 65536"	*/
	strcpy (pEnvVariavel, StrCodRetornoNulo);
	SetVar (NomeEnvVariavel, pEnvVariavel, tamanhoEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);

	strcat (&frasetemp[0], &NomeEnvVariavel[0]);	/* ZEL_xxxxxxxx	*/
	strcat (&frasetemp[0], "\" \"ADDRESS ");
	strcat (&frasetemp[0], HostDestino);
	strcat (&frasetemp[0], " ");
	strcat (&frasetemp[0], Comando);
	strcat (&frasetemp[0], ";exit RC\"");
	
	system (&frasetemp[0]);
}

/* usado pelo
	 int VerificaSeProgsNaMem (void)
	no Zelador_Nucleo.c	*/
long int EnviaEEsperaComandoREXX (char * HostDestino, char * Comando)
{
	char frasetemp [255] = "execute >NIL: scrp \"";

	/* equivalente ao rexx: "ADDRESS command setenv ZEL_xxxxxxxx 65536"	*/
	strcpy (pEnvVariavel, StrCodRetornoNulo);
	SetVar (NomeEnvVariavel, pEnvVariavel, tamanhoEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);

	strcat (&frasetemp[0], &NomeEnvVariavel[0]);	/* ZEL_xxxxxxxx	*/
	strcat (&frasetemp[0], "\" \"ADDRESS ");
	strcat (&frasetemp[0], HostDestino);
	strcat (&frasetemp[0], " ");
	strcat (&frasetemp[0], Comando);
	strcat (&frasetemp[0], ";exit RC\"");
	
/*	printf ("Comando enviado:\n%s\n", frasetemp);*/
	
	system (&frasetemp[0]);
	return (CodRetorno());
}

/* envia comando p/o YAM e espera conclusão	*/
/* dados: comando, pointer p/ string e tamanho do buffer	da string	*/
/* se o pointer para saida for nulo, não escreve nada de saida	*/
void EnviaComandoYAM (char * Comando, char * StringSaida, int TamBuff)
{
	char frasetemp [255] = "rx >NIL: \"OPTIONS RESULTS;";

	/* equivalente ao rexx: "ADDRESS command setenv ZEL_xxxxxxxx 65536"	*/
	strcpy (pEnvVariavel, StrCodRetornoNulo);
	SetVar (NomeEnvVariavel, pEnvVariavel, tamanhoEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);

	strcat (&frasetemp[0], "ADDRESS YAM;");
	strcat (&frasetemp[0], Comando);
	strcat (&frasetemp[0], ";ADDRESS command setenv ");
	strcat (&frasetemp[0], &NomeEnvVariavel[0]);	/* ZEL_xxxxxxxx	*/
	strcat (&frasetemp[0], " RESULT\"");
	
	system (&frasetemp[0]);
/*	return (CodRetorno());*/

	if (StringSaida)	/* se StringSaida<>0 colocar resultado nela	*/
		GetVar (NomeEnvVariavel, StringSaida, TamBuff, GVF_GLOBAL_ONLY|LV_VAR);

	/* resseta o código de retorno, caso o comando tenha dado erro e, assim, não alterado a variável	*/
	strcpy (pEnvVariavel, "0");
	SetVar (NomeEnvVariavel, pEnvVariavel, tamanhoEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);
}


/* retorna 65535 se o comando ainda não voltou */
long int CodRetorno (void)
{
	char tempEnv[tamanhoEnvVariavel];
	long int tempCodRet;

	/*	return (CodRetorno);*/
	GetVar (NomeEnvVariavel, tempEnv, tamanhoEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);
	tempCodRet = strtol (tempEnv, NULL, 10);

	return (tempCodRet);
}

void FechaREXX (void)
{
	/* apaga a variável environment, não é mais necessária	*/
	DeleteVar (NomeEnvVariavel, GVF_GLOBAL_ONLY|LV_VAR);
	FreeVec (pEnvVariavel);
}

/* executa comando CLI dado o comando em si e espera 0-não 1-sim	*/
void ExecutaComandoCLI (char * comandocli, int espera)
{
	char frasetemp [255] = "run ";

	if (!(espera))
	{
		strcat (&frasetemp[0], comandocli);
		system (&frasetemp[0]);
	}
	else
		system (comandocli);
}


