Change 30164 by [EMAIL PROTECTED] on 2007/02/07 21:38:12

        Integrate:
        [ 28339]
        Make VMS-specific device name encoding routine say no more politely.
        
        [ 28806]
        declaration after code nit in vms/vms.c (from Martin Vorlaender)
        
        [ 28843]
        Define d_cplusplus on VMS when appropriate
        
        [ 28977]
        fix a doc typo and a warning typo in VMS::DCLsym
        
        [ 29144]
        When we open a file and pass it along to PerlIO, be sure to enter the
        PerlIO world via Unix I/O.  If you start from stdio, a Unix I/O counter
        will get decremented on close even though it was never incremented (and 
        may not even exist).  Exposed by #29065.
        
        [ 29205]
        In pipe_exit_routine in vms/vms.c, mark a subprocess we've deleted
        as done.  Courtesy of Scott Lepage.
        
        [ 29326]
        Subject: [EMAIL PROTECTED] perl5db.pl detecting forked debugger on VMS.
        From: "John E. Malmberg" <[EMAIL PROTECTED]>
        Date: Sat, 18 Nov 2006 23:07:17 -0500
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 29380]
        xterm debugger support for VMS from John Malmberg (with revisions)
        
        [ 29572]
        Don't try to build Win32 on VMS
        
        [ 29573]
        In vms/vms.c, don't prototype decw$term_port until after 
        config.h (via perl.h) is included.  That's where USE_VMS_DECTERM
        is defined.
        
        [ 30041]
        Subject: [EMAIL PROTECTED] blead on OpenVMS doesn't build
        From: Abe Timmerman <[EMAIL PROTECTED]>
        Date: Sat, 27 Jan 2007 17:26:47 +0100
        Message-Id: <[EMAIL PROTECTED]>
        
        Disable DECterm support by default, and when we enable it, 
        make sure the image we need is installed, not merely present.
        
        [ 30108]
        Install parser.h on VMS, plus fix some case typos in 
descrip_mms.template.
        
        [ 30111]
        Install overload.h on VMS, plus more case fix-ups in 
descrip_mms.template.

Affected files ...

... //depot/maint-5.8/perl/configure.com#51 integrate
... //depot/maint-5.8/perl/lib/perl5db.pl#27 integrate
... //depot/maint-5.8/perl/vms/descrip_mms.template#46 integrate
... //depot/maint-5.8/perl/vms/ext/DCLsym/DCLsym.pm#2 integrate
... //depot/maint-5.8/perl/vms/ext/Stdio/Stdio.xs#3 integrate
... //depot/maint-5.8/perl/vms/vms.c#26 integrate

Differences ...

==== //depot/maint-5.8/perl/configure.com#51 (text) ====
Index: perl/configure.com
--- perl/configure.com#50~30163~        2007-02-07 12:48:27.000000000 -0800
+++ perl/configure.com  2007-02-07 13:38:12.000000000 -0800
@@ -50,6 +50,7 @@
 $ use64bitall = "n"
 $ use64bitint = "n"
 $ uselargefiles = "n"
+$ usedecterm = "n"
 $ usesitecustomize = "n"
 $ C_Compiler_Replace = "CC="
 $ thread_upcalls = "MTU="
@@ -904,7 +905,7 @@
 $   config_symbols2 
="|prefix|privlib|privlibexp|scriptdir|sitearch|sitearchexp|sitebin|sitelib|sitelib_stem|sitelibexp|try_cxx|use64bitall|use64bitint|"
 $   config_symbols3 
="|usecasesensitive|usedefaulttypes|usedevel|useieee|useithreads|usemultiplicity|usemymalloc|usedebugging_perl|useperlio|usesecurelog|"
 $   config_symbols4 
="|usethreads|usevmsdebug|usefaststdio|usemallocwrap|unlink_all_versions|uselargefiles|usesitecustomize|"
-$   config_symbols5 ="|buildmake|builder|usethreadupcalls|usekernelthreads"
+$   config_symbols5 
="|buildmake|builder|usethreadupcalls|usekernelthreads|usedecterm"
 $!  
 $   open/read CONFIG 'config_sh'
 $   rd_conf_loop:
@@ -2026,7 +2027,10 @@
 $   echo "You are using CXX ''line'"
 $   cxxversion = line
 $   ccversion = line
+$   d_cplusplus = "define"
 $   CALL Cxx_demangler_cleanup
+$ ELSE
+$   d_cplusplus = "undef"
 $ ENDIF
 $!
 $Cxx_demangler_cleanup: SUBROUTINE
@@ -2552,6 +2556,45 @@
 $ ELSE
 $     d_unlink_all_versions = "undef"
 $ ENDIF
+$!
+$! To avoid 'SYSTEM-F-PROTINSTALL, protected images must be installed'
+$! at run time, we must check that the DECterm image is both present
+$! and installed as a known image.
+$!
+$ decterm_capable = "FALSE"
+$ dflt = "SYS$SHARE:DECW$TERMINALSHR12.EXE"
+$ IF F$SEARCH(dflt) .NES. "" 
+$ THEN 
+$    decterm_capable = F$FILE_ATTRIBUTES(dflt, "KNOWN")
+$ ELSE
+$     dflt = "SYS$SHARE:DECW$TERMINALSHR.EXE"
+$     IF F$SEARCH(dflt) .NES. "" THEN decterm_capable = 
F$FILE_ATTRIBUTES(dflt, "KNOWN")
+$ ENDIF
+$!
+$ IF F$TYPE(usedecterm) .NES. ""
+$ THEN
+$       if usedecterm .or. usedecterm .eqs. "define"
+$       then
+$         bool_dflt="y"
+$       else
+$         bool_dflt="n"
+$       endif
+$ ELSE
+$       bool_dflt="n"
+$ ENDIF
+$ IF .NOT. use_debugging_perl THEN bool_dflt = "n"
+$ echo ""
+$ echo "Perl can be built to support DECterms from the Perl debugger"
+$ echo ""
+$ echo "If this does not make any sense to you, just accept the default '" + 
bool_dflt + "'."
+$ rp = "Build with DECterm Perl debugger support, if available? [''bool_dflt'] 
"
+$ GOSUB myread
+$ usedecterm=ans
+$ IF (usedecterm .OR. usedecterm .EQS. "define") .AND. .NOT. decterm_capable
+$ THEN
+$     echo4 "No installed DECterm image found, disabling..."
+$     usedecterm = "n"
+$ ENDIF
 $! CC Flags
 $ echo ""
 $ echo "Your compiler may want other flags.  For this question you should 
include"
@@ -2688,6 +2731,7 @@
 $   IF xxx .EQS. "SDBM_File/sdbm" THEN goto ext_loop ! sub extension - omit
 $   IF xxx .EQS. "Devel/PPPort/harness" THEN goto ext_loop ! sub extension - 
omit
 $   IF F$EXTRACT(0,7,xxx) .EQS. "Encode/" THEN goto ext_loop  ! sub extension 
- omit
+$   IF F$EXTRACT(0,5,xxx) .EQS. "Win32" THEN goto ext_loop  ! no Win32 API here
 $   IF xxx .EQS. "B/C" THEN goto ext_loop  ! sub extension - omit
 $   IF F$EXTRACT(0,8,line) .EQS. "vms/ext/" THEN -
       xxx = "VMS/" + F$EXTRACT(8,line_len - 20,line)
