我正在开发一个包装程序/桥COBOL程序,它处理程序调用并执行交叉操作,如日志记录、安全检查等。主要的动机是检查消费者程序的安全访问权限,不管它是否有权调用生产者程序。
让桥COBOL程序是B1,生产者程序P1和消费者(客户端) C1。
当C1想要调用P1时,它必须给B1打个电话。然后,B1检查可访问性。如果C1具有访问权限,那么B1使用C1的数据调用P1。
C1 -> B1 -> P1 在这里,B1和P1的连接部分是相同的。程序正在使用EXEC CICS链接相互调用。
委员会,
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或它的一个下属被引用了,但是COMMAREA是一个链接部分项,没有可寻址性。这个引用在执行时不会被成功地解析。”
什么意思?如何将B1的连接部分传递给P1的链接部分?
当我尝试这样做时,我在运行时得到了EIBRESP:22和EIBRESP2: 26 (逗区长度错误)。
-编辑--
我想我应该给出更多的细节;
主要动机;实际上有两家公司是COM1和COM2公司。COM2几年来一直是COM1的附属公司。COM1和COM2分别具有CICS1和CICS2。COM2客户端程序使用COM1生产者程序。COM2客户端从不直接调用COM1生产者。COM2客户端将数据放入COMMAREA,并远程调用通用Cobol程序(让它成为GCP)。COMMAREA-STRUCT也有“生产者程序名称”字段,GCP指出要调用哪个程序。因此,GCP将来自COMMAREA的数据和地图输出到生产者的领域.GCP通过寻址动态地执行映射操作(对于每个生产者来说并不特殊)。生产者执行后,GCP获取结果并通过COMMAREA-STRUCT返回给客户端。这个系统几年前就这样设计了。COM2有成千上万的客户和成千上万的COM1生产商。

现在,COM2想要脱离COM1。因此,COM1不希望再完全访问所有COM1资源(生产者)。因此,COM1希望在CICS1前面放置一个新的cics,它将是一个只在本地运行B1桥程序的处理程序CICS。这也与网络安全和公司政治决策有关。

要在一段时间内将公司分开,既不应影响客户,也不应影响生产商。因此,在GCP-桥层中需要解决的问题.
这就是为什么B1桥应该像GCP一样运行到COM2客户端,应该检查可访问性(不知怎么地,我们应用了它),并且应该将来自客户端的所有数据传递给GCP,而不进行任何修改。
当前,日志记录操作没有任何优先级。我们很快就会把注意力集中在公司的一部分上。
所以我非常感谢你的专家意见。
*我们不能使用CALL,因为B1将在另一个CICS上,并且不能访问LOADLIB1 of COM1,这就是为什么B1应该通过EXEC链接远程调用GCP。
*通过通道而不是经过公共区域,这对我来说听起来不错。我们会讨论这件事。
*顺便说一句,我会检查整字-半字的冲突。你是正确的。
*为了进行安全检查,我们将讨论"EXEC CICS查询安全性“。
*如上文所述,我们不能修改复制本。只有我们才能改变,
EXEC CICS LINK PROGRAM (GCP) 至
EXEC CICS LINK PROGRAM (B1) 对客户进行查找和替换。因为有成千上万的客户。我们不想换一本书去碰他们。
鉴于这些细节,我认为问题变得更容易理解。
发布于 2016-08-15 14:57:30
在通过EXEC CICS LINK调用的COBOL程序中,链接节必须包含具有名称DFHCOMMAREA的01级别结构。预编译器或COBOL编译器的CICS协处理器将为过程分区生成适当的USING,因此程序具有对DFHCOMMAREA结构的可寻址性。
DFHCOMMAREA将包含在对目标程序进行LINK时所调用的COMMAREA-STRUCT的内容。
处理发现自己的情况的一种方法是修改文案以删除01级别的结构名称,并要求所有客户端在COPY语句之前对自己的01层结构名称进行编码。在桥和生产者程序中,这个01层的结构名将是DFHCOMMAREA。
处理这种情况的另一种方法是避免使用LINK,而改用动态CALL。您必须将DFHEIBLK作为CALL的第一个参数。
处理这种情况的另一种方法是避免使用一个或多个CICS容器的公共区域。与其传递LINK上的逗号区域,不如传递一个通道,该通道将有一个或多个容器挂起,其中包含希望传递的数据。
需要注意的是,您正在使用LENGTH OF特殊寄存器来表示您的逗号区域长度。特殊寄存器是一个完整字,但逗号长度参数是一个半字。我怀疑这会给您带来痛苦,除非IBM生成代码来拦截特定的成语,并将特殊寄存器移动到一个临时的半字(不太可能,但可能)。
更新:
从您的附加信息中可以看出,您的任务是为现有的程序( GCP)编写一个“插入替换”。
一种实用的方法可能是创建一个新的文案,我们称之为COMAREA2,它是COMAREA1的副本,但没有嵌入的01层结构名称。将COPY COMAREA2语句紧接在DFHCOMMAREA 01结构名称之后放置在B1程序中。
这并不理想,因为某些地方的文档必须清楚地表明,对COMAREA1抄写簿的更改必须反映在COMAREA2中。当然,像这样的手动处理会引入错误的可能性,但它确实让您不必修改任何C1或P1程序。
如果它对你有效的话,更优雅的做法是试着.
COPY COMAREA1 REPLACING == 01 COMMAREA-STRUCT== BY ==*01 COMMAREA-STRUCT==....in您的B1程序。这将消除对上面提议的COMAREA2文案的需求。如果这样做有效,您只需将COPY语句放在DFHCOMMAREA 01结构级别名称之后。
https://stackoverflow.com/questions/38956306
复制相似问题