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