Move DEFSYM to lisp.h and use everywhere.
[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;
0b963a93 588 ptrdiff_t 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);
0b963a93 1090 dname_arg = *dname_arg2 ? dname_arg2 : NULL;
b3243e6f 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 {
0b963a93 1849 int match;
081bef73 1850
c96f26f4
RS
1851 /* If we have found "--", don't consider
1852 any more arguments as options. */
249443b6 1853 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1854 {
1855 /* Leave the "--", and everything following it, at the end. */
1856 for (; from < argc; from++)
1857 {
1858 priority[from] = -100;
1859 options[from] = -1;
1860 }
1861 break;
1862 }
1863
081bef73
RS
1864 /* Look for a match with a known old-fashioned option. */
1865 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1866 if (!strcmp (argv[from], standard_args[i].name))
1867 {
1868 options[from] = standard_args[i].nargs;
1869 priority[from] = standard_args[i].priority;
fd76ec52
RS
1870 if (from + standard_args[i].nargs >= argc)
1871 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1872 from += standard_args[i].nargs;
1873 goto done;
1874 }
1875
1876 /* Look for a match with a known long option.
1877 MATCH is -1 if no match so far, -2 if two or more matches so far,
1878 >= 0 (the table index of the match) if just one match so far. */
1879 if (argv[from][1] == '-')
1880 {
0b963a93
PE
1881 char const *equals = strchr (argv[from], '=');
1882 ptrdiff_t thislen =
1883 equals ? equals - argv[from] : strlen (argv[from]);
1884
081bef73 1885 match = -1;
081bef73 1886
f609ef57
KH
1887 for (i = 0;
1888 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1889 if (standard_args[i].longname
1890 && !strncmp (argv[from], standard_args[i].longname,
1891 thislen))
081bef73
RS
1892 {
1893 if (match == -1)
1894 match = i;
1895 else
1896 match = -2;
1897 }
1898
1899 /* If we found exactly one match, use that. */
1900 if (match >= 0)
1901 {
1902 options[from] = standard_args[match].nargs;
1903 priority[from] = standard_args[match].priority;
1904 /* If --OPTION=VALUE syntax is used,
1905 this option uses just one argv element. */
1906 if (equals != 0)
1907 options[from] = 0;
fd76ec52
RS
1908 if (from + options[from] >= argc)
1909 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1910 from += options[from];
1911 }
a09a5b5b
GM
1912 /* FIXME When match < 0, shouldn't there be some error,
1913 or at least indication to the user that there was a
1914 problem? */
081bef73
RS
1915 }
1916 done: ;
1917 }
1918 }
1919
1920 /* Copy the arguments, in order of decreasing priority, to NEW. */
1921 new[0] = argv[0];
956e3c7e 1922 while (incoming_used < argc)
081bef73
RS
1923 {
1924 int best = -1;
2c70c992 1925 int best_priority = -9999;
081bef73
RS
1926
1927 /* Find the highest priority remaining option.
1928 If several have equal priority, take the first of them. */
1929 for (from = 1; from < argc; from++)
1930 {
1931 if (argv[from] != 0 && priority[from] > best_priority)
1932 {
1933 best_priority = priority[from];
1934 best = from;
1935 }
1936 /* Skip option arguments--they are tied to the options. */
1937 if (options[from] > 0)
1938 from += options[from];
1939 }
7db35a48 1940
081bef73
RS
1941 if (best < 0)
1942 abort ();
1943
956e3c7e
RS
1944 /* Copy the highest priority remaining option, with its args, to NEW.
1945 Unless it is a duplicate of the previous one. */
1946 if (! (options[best] == 0
1947 && ! strcmp (new[to - 1], argv[best])))
1948 {
1949 new[to++] = argv[best];
1950 for (i = 0; i < options[best]; i++)
1951 new[to++] = argv[best + i + 1];
1952 }
1953
1954 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
1955
1956 /* Clear out this option in ARGV. */
1957 argv[best] = 0;
1958 for (i = 0; i < options[best]; i++)
1959 argv[best + i + 1] = 0;
1960 }
1961
81b7af72
RS
1962 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1963 while (to < argc)
1964 new[to++] = 0;
1965
72af86bd 1966 memcpy (argv, new, sizeof (char *) * argc);
0bf591da 1967
68db37aa
KS
1968 xfree (options);
1969 xfree (new);
1970 xfree (priority);
081bef73
RS
1971}
1972\f
a7ca3326 1973DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
1974 doc: /* Exit the Emacs job and kill it.
1975If ARG is an integer, return ARG as the exit program code.
b224de9b 1976If ARG is a string, stuff it as keyboard input.
7db35a48 1977
9c524fcb 1978This function is called upon receipt of the signals SIGTERM
383ebd15 1979or SIGHUP, and upon SIGINT in batch mode.
9c524fcb 1980
7db35a48
PJ
1981The value of `kill-emacs-hook', if not void,
1982is a list of functions (of no args),
1983all of which are called before Emacs is actually killed. */)
5842a27b 1984 (Lisp_Object arg)
f927c5ae 1985{
f927c5ae 1986 struct gcpro gcpro1;
dee091a3 1987 Lisp_Object hook;
f927c5ae
JB
1988
1989 GCPRO1 (arg);
1990
1991 if (feof (stdin))
1992 arg = Qt;
1993
dee091a3
JD
1994 hook = intern ("kill-emacs-hook");
1995 Frun_hooks (1, &hook);
f927c5ae 1996
f927c5ae
JB
1997 UNGCPRO;
1998
1dd3c2d9
CY
1999#ifdef HAVE_X_WINDOWS
2000 /* Transfer any clipboards we own to the clipboard manager. */
2001 x_clipboard_manager_save_all ();
2002#endif
2003
d0068e25 2004 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
40be253a 2005
58545838
KH
2006 /* If we have an auto-save list file,
2007 kill it because we are exiting Emacs deliberately (not crashing).
2008 Do it after shut_down_emacs, which does an auto-save. */
2009 if (STRINGP (Vauto_save_list_file_name))
42a5b22f 2010 unlink (SSDATA (Vauto_save_list_file_name));
58545838 2011
fa439170 2012 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
f927c5ae 2013}
40be253a
JB
2014
2015
2016/* Perform an orderly shutdown of Emacs. Autosave any modified
2017 buffers, kill any child processes, clean up the terminal modes (if
2018 we're in the foreground), and other stuff like that. Don't perform
2019 any redisplay; this may be called when Emacs is shutting down in
2020 the background, or after its X connection has died.
2021
2022 If SIG is a signal number, print a message for it.
2023
2024 This is called by fatal signal handlers, X protocol error handlers,
2025 and Fkill_emacs. */
f7ab4e3d 2026
40be253a 2027void
d5a3eaaf 2028shut_down_emacs (int sig, int no_x, Lisp_Object stuff)
40be253a 2029{
829d872b
RS
2030 /* Prevent running of hooks from now on. */
2031 Vrun_hooks = Qnil;
2032
9db03f6c
KS
2033 /* Don't update display from now on. */
2034 Vinhibit_redisplay = Qt;
2035
7db35a48 2036 /* If we are controlling the terminal, reset terminal modes. */
a7ebc409 2037#ifndef DOS_NT
40be253a 2038 {
d04d81d2 2039 int pgrp = EMACS_GETPGRP (0);
12e610e8
DN
2040 int tpgrp = tcgetpgrp (0);
2041 if ((tpgrp != -1) && tpgrp == pgrp)
40be253a 2042 {
28d440ab 2043 reset_all_sys_modes ();
40be253a 2044 if (sig && sig != SIGTERM)
6b61353c 2045 fprintf (stderr, "Fatal error (%d)", sig);
40be253a
JB
2046 }
2047 }
2048#else
2049 fflush (stdout);
0a125897 2050 reset_all_sys_modes ();
40be253a
JB
2051#endif
2052
f7ab4e3d
RS
2053 stuff_buffered_input (stuff);
2054
92d835a4 2055 inhibit_sentinels = 1;
40be253a
JB
2056 kill_buffer_processes (Qnil);
2057 Fdo_auto_save (Qt, Qnil);
2058
2059#ifdef CLASH_DETECTION
2060 unlock_all_files ();
2061#endif
2062
5e7f8733 2063#if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
41423a80 2064#ifdef HAVE_X_WINDOWS
f7511647 2065 /* It's not safe to call intern here. Maybe we are crashing. */
2246281f
KL
2066 if (!noninteractive && SYMBOLP (Vinitial_window_system)
2067 && SCHARS (SYMBOL_NAME (Vinitial_window_system)) == 1
2068 && SREF (SYMBOL_NAME (Vinitial_window_system), 0) == 'x'
f7511647 2069 && ! no_x)
41423a80
RS
2070 Fx_close_current_connection ();
2071#endif /* HAVE_X_WINDOWS */
5e7f8733 2072#endif
41423a80 2073
40be253a
JB
2074#ifdef SIGIO
2075 /* There is a tendency for a SIGIO signal to arrive within exit,
2076 and cause a SIGHUP because the input descriptor is already closed. */
2077 unrequest_sigio ();
2078 signal (SIGIO, SIG_IGN);
2079#endif
41f339d4
RS
2080
2081#ifdef WINDOWSNT
2082 term_ntproc ();
2083#endif
d546e578 2084
cd8d4168
GM
2085 /* Do this only if terminating normally, we want glyph matrices
2086 etc. in a core dump. */
200f868e 2087 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
2088 {
2089 check_glyph_memory ();
2090 check_message_stack ();
2091 }
90d920b6 2092
d546e578
EZ
2093#ifdef MSDOS
2094 dos_cleanup ();
2095#endif
edfda783
AR
2096
2097#ifdef HAVE_NS
2098 ns_term_shutdown (sig);
2099#endif
40be253a
JB
2100}
2101
2102
f927c5ae
JB
2103\f
2104#ifndef CANNOT_DUMP
f927c5ae 2105
ce701a33 2106#include "unexec.h"
dd5ecd6b 2107
f927c5ae 2108DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
2109 doc: /* Dump current state of Emacs into executable file FILENAME.
2110Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2111This is used in the file `loadup.el' when building Emacs.
2112
2113You must run Emacs in batch mode in order to dump it. */)
5842a27b 2114 (Lisp_Object filename, Lisp_Object symfile)
f927c5ae 2115{
f927c5ae 2116 Lisp_Object tem;
1b7ddf4f 2117 Lisp_Object symbol;
331379bf 2118 int count = SPECPDL_INDEX ();
4fab758d
GM
2119
2120 check_pure_size ();
f927c5ae 2121
87a98b1a
RS
2122 if (! noninteractive)
2123 error ("Dumping Emacs works only in batch mode");
2124
848a925e 2125#ifdef GNU_LINUX
c339dc2e
PE
2126
2127 /* Warn if the gap between BSS end and heap start is larger than this. */
2128# define MAX_HEAP_BSS_DIFF (1024*1024)
2129
dede2792
JD
2130 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2131 {
2132 fprintf (stderr, "**************************************************\n");
2133 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
e79beb56 2134 fprintf (stderr, "heap (%lu bytes). This usually means that exec-shield\n",
c37caf9d
JD
2135 heap_bss_diff);
2136 fprintf (stderr, "or something similar is in effect. The dump may\n");
e79beb56 2137 fprintf (stderr, "fail because of this. See the section about\n");
c37caf9d 2138 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
2139 fprintf (stderr, "**************************************************\n");
2140 }
848a925e 2141#endif /* GNU_LINUX */
dede2792 2142
1b7ddf4f
RS
2143 /* Bind `command-line-processed' to nil before dumping,
2144 so that the dumped Emacs will process its command line
2145 and set up to work with X windows if appropriate. */
4aaa3607 2146 symbol = intern ("command-line-processed");
1b7ddf4f
RS
2147 specbind (symbol, Qnil);
2148
b7826503 2149 CHECK_STRING (filename);
c9aae259
EN
2150 filename = Fexpand_file_name (filename, Qnil);
2151 if (!NILP (symfile))
f927c5ae 2152 {
b7826503 2153 CHECK_STRING (symfile);
d5db4077 2154 if (SCHARS (symfile))
c9aae259 2155 symfile = Fexpand_file_name (symfile, Qnil);
f927c5ae
JB
2156 }
2157
2158 tem = Vpurify_flag;
2159 Vpurify_flag = Qnil;
2160
0269dedb
RS
2161#ifdef HAVE_TZSET
2162 set_time_zone_rule (dump_tz);
2163#ifndef LOCALTIME_CACHE
2164 /* Force a tz reload, since set_time_zone_rule doesn't. */
2165 tzset ();
2166#endif
2167#endif
2168
f927c5ae 2169 fflush (stdout);
7db35a48 2170 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2171 /* Also arrange for warnings when nearly out of space. */
2172#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2173#ifndef WINDOWSNT
2174 /* On Windows, this was done before dumping, and that once suffices.
2175 Meanwhile, my_edata is not valid on Windows. */
c339dc2e
PE
2176 {
2177 extern char my_edata[];
2178 memory_warnings (my_edata, malloc_warning);
2179 }
cc5f52cb 2180#endif /* not WINDOWSNT */
dd5ecd6b 2181#if defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
aa477689
JD
2182 /* Pthread may call malloc before main, and then we will get an endless
2183 loop, because pthread_self (see alloc.c) calls malloc the first time
2184 it is called on some systems. */
2185 reset_malloc_hooks ();
2186#endif
dd5ecd6b 2187#endif /* not SYSTEM_MALLOC */
15aaf1b5
RS
2188#ifdef DOUG_LEA_MALLOC
2189 malloc_state_ptr = malloc_get_state ();
f927c5ae 2190#endif
2b7377ca 2191
a74c5ec1 2192#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2193 mmap_set_vars (0);
2194#endif
42a5b22f 2195 unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0);
a74c5ec1 2196#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2197 mmap_set_vars (1);
2198#endif
15aaf1b5
RS
2199#ifdef DOUG_LEA_MALLOC
2200 free (malloc_state_ptr);
2201#endif
f927c5ae
JB
2202
2203 Vpurify_flag = tem;
2204
1b7ddf4f 2205 return unbind_to (count, Qnil);
f927c5ae
JB
2206}
2207
f927c5ae
JB
2208#endif /* not CANNOT_DUMP */
2209\f
68c45bf0
PE
2210#if HAVE_SETLOCALE
2211/* Recover from setlocale (LC_ALL, ""). */
2212void
d5a3eaaf 2213fixup_locale (void)
68c45bf0 2214{
68c45bf0
PE
2215 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2216 so that numbers are read and printed properly for Emacs Lisp. */
2217 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2218}
2219
0c8559bb
PE
2220/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2221 DESIRED_LOCALE. */
68c45bf0 2222static void
dd4c5104 2223synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_locale)
68c45bf0 2224{
0c8559bb
PE
2225 if (! EQ (*plocale, desired_locale))
2226 {
2227 *plocale = desired_locale;
2228 setlocale (category, (STRINGP (desired_locale)
51b59d79 2229 ? SSDATA (desired_locale)
0c8559bb
PE
2230 : ""));
2231 }
68c45bf0
PE
2232}
2233
ca9c0567 2234/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2235void
d5a3eaaf 2236synchronize_system_time_locale (void)
68c45bf0 2237{
ca9c0567
PE
2238 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2239 Vsystem_time_locale);
68c45bf0
PE
2240}
2241
ca9c0567
PE
2242/* Set system messages locale to match Vsystem_messages_locale, if
2243 possible. */
68c45bf0 2244void
d5a3eaaf 2245synchronize_system_messages_locale (void)
68c45bf0
PE
2246{
2247#ifdef LC_MESSAGES
ca9c0567
PE
2248 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2249 Vsystem_messages_locale);
68c45bf0
PE
2250#endif
2251}
2252#endif /* HAVE_SETLOCALE */
2253\f
4b163808 2254#ifndef SEPCHAR
f927c5ae
JB
2255#define SEPCHAR ':'
2256#endif
2257
2258Lisp_Object
a8fe7202 2259decode_env_path (const char *evarname, const char *defalt)
f927c5ae 2260{
a8fe7202 2261 const char *path, *p;
213d0b1f 2262 Lisp_Object lpath, element, tem;
f927c5ae 2263
2447c626
JB
2264 /* It's okay to use getenv here, because this function is only used
2265 to initialize variables when Emacs starts up, and isn't called
2266 after that. */
e065a56e 2267 if (evarname != 0)
a8fe7202 2268 path = getenv (evarname);
e065a56e
JB
2269 else
2270 path = 0;
f927c5ae
JB
2271 if (!path)
2272 path = defalt;
6a30e6d6
RS
2273#ifdef DOS_NT
2274 /* Ensure values from the environment use the proper directory separator. */
2275 if (path)
2276 {
a8fe7202
AS
2277 char *path_copy = alloca (strlen (path) + 1);
2278 strcpy (path_copy, path);
2279 dostounix_filename (path_copy);
2280 path = path_copy;
6a30e6d6
RS
2281 }
2282#endif
f927c5ae
JB
2283 lpath = Qnil;
2284 while (1)
2285 {
8966b757 2286 p = strchr (path, SEPCHAR);
a8fe7202
AS
2287 if (!p)
2288 p = path + strlen (path);
213d0b1f
RS
2289 element = (p - path ? make_string (path, p - path)
2290 : build_string ("."));
2291
2292 /* Add /: to the front of the name
2293 if it would otherwise be treated as magic. */
2294 tem = Ffind_file_name_handler (element, Qt);
ca3df2d5
RS
2295
2296 /* However, if the handler says "I'm safe",
2297 don't bother adding /:. */
2298 if (SYMBOLP (tem))
2299 {
2300 Lisp_Object prop;
2301 prop = Fget (tem, intern ("safe-magic"));
2302 if (! NILP (prop))
2303 tem = Qnil;
2304 }
2305
213d0b1f
RS
2306 if (! NILP (tem))
2307 element = concat2 (build_string ("/:"), element);
2308
2309 lpath = Fcons (element, lpath);
f927c5ae
JB
2310 if (*p)
2311 path = p + 1;
2312 else
2313 break;
2314 }
2315 return Fnreverse (lpath);
2316}
2317
eab2ee89 2318DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
4ff029f6
DN
2319 doc: /* Return non-nil if the current emacs process is a daemon.
2320If the daemon was given a name argument, return that name. */)
5842a27b 2321 (void)
eab2ee89 2322{
fc012771 2323 if (IS_DAEMON)
4ff029f6
DN
2324 if (daemon_name)
2325 return build_string (daemon_name);
2326 else
2327 return Qt;
2328 else
2329 return Qnil;
eab2ee89
DN
2330}
2331
5790ef40 2332DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
fc012771
SM
2333 doc: /* Mark the Emacs daemon as being initialized.
2334This finishes the daemonization process by doing the other half of detaching
2335from the parent process and its tty file descriptors. */)
5842a27b 2336 (void)
5790ef40
DN
2337{
2338 int nfd;
dc1ca6a8 2339 int err = 0;
5790ef40 2340
fc012771 2341 if (!IS_DAEMON)
5790ef40
DN
2342 error ("This function can only be called if emacs is run as a daemon");
2343
2344 if (daemon_pipe[1] < 0)
2345 error ("The daemon has already been initialized");
2346
2347 if (NILP (Vafter_init_time))
2348 error ("This function can only be called after loading the init files");
2349
2350 /* Get rid of stdin, stdout and stderr. */
29dadb54 2351 nfd = open ("/dev/null", O_RDWR);
dc1ca6a8
PE
2352 err |= nfd < 0;
2353 err |= dup2 (nfd, 0) < 0;
2354 err |= dup2 (nfd, 1) < 0;
2355 err |= dup2 (nfd, 2) < 0;
2356 err |= close (nfd) != 0;
5790ef40 2357
fc012771
SM
2358 /* Closing the pipe will notify the parent that it can exit.
2359 FIXME: In case some other process inherited the pipe, closing it here
2360 won't notify the parent because it's still open elsewhere, so we
2361 additionally send a byte, just to make sure the parent really exits.
2362 Instead, we should probably close the pipe in start-process and
2363 call-process to make sure the pipe is never inherited by
2364 subprocesses. */
dc1ca6a8
PE
2365 err |= write (daemon_pipe[1], "\n", 1) < 0;
2366 err |= close (daemon_pipe[1]) != 0;
5790ef40
DN
2367 /* Set it to an invalid value so we know we've already run this function. */
2368 daemon_pipe[1] = -1;
dc1ca6a8
PE
2369
2370 if (err)
2371 error ("I/O error during daemon initialization");
5790ef40
DN
2372 return Qt;
2373}
2374
dfcf069d 2375void
d5a3eaaf 2376syms_of_emacs (void)
f927c5ae 2377{
cd3520a4
JB
2378 DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist");
2379 DEFSYM (Qrisky_local_variable, "risky-local-variable");
213d0b1f 2380
83591e66 2381#ifndef CANNOT_DUMP
f927c5ae
JB
2382 defsubr (&Sdump_emacs);
2383#endif
2384
2385 defsubr (&Skill_emacs);
2386
59653951 2387 defsubr (&Sinvocation_name);
ace40a69 2388 defsubr (&Sinvocation_directory);
eab2ee89 2389 defsubr (&Sdaemonp);
5790ef40 2390 defsubr (&Sdaemon_initialized);
59653951 2391
29208e82 2392 DEFVAR_LISP ("command-line-args", Vcommand_line_args,
2a9d2ed6
RS
2393 doc: /* Args passed by shell to Emacs, as a list of strings.
2394Many arguments are deleted from the list as they are processed. */);
f927c5ae 2395
29208e82 2396 DEFVAR_LISP ("system-type", Vsystem_type,
cf59a374 2397 doc: /* The value is a symbol indicating the type of operating system you are using.
40a8993a 2398Special values:
cf59a374
GM
2399 `gnu' compiled for a GNU Hurd system.
2400 `gnu/linux' compiled for a GNU/Linux system.
2401 `gnu/kfreebsd' compiled for a GNU system with a FreeBSD kernel.
2402 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2403 `ms-dos' compiled as an MS-DOS application.
2404 `windows-nt' compiled as a native W32 application.
2405 `cygwin' compiled using the Cygwin library.
bd6bc222
GM
2406Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix,
2407hpux, irix, usg-unix-v) indicates some sort of Unix system. */);
d67b4f80 2408 Vsystem_type = intern_c_string (SYSTEM_TYPE);
60393507 2409 /* The above values are from SYSTEM_TYPE in include files under src/s. */
f927c5ae 2410
29208e82 2411 DEFVAR_LISP ("system-configuration", Vsystem_configuration,
7db35a48
PJ
2412 doc: /* Value is string indicating configuration Emacs was built for.
2413On MS-Windows, the value reflects the OS flavor and version on which
2414Emacs is running. */);
f7511647 2415 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2416
29208e82 2417 DEFVAR_LISP ("system-configuration-options", Vsystem_configuration_options,
7db35a48 2418 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2419 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2420
29208e82 2421 DEFVAR_BOOL ("noninteractive", noninteractive1,
7db35a48 2422 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2423
29208e82 2424 DEFVAR_LISP ("kill-emacs-hook", Vkill_emacs_hook,
e79beb56 2425 doc: /* Hook to be run when `kill-emacs' is called.
d77b70e5 2426Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2427in other similar situations), functions placed on this hook should not
2428expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2429see `kill-emacs-query-functions' instead.
2430
9c524fcb
GM
2431Before Emacs 24.1, the hook was not run in batch mode, i.e., if
2432`noninteractive' was non-nil. */);
edc8ae07 2433 Vkill_emacs_hook = Qnil;
3005da00 2434
29208e82 2435 DEFVAR_LISP ("path-separator", Vpath_separator,
c7ed3276
EZ
2436 doc: /* String containing the character that separates directories in
2437search paths, such as PATH and other similar environment variables. */);
074a066b
GV
2438 {
2439 char c = SEPCHAR;
2440 Vpath_separator = make_string (&c, 1);
2441 }
59653951 2442
29208e82 2443 DEFVAR_LISP ("invocation-name", Vinvocation_name,
7db35a48
PJ
2444 doc: /* The program name that was used to run Emacs.
2445Any directory names are omitted. */);
f67de86f 2446
29208e82 2447 DEFVAR_LISP ("invocation-directory", Vinvocation_directory,
7db35a48
PJ
2448 doc: /* The directory in which the Emacs executable was found, to run it.
2449The value is nil if that directory's name is not known. */);
f67de86f 2450
29208e82 2451 DEFVAR_LISP ("installation-directory", Vinstallation_directory,
7db35a48 2452 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
e58a672c
RS
2453This is non-nil when we can't find those directories in their standard
2454installed locations, but we can find them near where the Emacs executable
2455was found. */);
07f4d123 2456 Vinstallation_directory = Qnil;
68c45bf0 2457
29208e82 2458 DEFVAR_LISP ("system-messages-locale", Vsystem_messages_locale,
7db35a48 2459 doc: /* System locale for messages. */);
ca9c0567 2460 Vsystem_messages_locale = Qnil;
68c45bf0 2461
ca9c0567 2462 DEFVAR_LISP ("previous-system-messages-locale",
29208e82 2463 Vprevious_system_messages_locale,
7db35a48 2464 doc: /* Most recently used system locale for messages. */);
ca9c0567 2465 Vprevious_system_messages_locale = Qnil;
68c45bf0 2466
29208e82 2467 DEFVAR_LISP ("system-time-locale", Vsystem_time_locale,
7db35a48 2468 doc: /* System locale for time. */);
ca9c0567 2469 Vsystem_time_locale = Qnil;
68c45bf0 2470
29208e82 2471 DEFVAR_LISP ("previous-system-time-locale", Vprevious_system_time_locale,
7db35a48 2472 doc: /* Most recently used system locale for time. */);
ca9c0567 2473 Vprevious_system_time_locale = Qnil;
90503d96 2474
29208e82 2475 DEFVAR_LISP ("before-init-time", Vbefore_init_time,
90503d96
CY
2476 doc: /* Value of `current-time' before Emacs begins initialization. */);
2477 Vbefore_init_time = Qnil;
2478
29208e82 2479 DEFVAR_LISP ("after-init-time", Vafter_init_time,
90503d96
CY
2480 doc: /* Value of `current-time' after loading the init files.
2481This is nil during initialization. */);
2482 Vafter_init_time = Qnil;
fc012771 2483
29208e82 2484 DEFVAR_BOOL ("inhibit-x-resources", inhibit_x_resources,
9b68317c 2485 doc: /* If non-nil, X resources, Windows Registry settings, and NS defaults are not used. */);
8686ac71
JB
2486 inhibit_x_resources = 0;
2487
29208e82 2488 DEFVAR_LISP ("emacs-copyright", Vemacs_copyright,
8c5ff6dd
KR
2489 doc: /* Short copyright string for this version of Emacs. */);
2490 Vemacs_copyright = build_string (emacs_copyright);
2491
29208e82 2492 DEFVAR_LISP ("emacs-version", Vemacs_version,
8c5ff6dd
KR
2493 doc: /* Version numbers of this version of Emacs. */);
2494 Vemacs_version = build_string (emacs_version);
2495
29208e82 2496 DEFVAR_LISP ("dynamic-library-alist", Vdynamic_library_alist,
2e288d54
JB
2497 doc: /* Alist of dynamic libraries vs external files implementing them.
2498Each element is a list (LIBRARY FILE...), where the car is a symbol
2499representing a supported external library, and the rest are strings giving
2500alternate filenames for that library.
2501
2502Emacs tries to load the library from the files in the order they appear on
2503the list; if none is loaded, the running session of Emacs won't have access
2504to that library.
2505
2506Note that image types `pbm' and `xbm' do not need entries in this variable
2507because they do not depend on external libraries and are always available.
2508
2509Also note that this is not a generic facility for accessing external
2510libraries; only those already known by Emacs will be loaded. */);
2511 Vdynamic_library_alist = Qnil;
2512 Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
2513
fc012771
SM
2514 /* Make sure IS_DAEMON starts up as false. */
2515 daemon_pipe[1] = 0;
f927c5ae 2516}