Convert old-style definitions
[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 extern Lisp_Object *stack_base;
761 stack_base = &dummy;
762#endif
763
a4ef73c8
CY
764#if defined (USE_GTK) && defined (G_SLICE_ALWAYS_MALLOC)
765 /* This is used by the Cygwin build. */
766 setenv ("G_SLICE", "always-malloc", 1);
767#endif
768
dede2792
JD
769 if (!initialized)
770 {
771 extern char my_endbss[];
772 extern char *my_endbss_static;
773
774 if (my_heap_start == 0)
775 my_heap_start = sbrk (0);
776
777 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
778 }
779
d785cf9e
RS
780#ifdef RUN_TIME_REMAP
781 if (initialized)
782 run_time_remap (argv[0]);
783#endif
784
14145fa3
AR
785/* If using unexmacosx.c (set by s/darwin.h), we must do this. */
786#ifdef DARWIN_OS
e0f712ba
AC
787 if (!initialized)
788 unexec_init_emacs_zone ();
789#endif
790
081bef73 791 sort_args (argc, argv);
956e3c7e
RS
792 argc = 0;
793 while (argv[argc]) argc++;
081bef73 794
8c5ff6dd 795 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args))
1702afef 796 {
8c5ff6dd
KR
797 const char *version, *copyright;
798 if (initialized)
5cf9ca93 799 {
8c5ff6dd
KR
800 Lisp_Object tem, tem2;
801 tem = Fsymbol_value (intern_c_string ("emacs-version"));
802 tem2 = Fsymbol_value (intern_c_string ("emacs-copyright"));
803 if (!STRINGP (tem))
804 {
805 fprintf (stderr, "Invalid value of `emacs-version'\n");
806 exit (1);
807 }
808 if (!STRINGP (tem2))
809 {
810 fprintf (stderr, "Invalid value of `emacs-copyright'\n");
811 exit (1);
812 }
813 else
814 {
815 version = SDATA (tem);
816 copyright = SDATA (tem2);
817 }
5cf9ca93 818 }
1702afef
RS
819 else
820 {
8c5ff6dd
KR
821 version = emacs_version;
822 copyright = emacs_copyright;
1702afef 823 }
8c5ff6dd
KR
824 printf ("GNU Emacs %s\n", version);
825 printf ("%s\n", copyright);
826 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
827 printf ("You may redistribute copies of Emacs\n");
828 printf ("under the terms of the GNU General Public License.\n");
829 printf ("For more information about these matters, ");
830 printf ("see the file named COPYING.\n");
831 exit (0);
1702afef 832 }
f63d0028
JD
833 if (argmatch (argv, argc, "-chdir", "--chdir", 2, &ch_to_dir, &skip_args))
834 if (chdir (ch_to_dir) == -1)
835 {
836 fprintf (stderr, "%s: Can't chdir to %s: %s\n",
837 argv[0], ch_to_dir, strerror (errno));
838 exit (1);
839 }
840
1702afef 841
dede2792 842#ifdef HAVE_PERSONALITY_LINUX32
dede2792
JD
843 if (!initialized
844 && (strcmp (argv[argc-1], "dump") == 0
845 || strcmp (argv[argc-1], "bootstrap") == 0)
fd75ddb2 846 && ! getenv ("EMACS_HEAP_EXEC"))
dede2792 847 {
fd75ddb2
JD
848 /* Set this so we only do this once. */
849 putenv("EMACS_HEAP_EXEC=true");
711877f3 850
fd75ddb2
JD
851 /* A flag to turn off address randomization which is introduced
852 in linux kernel shipped with fedora core 4 */
711877f3 853#define ADD_NO_RANDOMIZE 0x0040000
fd75ddb2 854 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
711877f3
MY
855#undef ADD_NO_RANDOMIZE
856
fd75ddb2 857 execvp (argv[0], argv);
dede2792 858
fd75ddb2
JD
859 /* If the exec fails, try to dump anyway. */
860 perror ("execvp");
dede2792
JD
861 }
862#endif /* HAVE_PERSONALITY_LINUX32 */
863
864
f927c5ae
JB
865/* Map in shared memory, if we are using that. */
866#ifdef HAVE_SHM
df6530f8 867 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
f927c5ae
JB
868 {
869 map_in_data (0);
870 /* The shared memory was just restored, which clobbered this. */
871 skip_args = 1;
872 }
873 else
874 {
875 map_in_data (1);
876 /* The shared memory was just restored, which clobbered this. */
877 skip_args = 0;
878 }
879#endif
880
ea2acec5 881#if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
6c2935e9
RS
882 /* Extend the stack space available.
883 Don't do that if dumping, since some systems (e.g. DJGPP)
884 might define a smaller stack limit at that time. */
885 if (1
886#ifndef CANNOT_DUMP
887 && (!noninteractive || initialized)
888#endif
889 && !getrlimit (RLIMIT_STACK, &rlim))
53c58b5d 890 {
509a8fcd 891 long newlim;
fa8459a3 892 extern size_t re_max_failures;
03effc23
KH
893 /* Approximate the amount regex.c needs per unit of re_max_failures. */
894 int ratio = 20 * sizeof (char *);
895 /* Then add 33% to cover the size of the smaller stacks that regex.c
896 successively allocates and discards, on its way to the maximum. */
897 ratio += ratio / 3;
898 /* Add in some extra to cover
899 what we're likely to use for other reasons. */
900 newlim = re_max_failures * ratio + 200000;
d0381a7f
RS
901#ifdef __NetBSD__
902 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
903 stack allocation routine for new process that the allocation
904 fails if stack limit is not on page boundary. So, round up the
905 new limit to page boundary. */
906 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
907#endif
509a8fcd 908 if (newlim > rlim.rlim_max)
6c2935e9
RS
909 {
910 newlim = rlim.rlim_max;
03effc23
KH
911 /* Don't let regex.c overflow the stack we have. */
912 re_max_failures = (newlim - 200000) / ratio;
6c2935e9 913 }
509a8fcd
RS
914 if (rlim.rlim_cur < newlim)
915 rlim.rlim_cur = newlim;
916
53c58b5d
RS
917 setrlimit (RLIMIT_STACK, &rlim);
918 }
ea2acec5 919#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
53c58b5d 920
f927c5ae
JB
921 /* Record (approximately) where the stack begins. */
922 stack_bottom = &stack_bottom_variable;
923
f927c5ae 924 clearerr (stdin);
9ae8f997 925
f927c5ae 926#ifndef SYSTEM_MALLOC
bf7f4e90
RS
927 /* Arrange to get warning messages as memory fills up. */
928 memory_warnings (0, malloc_warning);
9ac0d9e0 929
f5a3c8c4
AI
930 /* Call malloc at least once, to run the initial __malloc_hook.
931 Also call realloc and free for consistency. */
932 free (realloc (malloc (4), 4));
bf7f4e90 933
06ca62eb 934# ifndef SYNC_INPUT
bf7f4e90
RS
935 /* Arrange to disable interrupt input inside malloc etc. */
936 uninterrupt_malloc ();
06ca62eb 937# endif /* not SYNC_INPUT */
f927c5ae
JB
938#endif /* not SYSTEM_MALLOC */
939
3e9de9f6 940#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
333f1b6f 941 main_thread = pthread_self ();
3e9de9f6 942#endif /* FORWARD_SIGNAL_TO_MAIN_THREAD */
333f1b6f 943
edd3ff1d 944#if defined (MSDOS) || defined (WINDOWSNT)
29b89fe0
RS
945 /* We do all file input/output as binary files. When we need to translate
946 newlines, we do that manually. */
947 _fmode = O_BINARY;
edd3ff1d 948#endif /* MSDOS || WINDOWSNT */
18198bb2 949
edd3ff1d 950#ifdef MSDOS
18198bb2
RS
951 if (!isatty (fileno (stdin)))
952 setmode (fileno (stdin), O_BINARY);
953 if (!isatty (fileno (stdout)))
954 {
955 fflush (stdout);
956 setmode (fileno (stdout), O_BINARY);
957 }
29b89fe0
RS
958#endif /* MSDOS */
959
68c45bf0
PE
960 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
961 The build procedure uses this while dumping, to ensure that the
962 dumped Emacs does not have its system locale tables initialized,
963 as that might cause screwups when the dumped Emacs starts up. */
964 {
965 char *lc_all = getenv ("LC_ALL");
966 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
967 }
968
969 /* Set locale now, so that initial error messages are localized properly.
970 fixup_locale must wait until later, since it builds strings. */
971 if (do_initial_setlocale)
972 setlocale (LC_ALL, "");
973
f927c5ae
JB
974 inhibit_window_system = 0;
975
7db35a48 976 /* Handle the -t switch, which specifies filename to use as terminal. */
956e3c7e
RS
977 while (1)
978 {
979 char *term;
980 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
981 {
982 int result;
68c45bf0
PE
983 emacs_close (0);
984 emacs_close (1);
985 result = emacs_open (term, O_RDWR, 0);
956e3c7e
RS
986 if (result < 0)
987 {
988 char *errstring = strerror (errno);
186486eb 989 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
956e3c7e
RS
990 exit (1);
991 }
992 dup (0);
993 if (! isatty (0))
994 {
186486eb 995 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
956e3c7e
RS
996 exit (1);
997 }
998 fprintf (stderr, "Using %s\n", term);
8ba50e1a 999#ifdef HAVE_WINDOW_SYSTEM
956e3c7e 1000 inhibit_window_system = 1; /* -t => -nw */
f927c5ae 1001#endif
956e3c7e
RS
1002 }
1003 else
1004 break;
1005 }
1006
400d6fa9
PJ
1007 /* Command line option --no-windows is deprecated and thus not mentioned
1008 in the manual and usage informations. */
1009 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
1010 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
e2925360 1011 inhibit_window_system = 1;
f927c5ae 1012
e2925360 1013 /* Handle the -batch switch, which means don't do interactive display. */
f927c5ae 1014 noninteractive = 0;
df6530f8 1015 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
55f4edbc
RS
1016 {
1017 noninteractive = 1;
1018 Vundo_outer_limit = Qnil;
1019 }
6e910e07
RS
1020 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
1021 {
1022 noninteractive = 1; /* Set batch mode. */
21a4ff8e 1023 /* Convert --script to -scriptload, un-skip it, and sort again
e09b9180 1024 so that it will be handled in proper sequence. */
a09a5b5b 1025 /* FIXME broken for --script=FILE - is that supposed to work? */
21a4ff8e 1026 argv[skip_args - 1] = "-scriptload";
6e910e07
RS
1027 skip_args -= 2;
1028 sort_args (argc, argv);
1029 }
e2925360 1030
7db35a48 1031 /* Handle the --help option, which gives a usage message. */
df6530f8 1032 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
f927c5ae 1033 {
6b61353c
KH
1034 printf (USAGE1, argv[0], USAGE2);
1035 printf (USAGE3);
17284745 1036 printf (USAGE4);
e2925360 1037 exit (0);
f927c5ae
JB
1038 }
1039
4ff029f6
DN
1040 if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)
1041 || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, &skip_args))
eab2ee89 1042 {
9d29095c 1043#ifndef DOS_NT
5790ef40
DN
1044 pid_t f;
1045
1046 /* Start as a daemon: fork a new child process which will run the
1047 rest of the initialization code, then exit.
1048
fc012771
SM
1049 Detaching a daemon requires the following steps:
1050 - fork
1051 - setsid
1052 - exit the parent
1053 - close the tty file-descriptors
1054
1055 We only want to do the last 2 steps once the daemon is ready to
1056 serve requests, i.e. after loading .emacs (initialization).
1057 OTOH initialization may start subprocesses (e.g. ispell) and these
1058 should be run from the proper process (the one that will end up
1059 running as daemon) and with the proper "session id" in order for
1060 them to keep working after detaching, so fork and setsid need to be
1061 performed before initialization.
1062
5790ef40
DN
1063 We want to avoid exiting before the server socket is ready, so
1064 use a pipe for synchronization. The parent waits for the child
1065 to close its end of the pipe (using `daemon-initialized')
1066 before exiting. */
1067 if (pipe (daemon_pipe) == -1)
1068 {
1069 fprintf (stderr, "Cannot pipe!\n");
1070 exit (1);
1071 }
1072
b3243e6f 1073#ifndef NS_IMPL_COCOA
5790ef40 1074 f = fork ();
cfa6accb
AR
1075#else /* NS_IMPL_COCOA */
1076 /* Under Cocoa we must do fork+exec as CoreFoundation lib fails in
1077 forked process: http://developer.apple.com/ReleaseNotes/
1078 CoreFoundation/CoreFoundation.html)
b3243e6f
AR
1079 We mark being in the exec'd process by a daemon name argument of
1080 form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
1081 NAME is the original daemon name, if any. */
1082 if (!dname_arg || !strchr (dname_arg, '\n'))
1083 f = fork (); /* in orig */
1084 else
1085 f = 0; /* in exec'd */
cfa6accb 1086#endif /* NS_IMPL_COCOA */
eab2ee89 1087 if (f > 0)
5790ef40
DN
1088 {
1089 int retval;
1090 char buf[1];
1091
1092 /* Close unused writing end of the pipe. */
1093 close (daemon_pipe[1]);
1094
1095 /* Just wait for the child to close its end of the pipe. */
1096 do
1097 {
1098 retval = read (daemon_pipe[0], &buf, 1);
1099 }
1100 while (retval == -1 && errno == EINTR);
1101
1102 if (retval < 0)
1103 {
1104 fprintf (stderr, "Error reading status from child\n");
1105 exit (1);
1106 }
fd95644b
DN
1107 else if (retval == 0)
1108 {
1109 fprintf (stderr, "Error: server did not start correctly\n");
1110 exit (1);
1111 }
5790ef40
DN
1112
1113 close (daemon_pipe[0]);
1114 exit (0);
1115 }
eab2ee89
DN
1116 if (f < 0)
1117 {
1118 fprintf (stderr, "Cannot fork!\n");
9d0a6e42 1119 exit (1);
eab2ee89
DN
1120 }
1121
b3243e6f
AR
1122#ifdef NS_IMPL_COCOA
1123 {
cfa6accb 1124 /* In orig process, forked as child, OR in exec'd. */
b3243e6f 1125 if (!dname_arg || !strchr (dname_arg, '\n'))
cfa6accb 1126 { /* In orig, child: now exec w/special daemon name. */
b3243e6f
AR
1127 char fdStr[80];
1128
1129 if (dname_arg && strlen (dname_arg) > 70)
1130 {
1131 fprintf (stderr, "daemon: child name too long\n");
1132 exit (1);
1133 }
1134
1135 sprintf (fdStr, "--daemon=\n%d,%d\n%s", daemon_pipe[0],
1136 daemon_pipe[1], dname_arg ? dname_arg : "");
1137 argv[skip_args] = fdStr;
1138
1139 execv (argv[0], argv);
cff11156 1140 fprintf (stderr, "emacs daemon: exec failed: %d\n", errno);
b3243e6f
AR
1141 exit (1);
1142 }
1143
cfa6accb 1144 /* In exec'd: parse special dname into pipe and name info. */
b3243e6f
AR
1145 if (!dname_arg || !strchr (dname_arg, '\n')
1146 || strlen (dname_arg) < 1 || strlen (dname_arg) > 70)
1147 {
1148 fprintf (stderr, "emacs daemon: daemon name absent or too long\n");
1149 exit(1);
1150 }
1151 dname_arg2[0] = '\0';
1152 sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]),
1153 dname_arg2);
1154 dname_arg = strlen (dname_arg2) ? dname_arg2 : NULL;
1155 }
cfa6accb 1156#endif /* NS_IMPL_COCOA */
b3243e6f 1157
4ff029f6
DN
1158 if (dname_arg)
1159 daemon_name = xstrdup (dname_arg);
5790ef40
DN
1160 /* Close unused reading end of the pipe. */
1161 close (daemon_pipe[0]);
7c19d3ae
DN
1162 /* Make sure that the used end of the pipe is closed on exec, so
1163 that it is not accessible to programs started from .emacs. */
1164 fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC);
1165
eab2ee89
DN
1166#ifdef HAVE_SETSID
1167 setsid();
1168#endif
eab2ee89 1169#else /* DOS_NT */
9d29095c
DN
1170 fprintf (stderr, "This platform does not support the -daemon flag.\n");
1171 exit (1);
eab2ee89 1172#endif /* DOS_NT */
9d29095c 1173 }
eab2ee89 1174
edb85f59
RS
1175 if (! noninteractive)
1176 {
edb85f59
RS
1177#if defined (USG5) && defined (INTERRUPT_INPUT)
1178 setpgrp ();
1179#endif
5467331d
YM
1180#if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
1181 {
f57e2426 1182 extern void malloc_enable_thread (void);
5467331d
YM
1183
1184 malloc_enable_thread ();
1185 }
edb85f59
RS
1186#endif
1187 }
1188
fb8e9847 1189 init_signals ();
fb8e9847 1190
1efa2983
KH
1191 /* Don't catch SIGHUP if dumping. */
1192 if (1
1193#ifndef CANNOT_DUMP
1194 && initialized
1195#endif
1196 )
1197 {
57e3d22a 1198 sigblock (sigmask (SIGHUP));
1efa2983
KH
1199 /* In --batch mode, don't catch SIGHUP if already ignored.
1200 That makes nohup work. */
1201 if (! noninteractive
1202 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
1203 signal (SIGHUP, fatal_error_signal);
57e3d22a 1204 sigunblock (sigmask (SIGHUP));
1efa2983
KH
1205 }
1206
f927c5ae
JB
1207 if (
1208#ifndef CANNOT_DUMP
1209 ! noninteractive || initialized
1210#else
1211 1
1212#endif
1213 )
1214 {
1efa2983 1215 /* Don't catch these signals in batch mode if dumping.
f927c5ae
JB
1216 On some machines, this sets static data that would make
1217 signal fail to work right when the dumped Emacs is run. */
f927c5ae
JB
1218 signal (SIGQUIT, fatal_error_signal);
1219 signal (SIGILL, fatal_error_signal);
1220 signal (SIGTRAP, fatal_error_signal);
7317d9e8 1221#ifdef SIGUSR1
71b28d05 1222 add_user_signal (SIGUSR1, "sigusr1");
7317d9e8 1223#endif
8247c60d 1224#ifdef SIGUSR2
71b28d05 1225 add_user_signal (SIGUSR2, "sigusr2");
7317d9e8 1226#endif
99e372cd
RS
1227#ifdef SIGABRT
1228 signal (SIGABRT, fatal_error_signal);
1229#endif
1230#ifdef SIGHWE
1231 signal (SIGHWE, fatal_error_signal);
1232#endif
1233#ifdef SIGPRE
1234 signal (SIGPRE, fatal_error_signal);
1235#endif
1236#ifdef SIGORE
1237 signal (SIGORE, fatal_error_signal);
1238#endif
1239#ifdef SIGUME
1240 signal (SIGUME, fatal_error_signal);
1241#endif
1242#ifdef SIGDLK
1243 signal (SIGDLK, fatal_error_signal);
1244#endif
1245#ifdef SIGCPULIM
1246 signal (SIGCPULIM, fatal_error_signal);
1247#endif
a90538cb
JB
1248#ifdef SIGIOT
1249 /* This is missing on some systems - OS/2, for example. */
f927c5ae 1250 signal (SIGIOT, fatal_error_signal);
a90538cb 1251#endif
f927c5ae
JB
1252#ifdef SIGEMT
1253 signal (SIGEMT, fatal_error_signal);
1254#endif
1255 signal (SIGFPE, fatal_error_signal);
00eaaa32 1256#ifdef SIGBUS
f927c5ae 1257 signal (SIGBUS, fatal_error_signal);
00eaaa32 1258#endif
f927c5ae 1259 signal (SIGSEGV, fatal_error_signal);
00eaaa32 1260#ifdef SIGSYS
f927c5ae 1261 signal (SIGSYS, fatal_error_signal);
00eaaa32 1262#endif
f927c5ae
JB
1263 signal (SIGTERM, fatal_error_signal);
1264#ifdef SIGXCPU
1265 signal (SIGXCPU, fatal_error_signal);
1266#endif
1267#ifdef SIGXFSZ
1268 signal (SIGXFSZ, fatal_error_signal);
1269#endif /* SIGXFSZ */
1270
271c7b7c
RS
1271#ifdef SIGDANGER
1272 /* This just means available memory is getting low. */
1273 signal (SIGDANGER, memory_warning_signal);
1274#endif
1275
f927c5ae 1276#ifdef AIX
56e034fa
RS
1277/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1278 signal (SIGXCPU, fatal_error_signal);
0aef8561 1279#ifndef _I386
f927c5ae 1280 signal (SIGIOINT, fatal_error_signal);
0aef8561 1281#endif
f927c5ae
JB
1282 signal (SIGGRANT, fatal_error_signal);
1283 signal (SIGRETRACT, fatal_error_signal);
1284 signal (SIGSOUND, fatal_error_signal);
1285 signal (SIGMSG, fatal_error_signal);
1286#endif /* AIX */
1287 }
1288
1289 noninteractive1 = noninteractive;
1290
7db35a48 1291/* Perform basic initializations (not merely interning symbols). */
f927c5ae
JB
1292
1293 if (!initialized)
1294 {
1295 init_alloc_once ();
1296 init_obarray ();
1297 init_eval_once ();
e37d7195 1298 init_character_once ();
270ce821
KH
1299 init_charset_once ();
1300 init_coding_once ();
f927c5ae 1301 init_syntax_once (); /* Create standard syntax table. */
270ce821 1302 init_category_once (); /* Create standard category table. */
7db35a48 1303 /* Must be done before init_buffer. */
f927c5ae 1304 init_casetab_once ();
7db35a48
PJ
1305 init_buffer_once (); /* Create buffer table and some buffers. */
1306 init_minibuf_once (); /* Create list of minibuffers. */
1307 /* Must precede init_window_once. */
1308
90d920b6
GM
1309 /* Call syms_of_xfaces before init_window_once because that
1310 function creates Vterminal_frame. Termcap frames now use
1311 faces, and the face implementation uses some symbols as
1312 face names. */
90d920b6 1313 syms_of_xfaces ();
4ea81208
KL
1314 /* XXX syms_of_keyboard uses some symbols in keymap.c. It would
1315 be better to arrange things not to have this dependency. */
1316 syms_of_keymap ();
7a18af49
KR
1317 /* Call syms_of_keyboard before init_window_once because
1318 keyboard sets up symbols that include some face names that
1319 the X support will want to use. This can happen when
1320 CANNOT_DUMP is defined. */
1321 syms_of_keyboard ();
90d920b6 1322
985773c9
MB
1323 /* Called before syms_of_fileio, because it sets up Qerror_condition. */
1324 syms_of_data ();
1325 syms_of_fileio ();
1326 /* Before syms_of_coding to initialize Vgc_cons_threshold. */
1327 syms_of_alloc ();
1328 /* Before syms_of_coding because it initializes Qcharsetp. */
1329 syms_of_charset ();
1330 /* Before init_window_once, because it sets up the
1331 Vcoding_system_hash_table. */
1332 syms_of_coding (); /* This should be after syms_of_fileio. */
1a578e9b 1333
7db35a48 1334 init_window_once (); /* Init the window system. */
6b61353c
KH
1335#ifdef HAVE_WINDOW_SYSTEM
1336 init_fringe_once (); /* Swap bitmaps if necessary. */
1337#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae
JB
1338 }
1339
1340 init_alloc ();
68c45bf0
PE
1341
1342 if (do_initial_setlocale)
1343 {
1344 fixup_locale ();
ca9c0567
PE
1345 Vsystem_messages_locale = Vprevious_system_messages_locale;
1346 Vsystem_time_locale = Vprevious_system_time_locale;
68c45bf0
PE
1347 }
1348
f927c5ae
JB
1349 init_eval ();
1350 init_data ();
ad067ea6 1351#ifdef CLASH_DETECTION
01f67d2c 1352 init_filelock ();
ad067ea6 1353#endif
ab5d0358 1354 init_atimer ();
7074fde6 1355 running_asynch_code = 0;
0e956009 1356
a08a816a
RS
1357 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1358 but not while dumping. */
e721aa94 1359 if (1)
a08a816a
RS
1360 {
1361 int inhibit_unibyte = 0;
1362
1363 /* --multibyte overrides EMACS_UNIBYTE. */
1364 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
e721aa94
SM
1365 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
1366 /* Ignore EMACS_UNIBYTE before dumping. */
1367 || (!initialized && noninteractive))
a08a816a
RS
1368 inhibit_unibyte = 1;
1369
1370 /* --unibyte requests that we set up to do everything with single-byte
1371 buffers and strings. We need to handle this before calling
1372 init_lread, init_editfns and other places that generate Lisp strings
1373 from text in the environment. */
c0218e1b
DL
1374 /* Actually this shouldn't be needed as of 20.4 in a generally
1375 unibyte environment. As handa says, environment values
1376 aren't now decoded; also existing buffers are now made
1377 unibyte during startup if .emacs sets unibyte. Tested with
1378 8-bit data in environment variables and /etc/passwd, setting
7db35a48 1379 unibyte and Latin-1 in .emacs. -- Dave Love */
a08a816a
RS
1380 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
1381 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
1382 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
1383 {
1384 Lisp_Object old_log_max;
1385 Lisp_Object symbol, tail;
1386
d67b4f80 1387 symbol = intern_c_string ("enable-multibyte-characters");
82e98df4 1388 Fset_default (symbol, Qnil);
a08a816a 1389
6524291c
KH
1390 if (initialized)
1391 {
1392 /* Erase pre-dump messages in *Messages* now so no abort. */
1393 old_log_max = Vmessage_log_max;
1394 XSETFASTINT (Vmessage_log_max, 0);
1395 message_dolog ("", 0, 1, 0);
1396 Vmessage_log_max = old_log_max;
1397 }
a08a816a 1398
3e75bb9e 1399 for (tail = Vbuffer_alist; CONSP (tail);
7539e11f 1400 tail = XCDR (tail))
a08a816a
RS
1401 {
1402 Lisp_Object buffer;
1403
7539e11f 1404 buffer = Fcdr (XCAR (tail));
8f924df7 1405 /* Make a multibyte buffer unibyte. */
f2b89e21
KH
1406 if (BUF_Z_BYTE (XBUFFER (buffer)) > BUF_Z (XBUFFER (buffer)))
1407 {
1408 struct buffer *current = current_buffer;
1409
1410 set_buffer_temp (XBUFFER (buffer));
8f924df7 1411 Fset_buffer_multibyte (Qnil);
f2b89e21
KH
1412 set_buffer_temp (current);
1413 }
a08a816a 1414 }
82e98df4 1415 message ("Warning: unibyte sessions are obsolete and will disappear");
a08a816a
RS
1416 }
1417 }
1418
956e3c7e 1419 no_loadup
b96f9fb7 1420 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
956e3c7e 1421
edfda783
AR
1422#ifdef HAVE_NS
1423 ns_alloc_autorelease_pool();
1424 if (!noninteractive)
1425 {
edfda783
AR
1426#ifdef NS_IMPL_COCOA
1427 if (skip_args < argc)
1428 {
1429 if (!strncmp(argv[skip_args], "-psn", 4))
1430 {
1431 skip_args += 1;
3d0a4431 1432 chdir (getenv ("HOME"));
edfda783 1433 }
95889848 1434 else if (skip_args+1 < argc && !strncmp(argv[skip_args+1], "-psn", 4))
edfda783 1435 {
95889848 1436 skip_args += 2;
3d0a4431 1437 chdir (getenv ("HOME"));
edfda783
AR
1438 }
1439 }
9b68317c 1440#endif /* COCOA */
edfda783
AR
1441 }
1442#endif /* HAVE_NS */
1443
956e3c7e
RS
1444#ifdef HAVE_X_WINDOWS
1445 /* Stupid kludge to catch command-line display spec. We can't
1446 handle this argument entirely in window system dependent code
1447 because we don't even know which window system dependent code
1448 to run until we've recognized this argument. */
1449 {
1450 char *displayname = 0;
956e3c7e
RS
1451 int count_before = skip_args;
1452
1453 /* Skip any number of -d options, but only use the last one. */
1454 while (1)
1455 {
1456 int count_before_this = skip_args;
1457
1458 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1459 display_arg = 1;
1460 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1461 display_arg = 1;
1462 else
1463 break;
1464
1465 count_before = count_before_this;
1466 }
1467
1468 /* If we have the form --display=NAME,
1469 convert it into -d name.
1470 This requires inserting a new element into argv. */
1471 if (displayname != 0 && skip_args - count_before == 1)
1472 {
1473 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1474 int j;
1475
1476 for (j = 0; j < count_before + 1; j++)
1477 new[j] = argv[j];
1478 new[count_before + 1] = "-d";
1479 new[count_before + 2] = displayname;
1480 for (j = count_before + 2; j <argc; j++)
1481 new[j + 1] = argv[j];
1482 argv = new;
1483 argc++;
1484 }
1485 /* Change --display to -d, when its arg is separate. */
1486 else if (displayname != 0 && skip_args > count_before
1487 && argv[count_before + 1][1] == '-')
1488 argv[count_before + 1] = "-d";
1489
1490 /* Don't actually discard this arg. */
1491 skip_args = count_before;
1492 }
1493#endif
1494
1495 /* argmatch must not be used after here,
1496 except when bulding temacs
1497 because the -d argument has not been skipped in skip_args. */
1498
29b89fe0
RS
1499#ifdef MSDOS
1500 /* Call early 'cause init_environment needs it. */
1501 init_dosfns ();
1502 /* Set defaults for several environment variables. */
18198bb2
RS
1503 if (initialized)
1504 init_environment (argc, argv, skip_args);
1505 else
d1fc6752 1506 tzset ();
18198bb2 1507#endif /* MSDOS */
29b89fe0 1508
8ba50e1a 1509#ifdef WINDOWSNT
9785d95b 1510 globals_of_w32 ();
8ba50e1a 1511 /* Initialize environment from registry settings. */
a3a58294 1512 init_environment (argv);
7db35a48 1513 init_ntproc (); /* must precede init_editfns. */
8ba50e1a
GV
1514#endif
1515
edfda783
AR
1516#ifdef HAVE_NS
1517#ifndef CANNOT_DUMP
1518 if (initialized)
1519#endif
1520 ns_init_paths ();
1521#endif
1522
8b4eb796
KR
1523 /* Initialize and GC-protect Vinitial_environment and
1524 Vprocess_environment before set_initial_environment fills them
1525 in. */
1526 if (!initialized)
1527 syms_of_callproc ();
0e956009
JB
1528 /* egetenv is a pretty low-level facility, which may get called in
1529 many circumstances; it seems flimsy to put off initializing it
1530 until calling init_callproc. */
a13f8f50 1531 set_initial_environment ();
93aed04d 1532 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
5990851d
KL
1533 if this is not done. Do it after set_global_environment so that we
1534 don't pollute Vglobal_environment. */
fa09a82d 1535 /* Setting LANG here will defeat the startup locale processing... */
f2a77c3a 1536#ifdef AIX
93aed04d
RS
1537 putenv ("LANG=C");
1538#endif
0e956009 1539
7db35a48 1540 init_buffer (); /* Init default directory of main buffer. */
ace40a69 1541
7928f0b5 1542 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
ace40a69 1543 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
380e25b8
RS
1544
1545 if (initialized)
1546 {
7db35a48 1547 /* Erase any pre-dump messages in the message log, to avoid confusion. */
380e25b8
RS
1548 Lisp_Object old_log_max;
1549 old_log_max = Vmessage_log_max;
1550 XSETFASTINT (Vmessage_log_max, 0);
f6fe7bb5 1551 message_dolog ("", 0, 1, 0);
380e25b8
RS
1552 Vmessage_log_max = old_log_max;
1553 }
1554
7928f0b5 1555 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
fb8e9847 1556 init_lread ();
f927c5ae 1557
8bb697c0
RS
1558 /* Intern the names of all standard functions and variables;
1559 define standard keys. */
f927c5ae
JB
1560
1561 if (!initialized)
1562 {
4230ab74
KR
1563 /* The basic levels of Lisp must come first. Note that
1564 syms_of_data and some others have already been called. */
e37d7195 1565 syms_of_chartab ();
fb8e9847 1566 syms_of_lread ();
f927c5ae
JB
1567 syms_of_print ();
1568 syms_of_eval ();
1569 syms_of_fns ();
f927c5ae 1570 syms_of_floatfns ();
f927c5ae 1571
f927c5ae
JB
1572 syms_of_buffer ();
1573 syms_of_bytecode ();
1574 syms_of_callint ();
1575 syms_of_casefiddle ();
1576 syms_of_casetab ();
270ce821
KH
1577 syms_of_category ();
1578 syms_of_ccl ();
e37d7195 1579 syms_of_character ();
f927c5ae 1580 syms_of_cmds ();
f927c5ae 1581 syms_of_dired ();
f927c5ae
JB
1582 syms_of_display ();
1583 syms_of_doc ();
1584 syms_of_editfns ();
1585 syms_of_emacs ();
f927c5ae
JB
1586#ifdef CLASH_DETECTION
1587 syms_of_filelock ();
1588#endif /* CLASH_DETECTION */
1589 syms_of_indent ();
c2c5ed2c 1590 syms_of_insdel ();
4ea81208 1591 /* syms_of_keymap (); */
f927c5ae
JB
1592 syms_of_macros ();
1593 syms_of_marker ();
1594 syms_of_minibuf ();
f927c5ae 1595 syms_of_process ();
f927c5ae 1596 syms_of_search ();
1cbd5d9d 1597 syms_of_frame ();
f927c5ae 1598 syms_of_syntax ();
ed8dad6b 1599 syms_of_terminal ();
0d934e7b 1600 syms_of_term ();
f927c5ae 1601 syms_of_undo ();
90d920b6
GM
1602#ifdef HAVE_SOUND
1603 syms_of_sound ();
1604#endif
bef79ee4 1605 syms_of_textprop ();
9d100795 1606 syms_of_composite ();
05687c54
RS
1607#ifdef WINDOWSNT
1608 syms_of_ntproc ();
1609#endif /* WINDOWSNT */
f927c5ae
JB
1610 syms_of_window ();
1611 syms_of_xdisp ();
d53f587b 1612 syms_of_font ();
4fa9161d 1613#ifdef HAVE_WINDOW_SYSTEM
6b61353c
KH
1614 syms_of_fringe ();
1615 syms_of_image ();
1616#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 1617#ifdef HAVE_X_WINDOWS
72412588 1618 syms_of_xterm ();
f927c5ae 1619 syms_of_xfns ();
edfda783 1620 syms_of_xmenu ();
270ce821 1621 syms_of_fontset ();
637fa988 1622 syms_of_xsettings ();
28b1b672
JD
1623#ifdef HAVE_X_SM
1624 syms_of_xsmfns ();
1625#endif
72412588
JB
1626#ifdef HAVE_X11
1627 syms_of_xselect ();
1628#endif
f927c5ae
JB
1629#endif /* HAVE_X_WINDOWS */
1630
4e77ce60 1631 syms_of_menu ();
4e77ce60 1632
8ba50e1a 1633#ifdef HAVE_NTGUI
fbd6baed
GV
1634 syms_of_w32term ();
1635 syms_of_w32fns ();
fbd6baed
GV
1636 syms_of_w32select ();
1637 syms_of_w32menu ();
02062ac3 1638 syms_of_fontset ();
8ba50e1a
GV
1639#endif /* HAVE_NTGUI */
1640
40da1153
EZ
1641#ifdef MSDOS
1642 syms_of_xmenu ();
2e31d424
DN
1643 syms_of_dosfns();
1644 syms_of_msdos();
1645 syms_of_win16select();
40da1153
EZ
1646#endif /* MSDOS */
1647
edfda783
AR
1648#ifdef HAVE_NS
1649 syms_of_nsterm ();
1650 syms_of_nsfns ();
1651 syms_of_nsmenu ();
1652 syms_of_nsselect ();
1653 syms_of_fontset ();
1654#endif /* HAVE_NS */
1655
033b73e2
MA
1656#ifdef HAVE_DBUS
1657 syms_of_dbusbind ();
1658#endif /* HAVE_DBUS */
1659
2e31d424
DN
1660#ifdef WINDOWSNT
1661 syms_of_ntterm ();
1662#endif /* WINDOWSNT */
f927c5ae
JB
1663
1664 keys_of_casefiddle ();
1665 keys_of_cmds ();
1666 keys_of_buffer ();
1667 keys_of_keyboard ();
1668 keys_of_keymap ();
f927c5ae 1669 keys_of_window ();
9785d95b 1670 }
3b6536b1 1671 else
9785d95b 1672 {
3b6536b1
AS
1673 /* Initialization that must be done even if the global variable
1674 initialized is non zero. */
9785d95b
BK
1675#ifdef HAVE_NTGUI
1676 globals_of_w32fns ();
1677 globals_of_w32menu ();
52c7f9ee 1678 globals_of_w32select ();
3b6536b1 1679#endif /* HAVE_NTGUI */
f927c5ae
JB
1680 }
1681
cf411e8d
KH
1682 init_charset ();
1683
f7cf8b20 1684 init_editfns (); /* init_process uses Voperating_system_release. */
2491d293 1685 init_process (); /* init_display uses add_keyboard_wait_descriptor. */
7db35a48 1686 init_keyboard (); /* This too must precede init_sys_modes. */
0a125897 1687 if (!noninteractive)
7c2fb837 1688 init_display (); /* Determine terminal type. Calls init_sys_modes. */
90d920b6 1689 init_fns ();
8bb697c0 1690 init_xdisp ();
6b61353c
KH
1691#ifdef HAVE_WINDOW_SYSTEM
1692 init_fringe ();
1693 init_image ();
1694#endif /* HAVE_WINDOW_SYSTEM */
8bb697c0 1695 init_macros ();
8bb697c0 1696 init_floatfns ();
90d920b6
GM
1697#ifdef HAVE_SOUND
1698 init_sound ();
1699#endif
75816372 1700 init_window ();
74d75424 1701 init_font ();
087fc47a 1702
f927c5ae
JB
1703 if (!initialized)
1704 {
e2925360 1705 char *file;
7db35a48 1706 /* Handle -l loadup, args passed by Makefile. */
df6530f8 1707 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
d67b4f80 1708 Vtop_level = Fcons (intern_c_string ("load"),
e2925360 1709 Fcons (build_string (file), Qnil));
f927c5ae 1710 /* Unless next switch is -nl, load "loadup.el" first thing. */
956e3c7e 1711 if (! no_loadup)
d67b4f80 1712 Vtop_level = Fcons (intern_c_string ("load"),
f927c5ae 1713 Fcons (build_string ("loadup.el"), Qnil));
f927c5ae
JB
1714 }
1715
93572b43
KH
1716 if (initialized)
1717 {
0269dedb
RS
1718#ifdef HAVE_TZSET
1719 {
1720 /* If the execution TZ happens to be the same as the dump TZ,
1721 change it to some other value and then change it back,
1722 to force the underlying implementation to reload the TZ info.
1723 This is needed on implementations that load TZ info from files,
1724 since the TZ file contents may differ between dump and execution. */
1725 char *tz = getenv ("TZ");
1726 if (tz && !strcmp (tz, dump_tz))
1727 {
1728 ++*tz;
1729 tzset ();
1730 --*tz;
1731 }
1732 }
1733#endif
93572b43
KH
1734 }
1735
ecf783fa
EZ
1736 /* Set up for profiling. This is known to work on FreeBSD,
1737 GNU/Linux and MinGW. It might work on some other systems too.
1738 Give it a try and tell us if it works on your system. To compile
7b3a82d7 1739 for profiling, use the configure option --enable-profiling. */
ecf783fa 1740#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__)
e610ea43
RS
1741#ifdef PROFILING
1742 if (initialized)
1743 {
7db35a48 1744 extern void _mcleanup ();
ecf783fa
EZ
1745#ifdef __MINGW32__
1746 extern unsigned char etext asm ("etext");
1747#else
e610ea43 1748 extern char etext;
ecf783fa 1749#endif
90d920b6 1750 extern void safe_bcopy ();
67a5596f 1751
e610ea43 1752 atexit (_mcleanup);
90d920b6
GM
1753 /* This uses safe_bcopy because that function comes first in the
1754 Emacs executable. It might be better to use something that
1755 gives the start of the text segment, but start_of_text is not
1756 defined on all systems now. */
72af86bd
AS
1757 /* FIXME: Does not work on architectures with function
1758 descriptors. */
90d920b6 1759 monstartup (safe_bcopy, &etext);
e610ea43
RS
1760 }
1761 else
1762 moncontrol (0);
1763#endif
1764#endif
1765
f927c5ae
JB
1766 initialized = 1;
1767
e7536cff
RS
1768#ifdef LOCALTIME_CACHE
1769 /* Some versions of localtime have a bug. They cache the value of the time
279cc2b8
JB
1770 zone rather than looking it up every time. Since localtime() is
1771 called to bolt the undumping time into the undumped emacs, this
afe9fae9 1772 results in localtime ignoring the TZ environment variable.
7db35a48 1773 This flushes the new TZ value into localtime. */
afe9fae9 1774 tzset ();
e7536cff 1775#endif /* defined (LOCALTIME_CACHE) */
279cc2b8 1776
f927c5ae
JB
1777 /* Enter editor command loop. This never returns. */
1778 Frecursive_edit ();
1779 /* NOTREACHED */
6bbd7a29 1780 return 0;
f927c5ae
JB
1781}
1782\f
081bef73
RS
1783/* Sort the args so we can find the most important ones
1784 at the beginning of argv. */
1785
1786/* First, here's a table of all the standard options. */
1787
1788struct standard_args
1789{
5e2327cf
DN
1790 const char *name;
1791 const char *longname;
081bef73
RS
1792 int priority;
1793 int nargs;
1794};
1795
5e2327cf 1796const struct standard_args standard_args[] =
081bef73 1797{
05922407 1798 { "-version", "--version", 150, 0 },
f63d0028 1799 { "-chdir", "--chdir", 130, 1 },
05922407 1800 { "-t", "--terminal", 120, 1 },
400d6fa9 1801 { "-nw", "--no-window-system", 110, 0 },
05922407
RS
1802 { "-nw", "--no-windows", 110, 0 },
1803 { "-batch", "--batch", 100, 0 },
6e910e07 1804 { "-script", "--script", 100, 1 },
eab2ee89 1805 { "-daemon", "--daemon", 99, 0 },
05922407 1806 { "-help", "--help", 90, 0 },
956e3c7e
RS
1807 { "-no-unibyte", "--no-unibyte", 83, 0 },
1808 { "-multibyte", "--multibyte", 82, 0 },
1809 { "-unibyte", "--unibyte", 81, 0 },
1810 { "-no-multibyte", "--no-multibyte", 80, 0 },
956e3c7e 1811 { "-nl", "--no-loadup", 70, 0 },
956e3c7e
RS
1812 /* -d must come last before the options handled in startup.el. */
1813 { "-d", "--display", 60, 1 },
1814 { "-display", 0, 60, 1 },
4fe22cdf 1815 /* Now for the options handled in `command-line' (startup.el). */
a1716a57
RS
1816 { "-Q", "--quick", 55, 0 },
1817 { "-quick", 0, 55, 0 },
081bef73
RS
1818 { "-q", "--no-init-file", 50, 0 },
1819 { "-no-init-file", 0, 50, 0 },
1820 { "-no-site-file", "--no-site-file", 40, 0 },
1821 { "-u", "--user", 30, 1 },
1822 { "-user", 0, 30, 1 },
1823 { "-debug-init", "--debug-init", 20, 0 },
f2bc3538 1824 { "-iconic", "--iconic", 15, 0 },
a1716a57 1825 { "-D", "--basic-display", 12, 0},
e09b9180 1826 { "-basic-display", 0, 12, 0},
4fe22cdf
CY
1827 { "-nbc", "--no-blinking-cursor", 12, 0 },
1828 /* Now for the options handled in `command-line-1' (startup.el). */
1829 { "-nbi", "--no-bitmap-icon", 10, 0 },
081bef73
RS
1830 { "-bg", "--background-color", 10, 1 },
1831 { "-background", 0, 10, 1 },
1832 { "-fg", "--foreground-color", 10, 1 },
1833 { "-foreground", 0, 10, 1 },
1834 { "-bd", "--border-color", 10, 1 },
1835 { "-bw", "--border-width", 10, 1 },
1836 { "-ib", "--internal-border", 10, 1 },
1837 { "-ms", "--mouse-color", 10, 1 },
1838 { "-cr", "--cursor-color", 10, 1 },
1839 { "-fn", "--font", 10, 1 },
1840 { "-font", 0, 10, 1 },
94452530
EZ
1841 { "-fs", "--fullscreen", 10, 0 },
1842 { "-fw", "--fullwidth", 10, 0 },
1843 { "-fh", "--fullheight", 10, 0 },
3f1c6666 1844 { "-mm", "--maximized", 10, 0 },
081bef73
RS
1845 { "-g", "--geometry", 10, 1 },
1846 { "-geometry", 0, 10, 1 },
1847 { "-T", "--title", 10, 1 },
ae63ae52 1848 { "-title", 0, 10, 1 },
081bef73
RS
1849 { "-name", "--name", 10, 1 },
1850 { "-xrm", "--xrm", 10, 1 },
1540a61a 1851 { "-parent-id", "--parent-id", 10, 1 },
fcdeb5d9
RS
1852 { "-r", "--reverse-video", 5, 0 },
1853 { "-rv", 0, 5, 0 },
1854 { "-reverse", 0, 5, 0 },
ae63ae52 1855 { "-hb", "--horizontal-scroll-bars", 5, 0 },
fcdeb5d9 1856 { "-vb", "--vertical-scroll-bars", 5, 0 },
d20e1b1e 1857 { "-color", "--color", 5, 0},
16706228
JL
1858 { "-no-splash", "--no-splash", 3, 0 },
1859 { "-no-desktop", "--no-desktop", 3, 0 },
edfda783
AR
1860#ifdef HAVE_NS
1861 { "-NSAutoLaunch", 0, 5, 1 },
1862 { "-NXAutoLaunch", 0, 5, 1 },
1863 { "-disable-font-backend", "--disable-font-backend", 65, 0 },
1864 { "-_NSMachLaunch", 0, 85, 1 },
1865 { "-MachLaunch", 0, 85, 1 },
1866 { "-macosx", 0, 85, 0 },
1867 { "-NSHost", 0, 85, 1 },
1868#endif
fcdeb5d9
RS
1869 /* These have the same priority as ordinary file name args,
1870 so they are not reordered with respect to those. */
4af9e0b3
RS
1871 { "-L", "--directory", 0, 1 },
1872 { "-directory", 0, 0, 1 },
fcdeb5d9
RS
1873 { "-l", "--load", 0, 1 },
1874 { "-load", 0, 0, 1 },
21a4ff8e
GM
1875 /* This has no longname, because using --scriptload confuses sort_args,
1876 because then the --script long option seems to match twice; ie
1877 you can't have a long option which is a prefix of another long
1878 option. In any case, this is entirely an internal option. */
1879 { "-scriptload", NULL, 0, 1 },
fcdeb5d9
RS
1880 { "-f", "--funcall", 0, 1 },
1881 { "-funcall", 0, 0, 1 },
575985b1 1882 { "-eval", "--eval", 0, 1 },
67a5596f 1883 { "-execute", "--execute", 0, 1 },
2e13f8e9
RS
1884 { "-find-file", "--find-file", 0, 1 },
1885 { "-visit", "--visit", 0, 1 },
67a5596f 1886 { "-file", "--file", 0, 1 },
fcdeb5d9 1887 { "-insert", "--insert", 0, 1 },
edfda783
AR
1888#ifdef HAVE_NS
1889 { "-NXOpen", 0, 0, 1 },
1890 { "-NXOpenTemp", 0, 0, 1 },
1891 { "-NSOpen", 0, 0, 1 },
1892 { "-NSOpenTemp", 0, 0, 1 },
1893 { "-GSFilePath", 0, 0, 1 },
1894#endif
f2bc3538 1895 /* This should be processed after ordinary file name args and the like. */
fcdeb5d9 1896 { "-kill", "--kill", -10, 0 },
081bef73
RS
1897};
1898
1899/* Reorder the elements of ARGV (assumed to have ARGC elements)
1900 so that the highest priority ones come first.
1901 Do not change the order of elements of equal priority.
956e3c7e
RS
1902 If an option takes an argument, keep it and its argument together.
1903
1904 If an option that takes no argument appears more
1905 than once, eliminate all but one copy of it. */
081bef73
RS
1906
1907static void
dd4c5104 1908sort_args (int argc, char **argv)
081bef73
RS
1909{
1910 char **new = (char **) xmalloc (sizeof (char *) * argc);
1911 /* For each element of argv,
1912 the corresponding element of options is:
1913 0 for an option that takes no arguments,
1914 1 for an option that takes one argument, etc.
1915 -1 for an ordinary non-option argument. */
6dad9359 1916 int *options = (int *) xmalloc (sizeof (int) * argc);
081bef73
RS
1917 int *priority = (int *) xmalloc (sizeof (int) * argc);
1918 int to = 1;
956e3c7e 1919 int incoming_used = 1;
081bef73
RS
1920 int from;
1921 int i;
1922
1923 /* Categorize all the options,
1924 and figure out which argv elts are option arguments. */
1925 for (from = 1; from < argc; from++)
1926 {
1927 options[from] = -1;
fcdeb5d9 1928 priority[from] = 0;
081bef73
RS
1929 if (argv[from][0] == '-')
1930 {
1931 int match, thislen;
1932 char *equals;
1933
c96f26f4
RS
1934 /* If we have found "--", don't consider
1935 any more arguments as options. */
249443b6 1936 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1937 {
1938 /* Leave the "--", and everything following it, at the end. */
1939 for (; from < argc; from++)
1940 {
1941 priority[from] = -100;
1942 options[from] = -1;
1943 }
1944 break;
1945 }
1946
081bef73
RS
1947 /* Look for a match with a known old-fashioned option. */
1948 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1949 if (!strcmp (argv[from], standard_args[i].name))
1950 {
1951 options[from] = standard_args[i].nargs;
1952 priority[from] = standard_args[i].priority;
fd76ec52
RS
1953 if (from + standard_args[i].nargs >= argc)
1954 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1955 from += standard_args[i].nargs;
1956 goto done;
1957 }
1958
1959 /* Look for a match with a known long option.
1960 MATCH is -1 if no match so far, -2 if two or more matches so far,
1961 >= 0 (the table index of the match) if just one match so far. */
1962 if (argv[from][1] == '-')
1963 {
1964 match = -1;
1965 thislen = strlen (argv[from]);
8966b757 1966 equals = strchr (argv[from], '=');
081bef73
RS
1967 if (equals != 0)
1968 thislen = equals - argv[from];
1969
f609ef57
KH
1970 for (i = 0;
1971 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1972 if (standard_args[i].longname
1973 && !strncmp (argv[from], standard_args[i].longname,
1974 thislen))
081bef73
RS
1975 {
1976 if (match == -1)
1977 match = i;
1978 else
1979 match = -2;
1980 }
1981
1982 /* If we found exactly one match, use that. */
1983 if (match >= 0)
1984 {
1985 options[from] = standard_args[match].nargs;
1986 priority[from] = standard_args[match].priority;
1987 /* If --OPTION=VALUE syntax is used,
1988 this option uses just one argv element. */
1989 if (equals != 0)
1990 options[from] = 0;
fd76ec52
RS
1991 if (from + options[from] >= argc)
1992 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1993 from += options[from];
1994 }
a09a5b5b
GM
1995 /* FIXME When match < 0, shouldn't there be some error,
1996 or at least indication to the user that there was a
1997 problem? */
081bef73
RS
1998 }
1999 done: ;
2000 }
2001 }
2002
2003 /* Copy the arguments, in order of decreasing priority, to NEW. */
2004 new[0] = argv[0];
956e3c7e 2005 while (incoming_used < argc)
081bef73
RS
2006 {
2007 int best = -1;
2c70c992 2008 int best_priority = -9999;
081bef73
RS
2009
2010 /* Find the highest priority remaining option.
2011 If several have equal priority, take the first of them. */
2012 for (from = 1; from < argc; from++)
2013 {
2014 if (argv[from] != 0 && priority[from] > best_priority)
2015 {
2016 best_priority = priority[from];
2017 best = from;
2018 }
2019 /* Skip option arguments--they are tied to the options. */
2020 if (options[from] > 0)
2021 from += options[from];
2022 }
7db35a48 2023
081bef73
RS
2024 if (best < 0)
2025 abort ();
2026
956e3c7e
RS
2027 /* Copy the highest priority remaining option, with its args, to NEW.
2028 Unless it is a duplicate of the previous one. */
2029 if (! (options[best] == 0
2030 && ! strcmp (new[to - 1], argv[best])))
2031 {
2032 new[to++] = argv[best];
2033 for (i = 0; i < options[best]; i++)
2034 new[to++] = argv[best + i + 1];
2035 }
2036
2037 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
2038
2039 /* Clear out this option in ARGV. */
2040 argv[best] = 0;
2041 for (i = 0; i < options[best]; i++)
2042 argv[best + i + 1] = 0;
2043 }
2044
81b7af72
RS
2045 /* If duplicate options were deleted, fill up extra space with null ptrs. */
2046 while (to < argc)
2047 new[to++] = 0;
2048
72af86bd 2049 memcpy (argv, new, sizeof (char *) * argc);
0bf591da 2050
68db37aa
KS
2051 xfree (options);
2052 xfree (new);
2053 xfree (priority);
081bef73
RS
2054}
2055\f
f927c5ae 2056DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
2057 doc: /* Exit the Emacs job and kill it.
2058If ARG is an integer, return ARG as the exit program code.
b224de9b 2059If ARG is a string, stuff it as keyboard input.
7db35a48
PJ
2060
2061The value of `kill-emacs-hook', if not void,
2062is a list of functions (of no args),
2063all of which are called before Emacs is actually killed. */)
5842a27b 2064 (Lisp_Object arg)
f927c5ae 2065{
f927c5ae
JB
2066 struct gcpro gcpro1;
2067
2068 GCPRO1 (arg);
2069
2070 if (feof (stdin))
2071 arg = Qt;
2072
2447c626 2073 if (!NILP (Vrun_hooks) && !noninteractive)
f927c5ae
JB
2074 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
2075
f927c5ae
JB
2076 UNGCPRO;
2077
d0068e25 2078 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
40be253a 2079
58545838
KH
2080 /* If we have an auto-save list file,
2081 kill it because we are exiting Emacs deliberately (not crashing).
2082 Do it after shut_down_emacs, which does an auto-save. */
2083 if (STRINGP (Vauto_save_list_file_name))
d5db4077 2084 unlink (SDATA (Vauto_save_list_file_name));
58545838 2085
fa439170 2086 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
f927c5ae 2087 /* NOTREACHED */
f1145b54 2088 return Qnil;
f927c5ae 2089}
40be253a
JB
2090
2091
2092/* Perform an orderly shutdown of Emacs. Autosave any modified
2093 buffers, kill any child processes, clean up the terminal modes (if
2094 we're in the foreground), and other stuff like that. Don't perform
2095 any redisplay; this may be called when Emacs is shutting down in
2096 the background, or after its X connection has died.
2097
2098 If SIG is a signal number, print a message for it.
2099
2100 This is called by fatal signal handlers, X protocol error handlers,
2101 and Fkill_emacs. */
f7ab4e3d 2102
40be253a 2103void
d5a3eaaf 2104shut_down_emacs (int sig, int no_x, Lisp_Object stuff)
40be253a 2105{
829d872b
RS
2106 /* Prevent running of hooks from now on. */
2107 Vrun_hooks = Qnil;
2108
9db03f6c
KS
2109 /* Don't update display from now on. */
2110 Vinhibit_redisplay = Qt;
2111
7db35a48 2112 /* If we are controlling the terminal, reset terminal modes. */
40be253a
JB
2113#ifdef EMACS_HAVE_TTY_PGRP
2114 {
d04d81d2
RS
2115 int pgrp = EMACS_GETPGRP (0);
2116
40be253a
JB
2117 int tpgrp;
2118 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
5a570e37 2119 && tpgrp == pgrp)
40be253a 2120 {
28d440ab 2121 reset_all_sys_modes ();
40be253a 2122 if (sig && sig != SIGTERM)
6b61353c 2123 fprintf (stderr, "Fatal error (%d)", sig);
40be253a
JB
2124 }
2125 }
2126#else
2127 fflush (stdout);
0a125897 2128 reset_all_sys_modes ();
40be253a
JB
2129#endif
2130
f7ab4e3d
RS
2131 stuff_buffered_input (stuff);
2132
ba7c29f3 2133#ifdef subprocesses
92d835a4 2134 inhibit_sentinels = 1;
ba7c29f3 2135#endif
40be253a
JB
2136 kill_buffer_processes (Qnil);
2137 Fdo_auto_save (Qt, Qnil);
2138
2139#ifdef CLASH_DETECTION
2140 unlock_all_files ();
2141#endif
2142
5e7f8733 2143#if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
41423a80 2144#ifdef HAVE_X_WINDOWS
f7511647 2145 /* It's not safe to call intern here. Maybe we are crashing. */
2246281f
KL
2146 if (!noninteractive && SYMBOLP (Vinitial_window_system)
2147 && SCHARS (SYMBOL_NAME (Vinitial_window_system)) == 1
2148 && SREF (SYMBOL_NAME (Vinitial_window_system), 0) == 'x'
f7511647 2149 && ! no_x)
41423a80
RS
2150 Fx_close_current_connection ();
2151#endif /* HAVE_X_WINDOWS */
5e7f8733 2152#endif
41423a80 2153
40be253a
JB
2154#ifdef SIGIO
2155 /* There is a tendency for a SIGIO signal to arrive within exit,
2156 and cause a SIGHUP because the input descriptor is already closed. */
2157 unrequest_sigio ();
2158 signal (SIGIO, SIG_IGN);
2159#endif
41f339d4
RS
2160
2161#ifdef WINDOWSNT
2162 term_ntproc ();
2163#endif
d546e578 2164
cd8d4168
GM
2165 /* Do this only if terminating normally, we want glyph matrices
2166 etc. in a core dump. */
200f868e 2167 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
2168 {
2169 check_glyph_memory ();
2170 check_message_stack ();
2171 }
90d920b6 2172
d546e578
EZ
2173#ifdef MSDOS
2174 dos_cleanup ();
2175#endif
edfda783
AR
2176
2177#ifdef HAVE_NS
2178 ns_term_shutdown (sig);
2179#endif
40be253a
JB
2180}
2181
2182
f927c5ae
JB
2183\f
2184#ifndef CANNOT_DUMP
f927c5ae 2185
f927c5ae 2186DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
2187 doc: /* Dump current state of Emacs into executable file FILENAME.
2188Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2189This is used in the file `loadup.el' when building Emacs.
2190
2191You must run Emacs in batch mode in order to dump it. */)
5842a27b 2192 (Lisp_Object filename, Lisp_Object symfile)
f927c5ae 2193{
55697f5b 2194 extern char my_edata[];
f927c5ae 2195 Lisp_Object tem;
1b7ddf4f 2196 Lisp_Object symbol;
331379bf 2197 int count = SPECPDL_INDEX ();
4fab758d
GM
2198
2199 check_pure_size ();
f927c5ae 2200
87a98b1a
RS
2201 if (! noninteractive)
2202 error ("Dumping Emacs works only in batch mode");
2203
848a925e 2204#ifdef GNU_LINUX
dede2792
JD
2205 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2206 {
2207 fprintf (stderr, "**************************************************\n");
2208 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
e79beb56 2209 fprintf (stderr, "heap (%lu bytes). This usually means that exec-shield\n",
c37caf9d
JD
2210 heap_bss_diff);
2211 fprintf (stderr, "or something similar is in effect. The dump may\n");
e79beb56 2212 fprintf (stderr, "fail because of this. See the section about\n");
c37caf9d 2213 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
2214 fprintf (stderr, "**************************************************\n");
2215 }
848a925e 2216#endif /* GNU_LINUX */
dede2792 2217
1b7ddf4f
RS
2218 /* Bind `command-line-processed' to nil before dumping,
2219 so that the dumped Emacs will process its command line
2220 and set up to work with X windows if appropriate. */
4aaa3607 2221 symbol = intern ("command-line-processed");
1b7ddf4f
RS
2222 specbind (symbol, Qnil);
2223
b7826503 2224 CHECK_STRING (filename);
c9aae259
EN
2225 filename = Fexpand_file_name (filename, Qnil);
2226 if (!NILP (symfile))
f927c5ae 2227 {
b7826503 2228 CHECK_STRING (symfile);
d5db4077 2229 if (SCHARS (symfile))
c9aae259 2230 symfile = Fexpand_file_name (symfile, Qnil);
f927c5ae
JB
2231 }
2232
2233 tem = Vpurify_flag;
2234 Vpurify_flag = Qnil;
2235
0269dedb
RS
2236#ifdef HAVE_TZSET
2237 set_time_zone_rule (dump_tz);
2238#ifndef LOCALTIME_CACHE
2239 /* Force a tz reload, since set_time_zone_rule doesn't. */
2240 tzset ();
2241#endif
2242#endif
2243
f927c5ae 2244 fflush (stdout);
7db35a48 2245 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2246 /* Also arrange for warnings when nearly out of space. */
2247#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2248#ifndef WINDOWSNT
2249 /* On Windows, this was done before dumping, and that once suffices.
2250 Meanwhile, my_edata is not valid on Windows. */
cb37cf78 2251 memory_warnings (my_edata, malloc_warning);
cc5f52cb 2252#endif /* not WINDOWSNT */
15aaf1b5 2253#endif
06ca62eb 2254#if !defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
aa477689
JD
2255 /* Pthread may call malloc before main, and then we will get an endless
2256 loop, because pthread_self (see alloc.c) calls malloc the first time
2257 it is called on some systems. */
2258 reset_malloc_hooks ();
2259#endif
15aaf1b5
RS
2260#ifdef DOUG_LEA_MALLOC
2261 malloc_state_ptr = malloc_get_state ();
f927c5ae 2262#endif
2b7377ca 2263
a74c5ec1 2264#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2265 mmap_set_vars (0);
2266#endif
d5db4077
KR
2267 unexec (SDATA (filename),
2268 !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
a74c5ec1 2269#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2270 mmap_set_vars (1);
2271#endif
15aaf1b5
RS
2272#ifdef DOUG_LEA_MALLOC
2273 free (malloc_state_ptr);
2274#endif
f927c5ae
JB
2275
2276 Vpurify_flag = tem;
2277
1b7ddf4f 2278 return unbind_to (count, Qnil);
f927c5ae
JB
2279}
2280
f927c5ae
JB
2281#endif /* not CANNOT_DUMP */
2282\f
68c45bf0
PE
2283#if HAVE_SETLOCALE
2284/* Recover from setlocale (LC_ALL, ""). */
2285void
d5a3eaaf 2286fixup_locale (void)
68c45bf0 2287{
68c45bf0
PE
2288 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2289 so that numbers are read and printed properly for Emacs Lisp. */
2290 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2291}
2292
0c8559bb
PE
2293/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2294 DESIRED_LOCALE. */
68c45bf0 2295static void
dd4c5104 2296synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_locale)
68c45bf0 2297{
0c8559bb
PE
2298 if (! EQ (*plocale, desired_locale))
2299 {
2300 *plocale = desired_locale;
2301 setlocale (category, (STRINGP (desired_locale)
3b6536b1 2302 ? (char *) SDATA (desired_locale)
0c8559bb
PE
2303 : ""));
2304 }
68c45bf0
PE
2305}
2306
ca9c0567 2307/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2308void
d5a3eaaf 2309synchronize_system_time_locale (void)
68c45bf0 2310{
ca9c0567
PE
2311 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2312 Vsystem_time_locale);
68c45bf0
PE
2313}
2314
ca9c0567
PE
2315/* Set system messages locale to match Vsystem_messages_locale, if
2316 possible. */
68c45bf0 2317void
d5a3eaaf 2318synchronize_system_messages_locale (void)
68c45bf0
PE
2319{
2320#ifdef LC_MESSAGES
ca9c0567
PE
2321 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2322 Vsystem_messages_locale);
68c45bf0
PE
2323#endif
2324}
2325#endif /* HAVE_SETLOCALE */
2326\f
4b163808 2327#ifndef SEPCHAR
f927c5ae
JB
2328#define SEPCHAR ':'
2329#endif
2330
2331Lisp_Object
a8fe7202 2332decode_env_path (const char *evarname, const char *defalt)
f927c5ae 2333{
a8fe7202 2334 const char *path, *p;
213d0b1f 2335 Lisp_Object lpath, element, tem;
f927c5ae 2336
2447c626
JB
2337 /* It's okay to use getenv here, because this function is only used
2338 to initialize variables when Emacs starts up, and isn't called
2339 after that. */
e065a56e 2340 if (evarname != 0)
a8fe7202 2341 path = getenv (evarname);
e065a56e
JB
2342 else
2343 path = 0;
f927c5ae
JB
2344 if (!path)
2345 path = defalt;
6a30e6d6
RS
2346#ifdef DOS_NT
2347 /* Ensure values from the environment use the proper directory separator. */
2348 if (path)
2349 {
a8fe7202
AS
2350 char *path_copy = alloca (strlen (path) + 1);
2351 strcpy (path_copy, path);
2352 dostounix_filename (path_copy);
2353 path = path_copy;
6a30e6d6
RS
2354 }
2355#endif
f927c5ae
JB
2356 lpath = Qnil;
2357 while (1)
2358 {
8966b757 2359 p = strchr (path, SEPCHAR);
a8fe7202
AS
2360 if (!p)
2361 p = path + strlen (path);
213d0b1f
RS
2362 element = (p - path ? make_string (path, p - path)
2363 : build_string ("."));
2364
2365 /* Add /: to the front of the name
2366 if it would otherwise be treated as magic. */
2367 tem = Ffind_file_name_handler (element, Qt);
ca3df2d5
RS
2368
2369 /* However, if the handler says "I'm safe",
2370 don't bother adding /:. */
2371 if (SYMBOLP (tem))
2372 {
2373 Lisp_Object prop;
2374 prop = Fget (tem, intern ("safe-magic"));
2375 if (! NILP (prop))
2376 tem = Qnil;
2377 }
2378
213d0b1f
RS
2379 if (! NILP (tem))
2380 element = concat2 (build_string ("/:"), element);
2381
2382 lpath = Fcons (element, lpath);
f927c5ae
JB
2383 if (*p)
2384 path = p + 1;
2385 else
2386 break;
2387 }
2388 return Fnreverse (lpath);
2389}
2390
eab2ee89 2391DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
4ff029f6
DN
2392 doc: /* Return non-nil if the current emacs process is a daemon.
2393If the daemon was given a name argument, return that name. */)
5842a27b 2394 (void)
eab2ee89 2395{
fc012771 2396 if (IS_DAEMON)
4ff029f6
DN
2397 if (daemon_name)
2398 return build_string (daemon_name);
2399 else
2400 return Qt;
2401 else
2402 return Qnil;
eab2ee89
DN
2403}
2404
5790ef40 2405DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
fc012771
SM
2406 doc: /* Mark the Emacs daemon as being initialized.
2407This finishes the daemonization process by doing the other half of detaching
2408from the parent process and its tty file descriptors. */)
5842a27b 2409 (void)
5790ef40
DN
2410{
2411 int nfd;
2412
fc012771 2413 if (!IS_DAEMON)
5790ef40
DN
2414 error ("This function can only be called if emacs is run as a daemon");
2415
2416 if (daemon_pipe[1] < 0)
2417 error ("The daemon has already been initialized");
2418
2419 if (NILP (Vafter_init_time))
2420 error ("This function can only be called after loading the init files");
2421
2422 /* Get rid of stdin, stdout and stderr. */
29dadb54 2423 nfd = open ("/dev/null", O_RDWR);
5790ef40
DN
2424 dup2 (nfd, 0);
2425 dup2 (nfd, 1);
2426 dup2 (nfd, 2);
2427 close (nfd);
2428
fc012771
SM
2429 /* Closing the pipe will notify the parent that it can exit.
2430 FIXME: In case some other process inherited the pipe, closing it here
2431 won't notify the parent because it's still open elsewhere, so we
2432 additionally send a byte, just to make sure the parent really exits.
2433 Instead, we should probably close the pipe in start-process and
2434 call-process to make sure the pipe is never inherited by
2435 subprocesses. */
2436 write (daemon_pipe[1], "\n", 1);
5790ef40
DN
2437 close (daemon_pipe[1]);
2438 /* Set it to an invalid value so we know we've already run this function. */
2439 daemon_pipe[1] = -1;
2440 return Qt;
2441}
2442
dfcf069d 2443void
d5a3eaaf 2444syms_of_emacs (void)
f927c5ae 2445{
d67b4f80 2446 Qfile_name_handler_alist = intern_c_string ("file-name-handler-alist");
213d0b1f
RS
2447 staticpro (&Qfile_name_handler_alist);
2448
83591e66 2449#ifndef CANNOT_DUMP
f927c5ae
JB
2450 defsubr (&Sdump_emacs);
2451#endif
2452
2453 defsubr (&Skill_emacs);
2454
59653951 2455 defsubr (&Sinvocation_name);
ace40a69 2456 defsubr (&Sinvocation_directory);
eab2ee89 2457 defsubr (&Sdaemonp);
5790ef40 2458 defsubr (&Sdaemon_initialized);
59653951 2459
f927c5ae 2460 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2a9d2ed6
RS
2461 doc: /* Args passed by shell to Emacs, as a list of strings.
2462Many arguments are deleted from the list as they are processed. */);
f927c5ae
JB
2463
2464 DEFVAR_LISP ("system-type", &Vsystem_type,
cf59a374 2465 doc: /* The value is a symbol indicating the type of operating system you are using.
40a8993a 2466Special values:
cf59a374
GM
2467 `gnu' compiled for a GNU Hurd system.
2468 `gnu/linux' compiled for a GNU/Linux system.
2469 `gnu/kfreebsd' compiled for a GNU system with a FreeBSD kernel.
2470 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2471 `ms-dos' compiled as an MS-DOS application.
2472 `windows-nt' compiled as a native W32 application.
2473 `cygwin' compiled using the Cygwin library.
2474Anything else (in Emacs 23.1, the possibilities are: aix, berkeley-unix,
2475hpux, irix, lynxos 3.0.1, usg-unix-v) indicates some sort of Unix system. */);
d67b4f80 2476 Vsystem_type = intern_c_string (SYSTEM_TYPE);
f927c5ae 2477
271c7b7c 2478 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
7db35a48
PJ
2479 doc: /* Value is string indicating configuration Emacs was built for.
2480On MS-Windows, the value reflects the OS flavor and version on which
2481Emacs is running. */);
f7511647 2482 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2483
f0fc0b1a 2484 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
7db35a48 2485 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2486 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2487
f927c5ae 2488 DEFVAR_BOOL ("noninteractive", &noninteractive1,
7db35a48 2489 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2490
e5d77022 2491 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
e79beb56 2492 doc: /* Hook to be run when `kill-emacs' is called.
d77b70e5 2493Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2494in other similar situations), functions placed on this hook should not
2495expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2496see `kill-emacs-query-functions' instead.
2497
2498The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
edc8ae07 2499 Vkill_emacs_hook = Qnil;
3005da00
RS
2500
2501 DEFVAR_INT ("emacs-priority", &emacs_priority,
7db35a48
PJ
2502 doc: /* Priority for Emacs to run at.
2503This value is effective only if set before Emacs is dumped,
2504and only if the Emacs executable is installed with setuid to permit
2505it to change priority. (Emacs sets its uid back to the real uid.)
2506Currently, you need to define SET_EMACS_PRIORITY in `config.h'
2507before you compile Emacs, to enable the code for this feature. */);
e7a9e1c3 2508 emacs_priority = 0;
074a066b
GV
2509
2510 DEFVAR_LISP ("path-separator", &Vpath_separator,
c7ed3276
EZ
2511 doc: /* String containing the character that separates directories in
2512search paths, such as PATH and other similar environment variables. */);
074a066b
GV
2513 {
2514 char c = SEPCHAR;
2515 Vpath_separator = make_string (&c, 1);
2516 }
59653951 2517
f67de86f 2518 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
7db35a48
PJ
2519 doc: /* The program name that was used to run Emacs.
2520Any directory names are omitted. */);
f67de86f
RS
2521
2522 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
7db35a48
PJ
2523 doc: /* The directory in which the Emacs executable was found, to run it.
2524The value is nil if that directory's name is not known. */);
f67de86f
RS
2525
2526 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
7db35a48 2527 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
e58a672c
RS
2528This is non-nil when we can't find those directories in their standard
2529installed locations, but we can find them near where the Emacs executable
2530was found. */);
07f4d123 2531 Vinstallation_directory = Qnil;
68c45bf0 2532
ca9c0567 2533 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
7db35a48 2534 doc: /* System locale for messages. */);
ca9c0567 2535 Vsystem_messages_locale = Qnil;
68c45bf0 2536
ca9c0567 2537 DEFVAR_LISP ("previous-system-messages-locale",
7db35a48
PJ
2538 &Vprevious_system_messages_locale,
2539 doc: /* Most recently used system locale for messages. */);
ca9c0567 2540 Vprevious_system_messages_locale = Qnil;
68c45bf0 2541
ca9c0567 2542 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
7db35a48 2543 doc: /* System locale for time. */);
ca9c0567 2544 Vsystem_time_locale = Qnil;
68c45bf0 2545
ca9c0567 2546 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
7db35a48 2547 doc: /* Most recently used system locale for time. */);
ca9c0567 2548 Vprevious_system_time_locale = Qnil;
90503d96
CY
2549
2550 DEFVAR_LISP ("before-init-time", &Vbefore_init_time,
2551 doc: /* Value of `current-time' before Emacs begins initialization. */);
2552 Vbefore_init_time = Qnil;
2553
2554 DEFVAR_LISP ("after-init-time", &Vafter_init_time,
2555 doc: /* Value of `current-time' after loading the init files.
2556This is nil during initialization. */);
2557 Vafter_init_time = Qnil;
fc012771 2558
8686ac71 2559 DEFVAR_BOOL ("inhibit-x-resources", &inhibit_x_resources,
9b68317c 2560 doc: /* If non-nil, X resources, Windows Registry settings, and NS defaults are not used. */);
8686ac71
JB
2561 inhibit_x_resources = 0;
2562
8c5ff6dd
KR
2563 DEFVAR_LISP ("emacs-copyright", &Vemacs_copyright,
2564 doc: /* Short copyright string for this version of Emacs. */);
2565 Vemacs_copyright = build_string (emacs_copyright);
2566
2567 DEFVAR_LISP ("emacs-version", &Vemacs_version,
2568 doc: /* Version numbers of this version of Emacs. */);
2569 Vemacs_version = build_string (emacs_version);
2570
fc012771
SM
2571 /* Make sure IS_DAEMON starts up as false. */
2572 daemon_pipe[1] = 0;
f927c5ae 2573}
6b61353c
KH
2574
2575/* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
2576 (do not change this comment) */