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