Fix stdin inheritance for system and backticks on VMS.
authorCraig A. Berry <craigberry@mac.com>
Sat, 30 Nov 2013 14:47:09 +0000 (08:47 -0600)
committerCraig A. Berry <craigberry@mac.com>
Sat, 30 Nov 2013 14:59:14 +0000 (08:59 -0600)
The documentation to LIB$SPAWN says that standard input will be
inherited from the parent if not specified, and we've been
depending on that.  But it seems not to actually work that way
as a simple

    $ perl -e "system('edit foo.tmp');"

was failing due to the input not being a terminal.  So set up the
input explicitly using the same mechanism we've always used for
output and error.

Except when SYS$INPUT is a "directory," which probably means it's
a channel open on a volume that holds a command procedure.

vms/vms.c

index a3324c7..cb20e3b 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -4336,6 +4336,12 @@ safe_popen(pTHX_ const char *cmd, const char *in_mode, int *psts)
         
 
     } else if (*mode == 'n') {       /* separate subprocess, no Perl i/o */
+        /* Let the child inherit standard input, unless it's a directory. */
+        Stat_t st;
+        (void)my_trnlnm("SYS$INPUT", in, 0);
+        if (!flex_stat(in, &st) && S_ISDIR(st.st_mode))
+            *in = '\0';
+
         info->out = pipe_mbxtofd_setup(aTHX_ fileno(stdout), out);
         if (info->out) {
             info->out->pipe_done = &info->out_done;