* alloc.c: Do not define struct catchtag.
[bpt/emacs.git] / src / emacs.c
CommitLineData
f927c5ae 1/* Fully extensible Emacs, running on Unix, intended for GNU.
0b5538bd 2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999,
76b6f707 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
ea8c20e0 4 Free Software Foundation, Inc.
f927c5ae
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
f927c5ae 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
f927c5ae
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
f927c5ae
JB
20
21
68c45bf0 22#include <config.h>
f927c5ae
JB
23#include <signal.h>
24#include <errno.h>
f927c5ae
JB
25#include <stdio.h>
26
27#include <sys/types.h>
28#include <sys/file.h>
d7306fe6 29#include <setjmp.h>
f927c5ae 30
cda4a5fd
GM
31#ifdef HAVE_UNISTD_H
32#include <unistd.h>
33#endif
34
488b7cb3 35#ifdef BSD_SYSTEM
f927c5ae
JB
36#include <sys/ioctl.h>
37#endif
38
edd3ff1d
JR
39#ifdef WINDOWSNT
40#include <fcntl.h>
52c7f9ee
JR
41#include <windows.h> /* just for w32.h */
42#include "w32.h"
c68a2829 43#include "w32heap.h" /* for prototype of sbrk */
edd3ff1d
JR
44#endif
45
edfda783
AR
46#ifdef NS_IMPL_GNUSTEP
47/* At least under Debian, GSConfig is in a subdirectory. --Stef */
48#include <GNUstepBase/GSConfig.h>
49#endif
50
f927c5ae
JB
51#include "lisp.h"
52#include "commands.h"
bef79ee4 53#include "intervals.h"
a08a816a 54#include "buffer.h"
3f6abfd7 55#include "window.h"
f927c5ae 56
edc8ae07 57#include "systty.h"
6c3a4e9d 58#include "blockinput.h"
8090eb09 59#include "syssignal.h"
6c362a8b 60#include "process.h"
428a555e 61#include "frame.h"
5bda49c6 62#include "termhooks.h"
dfcf069d 63#include "keyboard.h"
e35f6ff7 64#include "keymap.h"
a41f8bed 65
68c45bf0
PE
66#ifdef HAVE_SETLOCALE
67#include <locale.h>
68#endif
69
53c58b5d
RS
70#ifdef HAVE_SETRLIMIT
71#include <sys/time.h>
72#include <sys/resource.h>
73#endif
74
dede2792
JD
75#ifdef HAVE_PERSONALITY_LINUX32
76#include <sys/personality.h>
77#endif
78
f927c5ae
JB
79#ifndef O_RDWR
80#define O_RDWR 2
81#endif
82
f95c3f91 83#ifdef HAVE_SETPGID
2b7e8799 84#if !defined (USG) || defined (BSD_PGRPS)
90553aa3 85#undef setpgrp
f95c3f91
GM
86#define setpgrp setpgid
87#endif
2b7e8799 88#endif
f95c3f91 89
90553aa3
DL
90extern void malloc_warning P_ ((char *));
91extern void set_time_zone_rule P_ ((char *));
8892f40b
GM
92#ifdef HAVE_INDEX
93extern char *index P_ ((const char *, int));
94#endif
43165242 95
30aa3f19
GM
96/* Make these values available in GDB, which doesn't see macros. */
97
6b61353c
KH
98#ifdef USE_LSB_TAG
99int gdb_use_lsb = 1;
100#else
101int gdb_use_lsb = 0;
102#endif
6e5cb96f 103#ifndef USE_LISP_UNION_TYPE
6b61353c
KH
104int gdb_use_union = 0;
105#else
106int gdb_use_union = 1;
107#endif
30aa3f19
GM
108EMACS_INT gdb_valbits = VALBITS;
109EMACS_INT gdb_gctypebits = GCTYPEBITS;
4f7cb96d 110#if defined (DATA_SEG_BITS) && ! defined (USE_LSB_TAG)
30aa3f19
GM
111EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
112#else
df50cf6c 113EMACS_INT gdb_data_seg_bits = 0;
30aa3f19 114#endif
00da0e4a 115EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
3fba6ca9 116EMACS_INT gdb_array_mark_flag = ARRAY_MARK_FLAG;
6baa02d6
EZ
117/* GDB might say "No enum type named pvec_type" if we don't have at
118 least one symbol with that type, and then xbacktrace could fail. */
119enum pvec_type gdb_pvec_type = PVEC_TYPE_MASK;
30aa3f19 120
7db35a48 121/* Command line args from shell, as list of strings. */
f927c5ae
JB
122Lisp_Object Vcommand_line_args;
123
59653951
JB
124/* The name under which Emacs was invoked, with any leading directory
125 names discarded. */
126Lisp_Object Vinvocation_name;
127
ace40a69
RS
128/* The directory name from which Emacs was invoked. */
129Lisp_Object Vinvocation_directory;
130
07f4d123
RS
131/* The directory name in which to find subdirs such as lisp and etc.
132 nil means get them only from PATH_LOADSEARCH. */
133Lisp_Object Vinstallation_directory;
134
90503d96
CY
135/* The values of `current-time' before and after Emacs initialization. */
136Lisp_Object Vbefore_init_time, Vafter_init_time;
137
e5d77022
JB
138/* Hook run by `kill-emacs' before it does really anything. */
139Lisp_Object Vkill_emacs_hook;
140
7e9fa161
JB
141/* Empty lisp strings. To avoid having to build any others. */
142Lisp_Object empty_unibyte_string, empty_multibyte_string;
f9a6326d 143
074a066b
GV
144/* Search path separator. */
145Lisp_Object Vpath_separator;
146
f927c5ae
JB
147/* Set nonzero after Emacs has started up the first time.
148 Prevents reinitialization of the Lisp world and keymaps
149 on subsequent starts. */
150int initialized;
151
15aaf1b5
RS
152#ifdef DOUG_LEA_MALLOC
153/* Preserves a pointer to the memory allocated that copies that
154 static data inside glibc's malloc. */
155void *malloc_state_ptr;
156/* From glibc, a routine that returns a copy of the malloc internal state. */
157extern void *malloc_get_state ();
158/* From glibc, a routine that overwrites the malloc internal state. */
fa8459a3 159extern int malloc_set_state ();
7c9cd446
AS
160/* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
161 dumping. Used to work around a bug in glibc's malloc. */
162int malloc_using_checking;
15aaf1b5
RS
163#endif
164
271c7b7c 165/* Variable whose value is symbol giving operating system type. */
f927c5ae 166Lisp_Object Vsystem_type;
271c7b7c
RS
167
168/* Variable whose value is string giving configuration built for. */
169Lisp_Object Vsystem_configuration;
f0fc0b1a
KH
170
171/* Variable whose value is string giving configuration options,
172 for use when reporting bugs. */
173Lisp_Object Vsystem_configuration_options;
174
213d0b1f
RS
175Lisp_Object Qfile_name_handler_alist;
176
68c45bf0 177/* Current and previous system locales for messages and time. */
ca9c0567
PE
178Lisp_Object Vsystem_messages_locale;
179Lisp_Object Vprevious_system_messages_locale;
180Lisp_Object Vsystem_time_locale;
181Lisp_Object Vprevious_system_time_locale;
68c45bf0 182
7d0393cf 183/* If non-zero, emacs should not attempt to use a window-specific code,
7db35a48 184 but instead should use the virtual terminal under which it was started. */
f927c5ae
JB
185int inhibit_window_system;
186
5aa7f46a
JB
187/* If nonzero, set Emacs to run at this priority. This is also used
188 in child_setup and sys_suspend to make sure subshells run at normal
7db35a48 189 priority; those functions have their own extern declaration. */
31ade731 190EMACS_INT emacs_priority;
3005da00 191
7db35a48
PJ
192/* If non-zero, a filter or a sentinel is running. Tested to save the match
193 data on the first attempt to change it inside asynchronous code. */
7074fde6
FP
194int running_asynch_code;
195
647cec74 196#ifdef BSD_PGRPS
9ae8f997
JB
197/* See sysdep.c. */
198extern int inherited_pgroup;
199#endif
200
edfda783 201#if defined(HAVE_X_WINDOWS) || defined(HAVE_NS)
7db35a48 202/* If non-zero, -d was specified, meaning we're using some window system. */
f927c5ae
JB
203int display_arg;
204#endif
205
206/* An address near the bottom of the stack.
207 Tells GC how to save a copy of the stack. */
208char *stack_bottom;
209
dede2792
JD
210/* The address where the heap starts (from the first sbrk (0) call). */
211static void *my_heap_start;
212
213/* The gap between BSS end and heap start as far as we can tell. */
214static unsigned long heap_bss_diff;
215
fd75ddb2
JD
216/* If the gap between BSS end and heap start is larger than this
217 output a warning in dump-emacs. */
dede2792
JD
218#define MAX_HEAP_BSS_DIFF (1024*1024)
219
220
8ba50e1a 221#ifdef HAVE_WINDOW_SYSTEM
2246281f 222extern Lisp_Object Vinitial_window_system;
8ba50e1a 223#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 224
1090a161
RS
225extern Lisp_Object Vauto_save_list_file_name;
226
9db03f6c
KS
227extern Lisp_Object Vinhibit_redisplay;
228
f927c5ae
JB
229/* Nonzero means running Emacs without interactive terminal. */
230
231int noninteractive;
232
233/* Value of Lisp variable `noninteractive'.
234 Normally same as C variable `noninteractive'
235 but nothing terrible happens if user sets this one. */
236
237int noninteractive1;
e29f86e4 238
8686ac71
JB
239/* Nonzero means Emacs was run in --quick mode. */
240int inhibit_x_resources;
241
4ff029f6
DN
242/* Name for the server started by the daemon.*/
243static char *daemon_name;
eab2ee89 244
5790ef40
DN
245/* Pipe used to send exit notification to the daemon parent at
246 startup. */
ff808935 247int daemon_pipe[2];
fc012771 248
e29f86e4
RS
249/* Save argv and argc. */
250char **initial_argv;
251int initial_argc;
081bef73
RS
252
253static void sort_args ();
dfcf069d 254void syms_of_emacs ();
bd4590ba 255
6b61353c
KH
256/* MSVC needs each string be shorter than 2048 bytes, so the usage
257 strings below are split to not overflow this limit. */
73ebcd25 258#define USAGE1 "\
bd4590ba
GM
259Usage: %s [OPTION-OR-FILENAME]...\n\
260\n\
261Run Emacs, the extensible, customizable, self-documenting real-time\n\
262display editor. The recommended way to start Emacs for normal editing\n\
263is with no options at all.\n\
264\n\
49ca717b 265Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
bd4590ba
GM
266read the main documentation for these command-line arguments.\n\
267\n\
268Initialization options:\n\
269\n\
6b61353c 270--batch do not do interactive display; implies -q\n\
598898a7 271--daemon start a server in the background\n\
6b61353c
KH
272--debug-init enable Emacs Lisp debugger for init file\n\
273--display, -d DISPLAY use X server DISPLAY\n\
6b61353c
KH
274--no-desktop do not load a saved desktop\n\
275--no-init-file, -q load neither ~/.emacs nor default.el\n\
276--no-shared-memory, -nl do not use shared memory\n\
277--no-site-file do not load site-start.el\n\
278--no-splash do not display a splash screen on startup\n\
2ff86b4e 279--no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
bae52079 280--quick, -Q equivalent to -q --no-site-file --no-splash\n\
6b61353c
KH
281--script FILE run FILE as an Emacs Lisp script\n\
282--terminal, -t DEVICE use DEVICE for terminal I/O\n\
6b61353c
KH
283--user, -u USER load ~USER/.emacs instead of your own\n\
284\n%s"
285
286#define USAGE2 "\
bd4590ba
GM
287Action options:\n\
288\n\
6b61353c 289FILE visit FILE using find-file\n\
9020b223
GM
290+LINE go to line LINE in next FILE\n\
291+LINE:COLUMN go to line LINE, column COLUMN, in next FILE\n\
6b61353c
KH
292--directory, -L DIR add DIR to variable load-path\n\
293--eval EXPR evaluate Emacs Lisp expression EXPR\n\
294--execute EXPR evaluate Emacs Lisp expression EXPR\n\
295--file FILE visit FILE using find-file\n\
296--find-file FILE visit FILE using find-file\n\
297--funcall, -f FUNC call Emacs Lisp function FUNC with no arguments\n\
298--insert FILE insert contents of FILE into current buffer\n\
299--kill exit without asking for confirmation\n\
300--load, -l FILE load Emacs Lisp FILE using the load function\n\
301--visit FILE visit FILE using find-file\n\
73ebcd25
AI
302\n"
303
6b61353c 304#define USAGE3 "\
5b2ca26b 305Display options:\n\
bd4590ba 306\n\
6b61353c 307--background-color, -bg COLOR window background color\n\
2ff86b4e
NR
308--basic-display, -D disable many display features;\n\
309 used for debugging Emacs\n\
6b61353c
KH
310--border-color, -bd COLOR main border color\n\
311--border-width, -bw WIDTH width of main border\n\
ced74849 312--color, --color=MODE override color mode for character terminals;\n\
6b61353c
KH
313 MODE defaults to `auto', and can also\n\
314 be `never', `auto', `always',\n\
315 or a mode name like `ansi8'\n\
316--cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
317--font, -fn FONT default font; must be fixed-width\n\
318--foreground-color, -fg COLOR window foreground color\n\
319--fullheight, -fh make the first frame high as the screen\n\
320--fullscreen, -fs make first frame fullscreen\n\
321--fullwidth, -fw make the first frame wide as the screen\n\
3f1c6666 322--maximized, -mm make the first frame maximized\n\
6b61353c 323--geometry, -g GEOMETRY window geometry\n\
f9e36a6d 324--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon\n\
6b61353c
KH
325--iconic start Emacs in iconified state\n\
326--internal-border, -ib WIDTH width between text and main border\n\
327--line-spacing, -lsp PIXELS additional space to put between lines\n\
328--mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
329--name NAME title for initial Emacs frame\n\
49ca717b 330--no-blinking-cursor, -nbc disable blinking cursor\n\
6b61353c
KH
331--reverse-video, -r, -rv switch foreground and background\n\
332--title, -T TITLE title for initial Emacs frame\n\
333--vertical-scroll-bars, -vb enable vertical scroll bars\n\
334--xrm XRESOURCES set additional X resources\n\
1540a61a 335--parent-id XID set parent window\n\
6b61353c
KH
336--help display this help and exit\n\
337--version output version information and exit\n\
07beadff
JR
338\n"
339
340#define USAGE4 "\
bd4590ba
GM
341You can generally also specify long option names with a single -; for\n\
342example, -batch as well as --batch. You can use any unambiguous\n\
343abbreviation for a --option.\n\
344\n\
345Various environment variables and window system resources also affect\n\
346Emacs' operation. See the main documentation.\n\
07beadff 347\n\
d883731c 348Report bugs to %s. First, please see the Bugs\n\
bd4590ba
GM
349section of the Emacs manual or the file BUGS.\n"
350
f927c5ae 351\f
7db35a48 352/* Signal code for the fatal signal that was received. */
f927c5ae
JB
353int fatal_error_code;
354
7db35a48 355/* Nonzero if handling a fatal error already. */
f927c5ae
JB
356int fatal_error_in_progress;
357
7db35a48 358/* If non-null, call this function from fatal_error_signal before
4fab758d
GM
359 committing suicide. */
360
361void (*fatal_error_signal_hook) P_ ((void));
362
3e9de9f6 363#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
9e2a2647
DN
364/* When compiled with GTK and running under Gnome,
365 multiple threads may be created. Keep track of our main
3e9de9f6 366 thread to make sure signals are delivered to it (see syssignal.h). */
333f1b6f
JD
367
368pthread_t main_thread;
369#endif
370
4fab758d 371
7db35a48 372/* Handle bus errors, invalid instruction, etc. */
2447c626 373SIGTYPE
f927c5ae
JB
374fatal_error_signal (sig)
375 int sig;
376{
333f1b6f 377 SIGNAL_THREAD_CHECK (sig);
f927c5ae
JB
378 fatal_error_code = sig;
379 signal (sig, SIG_DFL);
380
061b7f94
RS
381 TOTALLY_UNBLOCK_INPUT;
382
f927c5ae 383 /* If fatal error occurs in code below, avoid infinite recursion. */
8090eb09
JB
384 if (! fatal_error_in_progress)
385 {
386 fatal_error_in_progress = 1;
f927c5ae 387
f7ab4e3d 388 shut_down_emacs (sig, 0, Qnil);
8090eb09 389 }
f927c5ae 390
8090eb09
JB
391 /* Signal the same code; this time it will really be fatal.
392 Remember that since we're in a signal handler, the signal we're
393 going to send is probably blocked, so we have to unblock it if we
394 want to really receive it. */
29b89fe0 395#ifndef MSDOS
a90538cb 396 sigunblock (sigmask (fatal_error_code));
29b89fe0 397#endif
4fab758d
GM
398
399 if (fatal_error_signal_hook)
400 fatal_error_signal_hook ();
7db35a48 401
f927c5ae 402 kill (getpid (), fatal_error_code);
f927c5ae 403}
271c7b7c
RS
404
405#ifdef SIGDANGER
406
16c323ee 407/* Handler for SIGDANGER. */
271c7b7c
RS
408SIGTYPE
409memory_warning_signal (sig)
410 int sig;
411{
412 signal (sig, memory_warning_signal);
333f1b6f 413 SIGNAL_THREAD_CHECK (sig);
271c7b7c
RS
414
415 malloc_warning ("Operating system warns that virtual memory is running low.\n");
55796183
RS
416
417 /* It might be unsafe to call do_auto_save now. */
418 force_auto_save_soon ();
271c7b7c
RS
419}
420#endif
fcf01ad3
RS
421
422/* We define abort, rather than using it from the library,
c9fe9cce 423 so that GDB can return from a breakpoint here.
7db35a48 424 MSDOS has its own definition in msdos.c. */
fcf01ad3 425
37e2fdd2 426#if ! defined (DOS_NT) && ! defined (NO_ABORT)
ca9c0567 427
4624371d 428void
fcf01ad3
RS
429abort ()
430{
431 kill (getpid (), SIGABRT);
37e2fdd2
RS
432 /* This shouldn't be executed, but it prevents a warning. */
433 exit (1);
fcf01ad3 434}
c9fe9cce 435#endif
fcf01ad3 436
f927c5ae 437\f
7db35a48 438/* Code for dealing with Lisp access to the Unix command line. */
f927c5ae 439
dfcf069d 440static void
f927c5ae
JB
441init_cmdargs (argc, argv, skip_args)
442 int argc;
443 char **argv;
444 int skip_args;
445{
446 register int i;
213d0b1f 447 Lisp_Object name, dir, tem;
aed13378 448 int count = SPECPDL_INDEX ();
213d0b1f 449 Lisp_Object raw_name;
f927c5ae 450
e29f86e4
RS
451 initial_argv = argv;
452 initial_argc = argc;
453
213d0b1f
RS
454 raw_name = build_string (argv[0]);
455
456 /* Add /: to the front of the name
457 if it would otherwise be treated as magic. */
458 tem = Ffind_file_name_handler (raw_name, Qt);
459 if (! NILP (tem))
460 raw_name = concat2 (build_string ("/:"), raw_name);
461
462 Vinvocation_name = Ffile_name_nondirectory (raw_name);
463 Vinvocation_directory = Ffile_name_directory (raw_name);
464
ace40a69
RS
465 /* If we got no directory in argv[0], search PATH to find where
466 Emacs actually came from. */
467 if (NILP (Vinvocation_directory))
468 {
469 Lisp_Object found;
470 int yes = openp (Vexec_path, Vinvocation_name,
10c0915e 471 Vexec_suffixes, &found, make_number (X_OK));
e443f843 472 if (yes == 1)
213d0b1f
RS
473 {
474 /* Add /: to the front of the name
475 if it would otherwise be treated as magic. */
476 tem = Ffind_file_name_handler (found, Qt);
477 if (! NILP (tem))
478 found = concat2 (build_string ("/:"), found);
479 Vinvocation_directory = Ffile_name_directory (found);
480 }
ace40a69 481 }
59653951 482
4133b300
RS
483 if (!NILP (Vinvocation_directory)
484 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
213d0b1f
RS
485 /* Emacs was started with relative path, like ./emacs.
486 Make it absolute. */
4133b300
RS
487 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
488
07f4d123
RS
489 Vinstallation_directory = Qnil;
490
491 if (!NILP (Vinvocation_directory))
492 {
493 dir = Vinvocation_directory;
494 name = Fexpand_file_name (Vinvocation_name, dir);
495 while (1)
496 {
f5ab9736 497 Lisp_Object tem, lib_src_exists;
07f4d123
RS
498 Lisp_Object etc_exists, info_exists;
499
f5ab9736
RS
500 /* See if dir contains subdirs for use by Emacs.
501 Check for the ones that would exist in a build directory,
502 not including lisp and info. */
503 tem = Fexpand_file_name (build_string ("lib-src"), dir);
504 lib_src_exists = Ffile_exists_p (tem);
de004cc6 505
70344b34 506#ifdef MSDOS
de004cc6
RS
507 /* MSDOS installations frequently remove lib-src, but we still
508 must set installation-directory, or else info won't find
509 its files (it uses the value of installation-directory). */
510 tem = Fexpand_file_name (build_string ("info"), dir);
511 info_exists = Ffile_exists_p (tem);
70344b34
EZ
512#else
513 info_exists = Qnil;
514#endif
de004cc6
RS
515
516 if (!NILP (lib_src_exists) || !NILP (info_exists))
07f4d123 517 {
f5ab9736
RS
518 tem = Fexpand_file_name (build_string ("etc"), dir);
519 etc_exists = Ffile_exists_p (tem);
520 if (!NILP (etc_exists))
07f4d123 521 {
f5ab9736
RS
522 Vinstallation_directory
523 = Ffile_name_as_directory (dir);
524 break;
07f4d123
RS
525 }
526 }
527
528 /* See if dir's parent contains those subdirs. */
f5ab9736
RS
529 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
530 lib_src_exists = Ffile_exists_p (tem);
de004cc6 531
70344b34
EZ
532
533#ifdef MSDOS
534 /* See the MSDOS commentary above. */
de004cc6
RS
535 tem = Fexpand_file_name (build_string ("../info"), dir);
536 info_exists = Ffile_exists_p (tem);
70344b34
EZ
537#else
538 info_exists = Qnil;
539#endif
de004cc6
RS
540
541 if (!NILP (lib_src_exists) || !NILP (info_exists))
07f4d123 542 {
f5ab9736
RS
543 tem = Fexpand_file_name (build_string ("../etc"), dir);
544 etc_exists = Ffile_exists_p (tem);
545 if (!NILP (etc_exists))
07f4d123 546 {
f5ab9736
RS
547 tem = Fexpand_file_name (build_string (".."), dir);
548 Vinstallation_directory
549 = Ffile_name_as_directory (tem);
550 break;
07f4d123
RS
551 }
552 }
553
554 /* If the Emacs executable is actually a link,
555 next try the dir that the link points into. */
556 tem = Ffile_symlink_p (name);
557 if (!NILP (tem))
558 {
260ec24d 559 name = Fexpand_file_name (tem, dir);
07f4d123
RS
560 dir = Ffile_name_directory (name);
561 }
562 else
563 break;
564 }
565 }
566
f927c5ae
JB
567 Vcommand_line_args = Qnil;
568
569 for (i = argc - 1; i >= 0; i--)
570 {
571 if (i == 0 || i > skip_args)
a520393d
KH
572 /* For the moment, we keep arguments as is in unibyte strings.
573 They are decoded in the function command-line after we know
574 locale-coding-system. */
f927c5ae 575 Vcommand_line_args
68db37aa 576 = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
a520393d 577 Vcommand_line_args);
f927c5ae 578 }
213d0b1f
RS
579
580 unbind_to (count, Qnil);
f927c5ae 581}
59653951
JB
582
583DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
7db35a48
PJ
584 doc: /* Return the program name that was used to run Emacs.
585Any directory names are omitted. */)
586 ()
59653951
JB
587{
588 return Fcopy_sequence (Vinvocation_name);
589}
590
ace40a69 591DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
7db35a48
PJ
592 0, 0, 0,
593 doc: /* Return the directory name in which the Emacs executable was located. */)
594 ()
ace40a69
RS
595{
596 return Fcopy_sequence (Vinvocation_directory);
597}
598
f927c5ae 599\f
0269dedb
RS
600#ifdef HAVE_TZSET
601/* A valid but unlikely value for the TZ environment value.
602 It is OK (though a bit slower) if the user actually chooses this value. */
603static char dump_tz[] = "UtC0";
604#endif
605
a90538cb 606#ifndef ORDINARY_LINK
efd241cc
RS
607/* We don't include crtbegin.o and crtend.o in the link,
608 so these functions and variables might be missed.
609 Provide dummy definitions to avoid error.
610 (We don't have any real constructors or destructors.) */
611#ifdef __GNUC__
46e65b73 612#ifndef GCC_CTORS_IN_LIBC
dfcf069d 613void __do_global_ctors ()
efd241cc 614{}
dfcf069d 615void __do_global_ctors_aux ()
c83a7064 616{}
dfcf069d 617void __do_global_dtors ()
33143604 618{}
554061d8 619/* GNU/Linux has a bug in its library; avoid an error. */
8a2a6032 620#ifndef GNU_LINUX
c83a7064 621char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
64c1864a 622#endif
c83a7064 623char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
46e65b73 624#endif /* GCC_CTORS_IN_LIBC */
dfcf069d 625void __main ()
efd241cc 626{}
efd241cc 627#endif /* __GNUC__ */
a90538cb 628#endif /* ORDINARY_LINK */
efd241cc 629
e2925360
KH
630/* Test whether the next argument in ARGV matches SSTR or a prefix of
631 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
632 (the argument is supposed to have a value) store in *VALPTR either
633 the next argument or the portion of this one after the equal sign.
634 ARGV is read starting at position *SKIPPTR; this index is advanced
635 by the number of arguments used.
636
637 Too bad we can't just use getopt for all of this, but we don't have
638 enough information to do it right. */
081bef73 639
e2925360 640static int
df6530f8 641argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
e2925360 642 char **argv;
df6530f8 643 int argc;
e2925360
KH
644 char *sstr;
645 char *lstr;
646 int minlen;
647 char **valptr;
648 int *skipptr;
649{
6bbd7a29 650 char *p = NULL;
e2925360 651 int arglen;
df6530f8
RS
652 char *arg;
653
654 /* Don't access argv[argc]; give up in advance. */
655 if (argc <= *skipptr + 1)
656 return 0;
657
658 arg = argv[*skipptr+1];
e2925360
KH
659 if (arg == NULL)
660 return 0;
661 if (strcmp (arg, sstr) == 0)
662 {
663 if (valptr != NULL)
664 {
665 *valptr = argv[*skipptr+2];
666 *skipptr += 2;
667 }
668 else
669 *skipptr += 1;
670 return 1;
671 }
672 arglen = (valptr != NULL && (p = index (arg, '=')) != NULL
673 ? p - arg : strlen (arg));
c03e1113 674 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
e2925360
KH
675 return 0;
676 else if (valptr == NULL)
677 {
678 *skipptr += 1;
679 return 1;
680 }
681 else if (p != NULL)
682 {
683 *valptr = p+1;
684 *skipptr += 1;
685 return 1;
686 }
687 else if (argv[*skipptr+2] != NULL)
688 {
689 *valptr = argv[*skipptr+2];
690 *skipptr += 2;
691 return 1;
692 }
693 else
694 {
695 return 0;
696 }
697}
698
b6779252 699#ifdef DOUG_LEA_MALLOC
f927c5ae 700
b6779252
KH
701/* malloc can be invoked even before main (e.g. by the dynamic
702 linker), so the dumped malloc state must be restored as early as
703 possible using this special hook. */
704
705static void
706malloc_initialize_hook ()
707{
1f9c3929 708#ifndef USE_CRT_DLL
b6779252 709 extern char **environ;
1f9c3929 710#endif
6000fe37 711
15aaf1b5
RS
712 if (initialized)
713 {
7c9cd446
AS
714 if (!malloc_using_checking)
715 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
716 ignored if the heap to be restored was constructed without
d942e12a
AS
717 malloc checking. Can't use unsetenv, since that calls malloc. */
718 {
719 char **p;
720
a57c4026 721 for (p = environ; p && *p; p++)
d942e12a
AS
722 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
723 {
724 do
725 *p = p[1];
726 while (*++p);
727 break;
728 }
729 }
b6779252 730
15aaf1b5 731 malloc_set_state (malloc_state_ptr);
68db37aa 732#ifndef XMALLOC_OVERRUN_CHECK
15aaf1b5 733 free (malloc_state_ptr);
68db37aa 734#endif
15aaf1b5 735 }
7c9cd446 736 else
dede2792
JD
737 {
738 if (my_heap_start == 0)
739 my_heap_start = sbrk (0);
740 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
741 }
b6779252
KH
742}
743
744void (*__malloc_initialize_hook) () = malloc_initialize_hook;
745
746#endif /* DOUG_LEA_MALLOC */
747
d883731c
PJ
748
749#define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
750#define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
751
752/* This function is used to determine an address to which bug report should
753 be sent. */
754
400d6fa9
PJ
755char *
756bug_reporting_address ()
d883731c 757{
400d6fa9 758 int count = 0;
d883731c
PJ
759 Lisp_Object temp;
760 char *string;
761
762 temp = Fsymbol_value (intern ("emacs-version"));
763
764 /* When `emacs-version' is invalid, use normal address. */
765 if (!STRINGP(temp))
766 return REPORT_EMACS_BUG_ADDRESS;
767
d5db4077 768 string = SDATA (temp);
d883731c 769
400d6fa9
PJ
770 /* Count dots in `emacs-version'. */
771 while (*string)
772 {
773 if (*string == '.')
774 count++;
775 string++;
776 }
d883731c
PJ
777
778 /* When `emacs-version' has at least three dots, it is development or
779 pretest version of Emacs. */
400d6fa9 780 return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
d883731c
PJ
781}
782
783
b6779252
KH
784/* ARGSUSED */
785int
7c2fb837 786main (int argc, char **argv)
b6779252 787{
2313132f 788#if GC_MARK_STACK
39ec21ea
GM
789 Lisp_Object dummy;
790#endif
b6779252 791 char stack_bottom_variable;
68c45bf0 792 int do_initial_setlocale;
b6779252 793 int skip_args = 0;
1f9c3929 794#ifndef USE_CRT_DLL
b6779252 795 extern int errno;
1f9c3929 796#endif
b6779252
KH
797#ifdef HAVE_SETRLIMIT
798 struct rlimit rlim;
799#endif
800 int no_loadup = 0;
6e910e07 801 char *junk = 0;
4ff029f6 802 char *dname_arg = 0;
b3243e6f
AR
803#ifdef NS_IMPL_COCOA
804 char dname_arg2[80];
805#endif
b6779252 806
2313132f 807#if GC_MARK_STACK
39ec21ea
GM
808 extern Lisp_Object *stack_base;
809 stack_base = &dummy;
810#endif
811
dede2792
JD
812 if (!initialized)
813 {
814 extern char my_endbss[];
815 extern char *my_endbss_static;
816
817 if (my_heap_start == 0)
818 my_heap_start = sbrk (0);
819
820 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
821 }
822
cc61af67
DN
823#ifdef LINUX_SBRK_BUG
824 /* This is only used GNU/LINUX running on alpha when using libc5 */
b6779252 825 __sbrk (1);
15aaf1b5
RS
826#endif
827
d785cf9e
RS
828#ifdef RUN_TIME_REMAP
829 if (initialized)
830 run_time_remap (argv[0]);
831#endif
832
14145fa3
AR
833/* If using unexmacosx.c (set by s/darwin.h), we must do this. */
834#ifdef DARWIN_OS
e0f712ba
AC
835 if (!initialized)
836 unexec_init_emacs_zone ();
837#endif
838
081bef73 839 sort_args (argc, argv);
956e3c7e
RS
840 argc = 0;
841 while (argv[argc]) argc++;
081bef73 842
3270ae6e
KH
843 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)
844 /* We don't know the version number unless this is a dumped Emacs.
845 So ignore --version otherwise. */
846 && initialized)
1702afef 847 {
5cf9ca93 848 Lisp_Object tem, tem2;
1702afef 849 tem = Fsymbol_value (intern ("emacs-version"));
5cf9ca93 850 tem2 = Fsymbol_value (intern ("emacs-copyright"));
1702afef
RS
851 if (!STRINGP (tem))
852 {
853 fprintf (stderr, "Invalid value of `emacs-version'\n");
854 exit (1);
855 }
5cf9ca93
GM
856 if (!STRINGP (tem2))
857 {
858 fprintf (stderr, "Invalid value of `emacs-copyright'\n");
859 exit (1);
860 }
1702afef
RS
861 else
862 {
d5db4077 863 printf ("GNU Emacs %s\n", SDATA (tem));
5cf9ca93 864 printf ("%s\n", SDATA(tem2));
b455c665
RS
865 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
866 printf ("You may redistribute copies of Emacs\n");
867 printf ("under the terms of the GNU General Public License.\n");
868 printf ("For more information about these matters, ");
94487c4e 869 printf ("see the file named COPYING.\n");
1702afef
RS
870 exit (0);
871 }
872 }
873
dede2792 874#ifdef HAVE_PERSONALITY_LINUX32
dede2792
JD
875 if (!initialized
876 && (strcmp (argv[argc-1], "dump") == 0
877 || strcmp (argv[argc-1], "bootstrap") == 0)
fd75ddb2 878 && ! getenv ("EMACS_HEAP_EXEC"))
dede2792 879 {
fd75ddb2
JD
880 /* Set this so we only do this once. */
881 putenv("EMACS_HEAP_EXEC=true");
711877f3 882
fd75ddb2
JD
883 /* A flag to turn off address randomization which is introduced
884 in linux kernel shipped with fedora core 4 */
711877f3 885#define ADD_NO_RANDOMIZE 0x0040000
fd75ddb2 886 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
711877f3
MY
887#undef ADD_NO_RANDOMIZE
888
fd75ddb2 889 execvp (argv[0], argv);
dede2792 890
fd75ddb2
JD
891 /* If the exec fails, try to dump anyway. */
892 perror ("execvp");
dede2792
JD
893 }
894#endif /* HAVE_PERSONALITY_LINUX32 */
895
896
f927c5ae
JB
897/* Map in shared memory, if we are using that. */
898#ifdef HAVE_SHM
df6530f8 899 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
f927c5ae
JB
900 {
901 map_in_data (0);
902 /* The shared memory was just restored, which clobbered this. */
903 skip_args = 1;
904 }
905 else
906 {
907 map_in_data (1);
908 /* The shared memory was just restored, which clobbered this. */
909 skip_args = 0;
910 }
911#endif
912
ea2acec5 913#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
6c2935e9
RS
914 /* Extend the stack space available.
915 Don't do that if dumping, since some systems (e.g. DJGPP)
916 might define a smaller stack limit at that time. */
917 if (1
918#ifndef CANNOT_DUMP
919 && (!noninteractive || initialized)
920#endif
921 && !getrlimit (RLIMIT_STACK, &rlim))
53c58b5d 922 {
509a8fcd 923 long newlim;
fa8459a3 924 extern size_t re_max_failures;
03effc23
KH
925 /* Approximate the amount regex.c needs per unit of re_max_failures. */
926 int ratio = 20 * sizeof (char *);
927 /* Then add 33% to cover the size of the smaller stacks that regex.c
928 successively allocates and discards, on its way to the maximum. */
929 ratio += ratio / 3;
930 /* Add in some extra to cover
931 what we're likely to use for other reasons. */
932 newlim = re_max_failures * ratio + 200000;
d0381a7f
RS
933#ifdef __NetBSD__
934 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
935 stack allocation routine for new process that the allocation
936 fails if stack limit is not on page boundary. So, round up the
937 new limit to page boundary. */
938 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
939#endif
509a8fcd 940 if (newlim > rlim.rlim_max)
6c2935e9
RS
941 {
942 newlim = rlim.rlim_max;
03effc23
KH
943 /* Don't let regex.c overflow the stack we have. */
944 re_max_failures = (newlim - 200000) / ratio;
6c2935e9 945 }
509a8fcd
RS
946 if (rlim.rlim_cur < newlim)
947 rlim.rlim_cur = newlim;
948
53c58b5d
RS
949 setrlimit (RLIMIT_STACK, &rlim);
950 }
ea2acec5 951#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
53c58b5d 952
f927c5ae
JB
953 /* Record (approximately) where the stack begins. */
954 stack_bottom = &stack_bottom_variable;
955
f927c5ae 956 clearerr (stdin);
9ae8f997 957
f927c5ae 958#ifndef SYSTEM_MALLOC
bf7f4e90
RS
959 /* Arrange to get warning messages as memory fills up. */
960 memory_warnings (0, malloc_warning);
9ac0d9e0 961
f5a3c8c4
AI
962 /* Call malloc at least once, to run the initial __malloc_hook.
963 Also call realloc and free for consistency. */
964 free (realloc (malloc (4), 4));
bf7f4e90 965
06ca62eb 966# ifndef SYNC_INPUT
bf7f4e90
RS
967 /* Arrange to disable interrupt input inside malloc etc. */
968 uninterrupt_malloc ();
06ca62eb 969# endif /* not SYNC_INPUT */
f927c5ae
JB
970#endif /* not SYSTEM_MALLOC */
971
3e9de9f6 972#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
333f1b6f 973 main_thread = pthread_self ();
3e9de9f6 974#endif /* FORWARD_SIGNAL_TO_MAIN_THREAD */
333f1b6f 975
edd3ff1d 976#if defined (MSDOS) || defined (WINDOWSNT)
29b89fe0
RS
977 /* We do all file input/output as binary files. When we need to translate
978 newlines, we do that manually. */
979 _fmode = O_BINARY;
edd3ff1d 980#endif /* MSDOS || WINDOWSNT */
18198bb2 981
edd3ff1d 982#ifdef MSDOS
18198bb2
RS
983#if __DJGPP__ >= 2
984 if (!isatty (fileno (stdin)))
985 setmode (fileno (stdin), O_BINARY);
986 if (!isatty (fileno (stdout)))
987 {
988 fflush (stdout);
989 setmode (fileno (stdout), O_BINARY);
990 }
991#else /* not __DJGPP__ >= 2 */
29b89fe0
RS
992 (stdin)->_flag &= ~_IOTEXT;
993 (stdout)->_flag &= ~_IOTEXT;
994 (stderr)->_flag &= ~_IOTEXT;
18198bb2 995#endif /* not __DJGPP__ >= 2 */
29b89fe0
RS
996#endif /* MSDOS */
997
a422068f 998#ifdef SET_EMACS_PRIORITY
3005da00 999 if (emacs_priority)
5aa7f46a 1000 nice (emacs_priority);
f927c5ae 1001 setuid (getuid ());
a422068f 1002#endif /* SET_EMACS_PRIORITY */
f927c5ae 1003
68c45bf0
PE
1004 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
1005 The build procedure uses this while dumping, to ensure that the
1006 dumped Emacs does not have its system locale tables initialized,
1007 as that might cause screwups when the dumped Emacs starts up. */
1008 {
1009 char *lc_all = getenv ("LC_ALL");
1010 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
1011 }
1012
1013 /* Set locale now, so that initial error messages are localized properly.
1014 fixup_locale must wait until later, since it builds strings. */
1015 if (do_initial_setlocale)
1016 setlocale (LC_ALL, "");
1017
f927c5ae
JB
1018 inhibit_window_system = 0;
1019
7db35a48 1020 /* Handle the -t switch, which specifies filename to use as terminal. */
956e3c7e
RS
1021 while (1)
1022 {
1023 char *term;
1024 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
1025 {
1026 int result;
68c45bf0
PE
1027 emacs_close (0);
1028 emacs_close (1);
1029 result = emacs_open (term, O_RDWR, 0);
956e3c7e
RS
1030 if (result < 0)
1031 {
1032 char *errstring = strerror (errno);
186486eb 1033 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
956e3c7e
RS
1034 exit (1);
1035 }
1036 dup (0);
1037 if (! isatty (0))
1038 {
186486eb 1039 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
956e3c7e
RS
1040 exit (1);
1041 }
1042 fprintf (stderr, "Using %s\n", term);
8ba50e1a 1043#ifdef HAVE_WINDOW_SYSTEM
956e3c7e 1044 inhibit_window_system = 1; /* -t => -nw */
f927c5ae 1045#endif
956e3c7e
RS
1046 }
1047 else
1048 break;
1049 }
1050
400d6fa9
PJ
1051 /* Command line option --no-windows is deprecated and thus not mentioned
1052 in the manual and usage informations. */
1053 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
1054 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
e2925360 1055 inhibit_window_system = 1;
f927c5ae 1056
e2925360 1057 /* Handle the -batch switch, which means don't do interactive display. */
f927c5ae 1058 noninteractive = 0;
df6530f8 1059 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
55f4edbc
RS
1060 {
1061 noninteractive = 1;
1062 Vundo_outer_limit = Qnil;
1063 }
6e910e07
RS
1064 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
1065 {
1066 noninteractive = 1; /* Set batch mode. */
21a4ff8e 1067 /* Convert --script to -scriptload, un-skip it, and sort again
e09b9180 1068 so that it will be handled in proper sequence. */
a09a5b5b 1069 /* FIXME broken for --script=FILE - is that supposed to work? */
21a4ff8e 1070 argv[skip_args - 1] = "-scriptload";
6e910e07
RS
1071 skip_args -= 2;
1072 sort_args (argc, argv);
1073 }
e2925360 1074
7db35a48 1075 /* Handle the --help option, which gives a usage message. */
df6530f8 1076 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
f927c5ae 1077 {
6b61353c
KH
1078 printf (USAGE1, argv[0], USAGE2);
1079 printf (USAGE3);
1080 printf (USAGE4, bug_reporting_address ());
e2925360 1081 exit (0);
f927c5ae
JB
1082 }
1083
4ff029f6
DN
1084 if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)
1085 || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, &skip_args))
eab2ee89 1086 {
9d29095c 1087#ifndef DOS_NT
5790ef40
DN
1088 pid_t f;
1089
1090 /* Start as a daemon: fork a new child process which will run the
1091 rest of the initialization code, then exit.
1092
fc012771
SM
1093 Detaching a daemon requires the following steps:
1094 - fork
1095 - setsid
1096 - exit the parent
1097 - close the tty file-descriptors
1098
1099 We only want to do the last 2 steps once the daemon is ready to
1100 serve requests, i.e. after loading .emacs (initialization).
1101 OTOH initialization may start subprocesses (e.g. ispell) and these
1102 should be run from the proper process (the one that will end up
1103 running as daemon) and with the proper "session id" in order for
1104 them to keep working after detaching, so fork and setsid need to be
1105 performed before initialization.
1106
5790ef40
DN
1107 We want to avoid exiting before the server socket is ready, so
1108 use a pipe for synchronization. The parent waits for the child
1109 to close its end of the pipe (using `daemon-initialized')
1110 before exiting. */
1111 if (pipe (daemon_pipe) == -1)
1112 {
1113 fprintf (stderr, "Cannot pipe!\n");
1114 exit (1);
1115 }
1116
b3243e6f 1117#ifndef NS_IMPL_COCOA
5790ef40 1118 f = fork ();
cfa6accb
AR
1119#else /* NS_IMPL_COCOA */
1120 /* Under Cocoa we must do fork+exec as CoreFoundation lib fails in
1121 forked process: http://developer.apple.com/ReleaseNotes/
1122 CoreFoundation/CoreFoundation.html)
b3243e6f
AR
1123 We mark being in the exec'd process by a daemon name argument of
1124 form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
1125 NAME is the original daemon name, if any. */
1126 if (!dname_arg || !strchr (dname_arg, '\n'))
1127 f = fork (); /* in orig */
1128 else
1129 f = 0; /* in exec'd */
cfa6accb 1130#endif /* NS_IMPL_COCOA */
eab2ee89 1131 if (f > 0)
5790ef40
DN
1132 {
1133 int retval;
1134 char buf[1];
1135
1136 /* Close unused writing end of the pipe. */
1137 close (daemon_pipe[1]);
1138
1139 /* Just wait for the child to close its end of the pipe. */
1140 do
1141 {
1142 retval = read (daemon_pipe[0], &buf, 1);
1143 }
1144 while (retval == -1 && errno == EINTR);
1145
1146 if (retval < 0)
1147 {
1148 fprintf (stderr, "Error reading status from child\n");
1149 exit (1);
1150 }
fd95644b
DN
1151 else if (retval == 0)
1152 {
1153 fprintf (stderr, "Error: server did not start correctly\n");
1154 exit (1);
1155 }
5790ef40
DN
1156
1157 close (daemon_pipe[0]);
1158 exit (0);
1159 }
eab2ee89
DN
1160 if (f < 0)
1161 {
1162 fprintf (stderr, "Cannot fork!\n");
9d0a6e42 1163 exit (1);
eab2ee89
DN
1164 }
1165
b3243e6f
AR
1166#ifdef NS_IMPL_COCOA
1167 {
cfa6accb 1168 /* In orig process, forked as child, OR in exec'd. */
b3243e6f 1169 if (!dname_arg || !strchr (dname_arg, '\n'))
cfa6accb 1170 { /* In orig, child: now exec w/special daemon name. */
b3243e6f
AR
1171 char fdStr[80];
1172
1173 if (dname_arg && strlen (dname_arg) > 70)
1174 {
1175 fprintf (stderr, "daemon: child name too long\n");
1176 exit (1);
1177 }
1178
1179 sprintf (fdStr, "--daemon=\n%d,%d\n%s", daemon_pipe[0],
1180 daemon_pipe[1], dname_arg ? dname_arg : "");
1181 argv[skip_args] = fdStr;
1182
1183 execv (argv[0], argv);
cff11156 1184 fprintf (stderr, "emacs daemon: exec failed: %d\n", errno);
b3243e6f
AR
1185 exit (1);
1186 }
1187
cfa6accb 1188 /* In exec'd: parse special dname into pipe and name info. */
b3243e6f
AR
1189 if (!dname_arg || !strchr (dname_arg, '\n')
1190 || strlen (dname_arg) < 1 || strlen (dname_arg) > 70)
1191 {
1192 fprintf (stderr, "emacs daemon: daemon name absent or too long\n");
1193 exit(1);
1194 }
1195 dname_arg2[0] = '\0';
1196 sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]),
1197 dname_arg2);
1198 dname_arg = strlen (dname_arg2) ? dname_arg2 : NULL;
1199 }
cfa6accb 1200#endif /* NS_IMPL_COCOA */
b3243e6f 1201
4ff029f6
DN
1202 if (dname_arg)
1203 daemon_name = xstrdup (dname_arg);
5790ef40
DN
1204 /* Close unused reading end of the pipe. */
1205 close (daemon_pipe[0]);
7c19d3ae
DN
1206 /* Make sure that the used end of the pipe is closed on exec, so
1207 that it is not accessible to programs started from .emacs. */
1208 fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC);
1209
eab2ee89
DN
1210#ifdef HAVE_SETSID
1211 setsid();
1212#endif
eab2ee89 1213#else /* DOS_NT */
9d29095c
DN
1214 fprintf (stderr, "This platform does not support the -daemon flag.\n");
1215 exit (1);
eab2ee89 1216#endif /* DOS_NT */
9d29095c 1217 }
eab2ee89 1218
edb85f59
RS
1219 if (! noninteractive)
1220 {
1221#ifdef BSD_PGRPS
1222 if (initialized)
1223 {
1224 inherited_pgroup = EMACS_GETPGRP (0);
1225 setpgrp (0, getpid ());
1226 }
1227#else
1228#if defined (USG5) && defined (INTERRUPT_INPUT)
1229 setpgrp ();
1230#endif
5467331d
YM
1231#endif
1232#if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
1233 {
1234 extern void malloc_enable_thread P_ ((void));
1235
1236 malloc_enable_thread ();
1237 }
edb85f59
RS
1238#endif
1239 }
1240
fb8e9847 1241 init_signals ();
fb8e9847 1242
1efa2983
KH
1243 /* Don't catch SIGHUP if dumping. */
1244 if (1
1245#ifndef CANNOT_DUMP
1246 && initialized
1247#endif
1248 )
1249 {
57e3d22a 1250 sigblock (sigmask (SIGHUP));
1efa2983
KH
1251 /* In --batch mode, don't catch SIGHUP if already ignored.
1252 That makes nohup work. */
1253 if (! noninteractive
1254 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
1255 signal (SIGHUP, fatal_error_signal);
57e3d22a 1256 sigunblock (sigmask (SIGHUP));
1efa2983
KH
1257 }
1258
f927c5ae
JB
1259 if (
1260#ifndef CANNOT_DUMP
1261 ! noninteractive || initialized
1262#else
1263 1
1264#endif
1265 )
1266 {
1efa2983 1267 /* Don't catch these signals in batch mode if dumping.
f927c5ae
JB
1268 On some machines, this sets static data that would make
1269 signal fail to work right when the dumped Emacs is run. */
f927c5ae
JB
1270 signal (SIGQUIT, fatal_error_signal);
1271 signal (SIGILL, fatal_error_signal);
1272 signal (SIGTRAP, fatal_error_signal);
7317d9e8 1273#ifdef SIGUSR1
71b28d05 1274 add_user_signal (SIGUSR1, "sigusr1");
7317d9e8 1275#endif
8247c60d 1276#ifdef SIGUSR2
71b28d05 1277 add_user_signal (SIGUSR2, "sigusr2");
7317d9e8 1278#endif
99e372cd
RS
1279#ifdef SIGABRT
1280 signal (SIGABRT, fatal_error_signal);
1281#endif
1282#ifdef SIGHWE
1283 signal (SIGHWE, fatal_error_signal);
1284#endif
1285#ifdef SIGPRE
1286 signal (SIGPRE, fatal_error_signal);
1287#endif
1288#ifdef SIGORE
1289 signal (SIGORE, fatal_error_signal);
1290#endif
1291#ifdef SIGUME
1292 signal (SIGUME, fatal_error_signal);
1293#endif
1294#ifdef SIGDLK
1295 signal (SIGDLK, fatal_error_signal);
1296#endif
1297#ifdef SIGCPULIM
1298 signal (SIGCPULIM, fatal_error_signal);
1299#endif
a90538cb
JB
1300#ifdef SIGIOT
1301 /* This is missing on some systems - OS/2, for example. */
f927c5ae 1302 signal (SIGIOT, fatal_error_signal);
a90538cb 1303#endif
f927c5ae
JB
1304#ifdef SIGEMT
1305 signal (SIGEMT, fatal_error_signal);
1306#endif
1307 signal (SIGFPE, fatal_error_signal);
00eaaa32 1308#ifdef SIGBUS
f927c5ae 1309 signal (SIGBUS, fatal_error_signal);
00eaaa32 1310#endif
f927c5ae 1311 signal (SIGSEGV, fatal_error_signal);
00eaaa32 1312#ifdef SIGSYS
f927c5ae 1313 signal (SIGSYS, fatal_error_signal);
00eaaa32 1314#endif
f927c5ae
JB
1315 signal (SIGTERM, fatal_error_signal);
1316#ifdef SIGXCPU
1317 signal (SIGXCPU, fatal_error_signal);
1318#endif
1319#ifdef SIGXFSZ
1320 signal (SIGXFSZ, fatal_error_signal);
1321#endif /* SIGXFSZ */
1322
271c7b7c
RS
1323#ifdef SIGDANGER
1324 /* This just means available memory is getting low. */
1325 signal (SIGDANGER, memory_warning_signal);
1326#endif
1327
f927c5ae 1328#ifdef AIX
56e034fa
RS
1329/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1330 signal (SIGXCPU, fatal_error_signal);
0aef8561 1331#ifndef _I386
f927c5ae 1332 signal (SIGIOINT, fatal_error_signal);
0aef8561 1333#endif
f927c5ae
JB
1334 signal (SIGGRANT, fatal_error_signal);
1335 signal (SIGRETRACT, fatal_error_signal);
1336 signal (SIGSOUND, fatal_error_signal);
1337 signal (SIGMSG, fatal_error_signal);
1338#endif /* AIX */
1339 }
1340
1341 noninteractive1 = noninteractive;
1342
7db35a48 1343/* Perform basic initializations (not merely interning symbols). */
f927c5ae
JB
1344
1345 if (!initialized)
1346 {
1347 init_alloc_once ();
1348 init_obarray ();
1349 init_eval_once ();
e37d7195 1350 init_character_once ();
270ce821
KH
1351 init_charset_once ();
1352 init_coding_once ();
f927c5ae 1353 init_syntax_once (); /* Create standard syntax table. */
270ce821 1354 init_category_once (); /* Create standard category table. */
7db35a48 1355 /* Must be done before init_buffer. */
f927c5ae 1356 init_casetab_once ();
7db35a48
PJ
1357 init_buffer_once (); /* Create buffer table and some buffers. */
1358 init_minibuf_once (); /* Create list of minibuffers. */
1359 /* Must precede init_window_once. */
1360
90d920b6
GM
1361 /* Call syms_of_xfaces before init_window_once because that
1362 function creates Vterminal_frame. Termcap frames now use
1363 faces, and the face implementation uses some symbols as
1364 face names. */
90d920b6 1365 syms_of_xfaces ();
4ea81208
KL
1366 /* XXX syms_of_keyboard uses some symbols in keymap.c. It would
1367 be better to arrange things not to have this dependency. */
1368 syms_of_keymap ();
7a18af49
KR
1369 /* Call syms_of_keyboard before init_window_once because
1370 keyboard sets up symbols that include some face names that
1371 the X support will want to use. This can happen when
1372 CANNOT_DUMP is defined. */
1373 syms_of_keyboard ();
90d920b6 1374
985773c9
MB
1375 /* Called before syms_of_fileio, because it sets up Qerror_condition. */
1376 syms_of_data ();
1377 syms_of_fileio ();
1378 /* Before syms_of_coding to initialize Vgc_cons_threshold. */
1379 syms_of_alloc ();
1380 /* Before syms_of_coding because it initializes Qcharsetp. */
1381 syms_of_charset ();
1382 /* Before init_window_once, because it sets up the
1383 Vcoding_system_hash_table. */
1384 syms_of_coding (); /* This should be after syms_of_fileio. */
1a578e9b 1385
7db35a48 1386 init_window_once (); /* Init the window system. */
680256a8 1387 init_fileio_once (); /* Must precede any path manipulation. */
6b61353c
KH
1388#ifdef HAVE_WINDOW_SYSTEM
1389 init_fringe_once (); /* Swap bitmaps if necessary. */
1390#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae
JB
1391 }
1392
1393 init_alloc ();
68c45bf0
PE
1394
1395 if (do_initial_setlocale)
1396 {
1397 fixup_locale ();
ca9c0567
PE
1398 Vsystem_messages_locale = Vprevious_system_messages_locale;
1399 Vsystem_time_locale = Vprevious_system_time_locale;
68c45bf0
PE
1400 }
1401
f927c5ae
JB
1402 init_eval ();
1403 init_data ();
ad067ea6 1404#ifdef CLASH_DETECTION
01f67d2c 1405 init_filelock ();
ad067ea6 1406#endif
ab5d0358 1407 init_atimer ();
7074fde6 1408 running_asynch_code = 0;
0e956009 1409
a08a816a
RS
1410 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1411 but not while dumping. */
e721aa94 1412 if (1)
a08a816a
RS
1413 {
1414 int inhibit_unibyte = 0;
1415
1416 /* --multibyte overrides EMACS_UNIBYTE. */
1417 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
e721aa94
SM
1418 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
1419 /* Ignore EMACS_UNIBYTE before dumping. */
1420 || (!initialized && noninteractive))
a08a816a
RS
1421 inhibit_unibyte = 1;
1422
1423 /* --unibyte requests that we set up to do everything with single-byte
1424 buffers and strings. We need to handle this before calling
1425 init_lread, init_editfns and other places that generate Lisp strings
1426 from text in the environment. */
c0218e1b
DL
1427 /* Actually this shouldn't be needed as of 20.4 in a generally
1428 unibyte environment. As handa says, environment values
1429 aren't now decoded; also existing buffers are now made
1430 unibyte during startup if .emacs sets unibyte. Tested with
1431 8-bit data in environment variables and /etc/passwd, setting
7db35a48 1432 unibyte and Latin-1 in .emacs. -- Dave Love */
a08a816a
RS
1433 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
1434 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
1435 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
1436 {
1437 Lisp_Object old_log_max;
1438 Lisp_Object symbol, tail;
1439
82e98df4
SM
1440 symbol = intern ("enable-multibyte-characters");
1441 Fset_default (symbol, Qnil);
a08a816a 1442
6524291c
KH
1443 if (initialized)
1444 {
1445 /* Erase pre-dump messages in *Messages* now so no abort. */
1446 old_log_max = Vmessage_log_max;
1447 XSETFASTINT (Vmessage_log_max, 0);
1448 message_dolog ("", 0, 1, 0);
1449 Vmessage_log_max = old_log_max;
1450 }
a08a816a 1451
3e75bb9e 1452 for (tail = Vbuffer_alist; CONSP (tail);
7539e11f 1453 tail = XCDR (tail))
a08a816a
RS
1454 {
1455 Lisp_Object buffer;
1456
7539e11f 1457 buffer = Fcdr (XCAR (tail));
8f924df7 1458 /* Make a multibyte buffer unibyte. */
f2b89e21
KH
1459 if (BUF_Z_BYTE (XBUFFER (buffer)) > BUF_Z (XBUFFER (buffer)))
1460 {
1461 struct buffer *current = current_buffer;
1462
1463 set_buffer_temp (XBUFFER (buffer));
8f924df7 1464 Fset_buffer_multibyte (Qnil);
f2b89e21
KH
1465 set_buffer_temp (current);
1466 }
a08a816a 1467 }
82e98df4 1468 message ("Warning: unibyte sessions are obsolete and will disappear");
a08a816a
RS
1469 }
1470 }
1471
956e3c7e 1472 no_loadup
b96f9fb7 1473 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
956e3c7e 1474
edfda783
AR
1475#ifdef HAVE_NS
1476 ns_alloc_autorelease_pool();
1477 if (!noninteractive)
1478 {
edfda783
AR
1479#ifdef NS_IMPL_COCOA
1480 if (skip_args < argc)
1481 {
1482 if (!strncmp(argv[skip_args], "-psn", 4))
1483 {
1484 skip_args += 1;
3d0a4431 1485 chdir (getenv ("HOME"));
edfda783 1486 }
95889848 1487 else if (skip_args+1 < argc && !strncmp(argv[skip_args+1], "-psn", 4))
edfda783 1488 {
95889848 1489 skip_args += 2;
3d0a4431 1490 chdir (getenv ("HOME"));
edfda783
AR
1491 }
1492 }
9b68317c 1493#endif /* COCOA */
edfda783
AR
1494 }
1495#endif /* HAVE_NS */
1496
956e3c7e
RS
1497#ifdef HAVE_X_WINDOWS
1498 /* Stupid kludge to catch command-line display spec. We can't
1499 handle this argument entirely in window system dependent code
1500 because we don't even know which window system dependent code
1501 to run until we've recognized this argument. */
1502 {
1503 char *displayname = 0;
956e3c7e
RS
1504 int count_before = skip_args;
1505
1506 /* Skip any number of -d options, but only use the last one. */
1507 while (1)
1508 {
1509 int count_before_this = skip_args;
1510
1511 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1512 display_arg = 1;
1513 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1514 display_arg = 1;
1515 else
1516 break;
1517
1518 count_before = count_before_this;
1519 }
1520
1521 /* If we have the form --display=NAME,
1522 convert it into -d name.
1523 This requires inserting a new element into argv. */
1524 if (displayname != 0 && skip_args - count_before == 1)
1525 {
1526 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1527 int j;
1528
1529 for (j = 0; j < count_before + 1; j++)
1530 new[j] = argv[j];
1531 new[count_before + 1] = "-d";
1532 new[count_before + 2] = displayname;
1533 for (j = count_before + 2; j <argc; j++)
1534 new[j + 1] = argv[j];
1535 argv = new;
1536 argc++;
1537 }
1538 /* Change --display to -d, when its arg is separate. */
1539 else if (displayname != 0 && skip_args > count_before
1540 && argv[count_before + 1][1] == '-')
1541 argv[count_before + 1] = "-d";
1542
1543 /* Don't actually discard this arg. */
1544 skip_args = count_before;
1545 }
1546#endif
1547
1548 /* argmatch must not be used after here,
1549 except when bulding temacs
1550 because the -d argument has not been skipped in skip_args. */
1551
29b89fe0
RS
1552#ifdef MSDOS
1553 /* Call early 'cause init_environment needs it. */
1554 init_dosfns ();
1555 /* Set defaults for several environment variables. */
18198bb2
RS
1556 if (initialized)
1557 init_environment (argc, argv, skip_args);
1558 else
d1fc6752 1559 tzset ();
18198bb2 1560#endif /* MSDOS */
29b89fe0 1561
8ba50e1a 1562#ifdef WINDOWSNT
9785d95b 1563 globals_of_w32 ();
8ba50e1a 1564 /* Initialize environment from registry settings. */
a3a58294 1565 init_environment (argv);
7db35a48 1566 init_ntproc (); /* must precede init_editfns. */
8ba50e1a
GV
1567#endif
1568
edfda783
AR
1569#ifdef HAVE_NS
1570#ifndef CANNOT_DUMP
1571 if (initialized)
1572#endif
1573 ns_init_paths ();
1574#endif
1575
0e956009
JB
1576 /* egetenv is a pretty low-level facility, which may get called in
1577 many circumstances; it seems flimsy to put off initializing it
1578 until calling init_callproc. */
a13f8f50 1579 set_initial_environment ();
93aed04d 1580 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
5990851d
KL
1581 if this is not done. Do it after set_global_environment so that we
1582 don't pollute Vglobal_environment. */
fa09a82d 1583 /* Setting LANG here will defeat the startup locale processing... */
f2a77c3a 1584#ifdef AIX
93aed04d
RS
1585 putenv ("LANG=C");
1586#endif
0e956009 1587
7db35a48 1588 init_buffer (); /* Init default directory of main buffer. */
ace40a69 1589
7928f0b5 1590 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
ace40a69 1591 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
380e25b8
RS
1592
1593 if (initialized)
1594 {
7db35a48 1595 /* Erase any pre-dump messages in the message log, to avoid confusion. */
380e25b8
RS
1596 Lisp_Object old_log_max;
1597 old_log_max = Vmessage_log_max;
1598 XSETFASTINT (Vmessage_log_max, 0);
f6fe7bb5 1599 message_dolog ("", 0, 1, 0);
380e25b8
RS
1600 Vmessage_log_max = old_log_max;
1601 }
1602
7928f0b5 1603 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
fb8e9847 1604 init_lread ();
f927c5ae 1605
8bb697c0
RS
1606 /* Intern the names of all standard functions and variables;
1607 define standard keys. */
f927c5ae
JB
1608
1609 if (!initialized)
1610 {
4230ab74
KR
1611 /* The basic levels of Lisp must come first. Note that
1612 syms_of_data and some others have already been called. */
e37d7195 1613 syms_of_chartab ();
fb8e9847 1614 syms_of_lread ();
f927c5ae
JB
1615 syms_of_print ();
1616 syms_of_eval ();
1617 syms_of_fns ();
f927c5ae 1618 syms_of_floatfns ();
f927c5ae 1619
f927c5ae
JB
1620 syms_of_buffer ();
1621 syms_of_bytecode ();
1622 syms_of_callint ();
1623 syms_of_casefiddle ();
1624 syms_of_casetab ();
1625 syms_of_callproc ();
270ce821
KH
1626 syms_of_category ();
1627 syms_of_ccl ();
e37d7195 1628 syms_of_character ();
f927c5ae
JB
1629 syms_of_cmds ();
1630#ifndef NO_DIR_LIBRARY
1631 syms_of_dired ();
1632#endif /* not NO_DIR_LIBRARY */
1633 syms_of_display ();
1634 syms_of_doc ();
1635 syms_of_editfns ();
1636 syms_of_emacs ();
f927c5ae
JB
1637#ifdef CLASH_DETECTION
1638 syms_of_filelock ();
1639#endif /* CLASH_DETECTION */
1640 syms_of_indent ();
c2c5ed2c 1641 syms_of_insdel ();
4ea81208 1642 /* syms_of_keymap (); */
f927c5ae
JB
1643 syms_of_macros ();
1644 syms_of_marker ();
1645 syms_of_minibuf ();
f927c5ae 1646 syms_of_process ();
f927c5ae 1647 syms_of_search ();
1cbd5d9d 1648 syms_of_frame ();
f927c5ae 1649 syms_of_syntax ();
ed8dad6b 1650 syms_of_terminal ();
0d934e7b 1651 syms_of_term ();
f927c5ae 1652 syms_of_undo ();
90d920b6
GM
1653#ifdef HAVE_SOUND
1654 syms_of_sound ();
1655#endif
bef79ee4 1656 syms_of_textprop ();
9d100795 1657 syms_of_composite ();
05687c54
RS
1658#ifdef WINDOWSNT
1659 syms_of_ntproc ();
1660#endif /* WINDOWSNT */
f927c5ae
JB
1661 syms_of_window ();
1662 syms_of_xdisp ();
d53f587b 1663 syms_of_font ();
4fa9161d 1664#ifdef HAVE_WINDOW_SYSTEM
6b61353c
KH
1665 syms_of_fringe ();
1666 syms_of_image ();
1667#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 1668#ifdef HAVE_X_WINDOWS
72412588 1669 syms_of_xterm ();
f927c5ae 1670 syms_of_xfns ();
edfda783 1671 syms_of_xmenu ();
270ce821 1672 syms_of_fontset ();
28b1b672
JD
1673#ifdef HAVE_X_SM
1674 syms_of_xsmfns ();
1675#endif
72412588
JB
1676#ifdef HAVE_X11
1677 syms_of_xselect ();
1678#endif
f927c5ae
JB
1679#endif /* HAVE_X_WINDOWS */
1680
4e77ce60 1681 syms_of_menu ();
4e77ce60 1682
8ba50e1a 1683#ifdef HAVE_NTGUI
fbd6baed
GV
1684 syms_of_w32term ();
1685 syms_of_w32fns ();
fbd6baed
GV
1686 syms_of_w32select ();
1687 syms_of_w32menu ();
02062ac3 1688 syms_of_fontset ();
8ba50e1a
GV
1689#endif /* HAVE_NTGUI */
1690
40da1153
EZ
1691#ifdef MSDOS
1692 syms_of_xmenu ();
1693#endif /* MSDOS */
1694
edfda783
AR
1695#ifdef HAVE_NS
1696 syms_of_nsterm ();
1697 syms_of_nsfns ();
1698 syms_of_nsmenu ();
1699 syms_of_nsselect ();
1700 syms_of_fontset ();
1701#endif /* HAVE_NS */
1702
033b73e2
MA
1703#ifdef HAVE_DBUS
1704 syms_of_dbusbind ();
1705#endif /* HAVE_DBUS */
1706
f927c5ae
JB
1707#ifdef SYMS_SYSTEM
1708 SYMS_SYSTEM;
1709#endif
1710
1711#ifdef SYMS_MACHINE
1712 SYMS_MACHINE;
1713#endif
1714
1715 keys_of_casefiddle ();
1716 keys_of_cmds ();
1717 keys_of_buffer ();
1718 keys_of_keyboard ();
1719 keys_of_keymap ();
f927c5ae 1720 keys_of_window ();
9785d95b 1721 }
3b6536b1 1722 else
9785d95b 1723 {
3b6536b1
AS
1724 /* Initialization that must be done even if the global variable
1725 initialized is non zero. */
9785d95b
BK
1726#ifdef HAVE_NTGUI
1727 globals_of_w32fns ();
1728 globals_of_w32menu ();
52c7f9ee 1729 globals_of_w32select ();
3b6536b1 1730#endif /* HAVE_NTGUI */
f927c5ae
JB
1731 }
1732
cf411e8d
KH
1733 init_charset ();
1734
f7cf8b20 1735 init_editfns (); /* init_process uses Voperating_system_release. */
2491d293 1736 init_process (); /* init_display uses add_keyboard_wait_descriptor. */
7db35a48 1737 init_keyboard (); /* This too must precede init_sys_modes. */
0a125897 1738 if (!noninteractive)
7c2fb837 1739 init_display (); /* Determine terminal type. Calls init_sys_modes. */
90d920b6 1740 init_fns ();
8bb697c0 1741 init_xdisp ();
6b61353c
KH
1742#ifdef HAVE_WINDOW_SYSTEM
1743 init_fringe ();
1744 init_image ();
1745#endif /* HAVE_WINDOW_SYSTEM */
8bb697c0 1746 init_macros ();
8bb697c0 1747 init_floatfns ();
90d920b6
GM
1748#ifdef HAVE_SOUND
1749 init_sound ();
1750#endif
75816372 1751 init_window ();
74d75424 1752 init_font ();
8bb697c0 1753
f927c5ae
JB
1754 if (!initialized)
1755 {
e2925360 1756 char *file;
7db35a48 1757 /* Handle -l loadup, args passed by Makefile. */
df6530f8 1758 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
f927c5ae 1759 Vtop_level = Fcons (intern ("load"),
e2925360 1760 Fcons (build_string (file), Qnil));
f927c5ae 1761 /* Unless next switch is -nl, load "loadup.el" first thing. */
956e3c7e 1762 if (! no_loadup)
f927c5ae
JB
1763 Vtop_level = Fcons (intern ("load"),
1764 Fcons (build_string ("loadup.el"), Qnil));
f927c5ae
JB
1765 }
1766
93572b43
KH
1767 if (initialized)
1768 {
0269dedb
RS
1769#ifdef HAVE_TZSET
1770 {
1771 /* If the execution TZ happens to be the same as the dump TZ,
1772 change it to some other value and then change it back,
1773 to force the underlying implementation to reload the TZ info.
1774 This is needed on implementations that load TZ info from files,
1775 since the TZ file contents may differ between dump and execution. */
1776 char *tz = getenv ("TZ");
1777 if (tz && !strcmp (tz, dump_tz))
1778 {
1779 ++*tz;
1780 tzset ();
1781 --*tz;
1782 }
1783 }
1784#endif
93572b43
KH
1785 }
1786
ecf783fa
EZ
1787 /* Set up for profiling. This is known to work on FreeBSD,
1788 GNU/Linux and MinGW. It might work on some other systems too.
1789 Give it a try and tell us if it works on your system. To compile
7b3a82d7 1790 for profiling, use the configure option --enable-profiling. */
ecf783fa 1791#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__)
e610ea43
RS
1792#ifdef PROFILING
1793 if (initialized)
1794 {
7db35a48 1795 extern void _mcleanup ();
ecf783fa
EZ
1796#ifdef __MINGW32__
1797 extern unsigned char etext asm ("etext");
1798#else
e610ea43 1799 extern char etext;
ecf783fa 1800#endif
90d920b6 1801 extern void safe_bcopy ();
67a5596f
GM
1802 extern void dump_opcode_frequencies ();
1803
e610ea43 1804 atexit (_mcleanup);
90d920b6
GM
1805 /* This uses safe_bcopy because that function comes first in the
1806 Emacs executable. It might be better to use something that
1807 gives the start of the text segment, but start_of_text is not
1808 defined on all systems now. */
1809 monstartup (safe_bcopy, &etext);
e610ea43
RS
1810 }
1811 else
1812 moncontrol (0);
1813#endif
1814#endif
1815
f927c5ae
JB
1816 initialized = 1;
1817
e7536cff
RS
1818#ifdef LOCALTIME_CACHE
1819 /* Some versions of localtime have a bug. They cache the value of the time
279cc2b8
JB
1820 zone rather than looking it up every time. Since localtime() is
1821 called to bolt the undumping time into the undumped emacs, this
afe9fae9 1822 results in localtime ignoring the TZ environment variable.
7db35a48 1823 This flushes the new TZ value into localtime. */
afe9fae9 1824 tzset ();
e7536cff 1825#endif /* defined (LOCALTIME_CACHE) */
279cc2b8 1826
f927c5ae
JB
1827 /* Enter editor command loop. This never returns. */
1828 Frecursive_edit ();
1829 /* NOTREACHED */
6bbd7a29 1830 return 0;
f927c5ae
JB
1831}
1832\f
081bef73
RS
1833/* Sort the args so we can find the most important ones
1834 at the beginning of argv. */
1835
1836/* First, here's a table of all the standard options. */
1837
1838struct standard_args
1839{
1840 char *name;
1841 char *longname;
1842 int priority;
1843 int nargs;
1844};
1845
1846struct standard_args standard_args[] =
1847{
05922407
RS
1848 { "-version", "--version", 150, 0 },
1849#ifdef HAVE_SHM
1850 { "-nl", "--no-shared-memory", 140, 0 },
2725719a 1851#endif
05922407 1852 { "-t", "--terminal", 120, 1 },
400d6fa9 1853 { "-nw", "--no-window-system", 110, 0 },
05922407
RS
1854 { "-nw", "--no-windows", 110, 0 },
1855 { "-batch", "--batch", 100, 0 },
6e910e07 1856 { "-script", "--script", 100, 1 },
eab2ee89 1857 { "-daemon", "--daemon", 99, 0 },
05922407 1858 { "-help", "--help", 90, 0 },
956e3c7e
RS
1859 { "-no-unibyte", "--no-unibyte", 83, 0 },
1860 { "-multibyte", "--multibyte", 82, 0 },
1861 { "-unibyte", "--unibyte", 81, 0 },
1862 { "-no-multibyte", "--no-multibyte", 80, 0 },
956e3c7e 1863 { "-nl", "--no-loadup", 70, 0 },
956e3c7e
RS
1864 /* -d must come last before the options handled in startup.el. */
1865 { "-d", "--display", 60, 1 },
1866 { "-display", 0, 60, 1 },
05922407 1867 /* Now for the options handled in startup.el. */
a1716a57
RS
1868 { "-Q", "--quick", 55, 0 },
1869 { "-quick", 0, 55, 0 },
081bef73
RS
1870 { "-q", "--no-init-file", 50, 0 },
1871 { "-no-init-file", 0, 50, 0 },
1872 { "-no-site-file", "--no-site-file", 40, 0 },
1873 { "-u", "--user", 30, 1 },
1874 { "-user", 0, 30, 1 },
1875 { "-debug-init", "--debug-init", 20, 0 },
f9e36a6d 1876 { "-nbi", "--no-bitmap-icon", 15, 0 },
f2bc3538 1877 { "-iconic", "--iconic", 15, 0 },
a1716a57 1878 { "-D", "--basic-display", 12, 0},
e09b9180 1879 { "-basic-display", 0, 12, 0},
081bef73
RS
1880 { "-bg", "--background-color", 10, 1 },
1881 { "-background", 0, 10, 1 },
1882 { "-fg", "--foreground-color", 10, 1 },
1883 { "-foreground", 0, 10, 1 },
1884 { "-bd", "--border-color", 10, 1 },
1885 { "-bw", "--border-width", 10, 1 },
1886 { "-ib", "--internal-border", 10, 1 },
1887 { "-ms", "--mouse-color", 10, 1 },
1888 { "-cr", "--cursor-color", 10, 1 },
49ca717b 1889 { "-nbc", "--no-blinking-cursor", 10, 0 },
081bef73
RS
1890 { "-fn", "--font", 10, 1 },
1891 { "-font", 0, 10, 1 },
94452530
EZ
1892 { "-fs", "--fullscreen", 10, 0 },
1893 { "-fw", "--fullwidth", 10, 0 },
1894 { "-fh", "--fullheight", 10, 0 },
3f1c6666 1895 { "-mm", "--maximized", 10, 0 },
081bef73
RS
1896 { "-g", "--geometry", 10, 1 },
1897 { "-geometry", 0, 10, 1 },
1898 { "-T", "--title", 10, 1 },
ae63ae52 1899 { "-title", 0, 10, 1 },
081bef73
RS
1900 { "-name", "--name", 10, 1 },
1901 { "-xrm", "--xrm", 10, 1 },
1540a61a 1902 { "-parent-id", "--parent-id", 10, 1 },
fcdeb5d9
RS
1903 { "-r", "--reverse-video", 5, 0 },
1904 { "-rv", 0, 5, 0 },
1905 { "-reverse", 0, 5, 0 },
ae63ae52 1906 { "-hb", "--horizontal-scroll-bars", 5, 0 },
fcdeb5d9 1907 { "-vb", "--vertical-scroll-bars", 5, 0 },
d20e1b1e 1908 { "-color", "--color", 5, 0},
16706228
JL
1909 { "-no-splash", "--no-splash", 3, 0 },
1910 { "-no-desktop", "--no-desktop", 3, 0 },
edfda783
AR
1911#ifdef HAVE_NS
1912 { "-NSAutoLaunch", 0, 5, 1 },
1913 { "-NXAutoLaunch", 0, 5, 1 },
1914 { "-disable-font-backend", "--disable-font-backend", 65, 0 },
1915 { "-_NSMachLaunch", 0, 85, 1 },
1916 { "-MachLaunch", 0, 85, 1 },
1917 { "-macosx", 0, 85, 0 },
1918 { "-NSHost", 0, 85, 1 },
1919#endif
fcdeb5d9
RS
1920 /* These have the same priority as ordinary file name args,
1921 so they are not reordered with respect to those. */
4af9e0b3
RS
1922 { "-L", "--directory", 0, 1 },
1923 { "-directory", 0, 0, 1 },
fcdeb5d9
RS
1924 { "-l", "--load", 0, 1 },
1925 { "-load", 0, 0, 1 },
21a4ff8e
GM
1926 /* This has no longname, because using --scriptload confuses sort_args,
1927 because then the --script long option seems to match twice; ie
1928 you can't have a long option which is a prefix of another long
1929 option. In any case, this is entirely an internal option. */
1930 { "-scriptload", NULL, 0, 1 },
fcdeb5d9
RS
1931 { "-f", "--funcall", 0, 1 },
1932 { "-funcall", 0, 0, 1 },
575985b1 1933 { "-eval", "--eval", 0, 1 },
67a5596f 1934 { "-execute", "--execute", 0, 1 },
2e13f8e9
RS
1935 { "-find-file", "--find-file", 0, 1 },
1936 { "-visit", "--visit", 0, 1 },
67a5596f 1937 { "-file", "--file", 0, 1 },
fcdeb5d9 1938 { "-insert", "--insert", 0, 1 },
edfda783
AR
1939#ifdef HAVE_NS
1940 { "-NXOpen", 0, 0, 1 },
1941 { "-NXOpenTemp", 0, 0, 1 },
1942 { "-NSOpen", 0, 0, 1 },
1943 { "-NSOpenTemp", 0, 0, 1 },
1944 { "-GSFilePath", 0, 0, 1 },
1945#endif
f2bc3538 1946 /* This should be processed after ordinary file name args and the like. */
fcdeb5d9 1947 { "-kill", "--kill", -10, 0 },
081bef73
RS
1948};
1949
1950/* Reorder the elements of ARGV (assumed to have ARGC elements)
1951 so that the highest priority ones come first.
1952 Do not change the order of elements of equal priority.
956e3c7e
RS
1953 If an option takes an argument, keep it and its argument together.
1954
1955 If an option that takes no argument appears more
1956 than once, eliminate all but one copy of it. */
081bef73
RS
1957
1958static void
1959sort_args (argc, argv)
1960 int argc;
1961 char **argv;
1962{
1963 char **new = (char **) xmalloc (sizeof (char *) * argc);
1964 /* For each element of argv,
1965 the corresponding element of options is:
1966 0 for an option that takes no arguments,
1967 1 for an option that takes one argument, etc.
1968 -1 for an ordinary non-option argument. */
6dad9359 1969 int *options = (int *) xmalloc (sizeof (int) * argc);
081bef73
RS
1970 int *priority = (int *) xmalloc (sizeof (int) * argc);
1971 int to = 1;
956e3c7e 1972 int incoming_used = 1;
081bef73
RS
1973 int from;
1974 int i;
1975
1976 /* Categorize all the options,
1977 and figure out which argv elts are option arguments. */
1978 for (from = 1; from < argc; from++)
1979 {
1980 options[from] = -1;
fcdeb5d9 1981 priority[from] = 0;
081bef73
RS
1982 if (argv[from][0] == '-')
1983 {
1984 int match, thislen;
1985 char *equals;
1986
c96f26f4
RS
1987 /* If we have found "--", don't consider
1988 any more arguments as options. */
249443b6 1989 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1990 {
1991 /* Leave the "--", and everything following it, at the end. */
1992 for (; from < argc; from++)
1993 {
1994 priority[from] = -100;
1995 options[from] = -1;
1996 }
1997 break;
1998 }
1999
081bef73
RS
2000 /* Look for a match with a known old-fashioned option. */
2001 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
2002 if (!strcmp (argv[from], standard_args[i].name))
2003 {
2004 options[from] = standard_args[i].nargs;
2005 priority[from] = standard_args[i].priority;
fd76ec52
RS
2006 if (from + standard_args[i].nargs >= argc)
2007 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
2008 from += standard_args[i].nargs;
2009 goto done;
2010 }
2011
2012 /* Look for a match with a known long option.
2013 MATCH is -1 if no match so far, -2 if two or more matches so far,
2014 >= 0 (the table index of the match) if just one match so far. */
2015 if (argv[from][1] == '-')
2016 {
2017 match = -1;
2018 thislen = strlen (argv[from]);
2019 equals = index (argv[from], '=');
2020 if (equals != 0)
2021 thislen = equals - argv[from];
2022
f609ef57
KH
2023 for (i = 0;
2024 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
2025 if (standard_args[i].longname
2026 && !strncmp (argv[from], standard_args[i].longname,
2027 thislen))
081bef73
RS
2028 {
2029 if (match == -1)
2030 match = i;
2031 else
2032 match = -2;
2033 }
2034
2035 /* If we found exactly one match, use that. */
2036 if (match >= 0)
2037 {
2038 options[from] = standard_args[match].nargs;
2039 priority[from] = standard_args[match].priority;
2040 /* If --OPTION=VALUE syntax is used,
2041 this option uses just one argv element. */
2042 if (equals != 0)
2043 options[from] = 0;
fd76ec52
RS
2044 if (from + options[from] >= argc)
2045 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
2046 from += options[from];
2047 }
a09a5b5b
GM
2048 /* FIXME When match < 0, shouldn't there be some error,
2049 or at least indication to the user that there was a
2050 problem? */
081bef73
RS
2051 }
2052 done: ;
2053 }
2054 }
2055
2056 /* Copy the arguments, in order of decreasing priority, to NEW. */
2057 new[0] = argv[0];
956e3c7e 2058 while (incoming_used < argc)
081bef73
RS
2059 {
2060 int best = -1;
2c70c992 2061 int best_priority = -9999;
081bef73
RS
2062
2063 /* Find the highest priority remaining option.
2064 If several have equal priority, take the first of them. */
2065 for (from = 1; from < argc; from++)
2066 {
2067 if (argv[from] != 0 && priority[from] > best_priority)
2068 {
2069 best_priority = priority[from];
2070 best = from;
2071 }
2072 /* Skip option arguments--they are tied to the options. */
2073 if (options[from] > 0)
2074 from += options[from];
2075 }
7db35a48 2076
081bef73
RS
2077 if (best < 0)
2078 abort ();
2079
956e3c7e
RS
2080 /* Copy the highest priority remaining option, with its args, to NEW.
2081 Unless it is a duplicate of the previous one. */
2082 if (! (options[best] == 0
2083 && ! strcmp (new[to - 1], argv[best])))
2084 {
2085 new[to++] = argv[best];
2086 for (i = 0; i < options[best]; i++)
2087 new[to++] = argv[best + i + 1];
2088 }
2089
2090 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
2091
2092 /* Clear out this option in ARGV. */
2093 argv[best] = 0;
2094 for (i = 0; i < options[best]; i++)
2095 argv[best + i + 1] = 0;
2096 }
2097
81b7af72
RS
2098 /* If duplicate options were deleted, fill up extra space with null ptrs. */
2099 while (to < argc)
2100 new[to++] = 0;
2101
6dad9359 2102 bcopy (new, argv, sizeof (char *) * argc);
0bf591da 2103
68db37aa
KS
2104 xfree (options);
2105 xfree (new);
2106 xfree (priority);
081bef73
RS
2107}
2108\f
f927c5ae 2109DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
2110 doc: /* Exit the Emacs job and kill it.
2111If ARG is an integer, return ARG as the exit program code.
b224de9b 2112If ARG is a string, stuff it as keyboard input.
7db35a48
PJ
2113
2114The value of `kill-emacs-hook', if not void,
2115is a list of functions (of no args),
2116all of which are called before Emacs is actually killed. */)
2117 (arg)
f927c5ae
JB
2118 Lisp_Object arg;
2119{
f927c5ae
JB
2120 struct gcpro gcpro1;
2121
2122 GCPRO1 (arg);
2123
2124 if (feof (stdin))
2125 arg = Qt;
2126
2447c626 2127 if (!NILP (Vrun_hooks) && !noninteractive)
f927c5ae
JB
2128 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
2129
f927c5ae
JB
2130 UNGCPRO;
2131
d0068e25 2132 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
40be253a 2133
58545838
KH
2134 /* If we have an auto-save list file,
2135 kill it because we are exiting Emacs deliberately (not crashing).
2136 Do it after shut_down_emacs, which does an auto-save. */
2137 if (STRINGP (Vauto_save_list_file_name))
d5db4077 2138 unlink (SDATA (Vauto_save_list_file_name));
58545838 2139
fa439170 2140 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
f927c5ae 2141 /* NOTREACHED */
f1145b54 2142 return Qnil;
f927c5ae 2143}
40be253a
JB
2144
2145
2146/* Perform an orderly shutdown of Emacs. Autosave any modified
2147 buffers, kill any child processes, clean up the terminal modes (if
2148 we're in the foreground), and other stuff like that. Don't perform
2149 any redisplay; this may be called when Emacs is shutting down in
2150 the background, or after its X connection has died.
2151
2152 If SIG is a signal number, print a message for it.
2153
2154 This is called by fatal signal handlers, X protocol error handlers,
2155 and Fkill_emacs. */
f7ab4e3d 2156
40be253a 2157void
f7ab4e3d 2158shut_down_emacs (sig, no_x, stuff)
41423a80 2159 int sig, no_x;
f7ab4e3d 2160 Lisp_Object stuff;
40be253a 2161{
829d872b
RS
2162 /* Prevent running of hooks from now on. */
2163 Vrun_hooks = Qnil;
2164
9db03f6c
KS
2165 /* Don't update display from now on. */
2166 Vinhibit_redisplay = Qt;
2167
7db35a48 2168 /* If we are controlling the terminal, reset terminal modes. */
40be253a
JB
2169#ifdef EMACS_HAVE_TTY_PGRP
2170 {
d04d81d2
RS
2171 int pgrp = EMACS_GETPGRP (0);
2172
40be253a
JB
2173 int tpgrp;
2174 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
5a570e37 2175 && tpgrp == pgrp)
40be253a 2176 {
28d440ab 2177 reset_all_sys_modes ();
40be253a 2178 if (sig && sig != SIGTERM)
6b61353c 2179 fprintf (stderr, "Fatal error (%d)", sig);
40be253a
JB
2180 }
2181 }
2182#else
2183 fflush (stdout);
0a125897 2184 reset_all_sys_modes ();
40be253a
JB
2185#endif
2186
f7ab4e3d
RS
2187 stuff_buffered_input (stuff);
2188
ba7c29f3 2189#ifdef subprocesses
92d835a4 2190 inhibit_sentinels = 1;
ba7c29f3 2191#endif
40be253a
JB
2192 kill_buffer_processes (Qnil);
2193 Fdo_auto_save (Qt, Qnil);
2194
2195#ifdef CLASH_DETECTION
2196 unlock_all_files ();
2197#endif
2198
5e7f8733 2199#if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
41423a80 2200#ifdef HAVE_X_WINDOWS
f7511647 2201 /* It's not safe to call intern here. Maybe we are crashing. */
2246281f
KL
2202 if (!noninteractive && SYMBOLP (Vinitial_window_system)
2203 && SCHARS (SYMBOL_NAME (Vinitial_window_system)) == 1
2204 && SREF (SYMBOL_NAME (Vinitial_window_system), 0) == 'x'
f7511647 2205 && ! no_x)
41423a80
RS
2206 Fx_close_current_connection ();
2207#endif /* HAVE_X_WINDOWS */
5e7f8733 2208#endif
41423a80 2209
40be253a
JB
2210#ifdef SIGIO
2211 /* There is a tendency for a SIGIO signal to arrive within exit,
2212 and cause a SIGHUP because the input descriptor is already closed. */
2213 unrequest_sigio ();
2214 signal (SIGIO, SIG_IGN);
2215#endif
41f339d4
RS
2216
2217#ifdef WINDOWSNT
2218 term_ntproc ();
2219#endif
d546e578 2220
cd8d4168
GM
2221 /* Do this only if terminating normally, we want glyph matrices
2222 etc. in a core dump. */
200f868e 2223 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
2224 {
2225 check_glyph_memory ();
2226 check_message_stack ();
2227 }
90d920b6 2228
d546e578
EZ
2229#ifdef MSDOS
2230 dos_cleanup ();
2231#endif
edfda783
AR
2232
2233#ifdef HAVE_NS
2234 ns_term_shutdown (sig);
2235#endif
40be253a
JB
2236}
2237
2238
f927c5ae
JB
2239\f
2240#ifndef CANNOT_DUMP
f927c5ae
JB
2241
2242#ifdef HAVE_SHM
2243
2244DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
7db35a48
PJ
2245 doc: /* Dump current state of Emacs into data file FILENAME.
2246This function exists on systems that use HAVE_SHM. */)
2247 (filename)
c9aae259 2248 Lisp_Object filename;
f927c5ae 2249{
55697f5b 2250 extern char my_edata[];
f927c5ae 2251 Lisp_Object tem;
f927c5ae 2252
4fab758d 2253 check_pure_size ();
b7826503 2254 CHECK_STRING (filename);
c9aae259 2255 filename = Fexpand_file_name (filename, Qnil);
f927c5ae
JB
2256
2257 tem = Vpurify_flag;
2258 Vpurify_flag = Qnil;
2259
2260 fflush (stdout);
7db35a48 2261 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2262 /* Also arrange for warnings when nearly out of space. */
2263#ifndef SYSTEM_MALLOC
1090a161 2264 memory_warnings (my_edata, malloc_warning);
f927c5ae 2265#endif
d5db4077 2266 map_out_data (SDATA (filename));
f927c5ae
JB
2267
2268 Vpurify_flag = tem;
2269
2270 return Qnil;
2271}
2272
2273#else /* not HAVE_SHM */
2274
2275DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
2276 doc: /* Dump current state of Emacs into executable file FILENAME.
2277Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2278This is used in the file `loadup.el' when building Emacs.
2279
2280You must run Emacs in batch mode in order to dump it. */)
2281 (filename, symfile)
c9aae259 2282 Lisp_Object filename, symfile;
f927c5ae 2283{
55697f5b 2284 extern char my_edata[];
f927c5ae 2285 Lisp_Object tem;
1b7ddf4f 2286 Lisp_Object symbol;
331379bf 2287 int count = SPECPDL_INDEX ();
4fab758d
GM
2288
2289 check_pure_size ();
f927c5ae 2290
87a98b1a
RS
2291 if (! noninteractive)
2292 error ("Dumping Emacs works only in batch mode");
2293
848a925e 2294#ifdef GNU_LINUX
dede2792
JD
2295 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2296 {
2297 fprintf (stderr, "**************************************************\n");
2298 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
e79beb56 2299 fprintf (stderr, "heap (%lu bytes). This usually means that exec-shield\n",
c37caf9d
JD
2300 heap_bss_diff);
2301 fprintf (stderr, "or something similar is in effect. The dump may\n");
e79beb56 2302 fprintf (stderr, "fail because of this. See the section about\n");
c37caf9d 2303 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
2304 fprintf (stderr, "**************************************************\n");
2305 }
848a925e 2306#endif /* GNU_LINUX */
dede2792 2307
1b7ddf4f
RS
2308 /* Bind `command-line-processed' to nil before dumping,
2309 so that the dumped Emacs will process its command line
2310 and set up to work with X windows if appropriate. */
4aaa3607 2311 symbol = intern ("command-line-processed");
1b7ddf4f
RS
2312 specbind (symbol, Qnil);
2313
b7826503 2314 CHECK_STRING (filename);
c9aae259
EN
2315 filename = Fexpand_file_name (filename, Qnil);
2316 if (!NILP (symfile))
f927c5ae 2317 {
b7826503 2318 CHECK_STRING (symfile);
d5db4077 2319 if (SCHARS (symfile))
c9aae259 2320 symfile = Fexpand_file_name (symfile, Qnil);
f927c5ae
JB
2321 }
2322
2323 tem = Vpurify_flag;
2324 Vpurify_flag = Qnil;
2325
0269dedb
RS
2326#ifdef HAVE_TZSET
2327 set_time_zone_rule (dump_tz);
2328#ifndef LOCALTIME_CACHE
2329 /* Force a tz reload, since set_time_zone_rule doesn't. */
2330 tzset ();
2331#endif
2332#endif
2333
f927c5ae 2334 fflush (stdout);
7db35a48 2335 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2336 /* Also arrange for warnings when nearly out of space. */
2337#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2338#ifndef WINDOWSNT
2339 /* On Windows, this was done before dumping, and that once suffices.
2340 Meanwhile, my_edata is not valid on Windows. */
cb37cf78 2341 memory_warnings (my_edata, malloc_warning);
cc5f52cb 2342#endif /* not WINDOWSNT */
15aaf1b5 2343#endif
06ca62eb 2344#if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
aa477689
JD
2345 /* Pthread may call malloc before main, and then we will get an endless
2346 loop, because pthread_self (see alloc.c) calls malloc the first time
2347 it is called on some systems. */
2348 reset_malloc_hooks ();
2349#endif
15aaf1b5
RS
2350#ifdef DOUG_LEA_MALLOC
2351 malloc_state_ptr = malloc_get_state ();
f927c5ae 2352#endif
2b7377ca 2353
a74c5ec1 2354#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2355 mmap_set_vars (0);
2356#endif
d5db4077
KR
2357 unexec (SDATA (filename),
2358 !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
a74c5ec1 2359#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2360 mmap_set_vars (1);
2361#endif
15aaf1b5
RS
2362#ifdef DOUG_LEA_MALLOC
2363 free (malloc_state_ptr);
2364#endif
f927c5ae
JB
2365
2366 Vpurify_flag = tem;
2367
1b7ddf4f 2368 return unbind_to (count, Qnil);
f927c5ae
JB
2369}
2370
2371#endif /* not HAVE_SHM */
2372
2373#endif /* not CANNOT_DUMP */
2374\f
68c45bf0
PE
2375#if HAVE_SETLOCALE
2376/* Recover from setlocale (LC_ALL, ""). */
2377void
2378fixup_locale ()
2379{
68c45bf0
PE
2380 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2381 so that numbers are read and printed properly for Emacs Lisp. */
2382 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2383}
2384
0c8559bb
PE
2385/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2386 DESIRED_LOCALE. */
68c45bf0
PE
2387static void
2388synchronize_locale (category, plocale, desired_locale)
2389 int category;
2390 Lisp_Object *plocale;
2391 Lisp_Object desired_locale;
2392{
0c8559bb
PE
2393 if (! EQ (*plocale, desired_locale))
2394 {
2395 *plocale = desired_locale;
2396 setlocale (category, (STRINGP (desired_locale)
3b6536b1 2397 ? (char *) SDATA (desired_locale)
0c8559bb
PE
2398 : ""));
2399 }
68c45bf0
PE
2400}
2401
ca9c0567 2402/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2403void
ca9c0567 2404synchronize_system_time_locale ()
68c45bf0 2405{
ca9c0567
PE
2406 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2407 Vsystem_time_locale);
68c45bf0
PE
2408}
2409
ca9c0567
PE
2410/* Set system messages locale to match Vsystem_messages_locale, if
2411 possible. */
68c45bf0 2412void
ca9c0567 2413synchronize_system_messages_locale ()
68c45bf0
PE
2414{
2415#ifdef LC_MESSAGES
ca9c0567
PE
2416 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2417 Vsystem_messages_locale);
68c45bf0
PE
2418#endif
2419}
2420#endif /* HAVE_SETLOCALE */
2421\f
4b163808 2422#ifndef SEPCHAR
f927c5ae
JB
2423#define SEPCHAR ':'
2424#endif
2425
2426Lisp_Object
2427decode_env_path (evarname, defalt)
2428 char *evarname, *defalt;
2429{
2430 register char *path, *p;
213d0b1f 2431 Lisp_Object lpath, element, tem;
f927c5ae 2432
2447c626
JB
2433 /* It's okay to use getenv here, because this function is only used
2434 to initialize variables when Emacs starts up, and isn't called
2435 after that. */
e065a56e
JB
2436 if (evarname != 0)
2437 path = (char *) getenv (evarname);
2438 else
2439 path = 0;
f927c5ae
JB
2440 if (!path)
2441 path = defalt;
6a30e6d6
RS
2442#ifdef DOS_NT
2443 /* Ensure values from the environment use the proper directory separator. */
2444 if (path)
2445 {
2446 p = alloca (strlen (path) + 1);
2447 strcpy (p, path);
2448 path = p;
2449
2450 if ('/' == DIRECTORY_SEP)
2451 dostounix_filename (path);
2452 else
2453 unixtodos_filename (path);
2454 }
2455#endif
f927c5ae
JB
2456 lpath = Qnil;
2457 while (1)
2458 {
2459 p = index (path, SEPCHAR);
2460 if (!p) p = path + strlen (path);
213d0b1f
RS
2461 element = (p - path ? make_string (path, p - path)
2462 : build_string ("."));
2463
2464 /* Add /: to the front of the name
2465 if it would otherwise be treated as magic. */
2466 tem = Ffind_file_name_handler (element, Qt);
ca3df2d5
RS
2467
2468 /* However, if the handler says "I'm safe",
2469 don't bother adding /:. */
2470 if (SYMBOLP (tem))
2471 {
2472 Lisp_Object prop;
2473 prop = Fget (tem, intern ("safe-magic"));
2474 if (! NILP (prop))
2475 tem = Qnil;
2476 }
2477
213d0b1f
RS
2478 if (! NILP (tem))
2479 element = concat2 (build_string ("/:"), element);
2480
2481 lpath = Fcons (element, lpath);
f927c5ae
JB
2482 if (*p)
2483 path = p + 1;
2484 else
2485 break;
2486 }
2487 return Fnreverse (lpath);
2488}
2489
eab2ee89 2490DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
4ff029f6
DN
2491 doc: /* Return non-nil if the current emacs process is a daemon.
2492If the daemon was given a name argument, return that name. */)
9d0a6e42 2493 ()
eab2ee89 2494{
fc012771 2495 if (IS_DAEMON)
4ff029f6
DN
2496 if (daemon_name)
2497 return build_string (daemon_name);
2498 else
2499 return Qt;
2500 else
2501 return Qnil;
eab2ee89
DN
2502}
2503
5790ef40 2504DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
fc012771
SM
2505 doc: /* Mark the Emacs daemon as being initialized.
2506This finishes the daemonization process by doing the other half of detaching
2507from the parent process and its tty file descriptors. */)
5790ef40
DN
2508 ()
2509{
2510 int nfd;
2511
fc012771 2512 if (!IS_DAEMON)
5790ef40
DN
2513 error ("This function can only be called if emacs is run as a daemon");
2514
2515 if (daemon_pipe[1] < 0)
2516 error ("The daemon has already been initialized");
2517
2518 if (NILP (Vafter_init_time))
2519 error ("This function can only be called after loading the init files");
2520
2521 /* Get rid of stdin, stdout and stderr. */
29dadb54 2522 nfd = open ("/dev/null", O_RDWR);
5790ef40
DN
2523 dup2 (nfd, 0);
2524 dup2 (nfd, 1);
2525 dup2 (nfd, 2);
2526 close (nfd);
2527
fc012771
SM
2528 /* Closing the pipe will notify the parent that it can exit.
2529 FIXME: In case some other process inherited the pipe, closing it here
2530 won't notify the parent because it's still open elsewhere, so we
2531 additionally send a byte, just to make sure the parent really exits.
2532 Instead, we should probably close the pipe in start-process and
2533 call-process to make sure the pipe is never inherited by
2534 subprocesses. */
2535 write (daemon_pipe[1], "\n", 1);
5790ef40
DN
2536 close (daemon_pipe[1]);
2537 /* Set it to an invalid value so we know we've already run this function. */
2538 daemon_pipe[1] = -1;
2539 return Qt;
2540}
2541
dfcf069d 2542void
f927c5ae
JB
2543syms_of_emacs ()
2544{
213d0b1f
RS
2545 Qfile_name_handler_alist = intern ("file-name-handler-alist");
2546 staticpro (&Qfile_name_handler_alist);
2547
83591e66 2548#ifndef CANNOT_DUMP
f927c5ae
JB
2549#ifdef HAVE_SHM
2550 defsubr (&Sdump_emacs_data);
2551#else
2552 defsubr (&Sdump_emacs);
83591e66 2553#endif
f927c5ae
JB
2554#endif
2555
2556 defsubr (&Skill_emacs);
2557
59653951 2558 defsubr (&Sinvocation_name);
ace40a69 2559 defsubr (&Sinvocation_directory);
eab2ee89 2560 defsubr (&Sdaemonp);
5790ef40 2561 defsubr (&Sdaemon_initialized);
59653951 2562
f927c5ae 2563 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2a9d2ed6
RS
2564 doc: /* Args passed by shell to Emacs, as a list of strings.
2565Many arguments are deleted from the list as they are processed. */);
f927c5ae
JB
2566
2567 DEFVAR_LISP ("system-type", &Vsystem_type,
cf59a374 2568 doc: /* The value is a symbol indicating the type of operating system you are using.
40a8993a 2569Special values:
cf59a374
GM
2570 `gnu' compiled for a GNU Hurd system.
2571 `gnu/linux' compiled for a GNU/Linux system.
2572 `gnu/kfreebsd' compiled for a GNU system with a FreeBSD kernel.
2573 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2574 `ms-dos' compiled as an MS-DOS application.
2575 `windows-nt' compiled as a native W32 application.
2576 `cygwin' compiled using the Cygwin library.
2577Anything else (in Emacs 23.1, the possibilities are: aix, berkeley-unix,
2578hpux, irix, lynxos 3.0.1, usg-unix-v) indicates some sort of Unix system. */);
f927c5ae
JB
2579 Vsystem_type = intern (SYSTEM_TYPE);
2580
271c7b7c 2581 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
7db35a48
PJ
2582 doc: /* Value is string indicating configuration Emacs was built for.
2583On MS-Windows, the value reflects the OS flavor and version on which
2584Emacs is running. */);
f7511647 2585 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2586
f0fc0b1a 2587 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
7db35a48 2588 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2589 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2590
f927c5ae 2591 DEFVAR_BOOL ("noninteractive", &noninteractive1,
7db35a48 2592 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2593
e5d77022 2594 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
e79beb56 2595 doc: /* Hook to be run when `kill-emacs' is called.
d77b70e5 2596Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2597in other similar situations), functions placed on this hook should not
2598expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2599see `kill-emacs-query-functions' instead.
2600
2601The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
edc8ae07 2602 Vkill_emacs_hook = Qnil;
3005da00
RS
2603
2604 DEFVAR_INT ("emacs-priority", &emacs_priority,
7db35a48
PJ
2605 doc: /* Priority for Emacs to run at.
2606This value is effective only if set before Emacs is dumped,
2607and only if the Emacs executable is installed with setuid to permit
2608it to change priority. (Emacs sets its uid back to the real uid.)
2609Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2610before you compile Emacs, to enable the code for this feature. */);
e7a9e1c3 2611 emacs_priority = 0;
074a066b
GV
2612
2613 DEFVAR_LISP ("path-separator", &Vpath_separator,
c7ed3276
EZ
2614 doc: /* String containing the character that separates directories in
2615search paths, such as PATH and other similar environment variables. */);
074a066b
GV
2616 {
2617 char c = SEPCHAR;
2618 Vpath_separator = make_string (&c, 1);
2619 }
59653951 2620
f67de86f 2621 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
7db35a48
PJ
2622 doc: /* The program name that was used to run Emacs.
2623Any directory names are omitted. */);
f67de86f
RS
2624
2625 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
7db35a48
PJ
2626 doc: /* The directory in which the Emacs executable was found, to run it.
2627The value is nil if that directory's name is not known. */);
f67de86f
RS
2628
2629 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
7db35a48 2630 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
e58a672c
RS
2631This is non-nil when we can't find those directories in their standard
2632installed locations, but we can find them near where the Emacs executable
2633was found. */);
07f4d123 2634 Vinstallation_directory = Qnil;
68c45bf0 2635
ca9c0567 2636 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
7db35a48 2637 doc: /* System locale for messages. */);
ca9c0567 2638 Vsystem_messages_locale = Qnil;
68c45bf0 2639
ca9c0567 2640 DEFVAR_LISP ("previous-system-messages-locale",
7db35a48
PJ
2641 &Vprevious_system_messages_locale,
2642 doc: /* Most recently used system locale for messages. */);
ca9c0567 2643 Vprevious_system_messages_locale = Qnil;
68c45bf0 2644
ca9c0567 2645 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
7db35a48 2646 doc: /* System locale for time. */);
ca9c0567 2647 Vsystem_time_locale = Qnil;
68c45bf0 2648
ca9c0567 2649 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
7db35a48 2650 doc: /* Most recently used system locale for time. */);
ca9c0567 2651 Vprevious_system_time_locale = Qnil;
90503d96
CY
2652
2653 DEFVAR_LISP ("before-init-time", &Vbefore_init_time,
2654 doc: /* Value of `current-time' before Emacs begins initialization. */);
2655 Vbefore_init_time = Qnil;
2656
2657 DEFVAR_LISP ("after-init-time", &Vafter_init_time,
2658 doc: /* Value of `current-time' after loading the init files.
2659This is nil during initialization. */);
2660 Vafter_init_time = Qnil;
fc012771 2661
8686ac71 2662 DEFVAR_BOOL ("inhibit-x-resources", &inhibit_x_resources,
9b68317c 2663 doc: /* If non-nil, X resources, Windows Registry settings, and NS defaults are not used. */);
8686ac71
JB
2664 inhibit_x_resources = 0;
2665
fc012771
SM
2666 /* Make sure IS_DAEMON starts up as false. */
2667 daemon_pipe[1] = 0;
f927c5ae 2668}
6b61353c
KH
2669
2670/* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
2671 (do not change this comment) */