[blead-667-gec4d613] vms.c - Remove .DIR; in UNIX mode.

[email protected] (John Malmberg)
Newsgroups perl.perl5.porters,perl.vmsperl
Message-ID <[email protected]>
When doing a readdir() or glob() with DECC$FILENAME_UNIX_REPORT active, 
the ".DIR" suffix needs to be removed for directories.

-John
[email protected]
Personal Opinion Only
vms_c.gdiff (text/plain, 1.9 KB)
--- /rsync_root/perl/vms/vms.c	Fri Feb 20 17:44:08 2009
+++ vms/vms.c	Sat Feb 21 22:50:33 2009
@@ -10473,18 +10473,14 @@
         /* 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, &statbuf.crtl_stat);
-                    if ((ret_sts == 0) && S_ISDIR(statbuf.st_mode)) {
-                        e_len = 0;
-                        e_spec[0] = 0;
-                    }
+            if (is_dir_ext(e_spec, e_len, vs_spec, vs_len)) {
+                Stat_t statbuf;
+                int ret_sts;
+
+                ret_sts = flex_lstat(buff, &statbuf);
+                if ((ret_sts == 0) && S_ISDIR(statbuf.st_mode)) {
+                    e_len = 0;
+                    e_spec[0] = 0;
                 }
             }
         }
@@ -14369,6 +14365,20 @@
 	            /* Trim off the version */
 	            int file_len = v_len + r_len + d_len + n_len + e_len;
 	            vms_spec[file_len] = 0;
+
+                    /* Trim off the .DIR if this is a directory */
+                    if (is_dir_ext(e_spec, e_len, vs_spec, vs_len)) {
+                        if (S_ISDIR(my_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';
+		    }
 
 	            /* The result is expected to be in UNIX format */
 		    rslt = int_tounixspec(vms_spec, outbuf, utf8_fl);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.