| OLD | NEW |
| 1 /* opncls.c -- open and close a BFD. | 1 /* opncls.c -- open and close a BFD. |
| 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, | 2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, |
| 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 | 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 |
| 4 Free Software Foundation, Inc. | 4 Free Software Foundation, Inc. |
| 5 | 5 |
| 6 Written by Cygnus Support. | 6 Written by Cygnus Support. |
| 7 | 7 |
| 8 This file is part of BFD, the Binary File Descriptor library. | 8 This file is part of BFD, the Binary File Descriptor library. |
| 9 | 9 |
| 10 This program is free software; you can redistribute it and/or modify | 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 | 11 it under the terms of the GNU General Public License as published by |
| 12 the Free Software Foundation; either version 3 of the License, or | 12 the Free Software Foundation; either version 3 of the License, or |
| 13 (at your option) any later version. | 13 (at your option) any later version. |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 <<fdopen>>. | 183 <<fdopen>>. |
| 184 | 184 |
| 185 Calls <<bfd_find_target>>, so @var{target} is interpreted as by | 185 Calls <<bfd_find_target>>, so @var{target} is interpreted as by |
| 186 that function. | 186 that function. |
| 187 | 187 |
| 188 The new BFD is marked as cacheable iff @var{fd} is -1. | 188 The new BFD is marked as cacheable iff @var{fd} is -1. |
| 189 | 189 |
| 190 If <<NULL>> is returned then an error has occured. Possible errors | 190 If <<NULL>> is returned then an error has occured. Possible errors |
| 191 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or | 191 are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or |
| 192 <<system_call>> error. | 192 <<system_call>> error. |
| 193 |
| 194 On error, @var{fd} is always closed. |
| 193 */ | 195 */ |
| 194 | 196 |
| 195 bfd * | 197 bfd * |
| 196 bfd_fopen (const char *filename, const char *target, const char *mode, int fd) | 198 bfd_fopen (const char *filename, const char *target, const char *mode, int fd) |
| 197 { | 199 { |
| 198 bfd *nbfd; | 200 bfd *nbfd; |
| 199 const bfd_target *target_vec; | 201 const bfd_target *target_vec; |
| 200 | 202 |
| 201 nbfd = _bfd_new_bfd (); | 203 nbfd = _bfd_new_bfd (); |
| 202 if (nbfd == NULL) | 204 if (nbfd == NULL) |
| 203 return NULL; | 205 { |
| 206 if (fd != -1) |
| 207 » close (fd); |
| 208 return NULL; |
| 209 } |
| 204 | 210 |
| 205 target_vec = bfd_find_target (target, nbfd); | 211 target_vec = bfd_find_target (target, nbfd); |
| 206 if (target_vec == NULL) | 212 if (target_vec == NULL) |
| 207 { | 213 { |
| 214 if (fd != -1) |
| 215 close (fd); |
| 208 _bfd_delete_bfd (nbfd); | 216 _bfd_delete_bfd (nbfd); |
| 209 return NULL; | 217 return NULL; |
| 210 } | 218 } |
| 211 | 219 |
| 212 #ifdef HAVE_FDOPEN | 220 #ifdef HAVE_FDOPEN |
| 213 if (fd != -1) | 221 if (fd != -1) |
| 214 nbfd->iostream = fdopen (fd, mode); | 222 nbfd->iostream = fdopen (fd, mode); |
| 215 else | 223 else |
| 216 #endif | 224 #endif |
| 217 nbfd->iostream = real_fopen (filename, mode); | 225 nbfd->iostream = real_fopen (filename, mode); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 cached by BFD (opened as needed, closed as needed to free | 308 cached by BFD (opened as needed, closed as needed to free |
| 301 descriptors for other opens), with the supplied @var{fd} used as | 309 descriptors for other opens), with the supplied @var{fd} used as |
| 302 an initial file descriptor (but subject to closure at any time), | 310 an initial file descriptor (but subject to closure at any time), |
| 303 call bfd_set_cacheable(bfd, 1) on the returned BFD. The default | 311 call bfd_set_cacheable(bfd, 1) on the returned BFD. The default |
| 304 is to assume no caching; the file descriptor will remain open | 312 is to assume no caching; the file descriptor will remain open |
| 305 until <<bfd_close>>, and will not be affected by BFD operations | 313 until <<bfd_close>>, and will not be affected by BFD operations |
| 306 on other files. | 314 on other files. |
| 307 | 315 |
| 308 Possible errors are <<bfd_error_no_memory>>, | 316 Possible errors are <<bfd_error_no_memory>>, |
| 309 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>. | 317 <<bfd_error_invalid_target>> and <<bfd_error_system_call>>. |
| 318 |
| 319 On error, @var{fd} is closed. |
| 310 */ | 320 */ |
| 311 | 321 |
| 312 bfd * | 322 bfd * |
| 313 bfd_fdopenr (const char *filename, const char *target, int fd) | 323 bfd_fdopenr (const char *filename, const char *target, int fd) |
| 314 { | 324 { |
| 315 const char *mode; | 325 const char *mode; |
| 316 #if defined(HAVE_FCNTL) && defined(F_GETFL) | 326 #if defined(HAVE_FCNTL) && defined(F_GETFL) |
| 317 int fdflags; | 327 int fdflags; |
| 318 #endif | 328 #endif |
| 319 | 329 |
| 320 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL) | 330 #if ! defined(HAVE_FCNTL) || ! defined(F_GETFL) |
| 321 mode = FOPEN_RUB; /* Assume full access. */ | 331 mode = FOPEN_RUB; /* Assume full access. */ |
| 322 #else | 332 #else |
| 323 fdflags = fcntl (fd, F_GETFL, NULL); | 333 fdflags = fcntl (fd, F_GETFL, NULL); |
| 324 if (fdflags == -1) | 334 if (fdflags == -1) |
| 325 { | 335 { |
| 336 int save = errno; |
| 337 |
| 338 close (fd); |
| 339 errno = save; |
| 326 bfd_set_error (bfd_error_system_call); | 340 bfd_set_error (bfd_error_system_call); |
| 327 return NULL; | 341 return NULL; |
| 328 } | 342 } |
| 329 | 343 |
| 330 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */ | 344 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */ |
| 331 switch (fdflags & (O_ACCMODE)) | 345 switch (fdflags & (O_ACCMODE)) |
| 332 { | 346 { |
| 333 case O_RDONLY: mode = FOPEN_RB; break; | 347 case O_RDONLY: mode = FOPEN_RB; break; |
| 334 case O_WRONLY: mode = FOPEN_RUB; break; | 348 case O_WRONLY: mode = FOPEN_RUB; break; |
| 335 case O_RDWR: mode = FOPEN_RUB; break; | 349 case O_RDWR: mode = FOPEN_RUB; break; |
| (...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1523 | 1537 |
| 1524 if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size)) | 1538 if (! bfd_set_section_contents (abfd, sect, contents, 0, debuglink_size)) |
| 1525 { | 1539 { |
| 1526 /* XXX Should we delete the section from the bfd ? */ | 1540 /* XXX Should we delete the section from the bfd ? */ |
| 1527 free (contents); | 1541 free (contents); |
| 1528 return FALSE; | 1542 return FALSE; |
| 1529 } | 1543 } |
| 1530 | 1544 |
| 1531 return TRUE; | 1545 return TRUE; |
| 1532 } | 1546 } |
| OLD | NEW |