Re: regression test filesystem assumptions

2013-08-08 Thread John E. Malmberg

On 8/8/2013 2:31 AM, Nicholas Clark wrote:


I think these changes are sane. Once upon a time, the CRTL did not
support /dev/null as an alias for the native _NLA0:.


I would have to build up a VMS 5.5-2 system on a SimH emulator to be 
sure of the behavior back at the beginning of the current CRTL image.


There have been some features of the CRTL that have apparently been 
there since then, but only got documented recently.


The /dev/null being used for NLA0: is one of them.

Another is that /tmp is mapped to SYS$SCRATCH: if the logical name TMP: 
does not exist.


Regards,
-John



Re: test.pl runperl() exit oddity

2013-08-08 Thread Nicholas Clark
On Wed, Aug 07, 2013 at 12:50:55PM -0500, Craig A. Berry wrote:

> > $ sh -c 'pstree -p $$ | cat'
> > sh(13261)-+-cat(13263)
> >   `-pstree(13262)
> > $ ksh -c 'pstree -p $$ | cat'
> > cat(13349)---pstree(13350)

> The root cause of the problem on VMS is that command-line redirection
> is done by Perl and not by the shell.  Tony's addition of the stdin
> parameter to runperl gives us the equivalent of:
> 
> $ perl -e "exit 2;" | perl -e "exit 0;"
> %NONAME-E-NOMSG, Message number 0002
> $ show symbol $status
>   $STATUS == "%X0002"
> 
> The Perl process with an exit value of 0 is a child of the one that
> has an exit value of 2 so the final status we see in runperl is the
> exit value of the parent, not of the child.  But the child is actually
> the test program whose exit value we're interested in and we don't get
> it this way.
> 
> I *think* on *nix both perl invocations are subprocesses of the shell,
> or in any case $? is 0 when all is said and done, i.e., the exit
> status from the second Perl invocation.

Well, it turns out to differ between /bin/sh and /bin/ksh (which was the
cause of the AIX bug), but whether it's (ksh) child | parent
or (sh) child | child, either way the exit status of the pipeline is that
of the *last* command.

(This has turned out to be dangerous in the *nix Makefile. There were one
or two rules which were

some_command ... | sort >output

and if some_command failed, it wasn't noticed, because make picked up the
exit status of the sort, which was 0. I refactored things to avoid the need
for pipelines.)

This sort of means that the VMS pipeline setup is the wrong way round.
At least, it's the wrong way round if it wanted to be consistent with Unix.
Even if it's possible to change, I doubt that it would be a good idea.

> I have a working patch that fixes it by doing a piped open and writing
> to the pipe that provides the stdin of the child, then capturing the
> child's exit and passing it along.  It's ugly and makes the VMS code
> in t/test.pl even more different than it already is.  I've been
> sitting on it for a bit hoping to think of something better, but it
> looks like you've now done that. If /dev/null has portability problems
> on Win32, simply lifting the platform-specific code from
> File::Spec::dev_null should provide the solution in a very small
> amount of additional code.

Well, I sort of worked round it by not using a pipeline. But it achieves
the end goal.

Nicholas Clark


Re: regression test filesystem assumptions

2013-08-08 Thread Nicholas Clark
On Wed, Aug 07, 2013 at 10:03:17PM -0500, Craig A. Berry wrote:
> 
> On Aug 7, 2013, at 12:23 PM, Nicholas Clark  wrote:
> 
> > I have this commit pushed to a smoke-me branch. It doesn't cause any test
> > failures on the HP VMS testdrive system. Am I making bad assumptions?
> > 
> > Specifically, is it filesystem dependant whether this code as-is will pass?
> > 
> >open(H,'run/fresh_perl.t'); # must be in the 't' directory
> >stat(H);
> >print "ok\n" if (-e _ and -f _ and -r _);
> > 
> 
> I can't think of any reason that would be different on different filesystems.

OK, good. I wasn't totally sure, and wanted to avoid making a mistake that
caused someone else more work.

> > I infer that it must have failed 12 years ago, because the last line was
> > "corrected" to
> > 
> >print "ok\n" if (-e _ and -f _);
> > 
> > 
> > But what changed to cause it to work now?
> > 
> 
> There have been various fixes to stat as well as to Perl_cando_by_name in 
> vms/vms.c.  None I've managed to stumble on in the archives pops out as 
> obviously "the one," and it would be arduous to do a manual bisect without 
> git.

OK. I was curious if it was obvious to someone else, and it's not.

> > commit 219b23a016e4d19b9fc29d2cb6aad7c8f485e7bc
> > Author: Nicholas Clark 
> > Date:   Wed Aug 7 11:57:09 2013 +0200

> > open TEST, ">$tmpfile" or die "Cannot open $tmpfile: $!";
> > -
> > -# VMS adjustments
> > -if( $is_vms ) {
> > -$prog =~ s#/dev/null#NL:#;
> > -
> > -# VMS file locking
> > -$prog =~ s{if \(-e _ and -f _ and -r _\)}
> > -  {if (-e _ and -f _)}
> > -}
> > -
> > print TEST $prog;
> > close TEST or die "Cannot close $tmpfile: $!";
> > 
> 
> I think these changes are sane.  Once upon a time, the CRTL did not support 
> /dev/null as an alias for the native _NLA0:.  I forget when /dev/null became 
> supported; possibly v7.0, which was about 1995 or so.  I remember Chuck Lane, 
> who wrote the misc.t patch, saying at some point that he was running v6.2, 
> which was already somewhat old at the time.  I explicitly removed support for 
> pre-7.0 VMS systems in Perl 5.16.x, so the /dev/null workaround seems safe to 
> remove.
> 
> I think I disagree about whether these belonged in the test runner; that 
> actually was the general place to solve a general problem, even if there 
> weren't other extant tests that exercised the problem.  But those problems 
> don't seem to be there now, so thanks for cleaning up after us.

Yes, to be fair I'm in two minds about the /dev/null one, as it might show
up in other places. But it was bugging me that it's only VMS - surely other
platforms need similar fixes? But as George Greer observed, Win32 has a
special case:

DllExport FILE *
win32_freopen(const char *path, const char *mode, FILE *stream)
{
dTHXa(NULL);
if (stricmp(path, "/dev/null")==0)
path = "NUL";

aTHXa(PERL_GET_THX);
return freopen(PerlDir_mapA(path), mode, stream);
}


(and similar code in 2 other places)

But I think that the pattern match for qr/if \(-e _ and -f _ and -r _\)/ was
so specific that it was only ever going to match one test.

Nicholas Clark