summaryrefslogtreecommitdiff
path: root/cross/binutils/patches/patch-archive
blob: b3f9feaa4a93dcd196cd55efe478fb0d93f14367 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
$NetBSD: patch-archive,v 1.1 1999/01/04 22:37:32 tv Exp $

--- ./bfd/archive.c.orig	Fri May  1 11:48:01 1998
+++ ./bfd/archive.c	Mon Dec 28 17:43:17 1998
@@ -595,7 +595,9 @@
 	 Note that last_file->origin can be odd in the case of
 	 BSD-4.4-style element with a long odd size. */
       filestart = last_file->origin + size;
-      filestart += filestart % 2;
+      if (!strncmp(arch_hdr (last_file)->ar_name, "#1/", 3))
+	size += strlen(normalize(last_file, last_file->filename));
+      filestart += size % 2;
     }
 
   return _bfd_get_elt_at_filepos (archive, filestart);
@@ -1202,6 +1204,44 @@
   return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen);
 }
 
+/* 4.4BSD: frob short names, but leave extended name until write time. */
+
+boolean
+_bfd_archive_bsd44_construct_extended_name_table (abfd, tabloc, tablen, name)
+     bfd *abfd;
+     char **tabloc;
+     bfd_size_type *tablen;
+     const char **name;
+{
+  unsigned int maxname = abfd->xvec->ar_max_namelen;
+  bfd *current;
+
+  for (current = abfd->archive_head; current != NULL; current = current->next)
+    {
+      const char *normal;
+      unsigned int thislen;
+
+      normal = normalize (current, current->filename);
+      if (normal == NULL)
+	return false;
+
+      thislen = strlen (normal);
+      if (((thislen > maxname) || (strchr(normal, ' ') != NULL))
+	  && ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) == 0))
+	{
+	  struct ar_hdr *hdr = arch_hdr (current);
+	  sprintf ((hdr->ar_name), "#1/%-12ld", (long) thislen);
+	  hdr->ar_name[15] = ' ';
+	  sprintf ((hdr->ar_size), "%-9ld", (long) arelt_size(current) + thislen);
+	  hdr->ar_size[9] = ' ';
+	}
+    }
+
+  *name = *tabloc = NULL;
+  *tablen = 0;
+  return true;
+}
+
 /* Build an SVR4 style extended name table.  */
 
 boolean
@@ -1371,8 +1411,12 @@
 
   /* Goddamned sprintf doesn't permit MAXIMUM field lengths */
   sprintf ((hdr->ar_date), "%-12ld", (long) status.st_mtime);
-  sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid);
-  sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid);
+  if (status.st_uid > 65535U)
+    fprintf (stderr, "%s: uid %ld truncated to 16 bits\n", filename, status.st_uid);
+  sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid & 0xffffU);
+  if (status.st_gid > 65535U)
+    fprintf (stderr, "%s: gid %ld truncated to 16 bits\n", filename, status.st_gid);
+  sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid & 0xffffU);
   sprintf ((hdr->ar_mode), "%-8o", (unsigned int) status.st_mode);
   sprintf ((hdr->ar_size), "%-10ld", (long) status.st_size);
   /* Correct for a lossage in sprintf whereby it null-terminates.  I cannot
@@ -1654,12 +1698,22 @@
   for (current = arch->archive_head; current; current = current->next)
     {
       char buffer[DEFAULT_BUFFERSIZE];
-      unsigned int remaining = arelt_size (current);
+      unsigned int saved_size = arelt_size (current);
+      unsigned int remaining = saved_size;
       struct ar_hdr *hdr = arch_hdr (current);
 
       /* write ar header */
       if (bfd_write ((char *) hdr, 1, sizeof (*hdr), arch) != sizeof (*hdr))
 	return false;
+      /* write filename if it is a 4.4BSD extended file, and add to size */
+      if (!strncmp (hdr->ar_name, "#1/", 3))
+	{
+	  const char *normal = normalize (current, current->filename);
+	  unsigned int thislen = strlen (normal);
+	  if (bfd_write (normal, 1, thislen, arch) != thislen)
+	    return false;
+	  saved_size += thislen;
+	}
       if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
 	return false;
       while (remaining)
@@ -1678,7 +1732,7 @@
 	    return false;
 	  remaining -= amt;
 	}
-      if ((arelt_size (current) % 2) == 1)
+      if ((saved_size % 2) == 1)
 	{
 	  if (bfd_write ("\012", 1, 1, arch) != 1)
 	    return false;
@@ -1914,8 +1968,11 @@
 	{
 	  do
 	    {
-	      firstreal += arelt_size (current) + sizeof (struct ar_hdr);
-	      firstreal += firstreal % 2;
+	      unsigned int size = arelt_size (current);
+	      if (!strncmp(arch_hdr (current)->ar_name, "#1/", 3))
+		size += strlen(normalize(current, current->filename));
+	      firstreal += size + sizeof (struct ar_hdr);
+	      firstreal += size % 2;
 	      current = current->next;
 	    }
 	  while (current != (bfd *) (map[count]).pos);
--- ./bfd/libbfd-in.h.orig	Fri May  1 11:48:12 1998
+++ ./bfd/libbfd-in.h	Mon Dec 28 17:43:21 1998
@@ -219,6 +219,8 @@
   _bfd_slurp_extended_name_table
 extern boolean _bfd_archive_bsd_construct_extended_name_table
   PARAMS ((bfd *, char **, bfd_size_type *, const char **));
+extern boolean _bfd_archive_bsd44_construct_extended_name_table
+  PARAMS ((bfd *, char **, bfd_size_type *, const char **));
 #define _bfd_archive_bsd_truncate_arname bfd_bsd_truncate_arname
 #define _bfd_archive_bsd_write_armap bsd_write_armap
 #define _bfd_archive_bsd_read_ar_hdr _bfd_generic_read_ar_hdr
--- ./bfd/libbfd.h.orig	Fri May  1 11:48:12 1998
+++ ./bfd/libbfd.h	Mon Dec 28 17:43:21 1998
@@ -219,6 +219,8 @@
   _bfd_slurp_extended_name_table
 extern boolean _bfd_archive_bsd_construct_extended_name_table
   PARAMS ((bfd *, char **, bfd_size_type *, const char **));
+extern boolean _bfd_archive_bsd44_construct_extended_name_table
+  PARAMS ((bfd *, char **, bfd_size_type *, const char **));
 #define _bfd_archive_bsd_truncate_arname bfd_bsd_truncate_arname
 #define _bfd_archive_bsd_write_armap bsd_write_armap
 #define _bfd_archive_bsd_read_ar_hdr _bfd_generic_read_ar_hdr
--- bfd/netbsd.h.orig	Mon Jan  4 09:58:12 1999
+++ bfd/netbsd.h	Mon Jan  4 09:58:37 1999
@@ -66,6 +66,8 @@
 #define MY_write_object_contents MY(write_object_contents)
 static boolean MY(write_object_contents) PARAMS ((bfd *abfd));
 #define MY_text_includes_header 1
+#define MY_construct_extended_name_table \
+	_bfd_archive_bsd44_construct_extended_name_table
 
 #include "aout-target.h"