bfd * bfd_openstreamr (const char *filename, const char *target, void *streamarg) { FILE *stream = streamarg; bfd *nbfd; const bfd_target *target_vec; nbfd = _bfd_new_bfd (); if (nbfd == NULL) return NULL; target_vec = bfd_find_target (target, nbfd); if (target_vec == NULL) { _bfd_delete_bfd (nbfd); return NULL; } nbfd->iostream = stream; nbfd->filename = filename; nbfd->direction = read_direction; if (! bfd_cache_init (nbfd)) { _bfd_delete_bfd (nbfd); return NULL; } return nbfd; }
bfd * bfd_openstreamr (const char *filename, const char *target, void *streamarg) { FILE *stream = (FILE *) streamarg; bfd *nbfd; const bfd_target *target_vec; nbfd = _bfd_new_bfd (); if (nbfd == NULL) return NULL; target_vec = bfd_find_target (target, nbfd); if (target_vec == NULL) { _bfd_delete_bfd (nbfd); return NULL; } nbfd->iostream = stream; /* PR 11983: Do not cache the original filename, but rather make a copy - the original might go away. */ nbfd->filename = xstrdup (filename); nbfd->direction = read_direction; if (! bfd_cache_init (nbfd)) { _bfd_delete_bfd (nbfd); return NULL; } return nbfd; }
bfd * bfd_fopen (const char *filename, const char *target, const char *mode, int fd) { bfd *nbfd; const bfd_target *target_vec; nbfd = _bfd_new_bfd (); if (nbfd == NULL) return NULL; target_vec = bfd_find_target (target, nbfd); if (target_vec == NULL) { _bfd_delete_bfd (nbfd); return NULL; } #ifdef HAVE_FDOPEN if (fd != -1) nbfd->iostream = fdopen (fd, mode); else #endif nbfd->iostream = real_fopen (filename, mode); if (nbfd->iostream == NULL) { bfd_set_error (bfd_error_system_call); _bfd_delete_bfd (nbfd); return NULL; } /* OK, put everything where it belongs. */ nbfd->filename = filename; /* Figure out whether the user is opening the file for reading, writing, or both, by looking at the MODE argument. */ if ((mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a') && mode[1] == '+') nbfd->direction = both_direction; else if (mode[0] == 'r') nbfd->direction = read_direction; else nbfd->direction = write_direction; if (! bfd_cache_init (nbfd)) { _bfd_delete_bfd (nbfd); return NULL; } nbfd->opened_once = TRUE; /* If we opened the file by name, mark it cacheable; we can close it and reopen it later. However, if a file descriptor was provided, then it may have been opened with special flags that make it unsafe to close and reopen the file. */ if (fd == -1) bfd_set_cacheable (nbfd, TRUE); return nbfd; }
bfd * _bfd_new_bfd_contained_in (bfd *obfd) { bfd *nbfd; nbfd = _bfd_new_bfd (); if (nbfd == NULL) return NULL; nbfd->xvec = obfd->xvec; nbfd->iovec = obfd->iovec; nbfd->my_archive = obfd; nbfd->direction = read_direction; nbfd->target_defaulted = obfd->target_defaulted; return nbfd; }
bfd * _bfd_new_bfd_contained_in (bfd *obfd) { bfd *nbfd; nbfd = _bfd_new_bfd (); if (nbfd == NULL) return NULL; nbfd->xvec = obfd->xvec; nbfd->iovec = obfd->iovec; if (obfd->iovec == &opncls_iovec) nbfd->iostream = obfd->iostream; nbfd->my_archive = obfd; nbfd->direction = read_direction; nbfd->target_defaulted = obfd->target_defaulted; nbfd->lto_output = obfd->lto_output; nbfd->no_export = obfd->no_export; return nbfd; }