1 /* opncls.c -- open and close a BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
4 Free Software Foundation, Inc.
6 Written by Cygnus Support.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
30 #define S_IXUSR 0100 /* Execute by owner. */
33 #define S_IXGRP 0010 /* Execute by group. */
36 #define S_IXOTH 0001 /* Execute by others. */
39 /* fdopen is a loser -- we should use stdio exclusively. Unfortunately
40 if we do that we can't use fcntl. */
42 /* Return a new BFD. All BFD's are allocated through this routine. */
49 nbfd = (bfd *) bfd_zmalloc ((bfd_size_type) sizeof (bfd));
53 nbfd->memory = (PTR) objalloc_create ();
54 if (nbfd->memory == NULL)
56 bfd_set_error (bfd_error_no_memory);
61 nbfd->arch_info = &bfd_default_arch_struct;
63 nbfd->direction = no_direction;
64 nbfd->iostream = NULL;
66 if (!bfd_hash_table_init (&nbfd->section_htab, bfd_section_hash_newfunc))
71 nbfd->sections = (asection *) NULL;
72 nbfd->section_tail = &nbfd->sections;
73 nbfd->format = bfd_unknown;
74 nbfd->my_archive = (bfd *) NULL;
76 nbfd->opened_once = false;
77 nbfd->output_has_begun = false;
78 nbfd->section_count = 0;
79 nbfd->usrdata = (PTR) NULL;
80 nbfd->cacheable = false;
81 nbfd->flags = BFD_NO_FLAGS;
82 nbfd->mtime_set = false;
87 /* Allocate a new BFD as a member of archive OBFD. */
90 _bfd_new_bfd_contained_in (obfd)
95 nbfd = _bfd_new_bfd ();
98 nbfd->xvec = obfd->xvec;
99 nbfd->my_archive = obfd;
100 nbfd->direction = read_direction;
101 nbfd->target_defaulted = obfd->target_defaulted;
108 _bfd_delete_bfd (abfd)
111 bfd_hash_table_free (&abfd->section_htab);
112 objalloc_free ((struct objalloc *) abfd->memory);
118 Opening and closing BFDs
127 bfd *bfd_openr(const char *filename, const char *target);
130 Open the file @var{filename} (using <<fopen>>) with the target
131 @var{target}. Return a pointer to the created BFD.
133 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
136 If <<NULL>> is returned then an error has occured. Possible errors
137 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or <<system_call>> error.
141 bfd_openr (filename, target)
142 const char *filename;
146 const bfd_target *target_vec;
148 nbfd = _bfd_new_bfd ();
152 target_vec = bfd_find_target (target, nbfd);
153 if (target_vec == NULL)
155 bfd_set_error (bfd_error_invalid_target);
156 _bfd_delete_bfd (nbfd);
160 nbfd->filename = filename;
161 nbfd->direction = read_direction;
163 if (bfd_open_file (nbfd) == NULL)
165 /* File didn't exist, or some such. */
166 bfd_set_error (bfd_error_system_call);
167 _bfd_delete_bfd (nbfd);
174 /* Don't try to `optimize' this function:
176 o - We lock using stack space so that interrupting the locking
177 won't cause a storage leak.
178 o - We open the file stream last, since we don't want to have to
179 close it if anything goes wrong. Closing the stream means closing
180 the file descriptor too, even though we didn't open it. */
186 bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
189 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>.
190 It opens a BFD on a file already described by the @var{fd}
193 When the file is later <<bfd_close>>d, the file descriptor will be closed.
195 If the caller desires that this file descriptor be cached by BFD
196 (opened as needed, closed as needed to free descriptors for
197 other opens), with the supplied @var{fd} used as an initial
198 file descriptor (but subject to closure at any time), call
199 bfd_set_cacheable(bfd, 1) on the returned BFD. The default is to
200 assume no cacheing; the file descriptor will remain open until
201 <<bfd_close>>, and will not be affected by BFD operations on other
204 Possible errors are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
208 bfd_fdopenr (filename, target, fd)
209 const char *filename;
214 const bfd_target *target_vec;
217 bfd_set_error (bfd_error_system_call);
218 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
219 fdflags = O_RDWR; /* Assume full access. */
221 fdflags = fcntl (fd, F_GETFL, NULL);
223 if (fdflags == -1) return NULL;
225 nbfd = _bfd_new_bfd ();
229 target_vec = bfd_find_target (target, nbfd);
230 if (target_vec == NULL)
232 bfd_set_error (bfd_error_invalid_target);
233 _bfd_delete_bfd (nbfd);
238 nbfd->iostream = (PTR) fopen (filename, FOPEN_RB);
240 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
241 switch (fdflags & (O_ACCMODE))
243 case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break;
244 case O_WRONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break;
245 case O_RDWR: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break;
250 if (nbfd->iostream == NULL)
252 _bfd_delete_bfd (nbfd);
256 /* OK, put everything where it belongs. */
257 nbfd->filename = filename;
259 /* As a special case we allow a FD open for read/write to
260 be written through, although doing so requires that we end
261 the previous clause with a preposition. */
262 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
263 switch (fdflags & (O_ACCMODE))
265 case O_RDONLY: nbfd->direction = read_direction; break;
266 case O_WRONLY: nbfd->direction = write_direction; break;
267 case O_RDWR: nbfd->direction = both_direction; break;
271 if (! bfd_cache_init (nbfd))
273 _bfd_delete_bfd (nbfd);
276 nbfd->opened_once = true;
286 bfd *bfd_openstreamr(const char *, const char *, PTR);
290 Open a BFD for read access on an existing stdio stream. When
291 the BFD is passed to <<bfd_close>>, the stream will be closed.
295 bfd_openstreamr (filename, target, streamarg)
296 const char *filename;
300 FILE *stream = (FILE *) streamarg;
302 const bfd_target *target_vec;
304 nbfd = _bfd_new_bfd ();
308 target_vec = bfd_find_target (target, nbfd);
309 if (target_vec == NULL)
311 bfd_set_error (bfd_error_invalid_target);
312 _bfd_delete_bfd (nbfd);
316 nbfd->iostream = (PTR) stream;
317 nbfd->filename = filename;
318 nbfd->direction = read_direction;
320 if (! bfd_cache_init (nbfd))
322 _bfd_delete_bfd (nbfd);
329 /* bfd_openw -- open for writing.
330 Returns a pointer to a freshly-allocated BFD on success, or NULL.
332 See comment by bfd_fdopenr before you try to modify this function. */
339 bfd *bfd_openw(const char *filename, const char *target);
342 Create a BFD, associated with file @var{filename}, using the
343 file format @var{target}, and return a pointer to it.
345 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
346 <<bfd_error_invalid_target>>.
350 bfd_openw (filename, target)
351 const char *filename;
355 const bfd_target *target_vec;
357 bfd_set_error (bfd_error_system_call);
359 /* nbfd has to point to head of malloc'ed block so that bfd_close may
360 reclaim it correctly. */
361 nbfd = _bfd_new_bfd ();
365 target_vec = bfd_find_target (target, nbfd);
366 if (target_vec == NULL)
368 _bfd_delete_bfd (nbfd);
372 nbfd->filename = filename;
373 nbfd->direction = write_direction;
375 if (bfd_open_file (nbfd) == NULL)
377 /* File not writeable, etc. */
378 bfd_set_error (bfd_error_system_call);
379 _bfd_delete_bfd (nbfd);
392 boolean bfd_close(bfd *abfd);
396 Close a BFD. If the BFD was open for writing,
397 then pending operations are completed and the file written out
398 and closed. If the created file is executable, then
399 <<chmod>> is called to mark it as such.
401 All memory attached to the BFD is released.
403 The file descriptor associated with the BFD is closed (even
404 if it was passed in to BFD by <<bfd_fdopenr>>).
407 <<true>> is returned if all is ok, otherwise <<false>>.
417 if (bfd_write_p (abfd))
419 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
423 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
426 ret = bfd_cache_close (abfd);
428 /* If the file was open for writing and is now executable,
431 && abfd->direction == write_direction
432 && abfd->flags & EXEC_P)
436 if (stat (abfd->filename, &buf) == 0)
438 unsigned int mask = umask (0);
441 chmod (abfd->filename,
443 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
447 _bfd_delete_bfd (abfd);
457 boolean bfd_close_all_done(bfd *);
460 Close a BFD. Differs from <<bfd_close>>
461 since it does not complete any pending operations. This
462 routine would be used if the application had just used BFD for
463 swapping and didn't want to use any of the writing code.
465 If the created file is executable, then <<chmod>> is called
468 All memory attached to the BFD is released.
471 <<true>> is returned if all is ok, otherwise <<false>>.
475 bfd_close_all_done (abfd)
480 ret = bfd_cache_close (abfd);
482 /* If the file was open for writing and is now executable,
485 && abfd->direction == write_direction
486 && abfd->flags & EXEC_P)
490 if (stat (abfd->filename, &buf) == 0)
492 unsigned int mask = umask (0);
495 chmod (abfd->filename,
497 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
501 _bfd_delete_bfd (abfd);
511 bfd *bfd_create(const char *filename, bfd *templ);
514 Create a new BFD in the manner of
515 <<bfd_openw>>, but without opening a file. The new BFD
516 takes the target from the target used by @var{template}. The
517 format is always set to <<bfd_object>>.
521 bfd_create (filename, templ)
522 const char *filename;
527 nbfd = _bfd_new_bfd ();
530 nbfd->filename = filename;
532 nbfd->xvec = templ->xvec;
533 nbfd->direction = no_direction;
534 bfd_set_format (nbfd, bfd_object);
544 boolean bfd_make_writable(bfd *abfd);
547 Takes a BFD as created by <<bfd_create>> and converts it
548 into one like as returned by <<bfd_openw>>. It does this
549 by converting the BFD to BFD_IN_MEMORY. It's assumed that
550 you will call <<bfd_make_readable>> on this bfd later.
553 <<true>> is returned if all is ok, otherwise <<false>>.
557 bfd_make_writable(abfd)
560 struct bfd_in_memory *bim;
562 if (abfd->direction != no_direction)
564 bfd_set_error (bfd_error_invalid_operation);
568 bim = ((struct bfd_in_memory *)
569 bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
570 abfd->iostream = (PTR) bim;
571 /* bfd_bwrite will grow these as needed. */
575 abfd->flags |= BFD_IN_MEMORY;
576 abfd->direction = write_direction;
587 boolean bfd_make_readable(bfd *abfd);
590 Takes a BFD as created by <<bfd_create>> and
591 <<bfd_make_writable>> and converts it into one like as
592 returned by <<bfd_openr>>. It does this by writing the
593 contents out to the memory buffer, then reversing the
597 <<true>> is returned if all is ok, otherwise <<false>>. */
600 bfd_make_readable(abfd)
603 if (abfd->direction != write_direction || !(abfd->flags & BFD_IN_MEMORY))
605 bfd_set_error (bfd_error_invalid_operation);
609 if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
612 if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
616 abfd->arch_info = &bfd_default_arch_struct;
619 abfd->format = bfd_unknown;
620 abfd->my_archive = (bfd *) NULL;
622 abfd->opened_once = false;
623 abfd->output_has_begun = false;
624 abfd->section_count = 0;
625 abfd->usrdata = (PTR) NULL;
626 abfd->cacheable = false;
627 abfd->flags = BFD_IN_MEMORY;
628 abfd->mtime_set = false;
630 abfd->target_defaulted = true;
631 abfd->direction = read_direction;
634 abfd->outsymbols = 0;
637 bfd_section_list_clear (abfd);
638 bfd_check_format (abfd, bfd_object);
648 PTR bfd_alloc (bfd *abfd, size_t wanted);
651 Allocate a block of @var{wanted} bytes of memory attached to
652 <<abfd>> and return a pointer to it.
657 bfd_alloc (abfd, size)
663 if (size != (unsigned long) size)
665 bfd_set_error (bfd_error_no_memory);
669 ret = objalloc_alloc (abfd->memory, (unsigned long) size);
671 bfd_set_error (bfd_error_no_memory);
676 bfd_zalloc (abfd, size)
682 res = bfd_alloc (abfd, size);
684 memset (res, 0, (size_t) size);
688 /* Free a block allocated for a BFD.
689 Note: Also frees all more recently allocated blocks! */
692 bfd_release (abfd, block)
696 objalloc_free_block ((struct objalloc *) abfd->memory, block);