/*
 *========================================================================
 *
 *   시스템명 : AZN_PLAZA_LANE APP
 *   파 일 명 : app_mngt.c
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

#define _MAIN_MODULE_

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <unistd.h>
#include <wait.h>
#include <string.h>
#include "path_def.h"
#include "app_info.h"
#include "task_info.h"
#include "iis_func.h"
int    pid_init;
int    shmid;
#if 0
void SIG_usr1();
void SIG_term();
void SIG_pipe();
void SIG_cld();
void iis_init(),iis_start(),iis_shutdown(),Usage();
#endif
/*
 *========================================================================
 *
 *   함 수 명 : main()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

int main(argc, argv)
int  argc;
char *argv[];
{
    FILE *fp;

    signal(SIGTERM, SIG_term);
    signal(SIGALRM, SIG_IGN);
    signal(SIGHUP,  SIG_IGN);
    signal(SIGCLD,  SIG_cld);

    if(argc>2)
        if(!strcmp(argv[2],"nolog"))
        {
            close(0);
            close(1);
            close(2);
        }

    putenv(TZ);
    unlink("/tmp/_iis");
    if(argc<3 || strncmp(argv[2],"nomsg",2) )
    {
        fp = fopen("/tmp/_iis","w");
        fclose(fp);
    }

    chdir(LOG_DIR);
    shmid= shmget(KEY_INIT(),
    sizeof(SYS_INFO),IPC_PERM|IPC_CREAT);

    if(shmid<0)
    {
        proc_log("IIS ABORT: CANNOT GET SYS_INFO(%d)\n",shmid);
        exit(1);
    }
    system_info = (SYS_INFO *)shmat(shmid,(char*)0,0); /*IPC_PERM);*/
    if(system_info == NULL)
    {
        perror("shmat");
        proc_log("IIS ABORT: CANNOT ATTACH TO SYS_INFO\n");
        shmctl(shmid,IPC_RMID,0);
        exit(1);
    }

    if (argc < 2 ) iis_start();
    else if (argc > 1)
    {
        if (!strcmp(argv[1],"init")) iis_init();
        else if (!strncmp(argv[1],"start",4)) iis_start();
        else if (!strncmp(argv[1],"shutdown",4)) iis_shutdown();
        else Usage(argv[0]);
    } else Usage(argv[0]);
    exit(0);
}

