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