Mercurial > emacs
annotate src/unexhp9k800.c @ 93762:46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Give up if glyph indices not supported. Use uniscribe obtained
ABC widths for individual metrics. Map glyph clusters back to
characters using fClusterStart flag. Return number of glyphs
produced, not chars processed.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Sun, 06 Apr 2008 01:04:45 +0000 |
parents | 5cb7ffd03e07 |
children | ddedcecb18ef |
rev | line source |
---|---|
76673
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
1 /* Unexec for HP 9000 Series 800 machines. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
2 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
3 This file is in the public domain. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
4 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
5 Author: John V. Morris |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
6 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
7 This file was written by John V. Morris at Hewlett Packard. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
8 Both the author and Hewlett Packard Co. have disclaimed the |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
9 copyright on this file, and it is therefore in the public domain. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
10 (Search for "hp9k800" in copyright.list.) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
11 */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
12 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
13 /* |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
14 Bob Desinger <hpsemc!bd@hplabs.hp.com> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
15 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
16 Note that the GNU project considers support for HP operation a |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
17 peripheral activity which should not be allowed to divert effort |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
18 from development of the GNU system. Changes in this code will be |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
19 installed when users send them in, but aside from that we don't |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
20 plan to think about it, or about whether other Emacs maintenance |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
21 might break it. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
22 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
23 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
24 Unexec creates a copy of the old a.out file, and replaces the old data |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
25 area with the current data area. When the new file is executed, the |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
26 process will see the same data structures and data values that the |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
27 original process had when unexec was called. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
28 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
29 Unlike other versions of unexec, this one copies symbol table and |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
30 debug information to the new a.out file. Thus, the new a.out file |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
31 may be debugged with symbolic debuggers. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
32 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
33 If you fix any bugs in this, I'd like to incorporate your fixes. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
34 Send them to uunet!hpda!hpsemc!jmorris or jmorris%hpsemc@hplabs.HP.COM. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
35 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
36 CAVEATS: |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
37 This routine saves the current value of all static and external |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
38 variables. This means that any data structure that needs to be |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
39 initialized must be explicitly reset. Variables will not have their |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
40 expected default values. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
41 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
42 Unfortunately, the HP-UX signal handler has internal initialization |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
43 flags which are not explicitly reset. Thus, for signals to work in |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
44 conjunction with this routine, the following code must executed when |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
45 the new process starts up. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
46 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
47 void _sigreturn (); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
48 ... |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
49 sigsetreturn (_sigreturn); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
50 */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
51 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
52 #ifdef emacs |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
53 #include <config.h> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
54 #endif |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
55 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
56 #include <stdio.h> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
57 #include <fcntl.h> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
58 #include <errno.h> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
59 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
60 #include <a.out.h> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
61 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
62 #ifdef HPUX_USE_SHLIBS |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
63 #include <dl.h> |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
64 #endif |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
65 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
66 /* brk value to restore, stored as a global. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
67 This is really used only if we used shared libraries. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
68 static long brk_on_dump = 0; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
69 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
70 /* Called from main, if we use shared libraries. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
71 int |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
72 run_time_remap (ignored) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
73 char *ignored; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
74 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
75 brk ((char *) brk_on_dump); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
76 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
77 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
78 #undef roundup |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
79 #define roundup(x,n) (((x) + ((n) - 1)) & ~((n) - 1)) /* n is power of 2 */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
80 #define min(x,y) (((x) < (y)) ? (x) : (y)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
81 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
82 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
83 /* Create a new a.out file, same as old but with current data space */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
84 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
85 unexec (new_name, old_name, new_end_of_text, dummy1, dummy2) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
86 char new_name[]; /* name of the new a.out file to be created */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
87 char old_name[]; /* name of the old a.out file */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
88 char *new_end_of_text; /* ptr to new edata/etext; NOT USED YET */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
89 int dummy1, dummy2; /* not used by emacs */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
90 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
91 int old, new; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
92 int old_size, new_size; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
93 struct header hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
94 struct som_exec_auxhdr auxhdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
95 long i; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
96 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
97 /* For the greatest flexibility, should create a temporary file in |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
98 the same directory as the new file. When everything is complete, |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
99 rename the temp file to the new name. |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
100 This way, a program could update its own a.out file even while |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
101 it is still executing. If problems occur, everything is still |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
102 intact. NOT implemented. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
103 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
104 /* Open the input and output a.out files */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
105 old = open (old_name, O_RDONLY); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
106 if (old < 0) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
107 { perror (old_name); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
108 new = open (new_name, O_CREAT|O_RDWR|O_TRUNC, 0777); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
109 if (new < 0) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
110 { perror (new_name); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
111 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
112 /* Read the old headers */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
113 read_header (old, &hdr, &auxhdr); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
114 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
115 brk_on_dump = (long) sbrk (0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
116 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
117 /* Decide how large the new and old data areas are */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
118 old_size = auxhdr.exec_dsize; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
119 /* I suspect these two statements are separate |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
120 to avoid a compiler bug in hpux version 8. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
121 i = (long) sbrk (0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
122 new_size = i - auxhdr.exec_dmem; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
123 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
124 /* Copy the old file to the new, up to the data space */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
125 lseek (old, 0, 0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
126 copy_file (old, new, auxhdr.exec_dfile); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
127 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
128 /* Skip the old data segment and write a new one */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
129 lseek (old, old_size, 1); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
130 save_data_space (new, &hdr, &auxhdr, new_size); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
131 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
132 /* Copy the rest of the file */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
133 copy_rest (old, new); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
134 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
135 /* Update file pointers since we probably changed size of data area */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
136 update_file_ptrs (new, &hdr, &auxhdr, auxhdr.exec_dfile, new_size-old_size); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
137 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
138 /* Save the modified header */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
139 write_header (new, &hdr, &auxhdr); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
140 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
141 /* Close the binary file */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
142 close (old); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
143 close (new); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
144 return 0; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
145 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
146 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
147 /* Save current data space in the file, update header. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
148 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
149 save_data_space (file, hdr, auxhdr, size) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
150 int file; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
151 struct header *hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
152 struct som_exec_auxhdr *auxhdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
153 int size; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
154 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
155 /* Write the entire data space out to the file */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
156 if (write (file, auxhdr->exec_dmem, size) != size) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
157 { perror ("Can't save new data space"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
158 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
159 /* Update the header to reflect the new data size */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
160 auxhdr->exec_dsize = size; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
161 auxhdr->exec_bsize = 0; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
162 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
163 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
164 /* Update the values of file pointers when something is inserted. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
165 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
166 update_file_ptrs (file, hdr, auxhdr, location, offset) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
167 int file; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
168 struct header *hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
169 struct som_exec_auxhdr *auxhdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
170 unsigned int location; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
171 int offset; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
172 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
173 struct subspace_dictionary_record subspace; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
174 int i; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
175 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
176 /* Increase the overall size of the module */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
177 hdr->som_length += offset; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
178 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
179 /* Update the various file pointers in the header */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
180 #define update(ptr) if (ptr > location) ptr = ptr + offset |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
181 update (hdr->aux_header_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
182 update (hdr->space_strings_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
183 update (hdr->init_array_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
184 update (hdr->compiler_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
185 update (hdr->symbol_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
186 update (hdr->fixup_request_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
187 update (hdr->symbol_strings_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
188 update (hdr->unloadable_sp_location); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
189 update (auxhdr->exec_tfile); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
190 update (auxhdr->exec_dfile); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
191 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
192 /* Do for each subspace dictionary entry */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
193 lseek (file, hdr->subspace_location, 0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
194 for (i = 0; i < hdr->subspace_total; i++) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
195 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
196 if (read (file, &subspace, sizeof (subspace)) != sizeof (subspace)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
197 { perror ("Can't read subspace record"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
198 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
199 /* If subspace has a file location, update it */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
200 if (subspace.initialization_length > 0 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
201 && subspace.file_loc_init_value > location) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
202 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
203 subspace.file_loc_init_value += offset; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
204 lseek (file, -sizeof (subspace), 1); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
205 if (write (file, &subspace, sizeof (subspace)) != sizeof (subspace)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
206 { perror ("Can't update subspace record"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
207 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
208 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
209 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
210 /* Do for each initialization pointer record */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
211 /* (I don't think it applies to executable files, only relocatables) */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
212 #undef update |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
213 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
214 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
215 /* Read in the header records from an a.out file. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
216 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
217 read_header (file, hdr, auxhdr) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
218 int file; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
219 struct header *hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
220 struct som_exec_auxhdr *auxhdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
221 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
222 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
223 /* Read the header in */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
224 lseek (file, 0, 0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
225 if (read (file, hdr, sizeof (*hdr)) != sizeof (*hdr)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
226 { perror ("Couldn't read header from a.out file"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
227 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
228 if (hdr->a_magic != EXEC_MAGIC && hdr->a_magic != SHARE_MAGIC |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
229 && hdr->a_magic != DEMAND_MAGIC) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
230 { |
80031
5cb7ffd03e07
(read_header): Replace `legal' with `valid'.
Juanma Barranquero <lekktu@gmail.com>
parents:
76673
diff
changeset
|
231 fprintf (stderr, "a.out file doesn't have valid magic number\n"); |
76673
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
232 exit (1); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
233 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
234 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
235 lseek (file, hdr->aux_header_location, 0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
236 if (read (file, auxhdr, sizeof (*auxhdr)) != sizeof (*auxhdr)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
237 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
238 perror ("Couldn't read auxiliary header from a.out file"); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
239 exit (1); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
240 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
241 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
242 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
243 /* Write out the header records into an a.out file. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
244 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
245 write_header (file, hdr, auxhdr) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
246 int file; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
247 struct header *hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
248 struct som_exec_auxhdr *auxhdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
249 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
250 /* Update the checksum */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
251 hdr->checksum = calculate_checksum (hdr); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
252 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
253 /* Write the header back into the a.out file */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
254 lseek (file, 0, 0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
255 if (write (file, hdr, sizeof (*hdr)) != sizeof (*hdr)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
256 { perror ("Couldn't write header to a.out file"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
257 lseek (file, hdr->aux_header_location, 0); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
258 if (write (file, auxhdr, sizeof (*auxhdr)) != sizeof (*auxhdr)) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
259 { perror ("Couldn't write auxiliary header to a.out file"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
260 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
261 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
262 /* Calculate the checksum of a SOM header record. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
263 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
264 calculate_checksum (hdr) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
265 struct header *hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
266 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
267 int checksum, i, *ptr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
268 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
269 checksum = 0; ptr = (int *) hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
270 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
271 for (i = 0; i < sizeof (*hdr) / sizeof (int) - 1; i++) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
272 checksum ^= ptr[i]; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
273 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
274 return (checksum); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
275 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
276 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
277 /* Copy size bytes from the old file to the new one. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
278 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
279 copy_file (old, new, size) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
280 int new, old; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
281 int size; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
282 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
283 int len; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
284 int buffer[8192]; /* word aligned will be faster */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
285 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
286 for (; size > 0; size -= len) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
287 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
288 len = min (size, sizeof (buffer)); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
289 if (read (old, buffer, len) != len) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
290 { perror ("Read failure on a.out file"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
291 if (write (new, buffer, len) != len) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
292 { perror ("Write failure in a.out file"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
293 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
294 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
295 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
296 /* Copy the rest of the file, up to EOF. */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
297 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
298 copy_rest (old, new) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
299 int new, old; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
300 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
301 int buffer[4096]; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
302 int len; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
303 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
304 /* Copy bytes until end of file or error */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
305 while ((len = read (old, buffer, sizeof (buffer))) > 0) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
306 if (write (new, buffer, len) != len) break; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
307 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
308 if (len != 0) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
309 { perror ("Unable to copy the rest of the file"); exit (1); } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
310 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
311 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
312 #ifdef DEBUG |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
313 display_header (hdr, auxhdr) |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
314 struct header *hdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
315 struct som_exec_auxhdr *auxhdr; |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
316 { |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
317 /* Display the header information (debug) */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
318 printf ("\n\nFILE HEADER\n"); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
319 printf ("magic number %d \n", hdr->a_magic); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
320 printf ("text loc %.8x size %d \n", auxhdr->exec_tmem, auxhdr->exec_tsize); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
321 printf ("data loc %.8x size %d \n", auxhdr->exec_dmem, auxhdr->exec_dsize); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
322 printf ("entry %x \n", auxhdr->exec_entry); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
323 printf ("Bss segment size %u\n", auxhdr->exec_bsize); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
324 printf ("\n"); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
325 printf ("data file loc %d size %d\n", |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
326 auxhdr->exec_dfile, auxhdr->exec_dsize); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
327 printf ("som_length %d\n", hdr->som_length); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
328 printf ("unloadable sploc %d size %d\n", |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
329 hdr->unloadable_sp_location, hdr->unloadable_sp_size); |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
330 } |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
331 #endif /* DEBUG */ |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
332 |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
333 /* arch-tag: d55a09ac-9427-4ec4-8496-cb9d7710774f |
a82fc200152b
Restore file with clarified legal status.
Glenn Morris <rgm@gnu.org>
parents:
diff
changeset
|
334 (do not change this comment) */ |