Stefan,

> 
> > I think it should all be solvable inside Execute.  You could
> > restrict users to only execute .EXE and .COM files on VMS.  Another
> > solution is to write the command to a temporary .COM and then
> > execute that.  But I have to do some more testing here.
> 
> In either case, we should add some platform specific notes into the
> Ant manual.
> 

Certainly, yes.

> > The Runtime.exec() with working directory *does* work in more recent
> > versions of the JVM (1.3.1-6 and up) given that a special symbol has
> > been defined.
> 
> Do you think we have a chance to tell a VM that works from one that
> doesn't within Execute?  I mean, we always could use reflection to
> detect the three arg version of exec, but maybe there is an easier
> way.
> 

Well, the three arg version (with a specified working directory) is always
present, but it only works if the logical JAVA$FORK_SUPPORT_CHDIR is defined
in the job table, i.e. if prior to launching Java the following has been
done:

        $ define/job JAVA$FORK_SUPPORT_CHDIR TRUE

So it's not only a matter of the VM, unfortunately.  But the other
Runtime.exec() methods (without working directory) should all work.  If the
logical isn't defined, Runtime.exec() will return with an IOException with a
message like "function not implemented".

I assume it will be necessary to implement a VMS specific CommandLauncher
for launching through the shell.  I'll have to check how to do that.  Its
implementation could for instance write a temporary DCL script (.COM file)
and execute the command through that.

It would also be interesting whether it's possible to get a list of all
defined logicals (for <property environment="env"/>).  This would probably
again require writing and executing a temporary .COM file.

Also, I currently don't know what the VM does with environment variables
passed to Runtime.exec().  I'll try to find out.

> Expect Os.isFamily("openvms") to work in a few minutes 8-).
> 

Great!

> >> >  - The Ant <exec> task throws a BuildException if the exit code
> >> >  is unequal zero.
> > 
> > Do you know how to get around that?  Should the Execute class, in
> > the case of VMS, map the exit status to what's common on Unix
> > systems?
> 
> Maybe we should provide a Execute.isFailure(int result) method that 
> returns result != 0 on all platforms except OpenVMS (and 
> result % 2 != 0 on OpenVMS).
> 
> > Or would ExecTask need some modifications?
> 
> To accompany that, yes.  I'd prefer to keep the platform specific code
> isolated in Execute.
> 

That sounds like a very clean approach.  There seem to be some other tasks
which check the return value of Execute#execute() against zero though,
including <cvs>, <cvstagdiff>, <cvschangelog>, and <javadoc>.  Would this
change be a backward compatibility issue?

Once I have gathered all the information I'll try to write a patch for
Execute to get <exec> and friends to work on VMS.

--
knut

Reply via email to