annotate src/unexnext.c @ 26059:2a7f35e0072b

(Fminibuffer_complete_and_exit): Supply value for new ESCAPE_FROM_EDGE parameter to Ffield_beginning. (Fminibuffer_complete_word): Use Ffield_beginning to find the prompt end. (Fminibuffer_complete_and_exit): Test for an empty input string by seeing where the field begins, instead of looking at text-properties. (read_minibuf): Don't save minibuffer prompt length on minibuf_save_list. Don't initialize minibuffer prompt length. Wrap prompt text-properties around the entire prompt. Add 'prompt text-property to prompt. Get final value with Ffield_string instead of make_buffer_string. (read_minibuf_unwind): Don't restore minibuffer prompt length from minibuf_save_list. (do_completion): Get minibuffer input with Ffield_string instead of Fbuffer_string. Erase minibuffer input with Ferase_field instead of erase_buffer. (Fminibuffer_complete_and_exit): Likewise. Test whether buffer is empty by looking for the 'prompt text property at the end. Set prompt length by looking for the end of the prompt text property, and save prompt length for later use (since there is no longer a buffer variable to get it from). (Fminibuffer_prompt_width, Fminibuffer_prompt_end): Functions removed. (syms_of_minibuf): Remove initializations of Sminibuffer_prompt_width and Sminibuffer_prompt_end.
author Gerd Moellmann <gerd@gnu.org>
date Sun, 17 Oct 1999 12:55:49 +0000
parents 4383d4a532de
children 23a1cea22d13
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* Dump Emacs in macho format.
2660
b70f4760d769 Changes for Emacs 19 from Thorsten Ohl <ohl@chico.harvard.edu>:
Jim Blandy <jimb@redhat.com>
parents: 1349
diff changeset
2 Copyright (C) 1990, 1993 Free Software Foundation, Inc.
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 Written by Bradley Taylor (btaylor@next.com).
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 This file is part of GNU Emacs.
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
2660
b70f4760d769 Changes for Emacs 19 from Thorsten Ohl <ohl@chico.harvard.edu>:
Jim Blandy <jimb@redhat.com>
parents: 1349
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 any later version.
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 GNU General Public License for more details.
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 4598
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 4598
diff changeset
20 Boston, MA 02111-1307, USA. */
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 #undef __STRICT_BSD__
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 #include <stdio.h>
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 #include <stdlib.h>
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 #include <stdarg.h>
2660
b70f4760d769 Changes for Emacs 19 from Thorsten Ohl <ohl@chico.harvard.edu>:
Jim Blandy <jimb@redhat.com>
parents: 1349
diff changeset
28 #include <mach/mach.h>
b70f4760d769 Changes for Emacs 19 from Thorsten Ohl <ohl@chico.harvard.edu>:
Jim Blandy <jimb@redhat.com>
parents: 1349
diff changeset
29 #include <mach-o/loader.h>
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
30 #include <mach-o/reloc.h>
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 #include <sys/file.h>
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 #include <sys/stat.h>
19669
e8e724dad99a Include unistd.h instead of libc.h.
Richard M. Stallman <rms@gnu.org>
parents: 16853
diff changeset
33 #include <unistd.h>
19670
4383d4a532de Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 19669
diff changeset
34 /* Instead of unistd.h, this used to include libc.h.
4383d4a532de Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 19669
diff changeset
35 "Nelson H. F. Beebe" <beebe@math.utah.edu> says that doesn't work
4383d4a532de Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 19669
diff changeset
36 in system version 3.3. */
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
2660
b70f4760d769 Changes for Emacs 19 from Thorsten Ohl <ohl@chico.harvard.edu>:
Jim Blandy <jimb@redhat.com>
parents: 1349
diff changeset
39 int malloc_cookie;
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 * Kludge: we don't expect any program data beyond VM_HIGHDATA
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 * What is really needed is a way to find out from malloc() which
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 * pages it vm_allocated and write only those out into the data segment.
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 *
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 * This kludge may break when we stop using fixed virtual address
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 * shared libraries. Actually, emacs will probably continue working, but be
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 * much larger on disk than it needs to be (because non-malloced data will
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 * be in the file).
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 static const unsigned VM_HIGHDATA = 0x2000000;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 typedef struct region_t {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 vm_address_t address;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 vm_size_t size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 vm_prot_t protection;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 vm_prot_t max_protection;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 vm_inherit_t inheritance;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 boolean_t shared;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 port_t object_name;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 vm_offset_t offset;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 } region_t;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 static void
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 grow(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 struct load_command ***the_commands,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 unsigned *the_commands_len
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 if (*the_commands == NULL) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 *the_commands_len = 1;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 *the_commands = malloc(sizeof(*the_commands));
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 } else {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 (*the_commands_len)++;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 *the_commands = realloc(*the_commands,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 (*the_commands_len *
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 sizeof(**the_commands)));
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 static void
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 save_command(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 struct load_command *command,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 struct load_command ***the_commands,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 unsigned *the_commands_len
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 struct load_command **tmp;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 grow(the_commands, the_commands_len);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 tmp = &(*the_commands)[*the_commands_len - 1];
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 *tmp = malloc(command->cmdsize);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 bcopy(command, *tmp, command->cmdsize);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 static void
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 fatal_unexec(char *format, ...)
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 va_list ap;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 va_start(ap, format);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 fprintf(stderr, "unexec: ");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 vfprintf(stderr, format, ap);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 fprintf(stderr, "\n");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 va_end(ap);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 static int
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 read_macho(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 int fd,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 struct mach_header *the_header,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 struct load_command ***the_commands,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 unsigned *the_commands_len
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 struct load_command command;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 struct load_command *buf;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 int i;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 int size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 if (read(fd, the_header, sizeof(*the_header)) != sizeof(*the_header)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 fatal_unexec("cannot read macho header");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 for (i = 0; i < the_header->ncmds; i++) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 if (read(fd, &command, sizeof(struct load_command)) !=
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 sizeof(struct load_command)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 fatal_unexec("cannot read macho load command header");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 size = command.cmdsize - sizeof(struct load_command);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 if (size < 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 fatal_unexec("bogus load command size");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 buf = malloc(command.cmdsize);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 buf->cmd = command.cmd;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 buf->cmdsize = command.cmdsize;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 if (read(fd, ((char *)buf +
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 sizeof(struct load_command)),
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 size) != size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 fatal_unexec("cannot read load command data");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 save_command(buf, the_commands, the_commands_len);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 return (1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 static int
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 filldatagap(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 vm_address_t start_address,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 vm_size_t *size,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 vm_address_t end_address
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 vm_address_t address;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 vm_size_t gapsize;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 address = (start_address + *size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 gapsize = end_address - address;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 *size += gapsize;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 if (vm_allocate(task_self(), &address, gapsize,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 FALSE) != KERN_SUCCESS) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 fatal_unexec("cannot vm_allocate");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 return (1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 static int
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 get_data_region(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 vm_address_t *address,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 vm_size_t *size
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 region_t region;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 kern_return_t ret;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 struct section *sect;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182
4598
cec168152d88 (get_data_region): Add cast to avoid warning.
Richard M. Stallman <rms@gnu.org>
parents: 2660
diff changeset
183 sect = (struct section *) getsectbyname(SEG_DATA, SECT_DATA);
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 region.address = 0;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 *address = 0;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 for (;;) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 ret = vm_region(task_self(),
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 &region.address,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 &region.size,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 &region.protection,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 &region.max_protection,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 &region.inheritance,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 &region.shared,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 &region.object_name,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 &region.offset);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 if (ret != KERN_SUCCESS || region.address >= VM_HIGHDATA) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 break;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 if (*address != 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 if (region.address > *address + *size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 if (!filldatagap(*address, size,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 region.address)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 *size += region.size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 } else {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 if (region.address == sect->addr) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 *address = region.address;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 *size = region.size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 region.address += region.size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 return (1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 static char *
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 my_malloc(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 vm_size_t size
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 vm_address_t address;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 if (vm_allocate(task_self(), &address, size, TRUE) != KERN_SUCCESS) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 return (NULL);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 return ((char *)address);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 static void
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 my_free(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 char *buf,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 vm_size_t size
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 vm_deallocate(task_self(), (vm_address_t)buf, size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 static int
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 unexec_doit(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 int infd,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 int outfd
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 int i;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 struct load_command **the_commands = NULL;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 unsigned the_commands_len;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 struct mach_header the_header;
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
250 int fgrowth = 0;
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 int fdatastart;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 int fdatasize;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 int size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 struct stat st;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 char *buf;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 vm_address_t data_address;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 vm_size_t data_size;
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
258 vm_size_t vmaddr_growth = 0;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
259 vm_size_t dataseg_vmaddr, dataseg_vmend;
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 struct segment_command *segment;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
263 #ifdef NS_TARGET
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
264 unsigned long extreloff = 0;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
265 unsigned long nextrel = 0;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
266 struct dysymtab_command *dysymtab;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
267 struct relocation_info reloc_info;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
268 #endif
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
269
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 if (!read_macho(infd, &the_header, &the_commands, &the_commands_len)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274
2660
b70f4760d769 Changes for Emacs 19 from Thorsten Ohl <ohl@chico.harvard.edu>:
Jim Blandy <jimb@redhat.com>
parents: 1349
diff changeset
275 malloc_cookie = malloc_freezedry ();
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 if (!get_data_region(&data_address, &data_size)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 * DO NOT USE MALLOC IN THIS SECTION
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 * Fix offsets
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 for (i = 0; i < the_commands_len; i++) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 switch (the_commands[i]->cmd) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 case LC_SEGMENT:
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 segment = ((struct segment_command *)
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 the_commands[i]);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 if (strcmp(segment->segname, SEG_DATA) == 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 fdatastart = segment->fileoff;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 fdatasize = segment->filesize;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 fgrowth = (data_size -
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 segment->filesize);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 segment->vmsize = data_size;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 segment->filesize = data_size;
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
300 dataseg_vmaddr = segment->vmaddr;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
301 dataseg_vmend = segment->vmaddr + segment->vmsize;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
302 vmaddr_growth = segment->vmaddr + segment->vmsize;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
303 } else {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
304 ((struct segment_command *)the_commands[i])->fileoff += fgrowth;
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 }
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
306
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
307 if( strcmp( segment->segname, SEG_LINKEDIT ) == 0 ) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
308 segment->vmaddr = vmaddr_growth;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
309 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
310
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 break;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 case LC_SYMTAB:
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 ((struct symtab_command *)
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 the_commands[i])->symoff += fgrowth;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 ((struct symtab_command *)
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 the_commands[i])->stroff += fgrowth;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 break;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 case LC_SYMSEG:
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 ((struct symseg_command *)
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 the_commands[i])->offset += fgrowth;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 break;
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
322 #ifdef NS_TARGET
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
323 case LC_DYSYMTAB:
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
324 dysymtab = ((struct dysymtab_command *)the_commands[i]);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
325 extreloff = dysymtab->extreloff;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
326 nextrel = dysymtab->nextrel;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
327 dysymtab->indirectsymoff += fgrowth;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
328 dysymtab->extreloff += fgrowth;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
329 break;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
330 #endif
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 default:
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 break;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 * Write header
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 if (write(outfd, &the_header,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 sizeof(the_header)) != sizeof(the_header)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 fatal_unexec("cannot write output file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 * Write commands
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 for (i = 0; i < the_commands_len; i++) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 if (write(outfd, the_commands[i],
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350 the_commands[i]->cmdsize) !=
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 the_commands[i]->cmdsize) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 fatal_unexec("cannot write output file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 * Write original text
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 if (lseek(infd, the_header.sizeofcmds + sizeof(the_header),
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 L_SET) < 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 fatal_unexec("cannot seek input file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 size = fdatastart - (sizeof(the_header) +
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 the_header.sizeofcmds);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 buf = my_malloc(size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 if (read(infd, buf, size) != size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 my_free(buf, size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 fatal_unexec("cannot read input file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 if (write(outfd, buf, size) != size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 my_free(buf, size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 fatal_unexec("cannot write output file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 my_free(buf, size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 * Write new data
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 if (write(outfd, (char *)data_address,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 data_size) != data_size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 fatal_unexec("cannot write output file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 * OKAY TO USE MALLOC NOW
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 /*
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 * Write rest of file
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 */
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 fstat(infd, &st);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 if (lseek(infd, fdatasize, L_INCR) < 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 fatal_unexec("cannot seek input file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 size = st.st_size - lseek(infd, 0, L_INCR);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 buf = malloc(size);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 if (read(infd, buf, size) != size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 free(buf);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 fatal_unexec("cannot read input file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 if (write(outfd, buf, size) != size) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 free(buf);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 fatal_unexec("cannot write output file");
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 return (0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 free(buf);
16853
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
417
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
418 #ifdef NS_TARGET
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
419 /*
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
420 * Fix up relocation entries in the data segment.
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
421 */
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
422
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
423 if (lseek(infd, extreloff, L_SET) < 0) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
424 fatal_unexec("cannot seek input file");
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
425 return (0);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
426 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
427
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
428 for (i = 0; i < nextrel; i++)
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
429 {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
430 long zeroval = 0;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
431
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
432 if (read(infd, &reloc_info, sizeof (reloc_info)) != sizeof (reloc_info)) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
433 fatal_unexec("cannot read input file");
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
434 return (0);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
435 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
436 if (reloc_info.r_address >= dataseg_vmaddr && reloc_info.r_address < dataseg_vmend)
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
437 {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
438 if (lseek (outfd, fdatastart + reloc_info.r_address - dataseg_vmaddr, L_SET) < 0 ) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
439 fatal_unexec("cannot seek input file");
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
440 return (0);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
441 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
442 switch (reloc_info.r_length) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
443 case 0:
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
444 if (write(outfd, &zeroval, 1) != 1) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
445 fatal_unexec("cannot write output file");
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
446 return (0);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
447 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
448 break;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
449 case 1:
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
450 if (write(outfd, &zeroval, 2) != 2) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
451 fatal_unexec("cannot write output file");
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
452 return (0);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
453 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
454 break;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
455 case 2:
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
456 if (write(outfd, &zeroval, 4) != 4) {
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
457 fatal_unexec("cannot write output file");
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
458 return (0);
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
459 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
460 break;
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
461 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
462 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
463 }
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
464 #endif
63f2ad395c81 Include <mach-o/reloc.h>.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
465
1349
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 return (1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 void
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 unexec(
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471 char *outfile,
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 char *infile
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 )
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 int infd;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 int outfd;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 char tmpbuf[L_tmpnam];
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 char *tmpfile;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 infd = open(infile, O_RDONLY, 0);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 if (infd < 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 fatal_unexec("cannot open input file `%s'", infile);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 exit(1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 tmpnam(tmpbuf);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 tmpfile = rindex(tmpbuf, '/');
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 if (tmpfile == NULL) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 tmpfile = tmpbuf;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 } else {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 tmpfile++;
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 outfd = open(tmpfile, O_WRONLY|O_TRUNC|O_CREAT, 0755);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 if (outfd < 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 close(infd);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 fatal_unexec("cannot open tmp file `%s'", tmpfile);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 exit(1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 if (!unexec_doit(infd, outfd)) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 close(infd);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 close(outfd);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 unlink(tmpfile);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 exit(1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 close(infd);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 close(outfd);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 if (rename(tmpfile, outfile) < 0) {
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 unlink(tmpfile);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 fatal_unexec("cannot rename `%s' to `%s'", tmpfile, outfile);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 exit(1);
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 }
5f7b21303f10 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 }