This patch addresses two issues: 1. The setting for features should be case-insensitive.
2. The enabling of sys$posix_root was not working on threaded perl. -John [EMAIL PROTECTED] personal opinion only
--- /ref1_root/perl/vms/vms.c Sun Dec 7 07:59:24 2008 +++ vms/vms.c Sun Dec 7 08:25:58 2008 @@ -356,9 +356,7 @@ static int vms_posix_exit = 0; /* bug workarounds if needed */ -int decc_bug_readdir_efs1 = 0; int decc_bug_devnull = 1; -int decc_bug_fgetname = 0; int decc_dir_barename = 0; static int vms_debug_on_exception = 0; @@ -9185,6 +9183,8 @@ vms_image_init(int *argcp, char ***argvp) { char eqv[LNM$C_NAMLENGTH+1] = ""; + int status; + char val_str[10]; unsigned int len, tabct = 8, tabidx = 0; unsigned long int *mask, iosb[2], i, rlst[128], rsz; unsigned long int iprv[(sizeof(union prvdef) + sizeof(unsigned long int) - 1) / sizeof(unsigned long int)]; @@ -9202,6 +9202,35 @@ Perl_csighandler_init(); #endif + /* This was moved from the pre-image init handler because on threaded */ + /* Perl it was always returning 0 for the default value. */ + status = simple_trnlnm("SYS$POSIX_ROOT", val_str, sizeof(val_str)); + if (status > 0) { + int s; + s = decc$feature_get_index("DECC$DISABLE_POSIX_ROOT"); + if (s > 0) { + int initial; + initial = decc$feature_get_value(s, 4); + if (initial >= 0) { + /* initial is -1 if nothing has set the feature */ + /* initial is 1 if the logical name is present */ + decc_disable_posix_root = decc$feature_get_value(s, 1); + + /* If the value is not valid, force the feature off */ + if (decc_disable_posix_root < 0) { + decc$feature_set_value(s, 1, 1); + decc_disable_posix_root = 1; + } + } + else { + /* Traditionally Perl assumes this is off */ + decc_disable_posix_root = 1; + decc$feature_set_value(s, 1, 1); + } + } + } + + _ckvmssts_noperl(sys$getjpiw(0,NULL,NULL,jpilist,iosb,NULL,NULL)); _ckvmssts_noperl(iosb[0]); for (i = 0; i < sizeof iprv / sizeof(unsigned long int); i++) { @@ -13753,20 +13782,33 @@ vms_debug_on_exception = 0; status = sys_trnlnm("PERL_VMS_EXCEPTION_DEBUG", val_str, sizeof(val_str)); if ($VMS_STATUS_SUCCESS(status)) { + val_str[0] = _toupper(val_str[0]); if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) vms_debug_on_exception = 1; else vms_debug_on_exception = 0; } + /* Debug unix/vms file translation routines */ + vms_debug_fileify = 0; + status = sys_trnlnm("PERL_VMS_FILEIFY_DEBUG", val_str, sizeof(val_str)); + if ($VMS_STATUS_SUCCESS(status)) { + val_str[0] = _toupper(val_str[0]); + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + vms_debug_fileify = 1; + else + vms_debug_fileify = 0; + } + /* Create VTF-7 filenames from Unicode instead of UTF-8 */ vms_vtf7_filenames = 0; status = sys_trnlnm("PERL_VMS_VTF7_FILENAMES", val_str, sizeof(val_str)); if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - vms_vtf7_filenames = 1; + val_str[0] = _toupper(val_str[0]); + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + vms_vtf7_filenames = 1; else - vms_vtf7_filenames = 0; + vms_vtf7_filenames = 0; } @@ -13775,10 +13817,11 @@ status = sys_trnlnm ("PERL_VMS_UNLINK_ALL_VERSIONS", val_str, sizeof(val_str)); if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - vms_unlink_all_versions = 1; - else - vms_unlink_all_versions = 0; + val_str[0] = _toupper(val_str[0]); + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + vms_unlink_all_versions = 1; + else + vms_unlink_all_versions = 0; } /* Dectect running under GNV Bash or other UNIX like shell */ @@ -13800,44 +13843,26 @@ /* hacks to see if known bugs are still present for testing */ - /* Readdir is returning filenames in VMS syntax always */ - decc_bug_readdir_efs1 = 1; - status = sys_trnlnm("DECC_BUG_READDIR_EFS1", val_str, sizeof(val_str)); - if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - decc_bug_readdir_efs1 = 1; - else - decc_bug_readdir_efs1 = 0; - } - /* PCP mode requires creating /dev/null special device file */ decc_bug_devnull = 0; status = sys_trnlnm("DECC_BUG_DEVNULL", val_str, sizeof(val_str)); if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - decc_bug_devnull = 1; - else - decc_bug_devnull = 0; - } - - /* fgetname returning a VMS name in UNIX mode */ - decc_bug_fgetname = 1; - status = sys_trnlnm("DECC_BUG_FGETNAME", val_str, sizeof(val_str)); - if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - decc_bug_fgetname = 1; - else - decc_bug_fgetname = 0; + val_str[0] = _toupper(val_str[0]); + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + decc_bug_devnull = 1; + else + decc_bug_devnull = 0; } /* UNIX directory names with no paths are broken in a lot of places */ decc_dir_barename = 1; status = sys_trnlnm("DECC_DIR_BARENAME", val_str, sizeof(val_str)); if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - decc_dir_barename = 1; - else - decc_dir_barename = 0; + val_str[0] = _toupper(val_str[0]); + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + decc_dir_barename = 1; + else + decc_dir_barename = 0; } #if __CRTL_VER >= 70300000 && !defined(__VAX) @@ -13898,26 +13923,6 @@ decc_readdir_dropdotnotype = 0; } - status = sys_trnlnm("SYS$POSIX_ROOT", val_str, sizeof(val_str)); - if ($VMS_STATUS_SUCCESS(status)) { - s = decc$feature_get_index("DECC$DISABLE_POSIX_ROOT"); - if (s >= 0) { - dflt = decc$feature_get_value(s, 4); - if (dflt > 0) { - decc_disable_posix_root = decc$feature_get_value(s, 1); - if (decc_disable_posix_root <= 0) { - decc$feature_set_value(s, 1, 1); - decc_disable_posix_root = 1; - } - } - else { - /* Traditionally Perl assumes this is off */ - decc_disable_posix_root = 1; - decc$feature_set_value(s, 1, 1); - } - } - } - #if __CRTL_VER >= 80200000 s = decc$feature_get_index("DECC$POSIX_COMPLIANT_PATHNAMES"); if (s >= 0) { @@ -14001,10 +14006,11 @@ status = sys_trnlnm ("PERL_VMS_POSIX_EXIT", val_str, sizeof(val_str)); if ($VMS_STATUS_SUCCESS(status)) { - if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) - vms_posix_exit = 1; + val_str[0] = _toupper(val_str[0]); + if ((val_str[0] == 'E') || (val_str[0] == '1') || (val_str[0] == 'T')) + vms_posix_exit = 1; else - vms_posix_exit = 0; + vms_posix_exit = 0; }