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_n (&nbfd
->section_htab
,
67 bfd_section_hash_newfunc
,
73 nbfd
->sections
= (asection
*) NULL
;
74 nbfd
->section_tail
= &nbfd
->sections
;
75 nbfd
->format
= bfd_unknown
;
76 nbfd
->my_archive
= (bfd
*) NULL
;
78 nbfd
->opened_once
= false;
79 nbfd
->output_has_begun
= false;
80 nbfd
->section_count
= 0;
81 nbfd
->usrdata
= (PTR
) NULL
;
82 nbfd
->cacheable
= false;
83 nbfd
->flags
= BFD_NO_FLAGS
;
84 nbfd
->mtime_set
= false;
89 /* Allocate a new BFD as a member of archive OBFD. */
92 _bfd_new_bfd_contained_in (obfd
)
97 nbfd
= _bfd_new_bfd ();
100 nbfd
->xvec
= obfd
->xvec
;
101 nbfd
->my_archive
= obfd
;
102 nbfd
->direction
= read_direction
;
103 nbfd
->target_defaulted
= obfd
->target_defaulted
;
110 _bfd_delete_bfd (abfd
)
113 bfd_hash_table_free (&abfd
->section_htab
);
114 objalloc_free ((struct objalloc
*) abfd
->memory
);
120 Opening and closing BFDs
129 bfd *bfd_openr(const char *filename, const char *target);
132 Open the file @var{filename} (using <<fopen>>) with the target
133 @var{target}. Return a pointer to the created BFD.
135 Calls <<bfd_find_target>>, so @var{target} is interpreted as by
138 If <<NULL>> is returned then an error has occured. Possible errors
139 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or
140 <<system_call>> error.
144 bfd_openr (filename
, target
)
145 const char *filename
;
149 const bfd_target
*target_vec
;
151 nbfd
= _bfd_new_bfd ();
155 target_vec
= bfd_find_target (target
, nbfd
);
156 if (target_vec
== NULL
)
158 _bfd_delete_bfd (nbfd
);
162 nbfd
->filename
= filename
;
163 nbfd
->direction
= read_direction
;
165 if (bfd_open_file (nbfd
) == NULL
)
167 /* File didn't exist, or some such. */
168 bfd_set_error (bfd_error_system_call
);
169 _bfd_delete_bfd (nbfd
);
176 /* Don't try to `optimize' this function:
178 o - We lock using stack space so that interrupting the locking
179 won't cause a storage leak.
180 o - We open the file stream last, since we don't want to have to
181 close it if anything goes wrong. Closing the stream means closing
182 the file descriptor too, even though we didn't open it. */
188 bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
191 <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to
192 <<fopen>>. It opens a BFD on a file already described by the
195 When the file is later <<bfd_close>>d, the file descriptor will
196 be closed. If the caller desires that this file descriptor be
197 cached by BFD (opened as needed, closed as needed to free
198 descriptors for other opens), with the supplied @var{fd} used as
199 an initial file descriptor (but subject to closure at any time),
200 call bfd_set_cacheable(bfd, 1) on the returned BFD. The default
201 is to assume no cacheing; the file descriptor will remain open
202 until <<bfd_close>>, and will not be affected by BFD operations
205 Possible errors are <<bfd_error_no_memory>>,
206 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
210 bfd_fdopenr (filename
, target
, fd
)
211 const char *filename
;
216 const bfd_target
*target_vec
;
219 bfd_set_error (bfd_error_system_call
);
220 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
221 fdflags
= O_RDWR
; /* Assume full access. */
223 fdflags
= fcntl (fd
, F_GETFL
, NULL
);
228 nbfd
= _bfd_new_bfd ();
232 target_vec
= bfd_find_target (target
, nbfd
);
233 if (target_vec
== NULL
)
235 _bfd_delete_bfd (nbfd
);
240 nbfd
->iostream
= (PTR
) fopen (filename
, FOPEN_RB
);
242 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
243 switch (fdflags
& (O_ACCMODE
))
245 case O_RDONLY
: nbfd
->iostream
= (PTR
) fdopen (fd
, FOPEN_RB
); break;
246 case O_WRONLY
: nbfd
->iostream
= (PTR
) fdopen (fd
, FOPEN_RUB
); break;
247 case O_RDWR
: nbfd
->iostream
= (PTR
) fdopen (fd
, FOPEN_RUB
); break;
252 if (nbfd
->iostream
== NULL
)
254 _bfd_delete_bfd (nbfd
);
258 /* OK, put everything where it belongs. */
259 nbfd
->filename
= filename
;
261 /* As a special case we allow a FD open for read/write to
262 be written through, although doing so requires that we end
263 the previous clause with a preposition. */
264 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
265 switch (fdflags
& (O_ACCMODE
))
267 case O_RDONLY
: nbfd
->direction
= read_direction
; break;
268 case O_WRONLY
: nbfd
->direction
= write_direction
; break;
269 case O_RDWR
: nbfd
->direction
= both_direction
; break;
273 if (! bfd_cache_init (nbfd
))
275 _bfd_delete_bfd (nbfd
);
278 nbfd
->opened_once
= true;
288 bfd *bfd_openstreamr(const char *, const char *, PTR);
292 Open a BFD for read access on an existing stdio stream. When
293 the BFD is passed to <<bfd_close>>, the stream will be closed.
297 bfd_openstreamr (filename
, target
, streamarg
)
298 const char *filename
;
302 FILE *stream
= (FILE *) streamarg
;
304 const bfd_target
*target_vec
;
306 nbfd
= _bfd_new_bfd ();
310 target_vec
= bfd_find_target (target
, nbfd
);
311 if (target_vec
== NULL
)
313 _bfd_delete_bfd (nbfd
);
317 nbfd
->iostream
= (PTR
) stream
;
318 nbfd
->filename
= filename
;
319 nbfd
->direction
= read_direction
;
321 if (! bfd_cache_init (nbfd
))
323 _bfd_delete_bfd (nbfd
);
330 /* bfd_openw -- open for writing.
331 Returns a pointer to a freshly-allocated BFD on success, or NULL.
333 See comment by bfd_fdopenr before you try to modify this function. */
340 bfd *bfd_openw(const char *filename, const char *target);
343 Create a BFD, associated with file @var{filename}, using the
344 file format @var{target}, and return a pointer to it.
346 Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>,
347 <<bfd_error_invalid_target>>.
351 bfd_openw (filename
, target
)
352 const char *filename
;
356 const bfd_target
*target_vec
;
358 /* nbfd has to point to head of malloc'ed block so that bfd_close may
359 reclaim it correctly. */
360 nbfd
= _bfd_new_bfd ();
364 target_vec
= bfd_find_target (target
, nbfd
);
365 if (target_vec
== NULL
)
367 _bfd_delete_bfd (nbfd
);
371 nbfd
->filename
= filename
;
372 nbfd
->direction
= write_direction
;
374 if (bfd_open_file (nbfd
) == NULL
)
376 /* File not writeable, etc. */
377 bfd_set_error (bfd_error_system_call
);
378 _bfd_delete_bfd (nbfd
);
391 boolean bfd_close(bfd *abfd);
395 Close a BFD. If the BFD was open for writing, then pending
396 operations are completed and the file written out and closed.
397 If the created file is executable, then <<chmod>> is called
400 All memory attached to the BFD is released.
402 The file descriptor associated with the BFD is closed (even
403 if it was passed in to BFD by <<bfd_fdopenr>>).
406 <<true>> is returned if all is ok, otherwise <<false>>.
416 if (bfd_write_p (abfd
))
418 if (! BFD_SEND_FMT (abfd
, _bfd_write_contents
, (abfd
)))
422 if (! BFD_SEND (abfd
, _close_and_cleanup
, (abfd
)))
425 ret
= bfd_cache_close (abfd
);
427 /* If the file was open for writing and is now executable,
430 && abfd
->direction
== write_direction
431 && abfd
->flags
& EXEC_P
)
435 if (stat (abfd
->filename
, &buf
) == 0)
437 unsigned int mask
= umask (0);
440 chmod (abfd
->filename
,
442 & (buf
.st_mode
| ((S_IXUSR
| S_IXGRP
| S_IXOTH
) &~ mask
))));
446 _bfd_delete_bfd (abfd
);
456 boolean bfd_close_all_done(bfd *);
459 Close a BFD. Differs from <<bfd_close>> since it does not
460 complete any pending operations. This routine would be used
461 if the application had just used BFD for swapping and didn't
462 want to use any of the writing code.
464 If the created file is executable, then <<chmod>> is called
467 All memory attached to the BFD is released.
470 <<true>> is returned if all is ok, otherwise <<false>>.
474 bfd_close_all_done (abfd
)
479 ret
= bfd_cache_close (abfd
);
481 /* If the file was open for writing and is now executable,
484 && abfd
->direction
== write_direction
485 && abfd
->flags
& EXEC_P
)
489 if (stat (abfd
->filename
, &buf
) == 0)
491 unsigned int mask
= umask (0);
494 chmod (abfd
->filename
,
496 & (buf
.st_mode
| ((S_IXUSR
| S_IXGRP
| S_IXOTH
) &~ mask
))));
500 _bfd_delete_bfd (abfd
);
510 bfd *bfd_create(const char *filename, bfd *templ);
513 Create a new BFD in the manner of <<bfd_openw>>, but without
514 opening a file. The new BFD takes the target from the target
515 used by @var{template}. The format is always set to <<bfd_object>>.
519 bfd_create (filename
, templ
)
520 const char *filename
;
525 nbfd
= _bfd_new_bfd ();
528 nbfd
->filename
= filename
;
530 nbfd
->xvec
= templ
->xvec
;
531 nbfd
->direction
= no_direction
;
532 bfd_set_format (nbfd
, bfd_object
);
542 boolean bfd_make_writable(bfd *abfd);
545 Takes a BFD as created by <<bfd_create>> and converts it
546 into one like as returned by <<bfd_openw>>. It does this
547 by converting the BFD to BFD_IN_MEMORY. It's assumed that
548 you will call <<bfd_make_readable>> on this bfd later.
551 <<true>> is returned if all is ok, otherwise <<false>>.
555 bfd_make_writable(abfd
)
558 struct bfd_in_memory
*bim
;
560 if (abfd
->direction
!= no_direction
)
562 bfd_set_error (bfd_error_invalid_operation
);
566 bim
= ((struct bfd_in_memory
*)
567 bfd_malloc ((bfd_size_type
) sizeof (struct bfd_in_memory
)));
568 abfd
->iostream
= (PTR
) bim
;
569 /* bfd_bwrite will grow these as needed. */
573 abfd
->flags
|= BFD_IN_MEMORY
;
574 abfd
->direction
= write_direction
;
585 boolean bfd_make_readable(bfd *abfd);
588 Takes a BFD as created by <<bfd_create>> and
589 <<bfd_make_writable>> and converts it into one like as
590 returned by <<bfd_openr>>. It does this by writing the
591 contents out to the memory buffer, then reversing the
595 <<true>> is returned if all is ok, otherwise <<false>>. */
598 bfd_make_readable(abfd
)
601 if (abfd
->direction
!= write_direction
|| !(abfd
->flags
& BFD_IN_MEMORY
))
603 bfd_set_error (bfd_error_invalid_operation
);
607 if (! BFD_SEND_FMT (abfd
, _bfd_write_contents
, (abfd
)))
610 if (! BFD_SEND (abfd
, _close_and_cleanup
, (abfd
)))
614 abfd
->arch_info
= &bfd_default_arch_struct
;
617 abfd
->format
= bfd_unknown
;
618 abfd
->my_archive
= (bfd
*) NULL
;
620 abfd
->opened_once
= false;
621 abfd
->output_has_begun
= false;
622 abfd
->section_count
= 0;
623 abfd
->usrdata
= (PTR
) NULL
;
624 abfd
->cacheable
= false;
625 abfd
->flags
= BFD_IN_MEMORY
;
626 abfd
->mtime_set
= false;
628 abfd
->target_defaulted
= true;
629 abfd
->direction
= read_direction
;
632 abfd
->outsymbols
= 0;
635 bfd_section_list_clear (abfd
);
636 bfd_check_format (abfd
, bfd_object
);
646 PTR bfd_alloc (bfd *abfd, size_t wanted);
649 Allocate a block of @var{wanted} bytes of memory attached to
650 <<abfd>> and return a pointer to it.
655 bfd_alloc (abfd
, size
)
661 if (size
!= (unsigned long) size
)
663 bfd_set_error (bfd_error_no_memory
);
667 ret
= objalloc_alloc (abfd
->memory
, (unsigned long) size
);
669 bfd_set_error (bfd_error_no_memory
);
674 bfd_zalloc (abfd
, size
)
680 res
= bfd_alloc (abfd
, size
);
682 memset (res
, 0, (size_t) size
);
686 /* Free a block allocated for a BFD.
687 Note: Also frees all more recently allocated blocks! */
690 bfd_release (abfd
, block
)
694 objalloc_free_block ((struct objalloc
*) abfd
->memory
, block
);