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