At the moment I've enabled as the default (on systems that have the
infrastructure) John Malmberg's symlink support in the Perl that will
become 5.10.  I'm having second thoughts about whether the underlying
support in VMS is good enough or complete enough to make it the
default, so I thought I would throw it out there for discussion.

Not long ago, we found out that the unlink() function in the CRTL
doesn't work on symlinks unless DECC$POSIX_COMPLIANT_PATHNAMES is
defined, and defining that is likely to break lots of things.  John
worked around that by writing his own unlink() based on SYS$ERASE,
and other projects have done the same, for example Python:

http://forums1.itrc.hp.com/service/forums/questionanswer.do?threadId=1157019

I've been trying to track down test failures in the File::Find tests
in blead, and have discovered that chdir() also does not work on
symlinks.  The obvious solution is to call realpath() in our chdir()
wrapper before calling the CRTL's chdir(), but this obvious solution
doesn't work.  It doesn't work because realpath() does not work
unless posix-compliant pathnames are enabled.  Unlike the unlink
case, that's documented behavior in the v8.3 CRTL:

http://h71000.www7.hp.com/doc/83final/5763/5763pro_021.html#crtl_symlinks

I can probably get around this by doing a SYS$PARSE on the symlink
name without setting the special flag (NAML$M_OPEN_SPECIAL), so
SYS$PARSE will follow the symbolic link and give me a resulting
directory spec I can pass to chdir().  Actually the resulting spec
will probably need further conversion because in my experiments if
the symbolic link points to /disk/dir/subdir, SYS$PARSE gives me
disk:[dir]subdir as the resulting spec, and I need to make that
disk:[dir.subdir] to work with chdir(). Or I could perhaps try
something based on readlink(), but then I don't know if that will
work outside of PCP mode either.

So rolling our own chdir() should be doable, one way or another.  But
this made me stop and wonder how many other CRTL routines that
operate on files need to be changed to handle symbolic links
properly, but haven't been as of OpenVMS v8.3.  Anyone know of cases
besides unlink() and chdir() that don't work?  Should we be bold and
enable this support in Perl even though we don't know how much of it
actually works?

--
________________________________________
Craig A. Berry
mailto:[EMAIL PROTECTED]

"... getting out of a sonnet is much more
 difficult than getting in."
                 Brad Leithauser

Reply via email to