2016-08-15 1 views
5

프로그램 호출을 처리하고 로깅, 보안 검사 등과 같은 교차 절단 작업을 수행하는 래퍼/브리지 COBOL 프로그램에서 작업하고 있습니다. 주된 동기는 검사입니다. 생산자 프로그램을 호출 할 수있는 액세스 권한이 있는지 여부에 관계없이 소비자 프로그램에 대한 보안 액세스.COBOL에서 다른 프로그램의 연결 섹션에 연결 섹션 데이터를 전달하는 방법

브리지 COBOL 프로그램을 B1로하고 프로듀서 프로그램 P1과 소비자 (클라이언트) C1로합시다.

C1이 P1을 호출하려면 B1을 호출해야합니다. 그런 다음 B1이 액세스 가능성을 확인합니다. C1에 액세스 할 수있는 경우 B1은 P1에 C1 데이터를 호출합니다.

C1 -> B1 -> P1 

여기서, B1 및 P1의 연결 부분은 동일하다. 프로그램은 EXEC CICS LINK를 사용하여 서로 호출합니다.

COMMAREA,

COMMAREA1 (DataSet Name) 

01 COMMAREA-STRUCT, 
    03 a-field 
    03 another-field  
    ... 

클라이언트

;

IDENTIFICATION DIVISION. 
PROGRAM-ID. Client. 
ENVIRONMENT DIVISION. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
COPY COMMAREA1 
PROCEDURE DIVISION 

/* fill CommareaStruct with some values. */ 
.... 
/* call B1 Bridge */ 
    EXEC CICS LINK PROGRAM (B1Bridge)  NOHANDLE 
    COMMAREA (COMMAREA-STRUCT) 
    LENGTH (LENGTH OF COMMAREA-STRUCT) 
    END-EXEC 
.... 

다리,

IDENTIFICATION DIVISION. 
PROGRAM-ID. B1Bridge. 
ENVIRONMENT DIVISION. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
LINKAGE SECTION. 
COPY COMMAREA1 
PROCEDURE DIVISION 
... 
/* access control */ 
/* logging */ 
... 
/* pass data to P1*/ 
    EXEC CICS LINK PROGRAM (P1)  NOHANDLE 
     COMMAREA (COMMAREA-STRUCT) 
     LENGTH (LENGTH OF COMMAREA-STRUCT) 
    END-EXEC 
.... 

생산자;

IDENTIFICATION DIVISION. 
PROGRAM-ID. P1 
ENVIRONMENT DIVISION. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
LINKAGE SECTION. 
COPY COMMAREA1 
PROCEDURE DIVISION 
.... 

*doing some business with data in COMMAREA1 
... 

위의 경우 브리지 프로그램 B1에 대해 컴파일 타임 경고가 표시됩니다. "COMMAREA-STRUCT 또는 그 하급자 중 하나가 참조되었지만 COMMAREA-STRUCT는 주소 지정 기능이없는 링크 섹션 항목이었습니다.이 참조는 실행시 성공적으로 해결되지 않습니다."

어떤 의미입니까? B1의 연결 부분을 P1의 연결 부분에 어떻게 전달해야합니까?

이렇게하면 EIBRESP : 22와 EIBRESP2 : 26 (commarea length error)가 실행됩니다.

- 편집 - 내가 더 자세한 정보를 제공해야한다고 생각

;

주요 동기 부여; 실제로 회사 COM1과 COM2라는 두 회사가 있습니다. COM2는 수년간 COM1의 계열사였습니다. COM1 및 COM2에는 각각 CICS1 및 CICS2가 있습니다. 그리고 COM2 클라이언트 프로그램은 COM1 프로듀서 프로그램을 사용합니다. COM2 클라이언트는 절대로 COM1 제작자를 직접 호출하지 않습니다. COM2 클라이언트는 COMMAREA-STRUCT에 데이터를 입력하고 Generic Cobol Program (GCP로 지정)을 원격으로 호출합니다. COMMAREA-STRUCT는 또한 GCP가 어떤 프로그램을 불러 내기를 원하는지를 나타내는 "생산자 프로그램 이름"필드를 가지고 있습니다. 따라서 GCP는 COMMAREA-STRUCT에서 데이터를 내보내고 생산자 필드에 매핑합니다. GCP는 주소 지정을 사용하여 동적으로 매핑 작업을 수행합니다 (각 제작자에게 특별하지는 않음). 생산자가 수행 한 후에 GCP는 결과를 취해 COMMAREA-STRUCT를 통해 클라이언트로 전달합니다. 이 시스템은 몇 년 전에 설계되었습니다. 수많은 COM2 고객과 수천 명의 COM1 프로듀서가 있습니다.

