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