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