@@ -5694,7 +5738,7 @@
 $ WC "d_cmsghdr_s='undef'"
 $ WC "d_const='define'"
 $ WC "d_copysignl='define'"
-$ WC "d_cplusplus='undef'"
+$ WC "d_cplusplus='" + d_cplusplus + "'"
 $ WC "d_crypt='define'"
 $ WC "d_csh='undef'"
 $ WC "d_cuserid='define'"
@@ -6609,6 +6653,7 @@
 $!   WC "#define PERL_IGNORE_FPUSIG SIGFPE"
 $ ENDIF
 $ IF kill_by_sigprc .EQS. "define" then WC "#define KILL_BY_SIGPRC"
+$ IF usedecterm .OR. usedecterm .EQS. "define" then WC "#define 
USE_VMS_DECTERM"
 $ IF unlink_all_versions .OR. unlink_all_versions .EQS. "define" THEN -
     WC "#define UNLINK_ALL_VERSIONS"
 $ CLOSE CONFIG
@@ -6684,11 +6729,23 @@
 $ ELSE
 $   LARGEFILE_REPLACE = "LARGEFILE="
 $ ENDIF
+$ IF usedecterm .OR. usedecterm .EQS. "define"
+$ THEN
+$   IF F$SEARCH("SYS$SHARE:DECW$TERMINALSHR12.EXE") .nes. ""
+$   THEN
+$      DECTERM_REPLACE = "DECTERMLIB=DECTERMLIB=DECW$TERMINALSHR12/SHARE"
+$   ELSE
+$      DECTERM_REPLACE = "DECTERMLIB=DECTERMLIB=DECW$TERMINALSHR/SHARE"
+$   ENDIF
+$ ELSE
+$   DECTERM_REPLACE = "DECTERMLIB=DECTERMLIB="
+$ ENDIF
 $ echo4 "Extracting ''defmakefile' (with variable substitutions)"
 $ DEFINE/USER_MODE sys$output 'UUmakefile'
 $ mcr []munchconfig 'config_sh' 'Makefile_SH' "''DECC_REPLACE'" 
"''DECCXX_REPLACE'" "''ARCH_TYPE'" "''GNUC_REPLACE'" -
 "''SOCKET_REPLACE'" "''THREAD_REPLACE'" "''C_Compiler_Replace'" 
"''MALLOC_REPLACE'" -
-"''THREAD_UPCALLS'" "''THREAD_KERNEL'" "PV=''version'" 
"FLAGS=FLAGS=''extra_flags'" "''LARGEFILE_REPLACE'"
+"''THREAD_UPCALLS'" "''THREAD_KERNEL'" "PV=''version'" 
"FLAGS=FLAGS=''extra_flags'" "''LARGEFILE_REPLACE'" -
+"''DECTERM_REPLACE'"
 $! Clean up after ourselves
 $ DELETE/NOLOG/NOCONFIRM []munchconfig.exe;
 $!

==== //depot/maint-5.8/perl/lib/perl5db.pl#27 (text) ====
Index: perl/lib/perl5db.pl
--- perl/lib/perl5db.pl#26~26582~       2006-01-02 11:40:28.000000000 -0800
+++ perl/lib/perl5db.pl 2007-02-07 13:38:12.000000000 -0800
@@ -1317,9 +1317,21 @@
     # We're a child. Make us a label out of the current PID structure
     # recorded in PERLDB_PIDS plus our (new) PID. Mark us as not having
     # a term yet so the parent will give us one later via resetterm().
