/*
 *========================================================================
 *
 *   시스템명 : 요금징수 시스템
 *   파 일 명 : wrk_data_comm_lb.pc
 *   작 성 자 : 조보용
 *   작 성 일 : 2012.10.08
 *   수 정 일 :
 *   설    명 :
 *
 *========================================================================
*/

/*
 *========================================================================
 * wait_reply()     : 응답 대기
 * lo_lane_re_snd_rq()   : 하위차로에 재송요구/보증지시 송신
 * bind2socket() : Socket and bind (AF_UNIX,PACKET)
 *========================================================================
*/

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <sys/un.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <stdarg.h>

#include "ora_sql.h"
/*
exec sql include "tcs_db_def.h";
*/
#include "tcs_db_def.h"
#include "wrk_data_def.h"

/*
 *========================================================================
 * 전역 변수 정의
 *========================================================================
*/

//EXEC SQL INCLUDE SQLCA;


/*
 *========================================================================
 *
 *   Function : wrklog_open()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.07
 *   Modified :
 *   Remark   : wrk_svr log 시작
 *
 *========================================================================
*/
FILE *debug;

void wrklog_open(char *date)
{
    char    debug_f[128];
    char    debug_d[128];

    if(debug) fclose(debug);

    sprintf(debug_d, "%s/%.8s", LOG_DIR, date);
    mkdir(debug_d, 0755);

    sprintf(debug_f, "%s/wrk_svr.log", debug_d);
    debug = fopen(debug_f, "a+t");
}

/*
 *========================================================================
 *
 *   Function : wrklog_close()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.07
 *   Modified :
 *   Remark   : wrk_svr log 닫기
 *
 *========================================================================
*/
void wrklog_close()
{
    fclose(debug);
}

/*
 *========================================================================
 *
 *   Function : wrksvr_log()
 *   Progrmer : JBY (baarong@neighbor21.co.kr)
 *   Date     : 2018.08.07
 *   Modified :
 *   Remark   : wrk_svr log 처리
 *
 *========================================================================
*/
int wrksvr_log( char *form, ... )
{
    va_list    ap;
    char sDate[15];

    if( debug == NULL ) return -1;

    lb_get_nowdate_tm(sDate);
    fprintf(debug, "%s ", sDate+8);

    va_start( ap, form );
    vfprintf( debug, form, ap );
    va_end( ap );

    fflush( debug );
    return 0;
}

/*
 *========================================================================
 *
 *   함 수 명 : wait_reply
 *   작 성 자 : 조보용
 *   작 성 일 : 2012.10.08
 *   수 정 일 :
 *   설    명 : 응답 대기
 *
 *========================================================================
*/

int wait_reply(int fd, int time_out)
{
    struct    timeval    t_val;
#if 0
    // I'm told we shouldn't use "struct fd_set" due to standards concerns..
    // fd_set은 struct로 재정의를 일반적으로 재정의를 하지 않음
    struct fd_set    f_set;
#else
    fd_set    f_set;
#endif
    int    irv;

    t_val.tv_sec  = time_out;
    t_val.tv_usec = 0;        /* microtime 무시        */

    FD_ZERO(&f_set);
    FD_SET(fd, &f_set);

    if (time_out < 0)
    {
        irv = select(fd+1, &f_set, NULL, NULL, NULL);
    }
    else
    {
        errno = 0;
        irv = select(fd+1, &f_set, NULL, NULL, &t_val);
    }
    return (irv);
}

/*
 *========================================================================
 *
 *   함 수 명 : lo_lane_re_snd_rq
 *   작 성 자 : 조보용
 *   작 성 일 : 2012.10.08
 *   수 정 일 :
 *   설    명 : 하위차로에 재송요구/보증지시 송신
 *
 *========================================================================
*/

int lo_lane_re_snd_rq(struct write_info *wf, int re_snd_rq)
{
    struct    lo_lane_ctrl_cmd    lc_cmd;
    struct    lo_lane_ctrl_reply  lc_reply;
//    char      cBuff[128];
    char      logm[128];

    memset((char *) &lc_cmd, 0, sizeof(lc_cmd));
    memset((char *) &lc_reply, 0, sizeof(lc_reply));

    /* 재송요구 && 자료처리 FILE ERR '13' */
    if (re_snd_rq < 0 && wf->return_code == HNDSTAT(J_DATA,S_FILE_ERR))
    {            /* 재송요구    */
        lc_cmd.cmd = LW_TBL_DMP;
        lc_cmd.arg[0] = wf->strt_snd_no;
        lc_cmd.arg[1] = wf->end_snd_no;
    }
    else           /* 보증전송    */
    {
        lc_cmd.cmd = LW_WARR_SND_NO;
        lc_cmd.arg[0] = wf->end_snd_no;
        lc_cmd.arg[1] = wf->end_snd_no;
    }

    e_memcpy(lc_cmd.wrk_year, wf->year);
    e_memcpy(lc_cmd.wrk_mon , wf->mon );
    e_memcpy(lc_cmd.wrk_day , wf->day );
    e_memcpy(lc_cmd.wrk_no, wf->wrk_no);

    if(lc_cmd.cmd == LW_WARR_SND_NO)
    {
        switch(wf->knd)
        {
        case NS_WRK_END:  /* 근무종료 */
            lb_low_proc(wf, &lc_cmd, &lc_reply);
            sprintf(logm, "- 차로전송연번 wrk_no[%.4s] JSYB[%x]", wf->wrk_no, wf->end_snd_no);
            lb_err_log("tcskmp", logm, 0x03);
            wrksvr_log( " --[종별-%02x]개시연번 [%x], 종료연번 [%x]\n", wf->knd, wf->strt_snd_no, wf->end_snd_no);
            break;
        default :
            break;
        }
    }

    if(lc_cmd.cmd == LW_TBL_DMP)
    {
        switch(wf->knd)
        {
            case NS_WRK_END:  /* 근무종료(출구) */
                lb_low_proc(wf, &lc_cmd, &lc_reply);
                sprintf(logm, "- 차로전송연번 wrk_no[%.4s] SND_NO[%x]", wf->wrk_no, wf->end_snd_no);
                lb_err_log("tcskmp", logm, 0x03);
                wrksvr_log( " --[종별-%02x]개시연번 [%x], 종료연번 [%x]\n", wf->knd, wf->strt_snd_no, wf->end_snd_no);
                break;
        default :
            break;
        }
    }

    if(wf->knd == NS_RQ_SEQ_NO)
    {
        lc_cmd.cmd = LW_RQ_SEQ_NO;
        lb_low_proc(wf, &lc_cmd, &lc_reply);
    }

    return(lc_reply.rsp);
}

/*
 *========================================================================
 *
 *   함 수 명 : bind2socket
 *   작 성 자 : 조보용
 *   작 성 일 : 2012.10.08
 *   수 정 일 :
 *   설    명 : Socket and bind (AF_UNIX,PACKET)
 *
 *========================================================================
*/

int bind2socket(char *proc_name)
{
    int    sfd;
    struct    sockaddr_un    svr_add;

    sfd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (sfd < 0)
        return(-1);

    bzero((char *) &svr_add, sizeof(svr_add));
    svr_add.sun_family = AF_UNIX;
    sprintf(svr_add.sun_path, "%s/%s/%s", DIR_TCS, DIR_SPOOL, proc_name);
    remove(svr_add.sun_path);

    if (bind(sfd, (struct sockaddr *)&svr_add, sizeof(svr_add)) < 0)
    {
        close(sfd);
        return(-1);
    }
    return(sfd);
}