enter image description here

자, COM2 떨어져 COM1에서 싶어한다. 따라서 COM1은 더 이상 모든 COM1 리소스 (생산자)에 대한 완전한 액세스 권한을 부여하고 싶지 않습니다. 따라서 COM1은 B1 브릿지 프로그램 만 로컬로 실행하는 CICS 핸들러가 될 CICS1 앞에 새로운 cics를 추가하려고합니다.이것은 또한 네트워크 보안 및 회사 정치적 결정에 관한 것입니다.

enter image description here 잠시 동안 서로에게서 회사를 분리하려면 고객이나 제작자 모두 영향을받지 않아야합니다. 그래서 문제는 GCP-Bridge 계층에서 해결되어야합니다.

B1 Bridge는 COM2 클라이언트에 대해 GCP처럼 동작해야하며 액세스 가능성을 확인해야합니다 (어떤 방식 으로든 적용했습니다). 클라이언트에서 오는 모든 데이터를 수정하지 않고 GCP로 전달해야합니다.

현재 로깅 작업에는 우선 순위가 없습니다. 우리는 잠시 동안 일부 회사에 집중합니다.

귀하의 전문가 의견에 대해 매우 고맙게 생각합니다.

* B1은 다른 CICS에 있고 COM1의 LOADLIB1에 액세스 할 수 없기 때문에 B1이 EXEC CICS LINK에 의해 GCP를 원격으로 호출해야하는 이유 때문에 CALL을 사용할 수 없습니다.

* commarea를 전달하는 대신 채널을 전달하면 나에게 잘 들립니다. 그것에 대해 논의 할 것입니다.

* 필자는 LENGHT OF에서 전체 단어 - 하프 워드 충돌을 확인합니다. 당신 말이 맞아요.

* 보안 점검을 위해 "EXEC CICS QUERY SECURITY"에 대해 논의합니다.

* 위에서 언급 한 것처럼 우리는 사본을 수정할 수 없습니다. 만 우리는 IS 변경

EXEC CICS LINK PROGRAM (GCP) 

교체 &을 발견하여 클라이언트에

EXEC CICS LINK PROGRAM (B1) 

에 있습니다. 수천 명의 고객이 있기 때문입니다. 우리는 복사 본을 바꾸고 그 책에 손을 대고 싶지 않습니다.

이러한 세부 사항이 밝혀지면 문제가 더 쉽게 이해할 수 있다고 생각합니다.

+0

그래서 컴파일 결과 목록을보십시오. PROCEDURE DIVISION 헤더를보십시오. USING? @cschneid가 자세히 설명했듯이 01에서 주소 지정 기능을 사용할 수없는 이유입니다. 클라이언트 프로그램은 어떻게 "로그온"합니까? 왜 액세스 제어 및 로깅을 제공하지 않습니까? –

+0

로깅 및 보안은 흥미로울 수 있습니다. 보안을 위해'EXEC CICS QUERY SECURITY'를 권할 수 있습니다 (보안 전문가와 확인하십시오). 로깅 - 어디로? VSAM? DB2? 뭐라 구요? – cschneid

+0

전문가의 의견에 감사드립니다. 문제의 세부 사항과 답글로 구성된 질문을 편집했습니다. – Tunceren

답변

7

