/* @tier easy @module mg @transform msg-gateway-online */ /* * mg_ol_0029.pgc - 전문게이트웨이 전문 트레일러 생성 서비스 (MG_OL_0029) [tier=easy] * * 전문 본문(RAWMSG) 전체 바이트에 대해 XOR LRC(종방향 중복검사) 체크섬을 * 계산하여 전송 트레일러 필드를 생성한다. LRC 를 2자리 hex 트레일러로 * 구성해 응답한다. (순수 계산 로직 - DB 접근 없음) */ #include #include #include "txcore.h" #include "acq_util.h" #include "mg_core.h" EXEC SQL INCLUDE sqlca; /* 바이트열 XOR LRC 계산 (초기값 0) */ static unsigned char lrc_xor(const char *buf, int len) { unsigned char lrc = 0; int i; for (i = 0; i < len; i++) lrc ^= (unsigned char)buf[i]; return lrc; } TX_SERVICE(MG_OL_0029, ctx) { char raw[512]; char trailer[3]; static const char HX[] = "0123456789ABCDEF"; unsigned char lrc; int rawlen; tx_log(TX_LOG_INFO, "[MG_OL_0029] 전문 트레일러 생성 서비스 진입"); /* 1) 트레일러 대상 본문 수신 */ rawlen = tx_buf_get(ctx->in, "RAWMSG", raw, sizeof(raw)); if (rawlen <= 0) { tx_log(TX_LOG_ERROR, "[MG_OL_0029] 원시전문(RAWMSG) 누락"); tx_return(ctx, TX_EINVAL, ctx->out); return; } rawlen = (int)strlen(raw); /* 2) XOR LRC 체크섬 계산 */ lrc = lrc_xor(raw, rawlen); /* 3) 2자리 hex 트레일러 구성 */ trailer[0] = HX[(lrc >> 4) & 0x0f]; trailer[1] = HX[lrc & 0x0f]; trailer[2] = '\0'; /* 4) 체크섬/트레일러 응답 */ tx_buf_reset(ctx->out); tx_buf_sets(ctx->out, "RESP", RESP_OK); tx_buf_setlong(ctx->out, "BODYLEN", (long)rawlen); tx_buf_setlong(ctx->out, "LRC", (long)lrc); tx_buf_sets(ctx->out, "TRAILER", trailer); tx_log(TX_LOG_INFO, "[MG_OL_0029] 트레일러 생성완료 len=%d lrc=%02X", rawlen, lrc); tx_return(ctx, TX_OK, ctx->out); }