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;
     }
 
 

Reply via email to