EXEC CICS LINK을 통해 호출되는 CICS COBOL 프로그램에서 링키 지 섹션은 DFHCOMMAREA이라는 01 레벨 구조를 포함해야합니다. 프리 D 파일러 또는 COBOL 컴파일러의 CICS 코 프로세서는 프로시 듀 n 부에 대해 을 적절히 생성하여 프로그램이 DFHCOMMAREA 구조에 대한 주소 지정 가능성을 갖습니다. 대상 프로그램으로 당신 LINKCOMMAREA-STRUCT를 호출 무엇

DFHCOMMAREA는의 내용이 포함됩니다.

자신을 찾은 상황을 처리하는 한 가지 방법은 01 레벨 구조 이름을 제거하고 모든 클라이언트가 COPY 문 바로 전에 01 수준 구조체 이름을 코딩하도록 카피 북을 수정하는 것입니다. 교량과 생산자 프로그램에서이 01 수준 구조체 이름은 DFHCOMMAREA입니다.

이 상황을 처리하는 다른 방법은 LINK을 피하고 동적 인 CALL을 사용하는 것입니다. CALL의 첫 번째 매개 변수로 DFHEIBLK을 포함해야합니다.

이 상황을 처리하는 또 다른 방법은 하나 이상의 CICS 컨테이너에 대한 commarea를 피하는 것입니다.채널 LINK에 commarea를 전달하는 대신 채널에 전달할 하나 이상의 컨테이너가 있으며, 전달하려는 데이터가 들어 있습니다.

주의해야 할 점은 commarea 길이에 LENGTH OF 특수 레지스터를 사용하고 있다는 것입니다. 특수 레지스터는 풀 워드이지만 commarea 길이 매개 변수는 하프 워드입니다. IBM이 특정 관용구를 가로 채고 특수 레지스터를 임시 하프 워드 (가능하지는 않지만 가능한)로 이동시키는 코드를 생성하지 않으면 이것이 슬픔의 원인이 될 것으로 생각됩니다.

업데이트 : 귀하의 추가 정보에서

당신의 작업이 기존 프로그램합니다 (GCP)을위한 '드롭 인 (drop-in) 교체 "를 작성하는 것입니다 분명하다.

실용적인 접근법은 새 카피 북을 만드는 것일 수 있습니다. COMAREA1은 COMAREA1이지만 01 레벨 구조 이름은 포함되어 있지 않습니다. B1 프로그램의 구조 이름 DFHCOMMAREA 01 바로 뒤에 COPY COMAREA2 문을 배치하십시오.

COMAREA1 카피 북에 대한 변경 사항이 COMAREA2에 반영되어야한다는 것을 어딘가에 명시해야하기 때문에 이는 이상적이지 않습니다. 이와 같은 수동 프로세스는 오류의 가능성을 소개하지만 C1 또는 P1 프로그램을 수정해야하는 번거 로움이 없습니다.

더 우아하고, 당신의 B1 프로그램에 ... ... 그것을 시도하는 것입니다, 당신을 위해 작동

COPY COMAREA1 REPLACING == 01 COMMAREA-STRUCT== BY ==*01 COMMAREA-STRUCT==. 

를 제공했다. 이것은 위에 제안 된 COMAREA2 카피 북의 필요성을 제거 할 것이다. 이 방법을 사용하면 구조 레벨 이름 DFHCOMMAREA 01 뒤에 COPY 문을 입력하기 만하면됩니다.

+2

사전/보조 프로세서는 "길이"를 올바르게 처리합니다. 또한 LENGTH가 지정되지 않으면 기본 길이는 ... COMMAREA 필드의 길이입니다. LENGTH에 지정된 항목은 직접 사용되지 않지만 반 단어로 적절하게 마사지됩니다. –

+0

@BillWoodger 나는 이것에 어려움을 겪고 있다는 희미한 기억을 가지고있다. 그래서 나는 그것을 언급했다. 분명히 그것은 오래 전이거나 내 기억이 희미합니다. – cschneid

+0

데이터 항목을 사용하여 길이를 포함 할 때 COMP (또는 COMP-4 또는 BINARY)로 설정 한 다음 설정시 왜 잘리지 않는지 궁금하지만 (COMP-5 일 필요가 있지만) 문제는 전달되는 것과 함께 필드를 설정하는 것입니다. –

관련 문제