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

时间:2015-07-08 07:49:20

标签: ibm-midrange

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

         grtobjaut  obj(&libobj) objtype(*all) user(&user1) +
                         aut(&auth1)

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

&libobj

但是,只有grtobjaut obj('MYLIB/TEST')的前10个字符实际传递给GRTOBJAUT。我已在调试器中验证,尽管&libobj包含完整字符串,但传递例如MYLIB / TEST1234会导致{{1}}。根据{{​​3}},这应该是GRTOBJAUT命令的正确语法,因此允许超过10个字符的长路径。实际情况并非如此吗?交互式GRTOBJAUT和CL GRTOBJAUT之间有区别吗?我如何使这项工作?

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

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

1 个答案:

答案 0 :(得分: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)

库和对象名称作为单独的10个字符名称传递。那么GRTOBJAUT命令就是这样的:

 grtobjaut  obj(&lib/&obj) objtype(*all) user(&user1) +
                 aut(&auth1)

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

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

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

还有其他选择,但在尝试尝试基本上是“诡计”的事情之前,你应该先学习这个要求。