/*
 *========================================================================
 *
 *   함 수 명 : Usage()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void Usage(prog)
char *prog;
{
    fprintf(stderr, "Usage:\n");
    fprintf(stderr, "\t%s          - iis start\n", prog);
    fprintf(stderr, "\t%s init     - iis reinitialize\n", prog);
    fprintf(stderr, "\t%s shutdown - iis shutdown\n\n", prog);
    exit(1);
}

/*
 *========================================================================
 *
 *   함 수 명 : iisAbort()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void iisAbort(s)
char *s;
{
    proc_log("IIS ABORT: CANNOT ATTACH %s\n",s);
    remove_msg_que();     proc_log("IIS: Removed MSGQ.\n");
    unlink(FIFO);         proc_log("IIS: Removed FIFO.\n");
    process_unlock();     proc_log("IIS: Removed LOCK.\n");
    unlink(PIDF_IIS);     proc_log("IIS: Removed PIDF_IIS.\n");
    exit(1);
}

/*
 *========================================================================
 *
 *   함 수 명 : iis_start()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void iis_start()
{
    int    pid;

    proc_log("iis daemon start          - OK\n");
    process_lock();
    if ((pid = my_daemon()) == -1) {
        perror("IIS");
        process_unlock();
        exit(1);
    }
    write_pid(pid);
    if ((mknod(FIFO, S_IFIFO|PERM_FIFO,0))<0) iisAbort("FIFO");

    proc_log("*** IIS START-UP PROCEDURE ***\n");

    if ((pid_init = srv_exec(INITD,"iis_initd")) == -1)
        iisAbort("INITD");

    proc_log("INIT daemon start          - OK\n");
    proc_log("shmid = %d",shmid);

    signal(SIGUSR1, SIG_usr1);
    signal(SIGTERM, SIG_term);
    signal(SIGPIPE, SIG_pipe);

    proc_log("IIS START (pid=%d)\n", pid);
    for (;;) pause();
}

/*
 *========================================================================
 *
 *   함 수 명 : iis_init()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void iis_init()
{
    int    pid;

    if ((pid = read_pid()) == -1)
    {
        fprintf(stderr, "??? IIS is not running.\n");
        exit(1);
    }

    if (kill(pid, SIGUSR1) != 0)
    {
        char    buf[10];
        sprintf(buf, "%d", pid);
        perror(buf);
        fprintf(stderr, "??? IIS cannot be reinitialized.\n");
        exit(1);
    }
}

/*
 *========================================================================
 *
 *   함 수 명 : iis_shutdown()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void iis_shutdown()
{
    int    pid;

    if ((pid = read_pid()) == -1)
    {
        fprintf(stderr, "??? IIS is not running.\n");
        exit(1);
    }

    fprintf(stderr, "*** IIS (pid=%d) shutdown start...\n", pid);
    if (kill(pid, SIGTERM) != 0)
    {
        char    buf[10];
        sprintf(buf, "%d", pid);
        perror(buf);
        fprintf(stderr, "??? IIS cannot shut down.\n");
        exit(1);
    }
    unlink(PIDF_IIS);
    shmctl(shmid,IPC_RMID,0);
}

/*
 *========================================================================
 *
 *   함 수 명 : SIG_usr1()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void SIG_usr1()
{
    proc_log("*** IIS RECONFIGURATION START ***\n");
    kill(pid_init, SIGUSR1);
    signal(SIGUSR1, SIG_usr1);
}

/*
 *========================================================================
 *
 *   함 수 명 : SIG_term()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void SIG_term(sig)
int    sig;
{
    int stat;
    char h,l;
    int child;

    proc_log("IIS :: Got SIGTERM...SHUTDOWN STARTED(%d).\n",sig);
    proc_log("IIS SHUTDOWN AFTER %d SEC...\n", SHUTDOWN_WAITING);

    signal(SIGCLD,SIG_IGN);
    signal(SIGTERM,SIG_IGN);

    kill(pid_init,SIGTERM);
    proc_log("wait init process(%d)\n",pid_init);
    child=wait(&stat);
    h=(stat>>8)&0x00ff;
    l=stat&0x00ff;
    if(h)
    {
       if(l==0177) proc_log("IIS: child %d STOP by signal %d\n", child,h);
       if(l==0) proc_log("IIS: child %d EXIT with status %d\n", child,h);
    } else proc_log("IIS: child %d DEAD by signal %d with %s\n", child,l&0x7f,(l&0x80?"CORE DUMP":"NO CORE"));

    proc_log("wait ok\n");
    sleep(SHUTDOWN_WAITING);

    unlink(FIFO);         proc_log("IIS: Removed FIFO.\n");
    remove_msg_que();     proc_log("IIS: Removed MSGQ.\n");
    process_unlock();     proc_log("IIS: Removed LOCK.\n");
    unlink(PIDF_IIS);     proc_log("IIS: Removed PIDF_IIS.\n");

    proc_log("IIS: SHUTDOWN COMPLETED.\n");
    sleep(1);
    exit(0);
}

/*
 *========================================================================
 *
 *   함 수 명 : SIG_pipe()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void SIG_pipe()
{
    proc_log("!!! PIPE BROKEN: %s\n", FIFO);
}

/*
 *========================================================================
 *
 *   함 수 명 : SIG_cld()
 *   작 성 자 : JBY
 *   작 성 일 : 2018.07.13
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

void SIG_cld()
{
    int stat;
    char h,l;
    int child;
    child=wait(&stat);
    h=(stat>>8)&0x00ff;
    l=stat&0x00ff;
    if(h)
    {
        if(l==0177) proc_log("IIS: child %d STOP by signal %d\n", child,h);
        if(l==0) proc_log("IIS: child %d EXIT with status %d\n", child,h);
    } else proc_log("IIS: child %d DEAD by signal %d with %s\n", child,l&0x7f,(l&0x80?"CORE DUMP":"NO CORE"));
    signal(SIGCLD,SIG_cld);
}

