#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <string.h>
#include <errno.h>
#include <signal.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include "common.h"

using namespace std;

#define MAX_SCRIPT_LEN  (256)

static int msgid;
static bool nonstop;

//-----------------------------------------------------------------------------
struct SCRIPT_DATA
{
    long    mtype;
    char    script[MAX_SCRIPT_LEN];
} sd;
//-----------------------------------------------------------------------------
static void CatchUSR1Executer(int)
{
//printfd(__FILE__, "CatchUSR1Executer\n");
exit(0);
nonstop = false;
}
//-----------------------------------------------------------------------------
int ScriptExec(const string & str)
{
if (str.length() >= MAX_SCRIPT_LEN)
    return -1;

/*printfd(__FILE__, "2 Script schedule: %s\n", str.c_str());

if (access(str.c_str(), X_OK))
    return -1;*/

struct msgbuf * mbuf;
int ret;
strncpy(sd.script, str.c_str(), MAX_SCRIPT_LEN);
sd.mtype = 1;
mbuf = (struct msgbuf * )&sd;
ret = msgsnd(msgid, mbuf, MAX_SCRIPT_LEN, 0);
if (ret < 0)
    {
    printfd(__FILE__, "snd ERROR!\n");
    return -1;
    }
return 0;
}
//-----------------------------------------------------------------------------
void Executer(int msgKey, int msgID, pid_t pid, char * procName)
{
msgid = msgID;
if (pid)
    return;
nonstop = true;
//printfd(__FILE__, "close(pipeOut) %d pid=%d\n", pipeOut, getpid());

//printfd(__FILE__, "Executer started %d\n", getpid());
#ifdef LINUX
memset(procName, 0, strlen(procName));
strcpy(procName, "stg-exec");
#else
setproctitle("stg-exec");
#endif

struct sigaction newsa, oldsa;
sigset_t sigmask;

sigemptyset(&sigmask);
sigaddset(&sigmask, SIGTERM);
newsa.sa_handler = SIG_IGN;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGTERM, &newsa, &oldsa);

sigemptyset(&sigmask);
sigaddset(&sigmask, SIGINT);
newsa.sa_handler = SIG_IGN;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGINT, &newsa, &oldsa);

sigemptyset(&sigmask);
sigaddset(&sigmask, SIGUSR1);
newsa.sa_handler = CatchUSR1Executer;
newsa.sa_mask = sigmask;
newsa.sa_flags = 0;
sigaction(SIGUSR1, &newsa, &oldsa);

int ret;

SCRIPT_DATA sd;

while (nonstop)
    {
    sd.mtype = 1;
    //printfd(__FILE__, "Waiting for msgrcv... msgid=%d pid=%d\n", msgid, getpid());
    ret = msgrcv(msgid, &sd, MAX_SCRIPT_LEN, 0, 0);

    if (ret < 0)
        {
        usleep(20000);
        continue;
        }
    //printfd(__FILE__, "Script execute: %s\n", sd.script);
    system(sd.script);
    }
exit(0);
}
//-----------------------------------------------------------------------------