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