+ else {
+ strcpy(cmd,"Show Logical *");
+ if (str$case_blind_compare(env_tables[i],&fildevdsc)) {
+ strcat(cmd," /Table=");
+ strncat(cmd,env_tables[i]->dsc$a_pointer,env_tables[i]->dsc$w_length);
+ cmddsc.dsc$w_length = strlen(cmd);
+ }
+ else cmddsc.dsc$w_length = 14; /* N.B. We test this below */
+ flags = defflags | CLI$M_NOCLISYM;
+ }
+
+ /* Create a new subprocess to execute each command, to exclude the
+ * remote possibility that someone could subvert a mbx or file used
+ * to write multiple commands to a single subprocess.
+ */
+ do {
+ retsts = lib$spawn(&cmddsc,&nldsc,&mbxdsc,&flags,0,&subpid,&substs,
+ 0,&riseandshine,0,0,&clidsc,&clitabdsc);
+ flags &= ~CLI$M_TRUSTED; /* Just in case we hit a really old version */
+ defflags &= ~CLI$M_TRUSTED;
+ } while (retsts == LIB$_INVARG && (flags | CLI$M_TRUSTED));
+ _ckvmssts(retsts);
+ if (!buf) New(1322,buf,mbxbufsiz + 1,char);
+ if (seenhv) SvREFCNT_dec(seenhv);
+ seenhv = newHV();
+ while (1) {
+ char *cp1, *cp2, *key;
+ unsigned long int sts, iosb[2], retlen, keylen;
+ register U32 hash;
+
+ sts = sys$qiow(0,chan,IO$_READVBLK,iosb,0,0,buf,mbxbufsiz,0,0,0,0);
+ if (sts & 1) sts = iosb[0] & 0xffff;
+ if (sts == SS$_ENDOFFILE) {
+ int wakect = 0;
+ while (substs == 0) { sys$hiber(); wakect++;}
+ if (wakect > 1) sys$wake(0,0); /* Stole someone else's wake */
+ _ckvmssts(substs);
+ break;
+ }
+ _ckvmssts(sts);
+ retlen = iosb[0] >> 16;
+ if (!retlen) continue; /* blank line */
+ buf[retlen] = '\0';
+ if (iosb[1] != subpid) {
+ if (iosb[1]) {
+ Perl_croak(aTHX_ "Unknown process %x sent message to prime_env_iter: %s",buf);
+ }
+ continue;
+ }
+ if (sts == SS$_BUFFEROVF && ckWARN(WARN_INTERNAL))
+ Perl_warner(aTHX_ WARN_INTERNAL,"Buffer overflow in prime_env_iter: %s",buf);
+
+ for (cp1 = buf; *cp1 && isspace(*cp1); cp1++) ;
+ if (*cp1 == '(' || /* Logical name table name */
+ *cp1 == '=' /* Next eqv of searchlist */) continue;
+ if (*cp1 == '"') cp1++;
+ for (cp2 = cp1; *cp2 && *cp2 != '"' && *cp2 != ' '; cp2++) ;
+ key = cp1; keylen = cp2 - cp1;
+ if (keylen && hv_exists(seenhv,key,keylen)) continue;
+ while (*cp2 && *cp2 != '=') cp2++;
+ while (*cp2 && *cp2 == '=') cp2++;
+ while (*cp2 && *cp2 == ' ') cp2++;
+ if (*cp2 == '"') { /* String translation; may embed "" */
+ for (cp1 = buf + retlen; *cp1 != '"'; cp1--) ;
+ cp2++; cp1--; /* Skip "" surrounding translation */
+ }
+ else { /* Numeric translation */
+ for (cp1 = cp2; *cp1 && *cp1 != ' '; cp1++) ;
+ cp1--; /* stop on last non-space char */
+ }
+ if ((!keylen || (cp1 - cp2 < -1)) && ckWARN(WARN_INTERNAL)) {
+ Perl_warner(aTHX_ WARN_INTERNAL,"Ill-formed message in prime_env_iter: |%s|",buf);