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