From: John Malmberg Date: Sun, 22 Feb 2009 18:23:29 +0000 (-0600) Subject: vms.c - Remove .DIR; in UNIX mode. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f785e3a13bdb70150178a2baa433614531998f17;p=p5sagit%2Fp5-mst-13.2.git vms.c - Remove .DIR; in UNIX mode. When doing a readdir() or glob() with DECC$FILENAME_UNIX_REPORT active, the ".DIR" suffix needs to be removed for directories. --- diff --git a/vms/vms.c b/vms/vms.c index c9c9aca..10ee36b 100644 --- a/vms/vms.c +++ b/vms/vms.c @@ -10473,18 +10473,14 @@ Perl_readdir(pTHX_ DIR *dd) /* 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; } } } @@ -14370,6 +14366,20 @@ mp_do_vms_realpath(pTHX_ const char *filespec, char *outbuf, 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);