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