xref: /netbsd/external/gpl3/binutils/dist/binutils/ar.c (revision 6550d01e)
1 /* ar.c - Archive modify and extract.
2    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4    Free Software Foundation, Inc.
5 
6    This file is part of GNU Binutils.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 /*
24    Bugs: should use getopt the way tar does (complete w/optional -) and
25    should have long options too. GNU ar used to check file against filesystem
26    in quick_update and replace operations (would check mtime). Doesn't warn
27    when name truncated. No way to specify pos_end. Error messages should be
28    more consistent.  */
29 
30 #include "sysdep.h"
31 #include "bfd.h"
32 #include "libiberty.h"
33 #include "progress.h"
34 #include "aout/ar.h"
35 #include "libbfd.h"
36 #include "bucomm.h"
37 #include "arsup.h"
38 #include "filenames.h"
39 #include "binemul.h"
40 #include <sys/stat.h>
41 
42 #ifdef __GO32___
43 #define EXT_NAME_LEN 3		/* Bufflen of addition to name if it's MS-DOS.  */
44 #else
45 #define EXT_NAME_LEN 6		/* Ditto for *NIX.  */
46 #endif
47 
48 /* Kludge declaration from BFD!  This is ugly!  FIXME!  XXX  */
49 
50 struct ar_hdr *
51   bfd_special_undocumented_glue (bfd * abfd, const char *filename);
52 
53 /* Static declarations.  */
54 
55 static void mri_emul (void);
56 static const char *normalize (const char *, bfd *);
57 static void remove_output (void);
58 static void map_over_members (bfd *, void (*)(bfd *), char **, int);
59 static void print_contents (bfd * member);
60 static void delete_members (bfd *, char **files_to_delete);
61 
62 static void move_members (bfd *, char **files_to_move);
63 static void replace_members
64   (bfd *, char **files_to_replace, bfd_boolean quick);
65 static void print_descr (bfd * abfd);
66 static void write_archive (bfd *);
67 static int  ranlib_only (const char *archname);
68 static int  ranlib_touch (const char *archname);
69 static void usage (int);
70 
71 /** Globals and flags.  */
72 
73 static int mri_mode;
74 
75 /* This flag distinguishes between ar and ranlib:
76    1 means this is 'ranlib'; 0 means this is 'ar'.
77    -1 means if we should use argv[0] to decide.  */
78 extern int is_ranlib;
79 
80 /* Nonzero means don't warn about creating the archive file if necessary.  */
81 int silent_create = 0;
82 
83 /* Nonzero means describe each action performed.  */
84 int verbose = 0;
85 
86 /* Nonzero means preserve dates of members when extracting them.  */
87 int preserve_dates = 0;
88 
89 /* Nonzero means don't replace existing members whose dates are more recent
90    than the corresponding files.  */
91 int newer_only = 0;
92 
93 /* Controls the writing of an archive symbol table (in BSD: a __.SYMDEF
94    member).  -1 means we've been explicitly asked to not write a symbol table;
95    +1 means we've been explicitly asked to write it;
96    0 is the default.
97    Traditionally, the default in BSD has been to not write the table.
98    However, for POSIX.2 compliance the default is now to write a symbol table
99    if any of the members are object files.  */
100 int write_armap = 0;
101 
102 /* Operate in deterministic mode: write zero for timestamps, uids,
103    and gids for archive members and the archive symbol table, and write
104    consistent file modes.  */
105 int deterministic = 0;
106 
107 /* Nonzero means it's the name of an existing member; position new or moved
108    files with respect to this one.  */
109 char *posname = NULL;
110 
111 /* Sez how to use `posname': pos_before means position before that member.
112    pos_after means position after that member. pos_end means always at end.
113    pos_default means default appropriately. For the latter two, `posname'
114    should also be zero.  */
115 enum pos
116   {
117     pos_default, pos_before, pos_after, pos_end
118   } postype = pos_default;
119 
120 static bfd **
121 get_pos_bfd (bfd **, enum pos, const char *);
122 
123 /* For extract/delete only.  If COUNTED_NAME_MODE is TRUE, we only
124    extract the COUNTED_NAME_COUNTER instance of that name.  */
125 static bfd_boolean counted_name_mode = 0;
126 static int counted_name_counter = 0;
127 
128 /* Whether to truncate names of files stored in the archive.  */
129 static bfd_boolean ar_truncate = FALSE;
130 
131 /* Whether to use a full file name match when searching an archive.
132    This is convenient for archives created by the Microsoft lib
133    program.  */
134 static bfd_boolean full_pathname = FALSE;
135 
136 /* Whether to create a "thin" archive (symbol index only -- no files).  */
137 static bfd_boolean make_thin_archive = FALSE;
138 
139 int interactive = 0;
140 
141 static void
142 mri_emul (void)
143 {
144   interactive = isatty (fileno (stdin));
145   yyparse ();
146 }
147 
148 /* If COUNT is 0, then FUNCTION is called once on each entry.  If nonzero,
149    COUNT is the length of the FILES chain; FUNCTION is called on each entry
150    whose name matches one in FILES.  */
151 
152 static void
153 map_over_members (bfd *arch, void (*function)(bfd *), char **files, int count)
154 {
155   bfd *head;
156   int match_count;
157 
158   if (count == 0)
159     {
160       for (head = arch->archive_next; head; head = head->archive_next)
161 	{
162 	  PROGRESS (1);
163 	  function (head);
164 	}
165       return;
166     }
167 
168   /* This may appear to be a baroque way of accomplishing what we want.
169      However we have to iterate over the filenames in order to notice where
170      a filename is requested but does not exist in the archive.  Ditto
171      mapping over each file each time -- we want to hack multiple
172      references.  */
173 
174   for (; count > 0; files++, count--)
175     {
176       bfd_boolean found = FALSE;
177 
178       match_count = 0;
179       for (head = arch->archive_next; head; head = head->archive_next)
180 	{
181 	  const char * filename;
182 
183 	  PROGRESS (1);
184 	  filename = head->filename;
185 	  if (filename == NULL)
186 	    {
187 	      /* Some archive formats don't get the filenames filled in
188 		 until the elements are opened.  */
189 	      struct stat buf;
190 	      bfd_stat_arch_elt (head, &buf);
191 	    }
192 	  else if (bfd_is_thin_archive (arch))
193 	    {
194 	      /* Thin archives store full pathnames.  Need to normalize.  */
195 	      filename = normalize (filename, arch);
196 	    }
197 
198 	  if ((filename != NULL) &&
199 	      (!FILENAME_CMP (normalize (*files, arch), filename)))
200 	    {
201 	      ++match_count;
202 	      if (counted_name_mode
203 		  && match_count != counted_name_counter)
204 		{
205 		  /* Counting, and didn't match on count; go on to the
206                      next one.  */
207 		  continue;
208 		}
209 
210 	      found = TRUE;
211 	      function (head);
212 	    }
213 	}
214 
215       if (!found)
216 	/* xgettext:c-format */
217 	fprintf (stderr, _("no entry %s in archive\n"), *files);
218     }
219 }
220 
221 bfd_boolean operation_alters_arch = FALSE;
222 
223 static void
224 usage (int help)
225 {
226   FILE *s;
227 
228   s = help ? stdout : stderr;
229 
230   if (! is_ranlib)
231     {
232       /* xgettext:c-format */
233       fprintf (s, _("Usage: %s [emulation options] [-]{dmpqrstx}[abcfilNoPsSuvV] [member-name] [count] archive-file file...\n"),
234 	       program_name);
235       /* xgettext:c-format */
236       fprintf (s, _("       %s -M [<mri-script]\n"), program_name);
237       fprintf (s, _(" commands:\n"));
238       fprintf (s, _("  d            - delete file(s) from the archive\n"));
239       fprintf (s, _("  m[ab]        - move file(s) in the archive\n"));
240       fprintf (s, _("  p            - print file(s) found in the archive\n"));
241       fprintf (s, _("  q[f]         - quick append file(s) to the archive\n"));
242       fprintf (s, _("  r[ab][f][u]  - replace existing or insert new file(s) into the archive\n"));
243       fprintf (s, _("  t            - display contents of archive\n"));
244       fprintf (s, _("  x[o]         - extract file(s) from the archive\n"));
245       fprintf (s, _(" command specific modifiers:\n"));
246       fprintf (s, _("  [a]          - put file(s) after [member-name]\n"));
247       fprintf (s, _("  [b]          - put file(s) before [member-name] (same as [i])\n"));
248       fprintf (s, _("  [D]          - use zero for timestamps and uids/gids\n"));
249       fprintf (s, _("  [N]          - use instance [count] of name\n"));
250       fprintf (s, _("  [f]          - truncate inserted file names\n"));
251       fprintf (s, _("  [P]          - use full path names when matching\n"));
252       fprintf (s, _("  [o]          - preserve original dates\n"));
253       fprintf (s, _("  [u]          - only replace files that are newer than current archive contents\n"));
254       fprintf (s, _(" generic modifiers:\n"));
255       fprintf (s, _("  [c]          - do not warn if the library had to be created\n"));
256       fprintf (s, _("  [s]          - create an archive index (cf. ranlib)\n"));
257       fprintf (s, _("  [S]          - do not build a symbol table\n"));
258       fprintf (s, _("  [T]          - make a thin archive\n"));
259       fprintf (s, _("  [v]          - be verbose\n"));
260       fprintf (s, _("  [V]          - display the version number\n"));
261       fprintf (s, _("  @<file>      - read options from <file>\n"));
262 
263       ar_emul_usage (s);
264     }
265   else
266     {
267       /* xgettext:c-format */
268       fprintf (s, _("Usage: %s [options] archive\n"), program_name);
269       fprintf (s, _(" Generate an index to speed access to archives\n"));
270       fprintf (s, _(" The options are:\n\
271   @<file>                      Read options from <file>\n\
272   -t                           Update the archive's symbol map timestamp\n\
273   -h --help                    Print this help message\n\
274   -v --version                 Print version information\n"));
275     }
276 
277   list_supported_targets (program_name, s);
278 
279   if (REPORT_BUGS_TO[0] && help)
280     fprintf (s, _("Report bugs to %s\n"), REPORT_BUGS_TO);
281 
282   xexit (help ? 0 : 1);
283 }
284 
285 /* Normalize a file name specified on the command line into a file
286    name which we will use in an archive.  */
287 
288 static const char *
289 normalize (const char *file, bfd *abfd)
290 {
291   const char *filename;
292 
293   if (full_pathname)
294     return file;
295 
296   filename = strrchr (file, '/');
297 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
298   {
299     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
300     char *bslash = strrchr (file, '\\');
301 
302     if (filename == NULL || (bslash != NULL && bslash > filename))
303       filename = bslash;
304     if (filename == NULL && file[0] != '\0' && file[1] == ':')
305       filename = file + 1;
306   }
307 #endif
308   if (filename != (char *) NULL)
309     filename++;
310   else
311     filename = file;
312 
313   if (ar_truncate
314       && abfd != NULL
315       && strlen (filename) > abfd->xvec->ar_max_namelen)
316     {
317       char *s;
318 
319       /* Space leak.  */
320       s = xmalloc (abfd->xvec->ar_max_namelen + 1);
321       memcpy (s, filename, abfd->xvec->ar_max_namelen);
322       s[abfd->xvec->ar_max_namelen] = '\0';
323       filename = s;
324     }
325 
326   return filename;
327 }
328 
329 /* Remove any output file.  This is only called via xatexit.  */
330 
331 static const char *output_filename = NULL;
332 static FILE *output_file = NULL;
333 static bfd *output_bfd = NULL;
334 
335 static void
336 remove_output (void)
337 {
338   if (output_filename != NULL)
339     {
340       if (output_bfd != NULL)
341 	bfd_cache_close (output_bfd);
342       if (output_file != NULL)
343 	fclose (output_file);
344       unlink_if_ordinary (output_filename);
345     }
346 }
347 
348 /* The option parsing should be in its own function.
349    It will be when I have getopt working.  */
350 
351 int main (int, char **);
352 
353 int
354 main (int argc, char **argv)
355 {
356   char *arg_ptr;
357   char c;
358   enum
359     {
360       none = 0, delete, replace, print_table,
361       print_files, extract, move, quick_append
362     } operation = none;
363   int arg_index;
364   char **files;
365   int file_count;
366   char *inarch_filename;
367   int show_version;
368   int i;
369   int do_posix = 0;
370 
371 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
372   setlocale (LC_MESSAGES, "");
373 #endif
374 #if defined (HAVE_SETLOCALE)
375   setlocale (LC_CTYPE, "");
376 #endif
377   bindtextdomain (PACKAGE, LOCALEDIR);
378   textdomain (PACKAGE);
379 
380   program_name = argv[0];
381   xmalloc_set_program_name (program_name);
382 
383   expandargv (&argc, &argv);
384 
385   if (is_ranlib < 0)
386     {
387       char *temp;
388 
389       temp = strrchr (program_name, '/');
390 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
391       {
392 	/* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
393 	char *bslash = strrchr (program_name, '\\');
394 
395 	if (temp == NULL || (bslash != NULL && bslash > temp))
396 	  temp = bslash;
397 	if (temp == NULL && program_name[0] != '\0' && program_name[1] == ':')
398 	  temp = program_name + 1;
399       }
400 #endif
401       if (temp == NULL)
402 	temp = program_name;
403       else
404 	++temp;
405       if (strlen (temp) >= 6
406 	  && FILENAME_CMP (temp + strlen (temp) - 6, "ranlib") == 0)
407 	is_ranlib = 1;
408       else
409 	is_ranlib = 0;
410     }
411 
412   if (argc > 1 && argv[1][0] == '-')
413     {
414       if (strcmp (argv[1], "--help") == 0)
415 	usage (1);
416       else if (strcmp (argv[1], "--version") == 0)
417 	{
418 	  if (is_ranlib)
419 	    print_version ("ranlib");
420 	  else
421 	    print_version ("ar");
422 	}
423     }
424 
425   START_PROGRESS (program_name, 0);
426 
427   bfd_init ();
428   set_default_bfd_target ();
429 
430   show_version = 0;
431 
432   xatexit (remove_output);
433 
434   for (i = 1; i < argc; i++)
435     if (! ar_emul_parse_arg (argv[i]))
436       break;
437   argv += (i - 1);
438   argc -= (i - 1);
439 
440   if (is_ranlib)
441     {
442       int status = 0;
443       bfd_boolean touch = FALSE;
444 
445       if (argc < 2
446 	  || strcmp (argv[1], "--help") == 0
447 	  || strcmp (argv[1], "-h") == 0
448 	  || strcmp (argv[1], "-H") == 0)
449 	usage (0);
450       if (strcmp (argv[1], "-V") == 0
451 	  || strcmp (argv[1], "-v") == 0
452 	  || CONST_STRNEQ (argv[1], "--v"))
453 	print_version ("ranlib");
454       arg_index = 1;
455       if (strcmp (argv[1], "-t") == 0)
456 	{
457 	  ++arg_index;
458 	  touch = TRUE;
459 	}
460       while (arg_index < argc)
461 	{
462 	  if (! touch)
463 	    status |= ranlib_only (argv[arg_index]);
464 	  else
465 	    status |= ranlib_touch (argv[arg_index]);
466 	  ++arg_index;
467 	}
468       xexit (status);
469     }
470 
471   if (argc == 2 && strcmp (argv[1], "-M") == 0)
472     {
473       mri_emul ();
474       xexit (0);
475     }
476 
477   if (argc < 2)
478     usage (0);
479 
480   arg_index = 1;
481   arg_ptr = argv[arg_index];
482 
483   if (*arg_ptr == '-')
484     {
485       /* When the first option starts with '-' we support POSIX-compatible
486 	 option parsing.  */
487       do_posix = 1;
488       ++arg_ptr;			/* compatibility */
489     }
490 
491   do
492     {
493       while ((c = *arg_ptr++) != '\0')
494 	{
495 	  switch (c)
496 	    {
497 	    case 'd':
498 	    case 'm':
499 	    case 'p':
500 	    case 'q':
501 	    case 'r':
502 	    case 't':
503 	    case 'x':
504 	      if (operation != none)
505 		fatal (_("two different operation options specified"));
506 	      switch (c)
507 		{
508 		case 'd':
509 		  operation = delete;
510 		  operation_alters_arch = TRUE;
511 		  break;
512 		case 'm':
513 		  operation = move;
514 		  operation_alters_arch = TRUE;
515 		  break;
516 		case 'p':
517 		  operation = print_files;
518 		  break;
519 		case 'q':
520 		  operation = quick_append;
521 		  operation_alters_arch = TRUE;
522 		  break;
523 		case 'r':
524 		  operation = replace;
525 		  operation_alters_arch = TRUE;
526 		  break;
527 		case 't':
528 		  operation = print_table;
529 		  break;
530 		case 'x':
531 		  operation = extract;
532 		  break;
533 		}
534 	    case 'l':
535 	      break;
536 	    case 'c':
537 	      silent_create = 1;
538 	      break;
539 	    case 'o':
540 	      preserve_dates = 1;
541 	      break;
542 	    case 'V':
543 	      show_version = TRUE;
544 	      break;
545 	    case 's':
546 	      write_armap = 1;
547 	      break;
548 	    case 'S':
549 	      write_armap = -1;
550 	      break;
551 	    case 'u':
552 	      newer_only = 1;
553 	      break;
554 	    case 'v':
555 	      verbose = 1;
556 	      break;
557 	    case 'a':
558 	      postype = pos_after;
559 	      break;
560 	    case 'b':
561 	      postype = pos_before;
562 	      break;
563 	    case 'i':
564 	      postype = pos_before;
565 	      break;
566 	    case 'M':
567 	      mri_mode = 1;
568 	      break;
569 	    case 'N':
570 	      counted_name_mode = TRUE;
571 	      break;
572 	    case 'f':
573 	      ar_truncate = TRUE;
574 	      break;
575 	    case 'P':
576 	      full_pathname = TRUE;
577 	      break;
578 	    case 'D':
579 	      deterministic = TRUE;
580 	      break;
581 	    case 'T':
582 	      make_thin_archive = TRUE;
583 	      break;
584 	    default:
585 	      /* xgettext:c-format */
586 	      non_fatal (_("illegal option -- %c"), c);
587 	      usage (0);
588 	    }
589 	}
590 
591       /* With POSIX-compatible option parsing continue with the next
592 	 argument if it starts with '-'.  */
593       if (do_posix && arg_index + 1 < argc && argv[arg_index + 1][0] == '-')
594 	arg_ptr = argv[++arg_index] + 1;
595       else
596 	do_posix = 0;
597     }
598   while (do_posix);
599 
600   if (show_version)
601     print_version ("ar");
602 
603   ++arg_index;
604   if (arg_index >= argc)
605     usage (0);
606 
607   if (mri_mode)
608     {
609       mri_emul ();
610     }
611   else
612     {
613       bfd *arch;
614 
615       /* We don't use do_quick_append any more.  Too many systems
616 	 expect ar to always rebuild the symbol table even when q is
617 	 used.  */
618 
619       /* We can't write an armap when using ar q, so just do ar r
620          instead.  */
621       if (operation == quick_append && write_armap)
622 	operation = replace;
623 
624       if ((operation == none || operation == print_table)
625 	  && write_armap == 1)
626 	xexit (ranlib_only (argv[arg_index]));
627 
628       if (operation == none)
629 	fatal (_("no operation specified"));
630 
631       if (newer_only && operation != replace)
632 	fatal (_("`u' is only meaningful with the `r' option."));
633 
634       if (newer_only && deterministic)
635 	fatal (_("`u' is not meaningful with the `D' option."));
636 
637       if (postype != pos_default)
638 	posname = argv[arg_index++];
639 
640       if (counted_name_mode)
641 	{
642 	  if (operation != extract && operation != delete)
643 	     fatal (_("`N' is only meaningful with the `x' and `d' options."));
644 	  counted_name_counter = atoi (argv[arg_index++]);
645 	  if (counted_name_counter <= 0)
646 	    fatal (_("Value for `N' must be positive."));
647 	}
648 
649       inarch_filename = argv[arg_index++];
650 
651       files = arg_index < argc ? argv + arg_index : NULL;
652       file_count = argc - arg_index;
653 
654       arch = open_inarch (inarch_filename,
655 			  files == NULL ? (char *) NULL : files[0]);
656 
657       if (operation == extract && bfd_is_thin_archive (arch))
658 	fatal (_("`x' cannot be used on thin archives."));
659 
660       switch (operation)
661 	{
662 	case print_table:
663 	  map_over_members (arch, print_descr, files, file_count);
664 	  break;
665 
666 	case print_files:
667 	  map_over_members (arch, print_contents, files, file_count);
668 	  break;
669 
670 	case extract:
671 	  map_over_members (arch, extract_file, files, file_count);
672 	  break;
673 
674 	case delete:
675 	  if (files != NULL)
676 	    delete_members (arch, files);
677 	  else
678 	    output_filename = NULL;
679 	  break;
680 
681 	case move:
682 	  if (files != NULL)
683 	    move_members (arch, files);
684 	  else
685 	    output_filename = NULL;
686 	  break;
687 
688 	case replace:
689 	case quick_append:
690 	  if (files != NULL || write_armap > 0)
691 	    replace_members (arch, files, operation == quick_append);
692 	  else
693 	    output_filename = NULL;
694 	  break;
695 
696 	  /* Shouldn't happen! */
697 	default:
698 	  /* xgettext:c-format */
699 	  fatal (_("internal error -- this option not implemented"));
700 	}
701     }
702 
703   END_PROGRESS (program_name);
704 
705   xexit (0);
706   return 0;
707 }
708 
709 bfd *
710 open_inarch (const char *archive_filename, const char *file)
711 {
712   const char *target;
713   bfd **last_one;
714   bfd *next_one;
715   struct stat sbuf;
716   bfd *arch;
717   char **matching;
718 
719   bfd_set_error (bfd_error_no_error);
720 
721   target = NULL;
722 
723   if (stat (archive_filename, &sbuf) != 0)
724     {
725 #if !defined(__GO32__) || defined(__DJGPP__)
726 
727       /* FIXME: I don't understand why this fragment was ifndef'ed
728 	 away for __GO32__; perhaps it was in the days of DJGPP v1.x.
729 	 stat() works just fine in v2.x, so I think this should be
730 	 removed.  For now, I enable it for DJGPP v2. -- EZ.  */
731 
732 /* KLUDGE ALERT! Temporary fix until I figger why
733    stat() is wrong ... think it's buried in GO32's IDT - Jax */
734       if (errno != ENOENT)
735 	bfd_fatal (archive_filename);
736 #endif
737 
738       if (!operation_alters_arch)
739 	{
740 	  fprintf (stderr, "%s: ", program_name);
741 	  perror (archive_filename);
742 	  maybequit ();
743 	  return NULL;
744 	}
745 
746       /* Try to figure out the target to use for the archive from the
747          first object on the list.  */
748       if (file != NULL)
749 	{
750 	  bfd *obj;
751 
752 	  obj = bfd_openr (file, NULL);
753 	  if (obj != NULL)
754 	    {
755 	      if (bfd_check_format (obj, bfd_object))
756 		target = bfd_get_target (obj);
757 	      (void) bfd_close (obj);
758 	    }
759 	}
760 
761       /* Create an empty archive.  */
762       arch = bfd_openw (archive_filename, target);
763       if (arch == NULL
764 	  || ! bfd_set_format (arch, bfd_archive)
765 	  || ! bfd_close (arch))
766 	bfd_fatal (archive_filename);
767       else if (!silent_create)
768         non_fatal (_("creating %s"), archive_filename);
769 
770       /* If we die creating a new archive, don't leave it around.  */
771       output_filename = archive_filename;
772     }
773 
774   arch = bfd_openr (archive_filename, target);
775   if (arch == NULL)
776     {
777     bloser:
778       bfd_fatal (archive_filename);
779     }
780 
781   if (! bfd_check_format_matches (arch, bfd_archive, &matching))
782     {
783       bfd_nonfatal (archive_filename);
784       if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
785 	{
786 	  list_matching_formats (matching);
787 	  free (matching);
788 	}
789       xexit (1);
790     }
791 
792   last_one = &(arch->archive_next);
793   /* Read all the contents right away, regardless.  */
794   for (next_one = bfd_openr_next_archived_file (arch, NULL);
795        next_one;
796        next_one = bfd_openr_next_archived_file (arch, next_one))
797     {
798       PROGRESS (1);
799       *last_one = next_one;
800       last_one = &next_one->archive_next;
801     }
802   *last_one = (bfd *) NULL;
803   if (bfd_get_error () != bfd_error_no_more_archived_files)
804     goto bloser;
805   return arch;
806 }
807 
808 static void
809 print_contents (bfd *abfd)
810 {
811   size_t ncopied = 0;
812   char *cbuf = xmalloc (BUFSIZE);
813   struct stat buf;
814   size_t size;
815   if (bfd_stat_arch_elt (abfd, &buf) != 0)
816     /* xgettext:c-format */
817     fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
818 
819   if (verbose)
820     /* xgettext:c-format */
821     printf (_("\n<%s>\n\n"), bfd_get_filename (abfd));
822 
823   bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
824 
825   size = buf.st_size;
826   while (ncopied < size)
827     {
828 
829       size_t nread;
830       size_t tocopy = size - ncopied;
831       if (tocopy > BUFSIZE)
832 	tocopy = BUFSIZE;
833 
834       nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
835       if (nread != tocopy)
836 	/* xgettext:c-format */
837 	fatal (_("%s is not a valid archive"),
838 	       bfd_get_filename (bfd_my_archive (abfd)));
839 
840       /* fwrite in mingw32 may return int instead of size_t. Cast the
841 	 return value to size_t to avoid comparison between signed and
842 	 unsigned values.  */
843       if ((size_t) fwrite (cbuf, 1, nread, stdout) != nread)
844 	fatal ("stdout: %s", strerror (errno));
845       ncopied += tocopy;
846     }
847   free (cbuf);
848 }
849 
850 /* Extract a member of the archive into its own file.
851 
852    We defer opening the new file until after we have read a BUFSIZ chunk of the
853    old one, since we know we have just read the archive header for the old
854    one.  Since most members are shorter than BUFSIZ, this means we will read
855    the old header, read the old data, write a new inode for the new file, and
856    write the new data, and be done. This 'optimization' is what comes from
857    sitting next to a bare disk and hearing it every time it seeks.  -- Gnu
858    Gilmore  */
859 
860 void
861 extract_file (bfd *abfd)
862 {
863   FILE *ostream;
864   char *cbuf = xmalloc (BUFSIZE);
865   size_t nread, tocopy;
866   size_t ncopied = 0;
867   size_t size;
868   struct stat buf;
869 
870   if (bfd_stat_arch_elt (abfd, &buf) != 0)
871     /* xgettext:c-format */
872     fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
873   size = buf.st_size;
874 
875   if (verbose)
876     printf ("x - %s\n", bfd_get_filename (abfd));
877 
878   bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
879 
880   ostream = NULL;
881   if (size == 0)
882     {
883       /* Seems like an abstraction violation, eh?  Well it's OK! */
884       output_filename = bfd_get_filename (abfd);
885 
886       ostream = fopen (bfd_get_filename (abfd), FOPEN_WB);
887       if (ostream == NULL)
888 	{
889 	  perror (bfd_get_filename (abfd));
890 	  xexit (1);
891 	}
892 
893       output_file = ostream;
894     }
895   else
896     while (ncopied < size)
897       {
898 	tocopy = size - ncopied;
899 	if (tocopy > BUFSIZE)
900 	  tocopy = BUFSIZE;
901 
902 	nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
903 	if (nread != tocopy)
904 	  /* xgettext:c-format */
905 	  fatal (_("%s is not a valid archive"),
906 		 bfd_get_filename (bfd_my_archive (abfd)));
907 
908 	/* See comment above; this saves disk arm motion */
909 	if (ostream == NULL)
910 	  {
911 	    /* Seems like an abstraction violation, eh?  Well it's OK! */
912 	    output_filename = bfd_get_filename (abfd);
913 
914 	    ostream = fopen (bfd_get_filename (abfd), FOPEN_WB);
915 	    if (ostream == NULL)
916 	      {
917 		perror (bfd_get_filename (abfd));
918 		xexit (1);
919 	      }
920 
921 	    output_file = ostream;
922 	  }
923 
924 	/* fwrite in mingw32 may return int instead of size_t. Cast
925 	   the return value to size_t to avoid comparison between
926 	   signed and unsigned values.  */
927 	if ((size_t) fwrite (cbuf, 1, nread, ostream) != nread)
928 	  fatal ("%s: %s", output_filename, strerror (errno));
929 	ncopied += tocopy;
930       }
931 
932   if (ostream != NULL)
933     fclose (ostream);
934 
935   output_file = NULL;
936   output_filename = NULL;
937 
938   chmod (bfd_get_filename (abfd), buf.st_mode);
939 
940   if (preserve_dates)
941     {
942       /* Set access time to modification time.  Only st_mtime is
943 	 initialized by bfd_stat_arch_elt.  */
944       buf.st_atime = buf.st_mtime;
945       set_times (bfd_get_filename (abfd), &buf);
946     }
947 
948   free (cbuf);
949 }
950 
951 static void
952 write_archive (bfd *iarch)
953 {
954   bfd *obfd;
955   char *old_name, *new_name;
956   bfd *contents_head = iarch->archive_next;
957 
958   old_name = xmalloc (strlen (bfd_get_filename (iarch)) + 1);
959   strcpy (old_name, bfd_get_filename (iarch));
960   new_name = make_tempname (old_name);
961 
962   if (new_name == NULL)
963     bfd_fatal ("could not create temporary file whilst writing archive");
964 
965   output_filename = new_name;
966 
967   obfd = bfd_openw (new_name, bfd_get_target (iarch));
968 
969   if (obfd == NULL)
970     bfd_fatal (old_name);
971 
972   output_bfd = obfd;
973 
974   bfd_set_format (obfd, bfd_archive);
975 
976   /* Request writing the archive symbol table unless we've
977      been explicitly requested not to.  */
978   obfd->has_armap = write_armap >= 0;
979 
980   if (ar_truncate)
981     {
982       /* This should really use bfd_set_file_flags, but that rejects
983          archives.  */
984       obfd->flags |= BFD_TRADITIONAL_FORMAT;
985     }
986 
987   if (deterministic)
988     obfd->flags |= BFD_DETERMINISTIC_OUTPUT;
989 
990   if (make_thin_archive || bfd_is_thin_archive (iarch))
991     bfd_is_thin_archive (obfd) = 1;
992 
993   if (!bfd_set_archive_head (obfd, contents_head))
994     bfd_fatal (old_name);
995 
996   if (!bfd_close (obfd))
997     bfd_fatal (old_name);
998 
999   output_bfd = NULL;
1000   output_filename = NULL;
1001 
1002   /* We don't care if this fails; we might be creating the archive.  */
1003   bfd_close (iarch);
1004 
1005   if (smart_rename (new_name, old_name, 0) != 0)
1006     xexit (1);
1007 }
1008 
1009 /* Return a pointer to the pointer to the entry which should be rplacd'd
1010    into when altering.  DEFAULT_POS should be how to interpret pos_default,
1011    and should be a pos value.  */
1012 
1013 static bfd **
1014 get_pos_bfd (bfd **contents, enum pos default_pos, const char *default_posname)
1015 {
1016   bfd **after_bfd = contents;
1017   enum pos realpos;
1018   const char *realposname;
1019 
1020   if (postype == pos_default)
1021     {
1022       realpos = default_pos;
1023       realposname = default_posname;
1024     }
1025   else
1026     {
1027       realpos = postype;
1028       realposname = posname;
1029     }
1030 
1031   if (realpos == pos_end)
1032     {
1033       while (*after_bfd)
1034 	after_bfd = &((*after_bfd)->archive_next);
1035     }
1036   else
1037     {
1038       for (; *after_bfd; after_bfd = &(*after_bfd)->archive_next)
1039 	if (FILENAME_CMP ((*after_bfd)->filename, realposname) == 0)
1040 	  {
1041 	    if (realpos == pos_after)
1042 	      after_bfd = &(*after_bfd)->archive_next;
1043 	    break;
1044 	  }
1045     }
1046   return after_bfd;
1047 }
1048 
1049 static void
1050 delete_members (bfd *arch, char **files_to_delete)
1051 {
1052   bfd **current_ptr_ptr;
1053   bfd_boolean found;
1054   bfd_boolean something_changed = FALSE;
1055   int match_count;
1056 
1057   for (; *files_to_delete != NULL; ++files_to_delete)
1058     {
1059       /* In a.out systems, the armap is optional.  It's also called
1060 	 __.SYMDEF.  So if the user asked to delete it, we should remember
1061 	 that fact. This isn't quite right for COFF systems (where
1062 	 __.SYMDEF might be regular member), but it's very unlikely
1063 	 to be a problem.  FIXME */
1064 
1065       if (!strcmp (*files_to_delete, "__.SYMDEF"))
1066 	{
1067 	  arch->has_armap = FALSE;
1068 	  write_armap = -1;
1069 	  continue;
1070 	}
1071 
1072       found = FALSE;
1073       match_count = 0;
1074       current_ptr_ptr = &(arch->archive_next);
1075       while (*current_ptr_ptr)
1076 	{
1077 	  if (FILENAME_CMP (normalize (*files_to_delete, arch),
1078 			    (*current_ptr_ptr)->filename) == 0)
1079 	    {
1080 	      ++match_count;
1081 	      if (counted_name_mode
1082 		  && match_count != counted_name_counter)
1083 		{
1084 		  /* Counting, and didn't match on count; go on to the
1085                      next one.  */
1086 		}
1087 	      else
1088 		{
1089 		  found = TRUE;
1090 		  something_changed = TRUE;
1091 		  if (verbose)
1092 		    printf ("d - %s\n",
1093 			    *files_to_delete);
1094 		  *current_ptr_ptr = ((*current_ptr_ptr)->archive_next);
1095 		  goto next_file;
1096 		}
1097 	    }
1098 
1099 	  current_ptr_ptr = &((*current_ptr_ptr)->archive_next);
1100 	}
1101 
1102       if (verbose && !found)
1103 	{
1104 	  /* xgettext:c-format */
1105 	  printf (_("No member named `%s'\n"), *files_to_delete);
1106 	}
1107     next_file:
1108       ;
1109     }
1110 
1111   if (something_changed)
1112     write_archive (arch);
1113   else
1114     output_filename = NULL;
1115 }
1116 
1117 
1118 /* Reposition existing members within an archive */
1119 
1120 static void
1121 move_members (bfd *arch, char **files_to_move)
1122 {
1123   bfd **after_bfd;		/* New entries go after this one */
1124   bfd **current_ptr_ptr;	/* cdr pointer into contents */
1125 
1126   for (; *files_to_move; ++files_to_move)
1127     {
1128       current_ptr_ptr = &(arch->archive_next);
1129       while (*current_ptr_ptr)
1130 	{
1131 	  bfd *current_ptr = *current_ptr_ptr;
1132 	  if (FILENAME_CMP (normalize (*files_to_move, arch),
1133 			    current_ptr->filename) == 0)
1134 	    {
1135 	      /* Move this file to the end of the list - first cut from
1136 		 where it is.  */
1137 	      bfd *link;
1138 	      *current_ptr_ptr = current_ptr->archive_next;
1139 
1140 	      /* Now glue to end */
1141 	      after_bfd = get_pos_bfd (&arch->archive_next, pos_end, NULL);
1142 	      link = *after_bfd;
1143 	      *after_bfd = current_ptr;
1144 	      current_ptr->archive_next = link;
1145 
1146 	      if (verbose)
1147 		printf ("m - %s\n", *files_to_move);
1148 
1149 	      goto next_file;
1150 	    }
1151 
1152 	  current_ptr_ptr = &((*current_ptr_ptr)->archive_next);
1153 	}
1154       /* xgettext:c-format */
1155       fatal (_("no entry %s in archive %s!"), *files_to_move, arch->filename);
1156 
1157     next_file:;
1158     }
1159 
1160   write_archive (arch);
1161 }
1162 
1163 /* Ought to default to replacing in place, but this is existing practice!  */
1164 
1165 static void
1166 replace_members (bfd *arch, char **files_to_move, bfd_boolean quick)
1167 {
1168   bfd_boolean changed = FALSE;
1169   bfd **after_bfd;		/* New entries go after this one.  */
1170   bfd *current;
1171   bfd **current_ptr;
1172 
1173   while (files_to_move && *files_to_move)
1174     {
1175       if (! quick)
1176 	{
1177 	  current_ptr = &arch->archive_next;
1178 	  while (*current_ptr)
1179 	    {
1180 	      current = *current_ptr;
1181 
1182 	      /* For compatibility with existing ar programs, we
1183 		 permit the same file to be added multiple times.  */
1184 	      if (FILENAME_CMP (normalize (*files_to_move, arch),
1185 				normalize (current->filename, arch)) == 0
1186 		  && current->arelt_data != NULL)
1187 		{
1188 		  if (newer_only)
1189 		    {
1190 		      struct stat fsbuf, asbuf;
1191 
1192 		      if (stat (*files_to_move, &fsbuf) != 0)
1193 			{
1194 			  if (errno != ENOENT)
1195 			    bfd_fatal (*files_to_move);
1196 			  goto next_file;
1197 			}
1198 		      if (bfd_stat_arch_elt (current, &asbuf) != 0)
1199 			/* xgettext:c-format */
1200 			fatal (_("internal stat error on %s"),
1201 			       current->filename);
1202 
1203 		      if (fsbuf.st_mtime <= asbuf.st_mtime)
1204 			goto next_file;
1205 		    }
1206 
1207 		  after_bfd = get_pos_bfd (&arch->archive_next, pos_after,
1208 					   current->filename);
1209 		  if (ar_emul_replace (after_bfd, *files_to_move,
1210 				       verbose))
1211 		    {
1212 		      /* Snip out this entry from the chain.  */
1213 		      *current_ptr = (*current_ptr)->archive_next;
1214 		      changed = TRUE;
1215 		    }
1216 
1217 		  goto next_file;
1218 		}
1219 	      current_ptr = &(current->archive_next);
1220 	    }
1221 	}
1222 
1223       /* Add to the end of the archive.  */
1224       after_bfd = get_pos_bfd (&arch->archive_next, pos_end, NULL);
1225 
1226       if (ar_emul_append (after_bfd, *files_to_move, verbose,
1227                           make_thin_archive))
1228 	changed = TRUE;
1229 
1230     next_file:;
1231 
1232       files_to_move++;
1233     }
1234 
1235   if (changed)
1236     write_archive (arch);
1237   else
1238     output_filename = NULL;
1239 }
1240 
1241 static int
1242 ranlib_only (const char *archname)
1243 {
1244   bfd *arch;
1245 
1246   if (get_file_size (archname) < 1)
1247     return 1;
1248   write_armap = 1;
1249   arch = open_inarch (archname, (char *) NULL);
1250   if (arch == NULL)
1251     xexit (1);
1252   write_archive (arch);
1253   return 0;
1254 }
1255 
1256 /* Update the timestamp of the symbol map of an archive.  */
1257 
1258 static int
1259 ranlib_touch (const char *archname)
1260 {
1261 #ifdef __GO32__
1262   /* I don't think updating works on go32.  */
1263   ranlib_only (archname);
1264 #else
1265   int f;
1266   bfd *arch;
1267   char **matching;
1268 
1269   if (get_file_size (archname) < 1)
1270     return 1;
1271   f = open (archname, O_RDWR | O_BINARY, 0);
1272   if (f < 0)
1273     {
1274       bfd_set_error (bfd_error_system_call);
1275       bfd_fatal (archname);
1276     }
1277 
1278   arch = bfd_fdopenr (archname, (const char *) NULL, f);
1279   if (arch == NULL)
1280     bfd_fatal (archname);
1281   if (! bfd_check_format_matches (arch, bfd_archive, &matching))
1282     {
1283       bfd_nonfatal (archname);
1284       if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1285 	{
1286 	  list_matching_formats (matching);
1287 	  free (matching);
1288 	}
1289       xexit (1);
1290     }
1291 
1292   if (! bfd_has_map (arch))
1293     /* xgettext:c-format */
1294     fatal (_("%s: no archive map to update"), archname);
1295 
1296   bfd_update_armap_timestamp (arch);
1297 
1298   if (! bfd_close (arch))
1299     bfd_fatal (archname);
1300 #endif
1301   return 0;
1302 }
1303 
1304 /* Things which are interesting to map over all or some of the files: */
1305 
1306 static void
1307 print_descr (bfd *abfd)
1308 {
1309   print_arelt_descr (stdout, abfd, verbose);
1310 }
1311