[This was supposed to have been e-mailed before the stat patch]
This adds a vmspath routine that does not use a thread context. Next some updates to stat handling. -John Personal Opinion Only
--- /rsync_root/perl/vms/vms.c Sun Jan 25 17:50:08 2009 +++ vms/vms.c Mon Jan 26 00:31:06 2009 @@ -304,6 +304,7 @@ (const char *path, char *buf, int dir_flag, int * utf8_flag); static char * int_fileify_dirspec(const char *dir, char *buf, int *utf8_fl); static char * int_tounixspec(const char *spec, char *buf, int * utf8_fl); +static char * int_tovmspath(const char *path, char *buf, int * utf8_fl); /* see system service docs for $TRNLNM -- NOT the same as LNM$_MAX_INDEX */ #define PERL_LNM_MAX_ALLOWED_INDEX 127 @@ -5354,7 +5355,7 @@ if ((dst_sts == 0) && S_ISDIR(dst_st.st_mode)) { /* VMS pathify a dir target */ - ret_str = do_tovmspath(dst, vms_dst, 0, NULL); + ret_str = int_tovmspath(dst, vms_dst, NULL); if (ret_str == NULL) { PerlMem_free(vms_src); PerlMem_free(vms_dst); @@ -8935,6 +8936,33 @@ char *Perl_tovmsspec_utf8_ts(pTHX_ const char *path, char *buf, int * utf8_fl) { return do_tovmsspec(path,buf,1,utf8_fl); } +/*{{{ char *int_tovmspath(char *path, char *buf, const int *)*/ +/* Internal routine for use with out an explict context present */ +static char * int_tovmspath(const char *path, char *buf, int * utf8_fl) { + + char * ret_spec, *pathified; + + if (path == NULL) + return NULL; + + pathified = PerlMem_malloc(VMS_MAXRSS); + if (pathified == NULL) + _ckvmssts_noperl(SS$_INSFMEM); + + ret_spec = int_pathify_dirspec(path, pathified); + + if (ret_spec == NULL) { + PerlMem_free(pathified); + return NULL; + } + + ret_spec = int_tovmsspec(pathified, buf, 0, utf8_fl); + + PerlMem_free(pathified); + return ret_spec; + +} + /*{{{ char *tovmspath[_ts](char *path, char *buf, const int *)*/ static char *mp_do_tovmspath(pTHX_ const char *path, char *buf, int ts, int * utf8_fl) { static char __tovmspath_retbuf[VMS_MAXRSS]; @@ -10106,7 +10134,7 @@ Stat_t sb; Newx(dir, VMS_MAXRSS, char); - if (do_tovmspath(name,dir,0,NULL) == NULL) { + if (int_tovmspath(name, dir, NULL) == NULL) { Safefree(dir); return NULL; }