diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 2000-03-14 21:26:33 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 2000-03-14 21:26:33 +0000 |
commit | 08c7cbbb0fc466967038dcb56ca4f1b828b96269 (patch) | |
tree | fad77e4b1531338ba6f46112dcfefbae58e72a32 /vms/vms.c | |
parent | e277ebbfff2cc1c7947da9ad3d8fab33a272bc5c (diff) | |
download | perl-08c7cbbb0fc466967038dcb56ca4f1b828b96269.tar.gz |
integrate vmsperl changes into mainline (change#5693 denied)
p4raw-link: @5693 on //depot/vmsperl: 925fd5a3f200998584b0c9f5f508f038863055cb
p4raw-id: //depot/perl@5742
p4raw-integrated: from //depot/vmsperl@5741 'copy in'
vms/ext/filespec.t (@5564..) t/lib/filespec.t vms/vms.c
(@5689..) configure.com (@5690..) 'edit in'
lib/File/Spec/VMS.pm (@5690..) 'ignore' t/lib/complex.t
(@5690..)
Diffstat (limited to 'vms/vms.c')
-rw-r--r-- | vms/vms.c | 30 |
1 files changed, 24 insertions, 6 deletions
@@ -106,7 +106,7 @@ int vmstrnenv(const char *lnm, char *eqv, unsigned long int idx, struct dsc$descriptor_s **tabvec, unsigned long int flags) { - char uplnm[LNM$C_NAMLENGTH], *cp1, *cp2; + char uplnm[LNM$C_NAMLENGTH+1], *cp1, *cp2; unsigned short int eqvlen, curtab, ivlnm = 0, ivsym = 0, ivenv = 0, secure; unsigned long int retsts, attr = LNM$M_CASE_BLIND; unsigned char acmode; @@ -141,6 +141,7 @@ vmstrnenv(const char *lnm, char *eqv, unsigned long int idx, } lnmdsc.dsc$w_length = cp1 - lnm; lnmdsc.dsc$a_pointer = uplnm; + uplnm[lnmdsc.dsc$w_length] = '\0'; secure = flags & PERL__TRNENV_SECURE; acmode = secure ? PSL$C_EXEC : PSL$C_USER; if (!tabvec || !*tabvec) tabvec = env_tables; @@ -210,6 +211,19 @@ vmstrnenv(const char *lnm, char *eqv, unsigned long int idx, retsts = sys$trnlnm(&attr,tabvec[curtab],&lnmdsc,&acmode,lnmlst); if (retsts == SS$_IVLOGNAM) { ivlnm = 1; continue; } if (retsts == SS$_NOLOGNAM) continue; + /* PPFs have a prefix */ + if ( +#if INTSIZE == 4 + *((int *)uplnm) == *((int *)"SYS$") && +#endif + eqvlen >= 4 && eqv[0] == 0x1b && eqv[1] == 0x00 && + ( (uplnm[4] == 'O' && !strcmp(uplnm,"SYS$OUTPUT")) || + (uplnm[4] == 'I' && !strcmp(uplnm,"SYS$INPUT")) || + (uplnm[4] == 'E' && !strcmp(uplnm,"SYS$ERROR")) || + (uplnm[4] == 'C' && !strcmp(uplnm,"SYS$COMMAND")) ) ) { + memcpy(eqv,eqv+4,eqvlen-4); + eqvlen -= 4; + } break; } } @@ -2163,12 +2177,16 @@ static char *do_tovmsspec(char *path, char *buf, int ts) { else if (!infront && *cp2 == '.') { if (cp2+1 == dirend || *(cp2+1) == '\0') { cp2++; break; } else if (*(cp2+1) == '/') cp2++; /* skip over "./" - it's redundant */ - else if (*(cp2+1) == '.' && (*(cp2+2) == '/' || *(cp2+2) == '\0')) { /* handle "../" */ - if (*(cp1-1) == '-' || *(cp1-1) == '[') *(cp1++) = '-'; + else if (*(cp2+1) == '.' && (*(cp2+2) == '/' || *(cp2+2) == '\0')) { + if (*(cp1-1) == '-' || *(cp1-1) == '[') *(cp1++) = '-'; /* handle "../" */ else if (*(cp1-2) == '[') *(cp1-1) = '-'; - else { -/* if (*(cp1-1) != '.') *(cp1++) = '.'; */ - *(cp1++) = '-'; + else { /* back up over previous directory name */ + cp1--; + while (*(cp1-1) != '.' && *(cp1-1) != '[') cp1--; + if (*(cp1-1) == '[') { + memcpy(cp1,"000000.",7); + cp1 += 7; + } } cp2 += 2; if (cp2 == dirend) break; |