从CL程序调用GRTOBJAUT时,参数OBJ被切断

Lun*_*dis 2 ibm-midrange

我已经制作了一个CL程序来简化更改所有者,USRPRF和对象的权限.它利用GRTOBJAUT等进行更改.这是参数定义:

         pgm        parm(&libobj &type &owner &usrprfown &user1 &auth1 +
                      &user2 &auth2 &user3 &auth3)
         ...
         dcl        var(&libobj) type(*char) len(21)
         dcl        var(&type) type(*char) len(10)
         dcl        var(&user1) type(*char) len(10)
         dcl        var(&auth1) type(*char) len(10)
         ...
Run Code Online (Sandbox Code Playgroud)

这就是我称之为GRTOBJAUT的方式:

         grtobjaut  obj(&libobj) objtype(*all) user(&user1) +
                         aut(&auth1)
Run Code Online (Sandbox Code Playgroud)

但是,只有前10个字符&libobj实际传递给GRTOBJAUT.我已经在调试器中验证了grtobjaut obj('MYLIB/TEST')尽管&libobj包含完整的字符串,但传递MYLIB/TEST1234的结果仍然存在.根据文档,这应该是GRTOBJAUT命令的正确语法,因此允许超过10个字符的长路径.实际情况并非如此吗?交互式GRTOBJAUT和CL GRTOBJAUT之间有区别吗?我该如何工作?

该程序是为v6.1编译的,并在支持v7.1的环境中运行.

编辑:同样的问题适用于CHGOBJOWN.

use*_*816 7

您不能在单个参数中同时传递库和对象名称.GRTOBJAUT OBJ()参数有两部分,而不仅仅是一部分.您只定义一个部分,并声明它长度为21个字符.但事实并非如此.它是两部分,每个部分长十个字符.

通常,您应该以这种方式更改CL:

 pgm        parm(&lib &obj &type &owner &usrprfown &user1 &auth1 +
              &user2 &auth2 &user3 &auth3)
 ...
 dcl        var(&lib) type(*char) len(10)
 dcl        var(&obj) type(*char) len(10)
Run Code Online (Sandbox Code Playgroud)

库和对象名称作为单独的10个字符名称传递.然后GRTOBJAUT命令将是这样的:

 grtobjaut  obj(&lib/&obj) objtype(*all) user(&user1) +
                 aut(&auth1)
Run Code Online (Sandbox Code Playgroud)

请注意,OBJ()参数分别指定这两个部分.

如果您愿意,可以将21个字符的CL parm留在原位.但是,如果这样做,则必须向CL添加代码以解析该parm值并在将它们传递到GRTOBJAUT之前提取库和对象名称.将它们分别传递给CL更简单.

一旦你将它们分开,你需要确保当GRTOBJAUT收到它时,&lib不是空白的.如果它作为空白值进入您的CL,您将需要分配一个特殊值,例如'*LIBL','*CURLIB'或任何适当的值,以便GRTOBJAUT可以处理它.

有其他选择,但在尝试尝试基本上是"技巧"的东西之前,你应该先学习这个要求.