Write contents if writeable.

This commit is contained in:
Nick Clifton 2002-04-15 14:32:28 +00:00
parent 45b9982791
commit c4f3d13082
2 changed files with 37 additions and 36 deletions

View File

@ -1,3 +1,8 @@
2002-04-15 Michael Snyder <msnyder@redhat.com>
* opncls.c (bfd_close): Write contents if writeable.
Minor formatting tidy-ups.
2002-04-15 Alan Modra <alan@weed.local>
* elf32-ppc.c (ppc_elf_add_symbol_hook): Check the hash table type.

View File

@ -1,25 +1,25 @@
/* opncls.c -- open and close a BFD.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
2001
2001, 2002
Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
@ -39,9 +39,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* fdopen is a loser -- we should use stdio exclusively. Unfortunately
if we do that we can't use fcntl. */
/* FIXME: This is no longer used. */
long _bfd_chunksize = -1;
/* Return a new BFD. All BFD's are allocated through this routine. */
bfd *
@ -163,7 +160,7 @@ bfd_openr (filename, target)
if (bfd_open_file (nbfd) == NULL)
{
/* File didn't exist, or some such */
/* File didn't exist, or some such. */
bfd_set_error (bfd_error_system_call);
_bfd_delete_bfd (nbfd);
return NULL;
@ -178,8 +175,7 @@ bfd_openr (filename, target)
won't cause a storage leak.
o - We open the file stream last, since we don't want to have to
close it if anything goes wrong. Closing the stream means closing
the file descriptor too, even though we didn't open it.
*/
the file descriptor too, even though we didn't open it. */
/*
FUNCTION
bfd_fdopenr
@ -218,7 +214,7 @@ bfd_fdopenr (filename, target, fd)
bfd_set_error (bfd_error_system_call);
#if ! defined(HAVE_FCNTL) || ! defined(F_GETFL)
fdflags = O_RDWR; /* Assume full access */
fdflags = O_RDWR; /* Assume full access. */
#else
fdflags = fcntl (fd, F_GETFL, NULL);
#endif
@ -239,7 +235,7 @@ bfd_fdopenr (filename, target, fd)
#ifndef HAVE_FDOPEN
nbfd->iostream = (PTR) fopen (filename, FOPEN_RB);
#else
/* (O_ACCMODE) parens are to avoid Ultrix header file bug */
/* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
switch (fdflags & (O_ACCMODE))
{
case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break;
@ -255,14 +251,13 @@ bfd_fdopenr (filename, target, fd)
return NULL;
}
/* OK, put everything where it belongs */
/* OK, put everything where it belongs. */
nbfd->filename = filename;
/* As a special case we allow a FD open for read/write to
be written through, although doing so requires that we end
the previous clause with a preposition. */
/* (O_ACCMODE) parens are to avoid Ultrix header file bug */
/* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
switch (fdflags & (O_ACCMODE))
{
case O_RDONLY: nbfd->direction = read_direction; break;
@ -329,10 +324,10 @@ bfd_openstreamr (filename, target, streamarg)
return nbfd;
}
/** bfd_openw -- open for writing.
Returns a pointer to a freshly-allocated BFD on success, or NULL.
/* bfd_openw -- open for writing.
Returns a pointer to a freshly-allocated BFD on success, or NULL.
See comment by bfd_fdopenr before you try to modify this function. */
See comment by bfd_fdopenr before you try to modify this function. */
/*
FUNCTION
@ -360,8 +355,7 @@ bfd_openw (filename, target)
bfd_set_error (bfd_error_system_call);
/* nbfd has to point to head of malloc'ed block so that bfd_close may
reclaim it correctly. */
reclaim it correctly. */
nbfd = _bfd_new_bfd ();
if (nbfd == NULL)
return NULL;
@ -378,7 +372,8 @@ bfd_openw (filename, target)
if (bfd_open_file (nbfd) == NULL)
{
bfd_set_error (bfd_error_system_call); /* File not writeable, etc */
/* File not writeable, etc. */
bfd_set_error (bfd_error_system_call);
_bfd_delete_bfd (nbfd);
return NULL;
}
@ -417,7 +412,7 @@ bfd_close (abfd)
{
boolean ret;
if (!bfd_read_p (abfd))
if (bfd_write_p (abfd))
{
if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
return false;
@ -429,7 +424,7 @@ bfd_close (abfd)
ret = bfd_cache_close (abfd);
/* If the file was open for writing and is now executable,
make it so */
make it so. */
if (ret
&& abfd->direction == write_direction
&& abfd->flags & EXEC_P)
@ -439,6 +434,7 @@ bfd_close (abfd)
if (stat (abfd->filename, &buf) == 0)
{
unsigned int mask = umask (0);
umask (mask);
chmod (abfd->filename,
(0777
@ -471,7 +467,6 @@ DESCRIPTION
RETURNS
<<true>> is returned if all is ok, otherwise <<false>>.
*/
boolean
@ -483,7 +478,7 @@ bfd_close_all_done (abfd)
ret = bfd_cache_close (abfd);
/* If the file was open for writing and is now executable,
make it so */
make it so. */
if (ret
&& abfd->direction == write_direction
&& abfd->flags & EXEC_P)
@ -493,6 +488,7 @@ bfd_close_all_done (abfd)
if (stat (abfd->filename, &buf) == 0)
{
unsigned int mask = umask (0);
umask (mask);
chmod (abfd->filename,
(0777
@ -517,7 +513,6 @@ DESCRIPTION
<<bfd_openw>>, but without opening a file. The new BFD
takes the target from the target used by @var{template}. The
format is always set to <<bfd_object>>.
*/
bfd *
@ -535,6 +530,7 @@ bfd_create (filename, templ)
nbfd->xvec = templ->xvec;
nbfd->direction = no_direction;
bfd_set_format (nbfd, bfd_object);
return nbfd;
}
@ -570,7 +566,7 @@ bfd_make_writable(abfd)
bim = ((struct bfd_in_memory *)
bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
abfd->iostream = (PTR) bim;
/* bfd_bwrite will grow these as needed */
/* bfd_bwrite will grow these as needed. */
bim->size = 0;
bim->buffer = 0;