summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--iperlsys.h2
-rw-r--r--vms/vms.c24
-rw-r--r--vms/vmsish.h5
3 files changed, 29 insertions, 2 deletions
diff --git a/iperlsys.h b/iperlsys.h
index f36dcd5f32..59da4748cb 100644
--- a/iperlsys.h
+++ b/iperlsys.h
@@ -551,7 +551,7 @@ struct IPerlDirInfo
#define PerlDir_mkdir(name, mode) Mkdir((name), (mode))
#ifdef VMS
-# define PerlDir_chdir(n) chdir(((n) && *(n)) ? (n) : "SYS$LOGIN")
+# define PerlDir_chdir(n) Chdir(((n) && *(n)) ? (n) : "SYS$LOGIN")
#else
# define PerlDir_chdir(name) chdir((name))
#endif
diff --git a/vms/vms.c b/vms/vms.c
index c18ca49879..c50d828e7c 100644
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -911,6 +911,30 @@ my_mkdir(char *dir, Mode_t mode)
} /* end of my_mkdir */
/*}}}*/
+/*{{{int my_chdir(char *)*/
+int
+my_chdir(char *dir)
+{
+ STRLEN dirlen = strlen(dir);
+ dTHX;
+
+ /* zero length string sometimes gives ACCVIO */
+ if (dirlen == 0) return -1;
+
+ /* some versions of CRTL chdir() doesn't tolerate trailing /, since
+ * that implies
+ * null file name/type. However, it's commonplace under Unix,
+ * so we'll allow it for a gain in portability.
+ */
+ if (dir[dirlen-1] == '/') {
+ char *newdir = savepvn(dir,dirlen-1);
+ int ret = chdir(newdir);
+ Safefree(newdir);
+ return ret;
+ }
+ else return chdir(dir);
+} /* end of my_chdir */
+/*}}}*/
static void
create_mbx(unsigned short int *chan, struct dsc$descriptor_s *namdsc)
diff --git a/vms/vmsish.h b/vms/vmsish.h
index e53c604d16..c21f8f329e 100644
--- a/vms/vmsish.h
+++ b/vms/vmsish.h
@@ -109,6 +109,7 @@
#define do_rmdir Perl_do_rmdir
#define kill_file Perl_kill_file
#define my_mkdir Perl_my_mkdir
+#define my_chdir Perl_my_chdir
#define my_utime Perl_my_utime
#define rmsexpand Perl_rmsexpand
#define rmsexpand_ts Perl_rmsexpand_ts
@@ -447,8 +448,9 @@ struct utimbuf {
/* Ditto for sys$hash_passwrod() . . . */
#define crypt my_crypt
-/* Tweak arg to mkdir first, so we can tolerate trailing /. */
+/* Tweak arg to mkdir & chdir first, so we can tolerate trailing /. */
#define Mkdir(dir,mode) my_mkdir((dir),(mode))
+#define Chdir(dir) my_chdir((dir))
/* Use our own stat() clones, which handle Unix-style directory names */
#define Stat(name,bufptr) flex_stat(name,bufptr)
@@ -638,6 +640,7 @@ char * my_gconvert (double, int, int, char *);
int do_rmdir (char *);
int kill_file (char *);
int my_mkdir (char *, Mode_t);
+int my_chdir (char *);
int my_utime (char *, struct utimbuf *);
char * rmsexpand (char *, char *, char *, unsigned);
char * rmsexpand_ts (char *, char *, char *, unsigned);