static	char	sccsid[]="%Z% %M% %I% %E% %U%";
/******************************************************************************
*                                                                             *
*      処理目的　　：  他ホスト転送コマンド実行                               *
*                          ( V3003 )                                          *
*                                                                             *
*      関数名　　　：  int cl_process_leave ( pLeaf )                         *
*                                                                             *
*      戻り値　　　：  ERROR                                    　            *
*                      NORMAL                                                 *
*                                                                             *
*      処理概要　　：  パラメータチェック                                     *
*                      ホストＩＤ→ホスト名変換                               *
*                      ホスト名→ＩＰアドレス変換                             *
*                      ＬＥＡＶＥ 可/不可チェック                             *
*                      ＬＥＡＶ処理                                           *
*                                                                             *
*                                                                             *
******************************************************************************/
#include <colmn.h>

extern CLCOMMON CLcommon;
extern CLPRTBL	*pCLprocTable;
extern GlobalCt	GlobTable,*pGlobTable;		/* グローバル管理テーブル	*/
extern int giHOST_ID_SIZE;

int cl_proc_leave ( pLeaf, pProc )
	Leaf	*pLeaf;
	ProcCT	*pProc;
{
	int				rc,m;
	long			id_len;			/* パラメータ長		*/
	char			*id_ptr;		/* パラメータ実体	*/
	tdtInfoParm		rInfoParm,*pInfoParm;		/* パラメータ情報	*/
	char			HostName[9];	/* ホスト名			*/
	long			HostIp = 0L;	/* ＩＰアドレス		*/
	TrmToSrv		*pPacket;		/* 端末ーサーバ間I/F	*/
	AKAMSGCOM		*tpSendMsg,*tpRecvMsg;
	pCommPackHead   pHead;

	/* リンクチェック         */
	if (!pLeaf || !pProc) {
		ERROROUT(FORMAT(29));	/* リンクエラー !! */
		return( ECL_SYSTEM_ERROR );
	}

	/* コマンドＩＤチェック     */
	if (pLeaf->cmd.cid != C_LEAVE) {
		ERROROUT(FORMAT(346));	/* コマンドＩＤエラー !! */
		return( ECL_SYSTEM_ERROR );
	}

	/* パラメータ個数チェック	*/
	if ( pLeaf->cmd.prmnum != 1) {
		ERROROUT(FORMAT(347));	/* パラメータ個数エラー !! */
		return( ECL_SCRIPT_ERROR );
	}
	/* 入力パラメータ長、実体 */	
	id_len = pLeaf->cmd.prmp[0]->prmlen;
	id_ptr = pLeaf->cmd.prmp[0]->prp;

	/* 文書ホストＩＤの取得 */
	if (id_len != 0) {
		/* パラメータからホストＩＤの実体を取得 */
		if ((rc=cl_conv_arg(pLeaf->cmd.prmp[0],&rInfoParm)) != NORMAL) {
			if (rc != NAME_CONST) {
				/* パラメータからホストＩＤが取得できない !! */
				ERROROUT(FORMAT(348));
				return rc;
			}
		}
		else {
			if (rInfoParm.pi_attr != DEF_ZOK_CHAR) {
				ERROROUT(FORMAT(349));	/* ホストＩＤの属性が文字でない */
				return (ECL_SCRIPT_ERROR);
			}
			/* パラメータ(ホストＩＤ)長、実体 */	
			id_len = rInfoParm.pi_dlen;
			id_ptr = rInfoParm.pi_data;
		}
	}
	/* 文書ホストＩＤ→ＩＰアドレス変換 */
	if (id_len != 0L)
	{
		if (id_len != giHOST_ID_SIZE) {
			ERROROUT(FORMAT(350));	/* ホストＩＤの長さが誤っている */
		/*	if (rInfoParm.pi_scale & 0x80) Free(rInfoParm.pi_data);	*/
			return (ECL_SCRIPT_ERROR);
		}
			
		memcpy (HostName, id_ptr, id_len);
		HostName[id_len] = '\0';

		/* ホストＩＤをＩＰアドレスに変換 */
		rc = cl_process_get_ipaddr ( HostName, &HostIp );

		if ( rc != NORMAL )
		{
			/* ホストＩＤからＩＰアドレスが取得できない !! */
			ERROROUT(FORMAT(351));
		/*	if (rInfoParm.pi_scale & 0x80) Free(rInfoParm.pi_data);	*/
			return( ECL_SYSTEM_ERROR );
		}
	}
	else {		/* 文書ホストＩＤがＮＵＬＬ文字列 */
		HostIp = CLcommon.iOwnIPAddr ;
		HostName[0] = '\0';
	}
DEBUGOUTL3(190,"cl_process_leave: HostName=[%s] %08x iOwnIPAddr=%08x",
HostName,HostIp,CLcommon.iOwnIPAddr);
/*	if (rInfoParm.pi_scale & 0x80) Free(rInfoParm.pi_data);	*/

	/* エラーリターン値の初期化 */
	pGlobTable->exception = pGlobTable->error = NORMAL;

	/* 文書ホストのＩＰアドレスと実行ホストのＩＰアドレスの比較 */
	if ( HostIp == CLcommon.iOwnIPAddr )
		return ( NORMAL );

	/* １度、LEAVEされて来ているかどうかのチェック */
	tpRecvMsg = (AKAMSGCOM *)pCLprocTable->CmdPacketp;
	tpSendMsg = (AKAMSGCOM *)pCLprocTable->WrPacketp;
	pPacket = (TrmToSrv *)tpRecvMsg->msg_pmsg;
#if 1	/* 2021.8.2 */
	if (!pPacket) return NORMAL;
#endif
/*
printf("< cl_process_leave > LEAVE Com(Pre) : %08x\n",pPacket->commandid);
*/
	if ( pPacket->commandid & 0x10000000 )
	{
		pGlobTable->error = ECL_LV_LEAVE_ERROR;
		pGlobTable->exception = ETC_EXCEPTION;
		ERROROUT(FORMAT(352));	/* すでに、LEAVEされて来ている !! */
		return ( NORMAL );
	}
/*
printf("< cl_process_leave > Transaction '%s'\n",&GlobTable.Trnshid[0]);
*/
	/* トランザクション中かどうかチェック */
	if (pInfoParm = cl_get_public_var(D_NAM_TRNSHID)) m = pInfoParm->pi_dlen;
	else m = 0;
	if (m) {
		pGlobTable->error = ECL_LV_TRANS_ERROR;
		pGlobTable->exception = ETC_EXCEPTION;
		return ( NORMAL );
	}

	/** ＬＥＡＶＥ処理 **/
	/* コマンドパケット→書き出しパケット */
	memcpy(pCLprocTable->WrPacketp,pCLprocTable->CmdPacketp,sizeof(AKAMSGCOM));
	tpRecvMsg->msg_pmsg = NULL;
	tpSendMsg->msg_hoid = HostIp;
	tpSendMsg->msg_disp |= 0x0200;

#ifdef D_FOR_AKB	/* 2021.8.2 */
	/* フラグの設定 */
	cmn_set_stat( SCR_LV, &pCLprocTable->ScrSt, L_ON );
	cmn_set_stat( RTN_PR, &pCLprocTable->PrSt, L_ON );
	cmn_set_stat( RTN_PR, &pProc->ptype, L_ON );
#endif

	/* ＬＥＡＶＥした証拠にビットを立てる */
	pPacket = (TrmToSrv *)tpSendMsg->msg_pmsg;
	pPacket->commandid |= 0x10000000;
/*
printf("< cl_process_leave > LEAVE Com(Aft) : %08x\n",pPacket->commandid);
*/
	return NORMAL;
}
