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