- if ((test_len != 0)
- && (bfd_read (PRIV(vms_buf), 1, test_len, abfd) != test_len))
- {
- bfd_set_error (bfd_error_file_truncated);
- return 0;
- }
-
- /* check file format on first call */
-
- if (PRIV(file_format) == FF_UNKNOWN)
- { /* record length repeats ? */
- if ( (vms_buf[0] == vms_buf[4])
- && (vms_buf[1] == vms_buf[5]))
- {
- PRIV(file_format) = FF_FOREIGN; /* Y: foreign environment */
- test_start = 2;
- }
- else
- {
- PRIV(file_format) = FF_NATIVE; /* N: native environment */
- test_start = 0;
- }
- }
-
- if (PRIV(is_vax))
- {
- PRIV(rec_length) = bfd_read (vms_buf, 1, PRIV(buf_size), abfd);
- if (PRIV(rec_length) <= 0)
- {
- bfd_set_error (bfd_error_file_truncated);
- return 0;
- }
- PRIV(vms_rec) = vms_buf;
- }
- else /* Alpha */
- {
- /* extract vms record length */
-
- _bfd_vms_get_header_values (abfd, vms_buf+test_start, NULL,
- &PRIV(rec_length));
-
- if (PRIV(rec_length) <= 0)
- {
- bfd_set_error (bfd_error_file_truncated);
- return 0;
- }
-
- /* that's what the linker manual says */
-
- if (PRIV(rec_length) > EOBJ_S_C_MAXRECSIZ)
- {
- bfd_set_error (bfd_error_file_truncated);
- return 0;
- }
-
- /* adjust the buffer */
-
- if (PRIV(rec_length) > PRIV(buf_size))
- {
- PRIV(vms_buf) = (unsigned char *) realloc (vms_buf, PRIV(rec_length));
- vms_buf = PRIV(vms_buf);
- if (vms_buf == 0)
- {
- bfd_set_error (bfd_error_no_memory);
- return -1;
- }
- PRIV(buf_size) = PRIV(rec_length);
- }
-
- /* read the remaining record */
-
- remaining = PRIV(rec_length) - test_len + test_start;
-
-#if VMS_DEBUG
- vms_debug (10, "bfd_read remaining %d\n", remaining);
-#endif
- if (bfd_read (vms_buf + test_len, 1, remaining, abfd) != remaining)
- {
- bfd_set_error (bfd_error_file_truncated);
- return 0;
- }
- PRIV(vms_rec) = vms_buf + test_start;
- }
-
-#if VMS_DEBUG
- vms_debug (11, "bfd_read rec_length %d\n", PRIV(rec_length));
-#endif
-
- return PRIV(rec_length);