Just a quick update: I think that I've found the smoking gun here.
Note that with a vms.c that is equipped with the following .+printf()s
This is not a patch
$ gdiff -u vms.c;1 vms.c
--- vms.c;1 Tue Mar 14 15:56:14 2000
+++ vms.c Tue Mar 14 19:02:03 2000
@@ -4549,6 +4549,7 @@
bool
Perl_cando(pTHX_ Mode_t bit, Uid_t effective, Stat_t *statbufp)
{
.+printf("statbufp is now %d\n",statbufp);
if (statbufp == &PL_statcache) return
cando_by_name(bit,effective,namecache);
else {
char fname[NAM$C_MAXRSS+1];
@@ -4562,11 +4563,14 @@
devdsc.dsc$w_length = strlen(((Stat_t *)statbufp)->st_devnam);
namdsc.dsc$a_pointer = fname;
namdsc.dsc$w_length = sizeof fname - 1;
.+printf("st_devnam is now %s\n",((Stat_t *)statbufp)->st_devnam);
retsts = lib$fid_to_name(&devdsc,&(((Stat_t *)statbufp)->st_ino),
&namdsc,&namdsc.dsc$w_length,0,0);
.+printf("retsts is now %d\n",retsts);
if (retsts & 1) {
fname[namdsc.dsc$w_length] = '\0';
.+printf("gonna call cando with fname of %s\n",fname);
return cando_by_name(bit,effective,fname);
}
. else if (retsts == SS$_NOSUCHDEV || retsts == SS$_NOSUCHFILE) {
Not a patch.
I see this toward the bottom of a `MMS/macro=("__DEBUG__=1")` build:
Link
/Trace/Debug/Map/Full/Cross/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=SYS$DISK:[]MINIPERL.EXE
miniperlmain.obj, DBGlibperl.olb/Library/Include=globals
,[]crtl.opt/Options
MCR Sys$Disk:[]miniperl.exe "-I[.lib]" [.VMS]Writemain.pl "DynaLoader Socket"
statbufp is now 285880
st_devnam is now _SNFRN$DKB100
retsts is now 1
gonna call cando with fname of USER:[VMSPERL.VMS]WRITEMAIN.PL;1
Fatal VMS error (status=114762) at DKB100:[VMSPERL]VMS.C;11, line 4678.
%RMS-E-DNF, directory not found
-NONAME-W-NOMSG, Message number 00000000
%MMS-F-ABORT, For target PERLMAIN.C, CLI returned abort status: %X0001C04A.
-RMS-E-DNF, directory not found
Thus lib$fid_to_name() apparently feels compelled to change a perfectly OK
device name doing s/\Q_SNFRN$DKB100\E/USER/ for some odd reason. The bug is
Compaq's and I now have to hunt up a patch :-{
Peter Prymmer