-    $pids = "[$ENV{PERLDB_PIDS}]";
-    $ENV{PERLDB_PIDS} .= "->$$";
-    $term_pid = -1;
+
+    my $env_pids = $ENV{PERLDB_PIDS};
+    $pids = "[$env_pids]";
+
+    # Unless we are on OpenVMS, all programs under the DCL shell run under
+    # the same PID.
+
+    if (($^O eq 'VMS') && ($env_pids =~ /\b$$\b/)) {
+        $term_pid         = $$;
+    }
+    else {
+        $ENV{PERLDB_PIDS} .= "->$$";
+        $term_pid = -1;
+    }
+
 } ## end if (defined $ENV{PERLDB_PIDS...
 else {
 
@@ -1709,7 +1721,7 @@
         if ($console) {
 
             # If we have a console, check to see if there are separate ins and
-            # outs to open. (They are assumed identiical if not.)
+            # outs to open. (They are assumed identical if not.)
 
             my ( $i, $o ) = split /,/, $console;
             $o = $i unless defined $o;
@@ -6718,6 +6730,19 @@
 =cut
 
 sub TTY {
+
+    # With VMS we can get here with $term undefined, so we do not
+    # switch to this terminal.  There may be a better place to make
+    # sure that $term is defined on VMS
+    if ( @_ and ($^O eq 'VMS') and !defined($term) ) {
+       eval { require Term::ReadLine } or die $@;
+        if ( !$rl ) {
+           $term = new Term::ReadLine::Stub 'perldb', $IN, $OUT;
+       }
+       else {
+           $term = new Term::ReadLine 'perldb', $IN, $OUT;
+       }
+    }
     if ( @_ and $term and $term->Features->{newTTY} ) {
 
         # This terminal supports switching to a new TTY.

==== //depot/maint-5.8/perl/vms/descrip_mms.template#46 (text) ====
Index: perl/vms/descrip_mms.template
--- perl/vms/descrip_mms.template#45~30163~     2007-02-07 12:48:27.000000000 
-0800
+++ perl/vms/descrip_mms.template       2007-02-07 13:38:12.000000000 -0800
@@ -33,6 +33,7 @@
 ~MTU~
 ~FLAGS~
 ~LARGEFILE~
+~DECTERMLIB~
 
 #: >>>>> Architecture-specific options <<<<<
 .ifdef IXE
@@ -255,7 +256,7 @@
 # object files for these extensions; the trailing comma is required if
 # there are any object files specified
 # These must be built separately, or you must add rules below to build them
-myextobj = [.ext.dynaloader]dl_vms$(O),
+myextobj = [.ext.DynaLoader]dl_vms$(O),
 EXT = $(MYEXT)
 extobj = $(myextobj)
 
@@ -293,7 +294,7 @@
 
 h0 = av.h cc_runtime.h config.h cop.h cv.h embed.h embedvar.h
 h1 = EXTERN.h form.h gv.h handy.h hv.h INTERN.h intrpvar.h
-h2 = iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h opnames.h pad.h
+h2 = iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h opnames.h overload.h 
pad.h
 h3 = patchlevel.h perl.h perlapi.h perlio.h perlsdio.h perlvars.h perly.h
 h4 = pp.h pp_proto.h proto.h regcomp.h regexp.h regnodes.h scope.h
 h5 = sv.h thrdvar.h thread.h utf8.h util.h vmsish.h warnings.h
@@ -306,7 +307,7 @@
 ac3 = $(ARCHCORE)form.h $(ARCHCORE)gv.h $(ARCHCORE)handy.h $(ARCHCORE)hv.h
 ac4 = $(ARCHCORE)INTERN.h $(ARCHCORE)intrpvar.h $(ARCHCORE)iperlsys.h
 ac5 = $(ARCHCORE)keywords.h $(ARCHCORE)mg.h $(ARCHCORE)nostdio.h
-ac6 = $(ARCHCORE)op.h $(ARCHCORE)opcode.h $(ARCHCORE)opnames.h 
+ac6 = $(ARCHCORE)op.h $(ARCHCORE)opcode.h $(ARCHCORE)opnames.h  
$(ARCHCORE)overload.h
 ac7 = $(ARCHCORE)pad.h $(ARCHCORE)patchlevel.h $(ARCHCORE)perl.h
 ac8 = $(ARCHCORE)perlapi.h $(ARCHCORE)perlio.h $(ARCHCORE)perlsdio.h
 ac9 = $(ARCHCORE)perlsfio.h $(ARCHCORE)perlvars.h $(ARCHCORE)perly.h 
$(ARCHCORE)pp.h
@@ -438,7 +439,7 @@
        Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)
 
 perlmain.c : miniperlmain.c $(MINIPERL_EXE) [.vms]writemain.pl
-       $(MINIPERL) [.VMS]Writemain.pl "$(EXT)"
+       $(MINIPERL) [.vms]Writemain.pl "$(EXT)"
 
 .ifdef __DEBUG__
 # Link an extra perl that doesn't invoke the debugger
@@ -501,29 +502,29 @@
        @ If F$Search("$(MMS$TARGET)").nes."" Then Delete/NoLog/NoConfirm 
$(MMS$TARGET);*
        @ Copy/NoConfirm _NLA0: $(MMS$TARGET)
  
-[.ext.dynaloader]dl_vms.c : [.ext.dynaloader]dl_vms.xs $(ARCHDIR)Config.pm 
[.lib.ExtUtils]XSSymSet.pm $(MINIPERL_EXE) [.lib.VMS]Filespec.pm 
+[.ext.DynaLoader]dl_vms.c : [.ext.DynaLoader]dl_vms.xs $(ARCHDIR)Config.pm 
[.lib.ExtUtils]XSSymSet.pm $(MINIPERL_EXE) [.lib.VMS]Filespec.pm 
        $(XSUBPP) $(MMS$SOURCE) >$(MMS$TARGET)
 
-[.ext.dynaloader]dl_vms$(O) : [.ext.dynaloader]dl_vms.c
-       $(CC) $(CFLAGS) /Include=([],[.ext.dynaloader])/Object=$(MMS$TARGET) 
$(MMS$SOURCE)
+[.ext.DynaLoader]dl_vms$(O) : [.ext.DynaLoader]dl_vms.c
+       $(CC) $(CFLAGS) /Include=([],[.ext.DynaLoader])/Object=$(MMS$TARGET) 
$(MMS$SOURCE)
 
-[.lib]DynaLoader.pm : [.ext.Dynaloader]Dynaloader.pm
+[.lib]DynaLoader.pm : [.ext.DynaLoader]DynaLoader.pm
        Copy/NoConfirm/Log $(MMS$SOURCE) [.lib]
        @ If F$Search("[.lib]auto.dir").eqs."" Then Create/Directory [.lib.auto]
        @ $(MINIPERL) -e "use AutoSplit; autosplit_lib_modules(@ARGV)" 
[.lib]DynaLoader.pm
 
-[.lib]XSLoader.pm : [.ext.Dynaloader]XSLoader.pm
+[.lib]XSLoader.pm : [.ext.DynaLoader]XSLoader.pm
        Copy/NoConfirm/Log $(MMS$SOURCE) [.lib]
        @ If F$Search("[.lib]auto.dir").eqs."" Then Create/Directory [.lib.auto]
        @ $(MINIPERL) -e "use AutoSplit; autosplit_lib_modules(@ARGV)" 
[.lib]XSLoader.pm
 
-[.ext.dynaloader]dynaloader.pm : [.ext.dynaloader]dynaloader_pm.pl
+[.ext.DynaLoader]DynaLoader.pm : [.ext.DynaLoader]DynaLoader_pm.PL
        $(MINIPERL) $(MMS$SOURCE)
-       @ Rename/Log dynaloader.pm [.ext.dynaloader]
+       @ Rename/Log DynaLoader.pm [.ext.DynaLoader]
 
-[.ext.dynaloader]xsloader.pm : [.ext.dynaloader]xsloader_pm.pl
+[.ext.DynaLoader]XSLoader.pm : [.ext.DynaLoader]XSLoader_pm.PL
        $(MINIPERL) $(MMS$SOURCE)
-       @ Rename/Log xsloader.pm [.ext.dynaloader]
+       @ Rename/Log XSLoader.pm [.ext.DynaLoader]
 
 dynext : $(LIBPREREQ) $(DBG)perlshr$(E) preplibrary
        @make_ext "$(MINIPERL_EXE)" "$(MMS)"
@@ -1268,6 +1269,7 @@
 #      keywords.h:     keywords.pl
 #      opcode.h:       opcode.pl
 #      opnames.h:      opcode.pl
+#      overload.h:     overload.pl
 #      pp_proto.h:     opcode.pl
 #      pp.sym:         opcode.pl
 #      embed.h:        embed.pl  [* needs pp.sym generated by opcode.pl! *]
@@ -1285,6 +1287,7 @@
 regen_headers :
        $(INSTPERL) keywords.pl
        $(INSTPERL) opcode.pl
+       $(INSTPERL) overload.pl
        $(INSTPERL) embed.pl
        $(INSTPERL) bytecode.pl
        $(INSTPERL) regcomp.pl
@@ -1315,17 +1318,17 @@
 
 test : all [.t.lib]vmsfspec.t [.t.lib]vms_dclsym.t [.t.lib]vms_stdio.t
        @ PERL_TEST_DRIVER == "TEST."
-       - @[.VMS]Test.Com "$(E)" "$(__DEBUG__)"
+       - @[.vms]test.com "$(E)" "$(__DEBUG__)"
        @ $(MINIPERL) -e "print ""Ran tests"";" > [.t]rantests.
 
 test_harness : all [.t.lib]vmsfspec.t [.t.lib]vms_dclsym.t [.t.lib]vms_stdio.t
        @ PERL_TEST_DRIVER == "harness."
-       - @[.VMS]Test.Com "$(E)" "$(__DEBUG__)"
+       - @[.vms]test.com "$(E)" "$(__DEBUG__)"
        @ $(MINIPERL) -e "print ""Ran tests"";" > [.t]rantests.
 
 minitest : $(MINITEST_EXE) [.lib]re.pm [.lib]lib.pm [.lib.VMS]Filespec.pm 
unidatafiles.ts
        @ PERL_TEST_DRIVER == "minitest"
-       - @[.VMS]Test.Com "$(E)" "$(__DEBUG__)"
+       - @[.vms]test.com "$(E)" "$(__DEBUG__)"
 
 # install ought not need a source, but it doesn't work if one's not
 # there. Go figure...
@@ -1423,6 +1426,9 @@
 $(ARCHCORE)opnames.h : opnames.h
        @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory 
$(ARCHCORE)
        Copy/NoConfirm/Log $(MMS$SOURCE) $(ARCHCORE)
+$(ARCHCORE)overload.h : overload.h
+       @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory 
$(ARCHCORE)
+       Copy/NoConfirm/Log $(MMS$SOURCE) $(ARCHCORE)
 $(ARCHCORE)pad.h : pad.h
        @ If F$Search("$(ARCHDIR)CORE.dir").eqs."" Then Create/Directory 
$(ARCHCORE)
        Copy/NoConfirm/Log $(MMS$SOURCE) $(ARCHCORE)
@@ -1628,7 +1634,7 @@
        Copy/Log/Noconfirm [.vms]vms.c []
 
 $(CRTL) : $(MAKEFILE)
-       @ @[.vms]genopt "$(CRTL)/Write" "|" "$(LIBS1)|$(FULLLIBS2)|$(SOCKLIB)"
+       @ @[.vms]genopt "$(CRTL)/Write" "|" 
"$(LIBS1)|$(FULLLIBS2)|$(SOCKLIB)|$(DECTERMLIB)"
 
 ok : $(utils)
        $(MINIPERL) lib/perlbug.com -ok -s "(UNINSTALLED)"
@@ -1662,28 +1668,28 @@
        - If F$Search("[...]*.Opt;-1").nes."" Then Purge/NoConfirm/Log 
[...]*.Opt
        - If F$Search("[...]*$(O);-1").nes."" Then Purge/NoConfirm/Log 
[...]*$(O)
        - If F$Search("[...]*$(E);-1").nes."" Then Purge/NoConfirm/Log 
[...]*$(E)
-       - If F$Search("Config.H;-1").nes."" Then Purge/NoConfirm/Log Config.H
-       - If F$Search("Config.SH;-1").nes."" Then Purge/NoConfirm/Log Config.SH
-       - If F$Search("VMSish.H;-1").nes."" Then Purge/NoConfirm/Log VMSish.H
-       - If F$Search("VMS.C;-1")   .nes."" Then Purge/NoConfirm/Log VMS.C
-       - If F$Search("Perlmain.C;-1")   .nes."" Then Purge/NoConfirm/Log 
Perlmain.C
+       - If F$Search("config.h;-1").nes."" Then Purge/NoConfirm/Log config.h
+       - If F$Search("config.sh;-1").nes."" Then Purge/NoConfirm/Log config.sh
+       - If F$Search("vmsish.h;-1").nes."" Then Purge/NoConfirm/Log vmsish.h
+       - If F$Search("vms.c;-1")   .nes."" Then Purge/NoConfirm/Log vms.c
+       - If F$Search("perlmain.c;-1")   .nes."" Then Purge/NoConfirm/Log 
perlmain.c
        - If F$Search("Perlshr_Gbl*.Mar;-1")   .nes."" Then Purge/NoConfirm/Log 
Perlshr_Gbl*.Mar
-       - If F$Search("[.Ext.DynaLoader]DL_VMS$(O);-1").nes."" Then 
Purge/NoConfirm/Log [.Ext.DynaLoader]DL_VMS$(O)
-       - If F$Search("[.Ext.DynaLoader]DL_VMS.C;-1").nes."" Then 
Purge/NoConfirm/Log [.Ext.DynaLoader]DL_VMS.C
-       - If F$Search("[.Ext.Opcode...];-1").nes."" Then Purge/NoConfirm/Log 
[.Ext.Opcode]
-       - If F$Search("[.VMS.Ext...]*.C;-1").nes."" Then Purge/NoConfirm/Log 
[.VMS.Ext...]*.C
-       - If F$Search("[.VMS.Ext...]*$(O);-1").nes."" Then Purge/NoConfirm/Log 
[.VMS.Ext...]*$(O)
-       - If F$Search("[.Lib.Auto...]*.al;-1").nes."" Then Purge/NoConfirm/Log 
[.Lib.Auto...]*.al
-       - If F$Search("[.Lib.Auto...]autosplit.ix;-1").nes."" Then 
Purge/NoConfirm/Log [.Lib.Auto...]autosplit.ix
-       - If F$Search("[.Lib]DynaLoader.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.Lib]DynaLoader.pm
-       - If F$Search("[.Lib]XSLoader.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.Lib]XSLoader.pm
-       - If F$Search("[.Lib]Config.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.Lib]Config.pm
+       - If F$Search("[.ext.DynaLoader]dl_vms$(O);-1").nes."" Then 
Purge/NoConfirm/Log [.ext.DynaLoader]dl_vms$(O)
+       - If F$Search("[.ext.DynaLoader]dl_vms.c;-1").nes."" Then 
Purge/NoConfirm/Log [.ext.DynaLoader]dl_vms.c
+       - If F$Search("[.ext.Opcode...];-1").nes."" Then Purge/NoConfirm/Log 
[.ext.Opcode]
+       - If F$Search("[.vms.ext...]*.C;-1").nes."" Then Purge/NoConfirm/Log 
[.vms.ext...]*.C
+       - If F$Search("[.vms.ext...]*$(O);-1").nes."" Then Purge/NoConfirm/Log 
[.vms.ext...]*$(O)
+       - If F$Search("[.lib.auto...]*.al;-1").nes."" Then Purge/NoConfirm/Log 
[.lib.auto...]*.al
+       - If F$Search("[.lib.auto...]autosplit.ix;-1").nes."" Then 
Purge/NoConfirm/Log [.lib.auto...]autosplit.ix
+       - If F$Search("[.lib]DynaLoader.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.lib]DynaLoader.pm
+       - If F$Search("[.lib]XSLoader.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.lib]XSLoader.pm
+       - If F$Search("[.lib]Config.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.lib]Config.pm
        - If F$Search("$(ARCHDIR)Config.pm;-1").nes."" Then Purge/NoConfirm/Log 
$(ARCHDIR)Config.pm
-       - If F$Search("[.Lib]Config_heavy.pl;-1").nes."" Then 
Purge/NoConfirm/Log [.Lib]Config_heavy.pl
+       - If F$Search("[.lib]Config_heavy.pl;-1").nes."" Then 
Purge/NoConfirm/Log [.lib]Config_heavy.pl
        - If F$Search("$(ARCHDIR)Config_heavy.pl;-1").nes."" Then 
Purge/NoConfirm/Log $(ARCHDIR)Config_heavy.pl
        - If F$Search("[.lib.ExtUtils]Miniperl.pm").nes."" Then 
Purge/NoConfirm/Log [.lib.ExtUtils]Miniperl.pm
        - If F$Search("[.lib.ExtUtils]XSSymSet.pm").nes."" Then 
Purge/NoConfirm/Log [.lib.ExtUtils]XSSymSet.pm
-       - If F$Search("[.Lib.VMS]*.*;-1").nes."" Then Purge/NoConfirm/Log 
[.Lib.VMS]*.*
+       - If F$Search("[.lib.VMS]*.*;-1").nes."" Then Purge/NoConfirm/Log 
[.lib.VMS]*.*
        - If F$Search("[.lib.pods]*.Pod;-1").nes."" Then Purge/NoConfirm/Log 
[.lib.pods]*.Pod
        - If F$Search("$(ARCHCORE)*.*").nes."" Then Purge/NoConfirm/Log 
$(ARCHCORE)*.*
        - If F$Search("[.lib]*.com;-1").nes."" Then Purge/NoConfirm/Log 
[.lib]*.com
@@ -1698,17 +1704,17 @@
        - If F$Search("[...]*$(O);*") .nes."" Then Delete/NoConfirm/Log 
[...]*$(O);*
        - If F$Search(F$Parse("Sys$Disk:[]","$(SOCKH)")).nes."" Then 
Delete/NoConfirm/Log $(SOCKH);*
        - If F$Search(F$Parse("Sys$Disk:[]","$(SOCKC)")).nes."" Then 
Delete/NoConfirm/Log $(SOCKC);*
-       - If F$Search("VMSish.H").nes."" Then Delete/NoConfirm/Log VMSish.H;*
-       - If F$Search("VMS.C")   .nes."" Then Delete/NoConfirm/Log VMS.C;*
-       - If F$Search("Perlmain.C")   .nes."" Then Delete/NoConfirm/Log 
Perlmain.C;*
+       - If F$Search("vmsish.h").nes."" Then Delete/NoConfirm/Log vmsish.h;*
+       - If F$Search("vms.c")   .nes."" Then Delete/NoConfirm/Log vms.c;*
+       - If F$Search("perlmain.c")   .nes."" Then Delete/NoConfirm/Log 
perlmain.c;*
        - If F$Search("Perlshr_Gbl*.Mar")   .nes."" Then Delete/NoConfirm/Log 
Perlshr_Gbl*.Mar;*
        - If F$Search("*.TS").nes."" Then Delete/NoConfirm/Log *.TS;*
-       - If F$Search("[.Ext.DynaLoader]DL_VMS$(O)").nes."" Then 
Delete/NoConfirm/Log [.Ext.DynaLoader]DL_VMS$(O);*
-       - If F$Search("[.Ext.DynaLoader]DL_VMS.C").nes."" Then 
Delete/NoConfirm/Log [.Ext.DynaLoader]DL_VMS.C;*
-       - If F$Search("[.Ext.DynaLoader]DynaLoader.pm").nes."" Then 
Delete/NoConfirm/Log [.Ext.DynaLoader]DynaLoader.pm;*
-       - If F$Search("[.Ext.DynaLoader]XSLoader.pm").nes."" Then 
Delete/NoConfirm/Log [.Ext.DynaLoader]XSLoader.pm;*
-       - If F$Search("[.VMS.Ext...]*.C").nes."" Then Delete/NoConfirm/Log 
[.VMS.Ext...]*.C;*
-       - If F$Search("[.VMS.Ext...]*$(O)").nes."" Then Delete/NoConfirm/Log 
[.VMS.Ext...]*$(O);*
+       - If F$Search("[.ext.DynaLoader]dl_vms$(O)").nes."" Then 
Delete/NoConfirm/Log [.ext.DynaLoader]dl_vms$(O);*
+       - If F$Search("[.ext.DynaLoader]dl_vms.c").nes."" Then 
Delete/NoConfirm/Log [.ext.DynaLoader]dl_vms.c;*
+       - If F$Search("[.ext.DynaLoader]DynaLoader.pm").nes."" Then 
Delete/NoConfirm/Log [.ext.DynaLoader]DynaLoader.pm;*
+       - If F$Search("[.ext.DynaLoader]XSLoader.pm").nes."" Then 
Delete/NoConfirm/Log [.ext.DynaLoader]XSLoader.pm;*
+       - If F$Search("[.vms.ext...]*.C").nes."" Then Delete/NoConfirm/Log 
[.vms.ext...]*.C;*
+       - If F$Search("[.vms.ext...]*$(O)").nes."" Then Delete/NoConfirm/Log 
[.vms.ext...]*$(O);*
        - If F$Search("[.pod]*.com").nes."" Then Delete/NoConfirm/Log 
[.pod]*.com;*
        - If F$Search("[.pod]perldelta.pod").nes."" Then Delete/NoConfirm/Log 
[.pod]perldelta.pod;*
        - @extra_pods CLEAN
@@ -1717,8 +1723,8 @@
        - @make_ext "$(MINIPERL_EXE)" "$(MMS)" realclean
        - If F$Search("*$(OLB)").nes."" Then Delete/NoConfirm/Log *$(OLB);*
        - If F$Search("*.Opt").nes."" Then Delete/NoConfirm/Log *.Opt;*
-       - If F$Search("Config.H").nes."" Then Delete/NoConfirm/Log Config.H;*
-       - If F$Search("Config.SH").nes."" Then Delete/NoConfirm/Log Config.SH;*
+       - If F$Search("config.h").nes."" Then Delete/NoConfirm/Log config.h;*
+       - If F$Search("config.sh").nes."" Then Delete/NoConfirm/Log config.sh;*
        - $(MINIPERL) -e "use File::Path; rmtree([EMAIL PROTECTED],1,0);" config
        - If F$Search("[.lib.unicore]*.pl").nes."" Then Delete/NoConfirm/Log 
[.lib.unicore]*.pl;*
        - If F$Search("[.lib.unicore]Properties.").nes."" Then 
Delete/NoConfirm/Log [.lib.unicore]Properties.;*
@@ -1729,11 +1735,11 @@
        - If F$Search("extra.pods").nes."" Then Delete/NoConfirm/Log 
extra.pods;*
        - $(MINIPERL) -e "use File::Path; 
rmtree(['lib/auto','lib/VMS','lib/$(ARCH)'],1,0);"
        - If F$Search("*.TS").nes."" Then Delete/NoConfirm/Log *.TS;*
-       - If F$Search("[.Lib]DynaLoader.pm").nes."" Then Delete/NoConfirm/Log 
[.Lib]DynaLoader.pm;*
-       - If F$Search("[.Lib]XSLoader.pm").nes."" Then Delete/NoConfirm/Log 
[.Lib]XSLoader.pm;*
-       - If F$Search("[.Lib]Config.pm").nes."" Then Delete/NoConfirm/Log 
[.Lib]Config.pm;*
-       - If F$Search("[.Lib]Config_heavy.pl").nes."" Then Delete/NoConfirm/Log 
[.Lib]Config_heavy.pl;*
-       - If F$Search("[.Lib]*.com").nes."" Then Delete/NoConfirm/Log 
[.Lib]*.com;*
+       - If F$Search("[.lib]DynaLoader.pm").nes."" Then Delete/NoConfirm/Log 
[.lib]DynaLoader.pm;*
+       - If F$Search("[.lib]XSLoader.pm").nes."" Then Delete/NoConfirm/Log 
[.lib]XSLoader.pm;*
+       - If F$Search("[.lib]Config.pm").nes."" Then Delete/NoConfirm/Log 
[.lib]Config.pm;*
+       - If F$Search("[.lib]Config_heavy.pl").nes."" Then Delete/NoConfirm/Log 
[.lib]Config_heavy.pl;*
+       - If F$Search("[.lib]*.com").nes."" Then Delete/NoConfirm/Log 
[.lib]*.com;*
        - If F$Search("[.pod]*.com").nes."" Then Delete/NoConfirm/Log 
[.pod]*.com;*
        - If F$Search("[.utils]*.com").nes."" Then Delete/NoConfirm/Log 
[.utils]*.com;*
        - If F$Search("[.x2p]*.com").nes."" Then Delete/NoConfirm/Log 
[.x2p]*.com;*
@@ -1755,14 +1761,14 @@
        - If F$Search("[.t.lib]vms_stdio.t").nes."" Then Delete/NoConfirm/Log 
[.t.lib]vms_stdio.t;*
 
 cleansrc : clean
-       - If F$Search("*.C;-1").nes."" Then Purge/NoConfirm/Log *.C
-       - If F$Search("*.H;-1").nes."" Then Purge/NoConfirm/Log *.H
-       - If F$Search("*.VMS;-1").nes."" Then Purge/NoConfirm/Log *.VMS
-       - If F$Search("[.VMS]$(MAKEFILE);-1").nes."" Then Purge/NoConfirm/Log 
[.VMS]$(MAKEFILE)
-       - If F$Search("[.VMS]*.C;-1").nes."" Then Purge/NoConfirm/Log [.VMS]*.C
-       - If F$Search("[.VMS]*.H;-1").nes."" Then Purge/NoConfirm/Log [.VMS]*.H
-       - If F$Search("[.VMS]*.Pl;-1").nes."" Then Purge/NoConfirm/Log 
[.VMS]*.Pl
-       - If F$Search("[.VMS]*.VMS;-1").nes."" Then Purge/NoConfirm/Log 
[.VMS]*.VMS
-       - If F$Search("[.VMS...]*.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.VMS...]*.pm
-       - If F$Search("[.VMS...]*.xs;-1").nes."" Then Purge/NoConfirm/Log 
[.VMS...]*.xs
+       - If F$Search("*.c;-1").nes."" Then Purge/NoConfirm/Log *.c
+       - If F$Search("*.h;-1").nes."" Then Purge/NoConfirm/Log *.h
+       - If F$Search("*.vms;-1").nes."" Then Purge/NoConfirm/Log *.vms
+       - If F$Search("[.vms]$(MAKEFILE);-1").nes."" Then Purge/NoConfirm/Log 
[.vms]$(MAKEFILE)
+       - If F$Search("[.vms]*.c;-1").nes."" Then Purge/NoConfirm/Log [.vms]*.c
+       - If F$Search("[.vms]*.h;-1").nes."" Then Purge/NoConfirm/Log [.vms]*.h
+       - If F$Search("[.vms]*.pl;-1").nes."" Then Purge/NoConfirm/Log 
[.vms]*.pl
+       - If F$Search("[.vms]*.vms;-1").nes."" Then Purge/NoConfirm/Log 
[.vms]*.vms
+       - If F$Search("[.vms...]*.pm;-1").nes."" Then Purge/NoConfirm/Log 
[.vms...]*.pm
+       - If F$Search("[.vms...]*.xs;-1").nes."" Then Purge/NoConfirm/Log 
[.vms...]*.xs
 !GROK!THIS!

==== //depot/maint-5.8/perl/vms/ext/DCLsym/DCLsym.pm#2 (text) ====
Index: perl/vms/ext/DCLsym/DCLsym.pm
--- perl/vms/ext/DCLsym/DCLsym.pm#1~17645~      2002-07-19 12:29:57.000000000 
-0700
+++ perl/vms/ext/DCLsym/DCLsym.pm       2007-02-07 13:38:12.000000000 -0800
@@ -7,7 +7,7 @@
 
 # Package globals
 @ISA = ( 'DynaLoader' );
-$VERSION = '1.02';
+$VERSION = '1.03';
 my(%Locsyms) = ( ':ID' => 'LOCAL' );
 my(%Gblsyms) = ( ':ID' => 'GLOBAL');
 my $DoCache = 1;
@@ -106,7 +106,7 @@
     open(P,'Show Symbol * |');
     while (<P>) {
       ($name,$eqs,$val) = /^\s+(\S+) (=+) (.+)/
-        or carp "VMS::CLISym: unparseable line $_";
+        or carp "VMS::DCLsym: unparseable line $_";
       $name =~ s#\*##;
       $val =~ s/"(.*)"$/$1/ or $val =~ s/^(\S+).*/$1/;
       if ($eqs eq '==') { $Gblsyms{$name} = $val; }
@@ -157,7 +157,7 @@
   tie %cgisyms, VMS::DCLsym, 'GLOBAL';
 
 
-  $handle = new VMS::DCLsyms;
+  $handle = new VMS::DCLsym;
   $value = $handle->getsym($name);
   $handle->setsym($name,$value,'GLOBAL') or die "Can't create symbol: $!\n";
   $handle->delsym($name,'LOCAL') or die "Can't delete symbol: $!\n";

==== //depot/maint-5.8/perl/vms/ext/Stdio/Stdio.xs#3 (text) ====
Index: perl/vms/ext/Stdio/Stdio.xs
--- perl/vms/ext/Stdio/Stdio.xs#2~29807~        2007-01-14 05:09:22.000000000 
-0800
+++ perl/vms/ext/Stdio/Stdio.xs 2007-02-07 13:38:12.000000000 -0800
@@ -192,12 +192,13 @@
 
 char *
 getname(fp)
-       PerlIO * fp
+       PerlIO * fp
        PROTOTYPE: $
        CODE:
+            FILE *stdio = PerlIO_exportFILE(fp,0);
            char fname[NAM$C_MAXRSS+1];
            ST(0) = sv_newmortal();
-           if (PerlIO_getname(fp,fname) != NULL) sv_setpv(ST(0),fname);
+            if (fgetname(stdio,fname) != NULL) sv_setpv(ST(0),fname);
 
 void
 rewind(fp)
@@ -348,7 +349,7 @@
                break;
            }
            if (fp != Null(FILE*)) {
-             pio_fp = PerlIO_importFILE(fp,mode);
+             pio_fp = PerlIO_fdopen(fileno(fp),mode);
              fh = newFH(pio_fp,(mode[1] ? '+' : (mode[0] == 'r' ? '<' : 
(mode[0] == 'a' ? 'a' : '>'))));
             ST(0) = (fh ? sv_2mortal(fh) : &PL_sv_undef);
            }
@@ -363,8 +364,7 @@
        CODE:
            char *args[8];
            int i, myargc, fd;
-           FILE *fp;
-           PerlIO *pio_fp;
+           PerlIO *pio_fp;
            SV *fh;
            STRLEN n_a;
            if (!spec || !*spec) {
@@ -407,8 +407,7 @@
            }
            i = mode & 3;
            if (fd >= 0 &&
-              ((fp = fdopen(fd, &("r\000w\000r+"[2*i]))) != Null(FILE*))) {
-             pio_fp = PerlIO_importFILE(fp,&("r\000w\000r+"[2*i]));
+              ((pio_fp = PerlIO_fdopen(fd, &("r\000w\000r+"[2*i]))) != 
Null(PerlIO*))) {
              fh = newFH(pio_fp,"<>++"[i]);
             ST(0) = (fh ? sv_2mortal(fh) : &PL_sv_undef);
            }

==== //depot/maint-5.8/perl/vms/vms.c#26 (text) ====
Index: perl/vms/vms.c
--- perl/vms/vms.c#25~30163~    2007-02-07 12:48:27.000000000 -0800
+++ perl/vms/vms.c      2007-02-07 13:38:12.000000000 -0800
@@ -17,6 +17,7 @@
 #include <chpdef.h>
 #include <clidef.h>
 #include <climsgdef.h>
+#include <dcdef.h>
 #include <descrip.h>
 #include <devdef.h>
 #include <dvidef.h>
@@ -47,6 +48,7 @@
 #include <uicdef.h>
 #include <stsdef.h>
 #include <rmsdef.h>
+#include <smgdef.h>
 
 /* Set the maximum filespec size here as it is larger for EFS file
  * specifications.
@@ -125,6 +127,21 @@
 #  define RTL_USES_UTC 1
 #endif
 
+#ifdef USE_VMS_DECTERM
+
+/* Routine to create a decterm for use with the Perl debugger */
+/* No headers, this information was found in the Programming Concepts Manual */
+
+int decw$term_port
+   (const struct dsc$descriptor_s * display,
+    const struct dsc$descriptor_s * setup_file,
+    const struct dsc$descriptor_s * customization,
+    struct dsc$descriptor_s * result_device_name,
+    unsigned short * result_device_name_length,
+    void * controller,
+    void * char_buffer,
+    void * char_change_buffer);
+#endif
 
 /* gcc's header files don't #define direct access macros
  * corresponding to VAXC's variant structs */
@@ -854,8 +871,9 @@
          */
         char lnm[LNM$C_NAMLENGTH+1];
         char eqv[LNM$C_NAMLENGTH+1];
+        int trnlen;
         strncpy(lnm, key, keylen);
-        int trnlen = vmstrnenv(lnm, eqv, 0, fildev, 0);
+        trnlen = vmstrnenv(lnm, eqv, 0, fildev, 0);
         sv = newSVpvn(eqv, strlen(eqv));
       }
       else {
@@ -2047,6 +2065,8 @@
     int             in_done;        /* true when in pipe finished */
     int             out_done;
     int             err_done;
+    unsigned short  xchan;         /* channel to debug xterm */
+    unsigned short  xchan_valid;    /* channel is assigned */
 };
 
 struct exit_control_block
@@ -2180,6 +2200,7 @@
       if (!info->done) {  /* We tried to be nice . . . */
         sts = sys$delprc(&info->pid,0);
         if (!(sts&1) && sts != SS$_NONEXPR) _ckvmssts_noperl(sts); 
+        info->done = 1;  /* sys$delprc is as done as we're going to get. */
       }
       _ckvmssts_noperl(sys$setast(1));
       info = info->next;
@@ -2931,6 +2952,234 @@
 }
 
 
+#ifdef USE_VMS_DECTERM
+
+static int vms_is_syscommand_xterm(void)
+{
+    const static struct dsc$descriptor_s syscommand_dsc = 
+      { 11, DSC$K_DTYPE_T, DSC$K_CLASS_S, "SYS$COMMAND" };
+
+    const static struct dsc$descriptor_s decwdisplay_dsc = 
+      { 12, DSC$K_DTYPE_T, DSC$K_CLASS_S, "DECW$DISPLAY" };
+
+    struct item_list_3 items[2];
+    unsigned short dvi_iosb[4];
+    unsigned long devchar;
+    unsigned long devclass;
+    int status;
+
+    /* Very simple check to guess if sys$command is a decterm? */
+    /* First see if the DECW$DISPLAY: device exists */
+    items[0].len = 4;
+    items[0].code = DVI$_DEVCHAR;
+    items[0].bufadr = &devchar;
+    items[0].retadr = NULL;
+    items[1].len = 0;
+    items[1].code = 0;
+
+    status = sys$getdviw
+       (NO_EFN, 0, &decwdisplay_dsc, items, dvi_iosb, NULL, NULL, NULL);
+
+    if ($VMS_STATUS_SUCCESS(status)) {
+        status = dvi_iosb[0];
+    }
+
+    if (!$VMS_STATUS_SUCCESS(status)) {
+        SETERRNO(EVMSERR, status);
+       return -1;
+    }
+
+    /* If it does, then for now assume that we are on a workstation */
+    /* Now verify that SYS$COMMAND is a terminal */
+    /* for creating the debugger DECTerm */
+
+    items[0].len = 4;
+    items[0].code = DVI$_DEVCLASS;
+    items[0].bufadr = &devclass;
+    items[0].retadr = NULL;
+    items[1].len = 0;
+    items[1].code = 0;
+
+    status = sys$getdviw
+       (NO_EFN, 0, &syscommand_dsc, items, dvi_iosb, NULL, NULL, NULL);
+
+    if ($VMS_STATUS_SUCCESS(status)) {
+        status = dvi_iosb[0];
+    }
+
+    if (!$VMS_STATUS_SUCCESS(status)) {
+        SETERRNO(EVMSERR, status);
+       return -1;
+    }
+    else {
+       if (devclass == DC$_TERM) {
+           return 0;
+       }
+    }
+    return -1;
+}
+
+/* If we are on a DECTerm, we can pretend to fork xterms when requested */
+static PerlIO * create_forked_xterm(pTHX_ const char *cmd, const char *mode)
+{
+    int status;
+    int ret_stat;
+    char * ret_char;
+    char device_name[65];
+    unsigned short device_name_len;
+    struct dsc$descriptor_s customization_dsc;
+    struct dsc$descriptor_s device_name_dsc;
+    const char * cptr;
+    char * tptr;
+    char customization[200];
+    char title[40];
+    pInfo info = NULL;
+    char mbx1[64];
+    unsigned short p_chan;
+    int n;
+    unsigned short iosb[4];
+    struct item_list_3 items[2];
+    const char * cust_str =
+        "DECW$TERMINAL.iconName:\tPerl Dbg\nDECW$TERMINAL.title:\t%40s\n";
+    struct dsc$descriptor_s d_mbx1 = {sizeof mbx1, DSC$K_DTYPE_T,
+                                          DSC$K_CLASS_S, mbx1};
+
+    ret_char = strstr(cmd," xterm ");
+    if (ret_char == NULL)
+       return NULL;
+    cptr = ret_char + 7;
+    ret_char = strstr(cmd,"tty");
+    if (ret_char == NULL)
+       return NULL;
+    ret_char = strstr(cmd,"sleep");
+    if (ret_char == NULL)
+       return NULL;
+
+    /* Are we on a workstation? */
+    /* to do: capture the rows / columns and pass their properties */
+    ret_stat = vms_is_syscommand_xterm();
+    if (ret_stat < 0)
+       return NULL;
+
+    /* Make the title: */
+    ret_char = strstr(cptr,"-title");
+    if (ret_char != NULL) {
+       while ((*cptr != 0) && (*cptr != '\"')) {
+           cptr++;
+       }
+       if (*cptr == '\"')
+           cptr++;
+       n = 0;
+       while ((*cptr != 0) && (*cptr != '\"')) {
+           title[n] = *cptr;
+           n++;
+           if (n == 39) {
+               title[39] == 0;
+               break;
+           }
+           cptr++;
+       }
+       title[n] = 0;
+    }
+    else {
+           /* Default title */
+           strcpy(title,"Perl Debug DECTerm");
+    }
+    sprintf(customization, cust_str, title);
+
+    customization_dsc.dsc$a_pointer = customization;
+    customization_dsc.dsc$w_length = strlen(customization);
+    customization_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    customization_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+    device_name_dsc.dsc$a_pointer = device_name;
+    device_name_dsc.dsc$w_length = sizeof device_name -1;
+    device_name_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    device_name_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+    device_name_len = 0;
+
+    /* Try to create the window */
+     status = decw$term_port
+       (NULL,
+       NULL,
+       &customization_dsc,
+       &device_name_dsc,
+       &device_name_len,
+       NULL,
+       NULL,
+       NULL);
+    if (!$VMS_STATUS_SUCCESS(status)) {
+        SETERRNO(EVMSERR, status);
+       return NULL;
+    }
+
+    device_name[device_name_len] = '\0';
+
+    /* Need to set this up to look like a pipe for cleanup */
+    n = sizeof(Info);
+    status = lib$get_vm(&n, &info);
+    if (!$VMS_STATUS_SUCCESS(status)) {
+        SETERRNO(ENOMEM, status);
+        return NULL;
+    }
+
+    info->mode = *mode;
+    info->done = FALSE;
+    info->completion = 0;
+    info->closing    = FALSE;
+    info->in         = 0;
+    info->out        = 0;
+    info->err        = 0;
+    info->fp         = Nullfp;
+    info->useFILE    = 0;
+    info->waiting    = 0;
+    info->in_done    = TRUE;
+    info->out_done   = TRUE;
+    info->err_done   = TRUE;
+
+    /* Assign a channel on this so that it will persist, and not login */
+    /* We stash this channel in the info structure for reference. */
+    /* The created xterm self destructs when the last channel is removed */
+    /* and it appears that perl5db.pl (perl debugger) does this routinely */
+    /* So leave this assigned. */
+    device_name_dsc.dsc$w_length = device_name_len;
+    status = sys$assign(&device_name_dsc,&info->xchan,0,0);
+    if (!$VMS_STATUS_SUCCESS(status)) {
+        SETERRNO(EVMSERR, status);
+       return NULL;
+    }
+    info->xchan_valid = 1;
+
+    /* Now create a mailbox to be read by the application */
+
+    create_mbx(aTHX_ &p_chan, &d_mbx1);
+
+    /* write the name of the created terminal to the mailbox */
+    status = sys$qiow(NO_EFN, p_chan, IO$_WRITEVBLK|IO$M_NOW,
+            iosb, NULL, NULL, device_name, device_name_len, 0, 0, 0, 0);
+
+    if (!$VMS_STATUS_SUCCESS(status)) {
+        SETERRNO(EVMSERR, status);
+       return NULL;
+    }
+
+    info->fp  = PerlIO_open(mbx1, mode);
+
+    /* Done with this channel */
+    sys$dassgn(p_chan);
+
+    /* If any errors, then clean up */
+    if (!info->fp) {
+               n = sizeof(Info);
+       _ckvmssts(lib$free_vm(&n, &info));
+       return NULL;
+        }
+
+    /* All done */
+    return info->fp;
+}
+#endif
 
 static PerlIO *
 safe_popen(pTHX_ const char *cmd, const char *in_mode, int *psts)
@@ -2959,7 +3208,21 @@
     $DESCRIPTOR(d_sym_in ,"PERL_POPEN_IN");
     $DESCRIPTOR(d_sym_out,"PERL_POPEN_OUT");
     $DESCRIPTOR(d_sym_err,"PERL_POPEN_ERR");
-                            
+
+#ifdef USE_VMS_DECTERM
+    /* Check here for Xterm create request.  This means looking for
+     * "3>&1 xterm\b" and "\btty 1>&3\b$" in the command, and that it
+     *  is possible to create an xterm.
+     */
+    if (*in_mode == 'r') {
+        PerlIO * xterm_fd;
+
+       xterm_fd = create_forked_xterm(aTHX_ cmd, in_mode);
+       if (xterm_fd != Nullfp)
+           return xterm_fd;
+    }
+#endif
+
     if (!head_PLOC) store_pipelocs(aTHX);   /* at least TRY to use a static 
vmspipe file */
 
     /* once-per-program initialization...
@@ -3028,7 +3291,7 @@
           set_errno(EVMSERR); 
       }
       set_vaxc_errno(sts);
-      if (*mode != 'n' && ckWARN(WARN_PIPE)) {
+      if (*in_mode != 'n' && ckWARN(WARN_PIPE)) {
         Perl_warner(aTHX_ packWARN(WARN_PIPE),"Can't pipe \"%*s\": %s", 
strlen(cmd), cmd, Strerror(errno));
       }
       *psts = sts;
@@ -3051,6 +3314,8 @@
     info->in_done    = TRUE;
     info->out_done   = TRUE;
     info->err_done   = TRUE;
+    info->xchan      = 0;
+    info->xchan_valid = 0;
     in[0] = out[0] = err[0] = '\0';
 
     if ((p = strchr(mode,'F')) != NULL) {   /* F -> use FILE* */
@@ -3071,7 +3336,7 @@
             info->out->info = info;
         }
         if (!info->useFILE) {
-        info->fp  = PerlIO_open(mbx, mode);
+           info->fp  = PerlIO_open(mbx, mode);
         } else {
             info->fp = (PerlIO *) freopen(mbx, mode, stdin);
             Perl_vmssetuserlnm(aTHX_ "SYS$INPUT",mbx);
@@ -3288,6 +3553,7 @@
     pInfo info, last = NULL;
     unsigned long int retsts;
     int done, iss, n;
+    int status;
     
     for (info = open_pipes; info != NULL; last = info, info = info->next)
         if (info->fp == fp) break;
@@ -7790,7 +8056,7 @@
  *
  * A better method might be to use sys$device_scan on the first call, and to
  * search for the device, returning an index into the cached array.
- * The number returned would be more intelligable.
+ * The number returned would be more intelligible.
  * This is probably not worth it, and anyway would take quite a bit longer
  * on the first call.
  */
@@ -7808,7 +8074,7 @@
 #if LOCKID_MASK
   {
     struct dsc$descriptor_s dev_desc;
-    unsigned long int status, lockid, item = DVI$_LOCKID;
+    unsigned long int status, lockid = 0, item = DVI$_LOCKID;
 
     /* For cluster-mounted disks, the disk lock identifier is unique, so we
        can try that first. */
@@ -7816,7 +8082,16 @@
     dev_desc.dsc$b_dtype =   DSC$K_DTYPE_T;
     dev_desc.dsc$b_class =   DSC$K_CLASS_S;
     dev_desc.dsc$a_pointer = (char *) dev;  /* Read only parameter */
-    _ckvmssts(lib$getdvi(&item, 0, &dev_desc, &lockid, 0, 0));
+    status = lib$getdvi(&item, 0, &dev_desc, &lockid, 0, 0);
+    if (!(status & 1)) {
+      switch (status) {
+        case SS$_NOSUCHDEV: 
+          SETERRNO(ENODEV, status);
+          return 0;
+        default: 
+          _ckvmssts(status);
+      }
+    }
     if (lockid) return (lockid & ~LOCKID_MASK);
   }
 #endif
End of Patch.

Reply via email to