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