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