Readdir() on VMS, when opening a directory with a UNIX file specification, should return all the files in UNIX format.

This includes dropping the ".DIR" from the directory specifications.

Because traditionally Perl has not done this, this fix will only be done when the DECC$EFS_CHARSET feature is enabled.


Next on the fix list for Unix compatibility mode, <*> is always returning specifications in VMS format instead of UNIX format when DECC$FILENAME_UNIX_REPORT is active.

Regards,
-John
--- /rsync_root/perl/vms/vms.c  Mon Nov 10 06:51:29 2008
+++ vms/vms.c   Sat Nov 22 10:46:34 2008
@@ -9631,11 +9631,32 @@
        &vs_spec,
        &vs_len);
 
-    /* Drop NULL extensions on UNIX file specification */
-    if ((dd->flags & PERL_VMSDIR_M_UNIXSPECS &&
-       (e_len == 1) && decc_readdir_dropdotnotype)) {
-       e_len = 0;
-       e_spec[0] = '\0';
+    if (dd->flags & PERL_VMSDIR_M_UNIXSPECS) {
+
+        /* In Unix report mode, remove the ".dir;1" from the name */
+        /* if it is a real directory. */
+        if (decc_filename_unix_report || decc_efs_charset) {
+            if ((e_len == 4) && (vs_len == 2) && (vs_spec[1] == '1')) {
+                if ((toupper(e_spec[1]) == 'D') &&
+                    (toupper(e_spec[2]) == 'I') &&
+                    (toupper(e_spec[3]) == 'R')) {
+                    Stat_t statbuf;
+                    int ret_sts;
+
+                    ret_sts = stat(buff, (stat_t *)&statbuf);
+                    if ((ret_sts == 0) && S_ISDIR(statbuf.st_mode)) {
+                        e_len = 0;
+                        e_spec[0] = 0;
+                    }
+                }
+            }
+        }
+
+        /* Drop NULL extensions on UNIX file specification */
+       if ((e_len == 1) && decc_readdir_dropdotnotype) {
+           e_len = 0;
+           e_spec[0] = '\0';
+        }
     }
 
     strncpy(dd->entry.d_name, n_spec, n_len + e_len);

Reply via email to