Fix last change of grow_mini_window.
[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,
518c40a2 427 Vexec_suffixes, &found, make_number (X_OK), false);
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
411bf4a4
PE
1102 fcntl (daemon_pipe[0], F_SETFD, 0);
1103 fcntl (daemon_pipe[1], F_SETFD, 0);
5257b701 1104 execvp (argv[0], argv);
4ebbdd67 1105 emacs_perror (argv[0]);
29be4a50 1106 exit (errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE);
b3243e6f
AR
1107 }
1108
cfa6accb 1109 /* In exec'd: parse special dname into pipe and name info. */
b3243e6f
AR
1110 if (!dname_arg || !strchr (dname_arg, '\n')
1111 || strlen (dname_arg) < 1 || strlen (dname_arg) > 70)
1112 {
1113 fprintf (stderr, "emacs daemon: daemon name absent or too long\n");
4ebbdd67 1114 exit (EXIT_CANNOT_INVOKE);
b3243e6f
AR
1115 }
1116 dname_arg2[0] = '\0';
1117 sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]),
1118 dname_arg2);
0b963a93 1119 dname_arg = *dname_arg2 ? dname_arg2 : NULL;
45bd2734 1120 fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC);
b3243e6f 1121 }
ce9f00e4 1122#endif /* DAEMON_MUST_EXEC */
b3243e6f 1123
4ff029f6
DN
1124 if (dname_arg)
1125 daemon_name = xstrdup (dname_arg);
5790ef40 1126 /* Close unused reading end of the pipe. */
bacba3c2 1127 emacs_close (daemon_pipe[0]);
7c19d3ae 1128
5e617bc2 1129 setsid ();
eab2ee89 1130#else /* DOS_NT */
9d29095c
DN
1131 fprintf (stderr, "This platform does not support the -daemon flag.\n");
1132 exit (1);
eab2ee89 1133#endif /* DOS_NT */
9d29095c 1134 }
eab2ee89 1135
8f43ce49 1136#if defined HAVE_PTHREAD && !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC
2c1c974b
PE
1137# ifndef CANNOT_DUMP
1138 /* Do not make gmalloc thread-safe when creating bootstrap-emacs, as
1139 that causes an infinite recursive loop with FreeBSD. But do make
1140 it thread-safe when creating emacs, otherwise bootstrap-emacs
1141 fails on Cygwin. See Bug#14569. */
1142 if (!noninteractive || initialized)
1143# endif
1144 malloc_enable_thread ();
322aea6d 1145#endif
edb85f59 1146
4d7e6e51 1147 init_signals (dumping);
f927c5ae
JB
1148
1149 noninteractive1 = noninteractive;
1150
cf4bb06d 1151 /* Perform basic initializations (not merely interning symbols). */
f927c5ae
JB
1152
1153 if (!initialized)
1154 {
1155 init_alloc_once ();
1156 init_obarray ();
1157 init_eval_once ();
270ce821
KH
1158 init_charset_once ();
1159 init_coding_once ();
f927c5ae 1160 init_syntax_once (); /* Create standard syntax table. */
270ce821 1161 init_category_once (); /* Create standard category table. */
cf4bb06d 1162 init_casetab_once (); /* Must be done before init_buffer_once. */
7db35a48
PJ
1163 init_buffer_once (); /* Create buffer table and some buffers. */
1164 init_minibuf_once (); /* Create list of minibuffers. */
1165 /* Must precede init_window_once. */
1166
90d920b6
GM
1167 /* Call syms_of_xfaces before init_window_once because that
1168 function creates Vterminal_frame. Termcap frames now use
1169 faces, and the face implementation uses some symbols as
1170 face names. */
90d920b6 1171 syms_of_xfaces ();
4ea81208
KL
1172 /* XXX syms_of_keyboard uses some symbols in keymap.c. It would
1173 be better to arrange things not to have this dependency. */
1174 syms_of_keymap ();
7a18af49
KR
1175 /* Call syms_of_keyboard before init_window_once because
1176 keyboard sets up symbols that include some face names that
1177 the X support will want to use. This can happen when
1178 CANNOT_DUMP is defined. */
1179 syms_of_keyboard ();
90d920b6 1180
985773c9
MB
1181 /* Called before syms_of_fileio, because it sets up Qerror_condition. */
1182 syms_of_data ();
b7432bb2 1183 syms_of_fns (); /* Before syms_of_charset which uses hashtables. */
985773c9
MB
1184 syms_of_fileio ();
1185 /* Before syms_of_coding to initialize Vgc_cons_threshold. */
1186 syms_of_alloc ();
cf4bb06d
DA
1187 /* May call Ffuncall and so GC, thus the latter should be initialized. */
1188 init_print_once ();
985773c9
MB
1189 /* Before syms_of_coding because it initializes Qcharsetp. */
1190 syms_of_charset ();
1191 /* Before init_window_once, because it sets up the
1192 Vcoding_system_hash_table. */
1193 syms_of_coding (); /* This should be after syms_of_fileio. */
1a578e9b 1194
7db35a48 1195 init_window_once (); /* Init the window system. */
6b61353c 1196#ifdef HAVE_WINDOW_SYSTEM
b7432bb2 1197 init_fringe_once (); /* Swap bitmaps if necessary. */
6b61353c 1198#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae
JB
1199 }
1200
1201 init_alloc ();
68c45bf0
PE
1202
1203 if (do_initial_setlocale)
1204 {
1205 fixup_locale ();
ca9c0567
PE
1206 Vsystem_messages_locale = Vprevious_system_messages_locale;
1207 Vsystem_time_locale = Vprevious_system_time_locale;
68c45bf0
PE
1208 }
1209
f927c5ae 1210 init_eval ();
ab5d0358 1211 init_atimer ();
7074fde6 1212 running_asynch_code = 0;
0e23ef9d 1213 init_random ();
0e956009 1214
956e3c7e 1215 no_loadup
b96f9fb7 1216 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
956e3c7e 1217
66b7b0fe
GM
1218 no_site_lisp
1219 = argmatch (argv, argc, "-nsl", "--no-site-lisp", 11, NULL, &skip_args);
1220
edfda783 1221#ifdef HAVE_NS
204ee57f 1222 ns_pool = ns_alloc_autorelease_pool ();
40f18bf3
JD
1223#ifdef NS_IMPL_GNUSTEP
1224 /* GNUStep stupidly resets our locale settings after we made them. */
1225 fixup_locale ();
1226#endif
1227
edfda783
AR
1228 if (!noninteractive)
1229 {
edfda783 1230#ifdef NS_IMPL_COCOA
a9f8deec
JD
1231 /* Started from GUI? */
1232 /* FIXME: Do the right thing if getenv returns NULL, or if
1233 chdir fails. */
1234 if (! inhibit_window_system && ! isatty (0))
1235 chdir (getenv ("HOME"));
edfda783
AR
1236 if (skip_args < argc)
1237 {
5e617bc2 1238 if (!strncmp (argv[skip_args], "-psn", 4))
edfda783
AR
1239 {
1240 skip_args += 1;
3d0a4431 1241 chdir (getenv ("HOME"));
edfda783 1242 }
5e617bc2 1243 else if (skip_args+1 < argc && !strncmp (argv[skip_args+1], "-psn", 4))
edfda783 1244 {
95889848 1245 skip_args += 2;
3d0a4431 1246 chdir (getenv ("HOME"));
edfda783
AR
1247 }
1248 }
9b68317c 1249#endif /* COCOA */
edfda783
AR
1250 }
1251#endif /* HAVE_NS */
1252
956e3c7e
RS
1253#ifdef HAVE_X_WINDOWS
1254 /* Stupid kludge to catch command-line display spec. We can't
1255 handle this argument entirely in window system dependent code
1256 because we don't even know which window system dependent code
1257 to run until we've recognized this argument. */
1258 {
1259 char *displayname = 0;
956e3c7e
RS
1260 int count_before = skip_args;
1261
1262 /* Skip any number of -d options, but only use the last one. */
1263 while (1)
1264 {
1265 int count_before_this = skip_args;
1266
1267 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1268 display_arg = 1;
1269 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1270 display_arg = 1;
1271 else
1272 break;
1273
1274 count_before = count_before_this;
1275 }
1276
1277 /* If we have the form --display=NAME,
1278 convert it into -d name.
1279 This requires inserting a new element into argv. */
0065d054 1280 if (displayname && count_before < skip_args)
956e3c7e 1281 {
0065d054
PE
1282 if (skip_args == count_before + 1)
1283 {
1284 memmove (argv + count_before + 3, argv + count_before + 2,
1285 (argc - (count_before + 2)) * sizeof *argv);
1286 argv[count_before + 2] = displayname;
1287 argc++;
1288 }
1289 argv[count_before + 1] = (char *) "-d";
956e3c7e 1290 }
956e3c7e 1291
66b7b0fe
GM
1292 if (! no_site_lisp)
1293 {
1294 if (argmatch (argv, argc, "-Q", "--quick", 3, NULL, &skip_args)
1295 || argmatch (argv, argc, "-quick", 0, 2, NULL, &skip_args))
1296 no_site_lisp = 1;
1297 }
1298
956e3c7e
RS
1299 /* Don't actually discard this arg. */
1300 skip_args = count_before;
1301 }
66b7b0fe
GM
1302#else /* !HAVE_X_WINDOWS */
1303 if (! no_site_lisp)
1304 {
1305 int count_before = skip_args;
1306
1307 if (argmatch (argv, argc, "-Q", "--quick", 3, NULL, &skip_args)
1308 || argmatch (argv, argc, "-quick", 0, 2, NULL, &skip_args))
1309 no_site_lisp = 1;
1310
1311 skip_args = count_before;
1312 }
956e3c7e
RS
1313#endif
1314
1315 /* argmatch must not be used after here,
91af3942 1316 except when building temacs
956e3c7e
RS
1317 because the -d argument has not been skipped in skip_args. */
1318
29b89fe0
RS
1319#ifdef MSDOS
1320 /* Call early 'cause init_environment needs it. */
1321 init_dosfns ();
1322 /* Set defaults for several environment variables. */
18198bb2
RS
1323 if (initialized)
1324 init_environment (argc, argv, skip_args);
1325 else
d1fc6752 1326 tzset ();
18198bb2 1327#endif /* MSDOS */
29b89fe0 1328
90db8702
MA
1329#ifdef HAVE_GFILENOTIFY
1330 globals_of_gfilenotify ();
1331#endif
1332
8ba50e1a 1333#ifdef WINDOWSNT
9785d95b 1334 globals_of_w32 ();
c9628c79 1335#ifdef HAVE_W32NOTIFY
37a4dabe 1336 globals_of_w32notify ();
c9628c79 1337#endif
8ba50e1a 1338 /* Initialize environment from registry settings. */
a3a58294 1339 init_environment (argv);
16b22fef 1340 init_ntproc (dumping); /* must precede init_editfns. */
8ba50e1a
GV
1341#endif
1342
8b4eb796
KR
1343 /* Initialize and GC-protect Vinitial_environment and
1344 Vprocess_environment before set_initial_environment fills them
1345 in. */
1346 if (!initialized)
1347 syms_of_callproc ();
0e956009
JB
1348 /* egetenv is a pretty low-level facility, which may get called in
1349 many circumstances; it seems flimsy to put off initializing it
738db178 1350 until calling init_callproc. Do not do it when dumping. */
4d7e6e51 1351 if (! dumping)
738db178
DN
1352 set_initial_environment ();
1353
93aed04d 1354 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
5990851d
KL
1355 if this is not done. Do it after set_global_environment so that we
1356 don't pollute Vglobal_environment. */
fa09a82d 1357 /* Setting LANG here will defeat the startup locale processing... */
f2a77c3a 1358#ifdef AIX
5745a7df 1359 xputenv ("LANG=C");
93aed04d 1360#endif
0e956009 1361
7db35a48 1362 init_buffer (); /* Init default directory of main buffer. */
ace40a69 1363
7928f0b5 1364 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
a90e5a33
PE
1365
1366 /* Must precede init_lread. */
1367 init_cmdargs (argc, argv, skip_args, original_pwd);
380e25b8
RS
1368
1369 if (initialized)
1370 {
7db35a48 1371 /* Erase any pre-dump messages in the message log, to avoid confusion. */
380e25b8
RS
1372 Lisp_Object old_log_max;
1373 old_log_max = Vmessage_log_max;
1374 XSETFASTINT (Vmessage_log_max, 0);
f6fe7bb5 1375 message_dolog ("", 0, 1, 0);
380e25b8
RS
1376 Vmessage_log_max = old_log_max;
1377 }
1378
7928f0b5 1379 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
9fe43ff6 1380 init_fileio ();
fb8e9847 1381 init_lread ();
76151e2c
EZ
1382#ifdef WINDOWSNT
1383 /* Check to see if Emacs has been installed correctly. */
1384 check_windows_init_file ();
1385#endif
f927c5ae 1386
8bb697c0
RS
1387 /* Intern the names of all standard functions and variables;
1388 define standard keys. */
f927c5ae
JB
1389
1390 if (!initialized)
1391 {
4230ab74
KR
1392 /* The basic levels of Lisp must come first. Note that
1393 syms_of_data and some others have already been called. */
e37d7195 1394 syms_of_chartab ();
fb8e9847 1395 syms_of_lread ();
f927c5ae
JB
1396 syms_of_print ();
1397 syms_of_eval ();
f927c5ae 1398 syms_of_floatfns ();
f927c5ae 1399
f927c5ae
JB
1400 syms_of_buffer ();
1401 syms_of_bytecode ();
1402 syms_of_callint ();
1403 syms_of_casefiddle ();
1404 syms_of_casetab ();
270ce821
KH
1405 syms_of_category ();
1406 syms_of_ccl ();
e37d7195 1407 syms_of_character ();
f927c5ae 1408 syms_of_cmds ();
f927c5ae 1409 syms_of_dired ();
f927c5ae
JB
1410 syms_of_display ();
1411 syms_of_doc ();
1412 syms_of_editfns ();
1413 syms_of_emacs ();
f927c5ae 1414 syms_of_filelock ();
f927c5ae 1415 syms_of_indent ();
c2c5ed2c 1416 syms_of_insdel ();
4ea81208 1417 /* syms_of_keymap (); */
f927c5ae
JB
1418 syms_of_macros ();
1419 syms_of_marker ();
1420 syms_of_minibuf ();
f927c5ae 1421 syms_of_process ();
f927c5ae 1422 syms_of_search ();
1cbd5d9d 1423 syms_of_frame ();
f927c5ae 1424 syms_of_syntax ();
ed8dad6b 1425 syms_of_terminal ();
0d934e7b 1426 syms_of_term ();
f927c5ae 1427 syms_of_undo ();
90d920b6
GM
1428#ifdef HAVE_SOUND
1429 syms_of_sound ();
1430#endif
bef79ee4 1431 syms_of_textprop ();
9d100795 1432 syms_of_composite ();
05687c54
RS
1433#ifdef WINDOWSNT
1434 syms_of_ntproc ();
1435#endif /* WINDOWSNT */
3fc5e44a 1436#if defined CYGWIN
0fda9b75 1437 syms_of_cygw32 ();
a9e7a9d5 1438#endif
f927c5ae
JB
1439 syms_of_window ();
1440 syms_of_xdisp ();
d53f587b 1441 syms_of_font ();
4fa9161d 1442#ifdef HAVE_WINDOW_SYSTEM
6b61353c
KH
1443 syms_of_fringe ();
1444 syms_of_image ();
1445#endif /* HAVE_WINDOW_SYSTEM */
f927c5ae 1446#ifdef HAVE_X_WINDOWS
72412588 1447 syms_of_xterm ();
f927c5ae 1448 syms_of_xfns ();
edfda783 1449 syms_of_xmenu ();
270ce821 1450 syms_of_fontset ();
637fa988 1451 syms_of_xsettings ();
28b1b672
JD
1452#ifdef HAVE_X_SM
1453 syms_of_xsmfns ();
1454#endif
72412588
JB
1455#ifdef HAVE_X11
1456 syms_of_xselect ();
1457#endif
f927c5ae
JB
1458#endif /* HAVE_X_WINDOWS */
1459
381408e2
LMI
1460#ifdef HAVE_LIBXML2
1461 syms_of_xml ();
1462#endif
1463
313546eb
LMI
1464#ifdef HAVE_ZLIB
1465 syms_of_decompress ();
1466#endif
1467
4e77ce60 1468 syms_of_menu ();
4e77ce60 1469
8ba50e1a 1470#ifdef HAVE_NTGUI
fbd6baed
GV
1471 syms_of_w32term ();
1472 syms_of_w32fns ();
fbd6baed 1473 syms_of_w32menu ();
02062ac3 1474 syms_of_fontset ();
8ba50e1a
GV
1475#endif /* HAVE_NTGUI */
1476
a9e7a9d5 1477#if defined WINDOWSNT || defined HAVE_NTGUI
0fda9b75 1478 syms_of_w32select ();
a9e7a9d5 1479#endif
0fda9b75 1480
40da1153
EZ
1481#ifdef MSDOS
1482 syms_of_xmenu ();
5e617bc2
JB
1483 syms_of_dosfns ();
1484 syms_of_msdos ();
1485 syms_of_win16select ();
40da1153
EZ
1486#endif /* MSDOS */
1487
edfda783
AR
1488#ifdef HAVE_NS
1489 syms_of_nsterm ();
1490 syms_of_nsfns ();
1491 syms_of_nsmenu ();
1492 syms_of_nsselect ();
1493 syms_of_fontset ();
1494#endif /* HAVE_NS */
1495
8af55556
TZ
1496#ifdef HAVE_GNUTLS
1497 syms_of_gnutls ();
1498#endif
1499
c9628c79
MA
1500#ifdef HAVE_GFILENOTIFY
1501 syms_of_gfilenotify ();
1502#endif /* HAVE_GFILENOTIFY */
1503
81606b10
RS
1504#ifdef HAVE_INOTIFY
1505 syms_of_inotify ();
1506#endif /* HAVE_INOTIFY */
1507
033b73e2
MA
1508#ifdef HAVE_DBUS
1509 syms_of_dbusbind ();
1510#endif /* HAVE_DBUS */
1511
2e31d424
DN
1512#ifdef WINDOWSNT
1513 syms_of_ntterm ();
c9628c79 1514#ifdef HAVE_W32NOTIFY
477f1e50 1515 syms_of_w32notify ();
c9628c79 1516#endif /* HAVE_W32NOTIFY */
2e31d424 1517#endif /* WINDOWSNT */
f927c5ae 1518
c2d7786e
TM
1519 syms_of_profiler ();
1520
f927c5ae
JB
1521 keys_of_casefiddle ();
1522 keys_of_cmds ();
1523 keys_of_buffer ();
1524 keys_of_keyboard ();
1525 keys_of_keymap ();
f927c5ae 1526 keys_of_window ();
9785d95b 1527 }
3b6536b1 1528 else
9785d95b 1529 {
3b6536b1
AS
1530 /* Initialization that must be done even if the global variable
1531 initialized is non zero. */
9785d95b 1532#ifdef HAVE_NTGUI
db4f02f2 1533 globals_of_w32font ();
9785d95b
BK
1534 globals_of_w32fns ();
1535 globals_of_w32menu ();
3b6536b1 1536#endif /* HAVE_NTGUI */
0fda9b75 1537
a9e7a9d5 1538#if defined WINDOWSNT || defined HAVE_NTGUI
0fda9b75 1539 globals_of_w32select ();
a9e7a9d5 1540#endif
f927c5ae
JB
1541 }
1542
cf411e8d
KH
1543 init_charset ();
1544
b82da769
GM
1545 init_editfns (); /* init_process_emacs uses Voperating_system_release. */
1546 init_process_emacs (); /* init_display uses add_keyboard_wait_descriptor. */
7db35a48 1547 init_keyboard (); /* This too must precede init_sys_modes. */
0a125897 1548 if (!noninteractive)
7c2fb837 1549 init_display (); /* Determine terminal type. Calls init_sys_modes. */
9c099ca7
EZ
1550#if HAVE_W32NOTIFY
1551 else
1552 init_crit (); /* w32notify.c needs this in batch mode. */
1553#endif /* HAVE_W32NOTIFY */
8bb697c0 1554 init_xdisp ();
6b61353c
KH
1555#ifdef HAVE_WINDOW_SYSTEM
1556 init_fringe ();
6b61353c 1557#endif /* HAVE_WINDOW_SYSTEM */
8bb697c0 1558 init_macros ();
75816372 1559 init_window ();
74d75424 1560 init_font ();
087fc47a 1561
f927c5ae
JB
1562 if (!initialized)
1563 {
e2925360 1564 char *file;
7db35a48 1565 /* Handle -l loadup, args passed by Makefile. */
df6530f8 1566 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
080fd649
EZ
1567 {
1568#ifdef WINDOWSNT
1569 char file_utf8[MAX_UTF8_PATH];
1570
1571 if (filename_from_ansi (file, file_utf8) == 0)
1572 file = file_utf8;
1573#endif
1574 Vtop_level = list2 (intern_c_string ("load"),
1575 build_unibyte_string (file));
1576 }
f927c5ae 1577 /* Unless next switch is -nl, load "loadup.el" first thing. */
956e3c7e 1578 if (! no_loadup)
6c6f1994
PE
1579 Vtop_level = list2 (intern_c_string ("load"),
1580 build_string ("loadup.el"));
f927c5ae
JB
1581 }
1582
93572b43
KH
1583 if (initialized)
1584 {
0269dedb
RS
1585#ifdef HAVE_TZSET
1586 {
1587 /* If the execution TZ happens to be the same as the dump TZ,
1588 change it to some other value and then change it back,
1589 to force the underlying implementation to reload the TZ info.
1590 This is needed on implementations that load TZ info from files,
1591 since the TZ file contents may differ between dump and execution. */
1592 char *tz = getenv ("TZ");
1593 if (tz && !strcmp (tz, dump_tz))
1594 {
1595 ++*tz;
1596 tzset ();
1597 --*tz;
1598 }
1599 }
1600#endif
93572b43
KH
1601 }
1602
ecf783fa
EZ
1603 /* Set up for profiling. This is known to work on FreeBSD,
1604 GNU/Linux and MinGW. It might work on some other systems too.
1605 Give it a try and tell us if it works on your system. To compile
7b3a82d7 1606 for profiling, use the configure option --enable-profiling. */
5e617bc2 1607#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined (__MINGW32__)
e610ea43
RS
1608#ifdef PROFILING
1609 if (initialized)
1610 {
ecf783fa
EZ
1611#ifdef __MINGW32__
1612 extern unsigned char etext asm ("etext");
1613#else
e610ea43 1614 extern char etext;
ecf783fa 1615#endif
67a5596f 1616
e610ea43 1617 atexit (_mcleanup);
9e4bf381 1618 monstartup ((uintptr_t) __executable_start, (uintptr_t) &etext);
e610ea43
RS
1619 }
1620 else
1621 moncontrol (0);
1622#endif
1623#endif
1624
f927c5ae
JB
1625 initialized = 1;
1626
e7536cff
RS
1627#ifdef LOCALTIME_CACHE
1628 /* Some versions of localtime have a bug. They cache the value of the time
279cc2b8
JB
1629 zone rather than looking it up every time. Since localtime() is
1630 called to bolt the undumping time into the undumped emacs, this
afe9fae9 1631 results in localtime ignoring the TZ environment variable.
7db35a48 1632 This flushes the new TZ value into localtime. */
afe9fae9 1633 tzset ();
e7536cff 1634#endif /* defined (LOCALTIME_CACHE) */
279cc2b8 1635
f927c5ae
JB
1636 /* Enter editor command loop. This never returns. */
1637 Frecursive_edit ();
1638 /* NOTREACHED */
6bbd7a29 1639 return 0;
f927c5ae
JB
1640}
1641\f
081bef73
RS
1642/* Sort the args so we can find the most important ones
1643 at the beginning of argv. */
1644
1645/* First, here's a table of all the standard options. */
1646
1647struct standard_args
1648{
5e2327cf
DN
1649 const char *name;
1650 const char *longname;
081bef73
RS
1651 int priority;
1652 int nargs;
1653};
1654
35f08c38 1655static const struct standard_args standard_args[] =
081bef73 1656{
05922407 1657 { "-version", "--version", 150, 0 },
f63d0028 1658 { "-chdir", "--chdir", 130, 1 },
05922407 1659 { "-t", "--terminal", 120, 1 },
400d6fa9 1660 { "-nw", "--no-window-system", 110, 0 },
05922407
RS
1661 { "-nw", "--no-windows", 110, 0 },
1662 { "-batch", "--batch", 100, 0 },
6e910e07 1663 { "-script", "--script", 100, 1 },
eab2ee89 1664 { "-daemon", "--daemon", 99, 0 },
05922407 1665 { "-help", "--help", 90, 0 },
956e3c7e 1666 { "-nl", "--no-loadup", 70, 0 },
66b7b0fe 1667 { "-nsl", "--no-site-lisp", 65, 0 },
956e3c7e
RS
1668 /* -d must come last before the options handled in startup.el. */
1669 { "-d", "--display", 60, 1 },
1670 { "-display", 0, 60, 1 },
4fe22cdf 1671 /* Now for the options handled in `command-line' (startup.el). */
66b7b0fe 1672 /* (Note that to imply -nsl, -Q is partially handled here.) */
a1716a57
RS
1673 { "-Q", "--quick", 55, 0 },
1674 { "-quick", 0, 55, 0 },
081bef73
RS
1675 { "-q", "--no-init-file", 50, 0 },
1676 { "-no-init-file", 0, 50, 0 },
1677 { "-no-site-file", "--no-site-file", 40, 0 },
1678 { "-u", "--user", 30, 1 },
1679 { "-user", 0, 30, 1 },
1680 { "-debug-init", "--debug-init", 20, 0 },
f2bc3538 1681 { "-iconic", "--iconic", 15, 0 },
a1716a57 1682 { "-D", "--basic-display", 12, 0},
e09b9180 1683 { "-basic-display", 0, 12, 0},
4fe22cdf
CY
1684 { "-nbc", "--no-blinking-cursor", 12, 0 },
1685 /* Now for the options handled in `command-line-1' (startup.el). */
1686 { "-nbi", "--no-bitmap-icon", 10, 0 },
081bef73
RS
1687 { "-bg", "--background-color", 10, 1 },
1688 { "-background", 0, 10, 1 },
1689 { "-fg", "--foreground-color", 10, 1 },
1690 { "-foreground", 0, 10, 1 },
1691 { "-bd", "--border-color", 10, 1 },
1692 { "-bw", "--border-width", 10, 1 },
1693 { "-ib", "--internal-border", 10, 1 },
1694 { "-ms", "--mouse-color", 10, 1 },
1695 { "-cr", "--cursor-color", 10, 1 },
1696 { "-fn", "--font", 10, 1 },
1697 { "-font", 0, 10, 1 },
94452530
EZ
1698 { "-fs", "--fullscreen", 10, 0 },
1699 { "-fw", "--fullwidth", 10, 0 },
1700 { "-fh", "--fullheight", 10, 0 },
3f1c6666 1701 { "-mm", "--maximized", 10, 0 },
081bef73
RS
1702 { "-g", "--geometry", 10, 1 },
1703 { "-geometry", 0, 10, 1 },
1704 { "-T", "--title", 10, 1 },
ae63ae52 1705 { "-title", 0, 10, 1 },
081bef73
RS
1706 { "-name", "--name", 10, 1 },
1707 { "-xrm", "--xrm", 10, 1 },
1540a61a 1708 { "-parent-id", "--parent-id", 10, 1 },
fcdeb5d9
RS
1709 { "-r", "--reverse-video", 5, 0 },
1710 { "-rv", 0, 5, 0 },
1711 { "-reverse", 0, 5, 0 },
ae63ae52 1712 { "-hb", "--horizontal-scroll-bars", 5, 0 },
fcdeb5d9 1713 { "-vb", "--vertical-scroll-bars", 5, 0 },
d20e1b1e 1714 { "-color", "--color", 5, 0},
16706228
JL
1715 { "-no-splash", "--no-splash", 3, 0 },
1716 { "-no-desktop", "--no-desktop", 3, 0 },
edfda783
AR
1717#ifdef HAVE_NS
1718 { "-NSAutoLaunch", 0, 5, 1 },
1719 { "-NXAutoLaunch", 0, 5, 1 },
edfda783
AR
1720 { "-_NSMachLaunch", 0, 85, 1 },
1721 { "-MachLaunch", 0, 85, 1 },
1722 { "-macosx", 0, 85, 0 },
1723 { "-NSHost", 0, 85, 1 },
1724#endif
fcdeb5d9
RS
1725 /* These have the same priority as ordinary file name args,
1726 so they are not reordered with respect to those. */
4af9e0b3
RS
1727 { "-L", "--directory", 0, 1 },
1728 { "-directory", 0, 0, 1 },
fcdeb5d9
RS
1729 { "-l", "--load", 0, 1 },
1730 { "-load", 0, 0, 1 },
21a4ff8e
GM
1731 /* This has no longname, because using --scriptload confuses sort_args,
1732 because then the --script long option seems to match twice; ie
1733 you can't have a long option which is a prefix of another long
1734 option. In any case, this is entirely an internal option. */
1735 { "-scriptload", NULL, 0, 1 },
fcdeb5d9
RS
1736 { "-f", "--funcall", 0, 1 },
1737 { "-funcall", 0, 0, 1 },
575985b1 1738 { "-eval", "--eval", 0, 1 },
67a5596f 1739 { "-execute", "--execute", 0, 1 },
2e13f8e9
RS
1740 { "-find-file", "--find-file", 0, 1 },
1741 { "-visit", "--visit", 0, 1 },
67a5596f 1742 { "-file", "--file", 0, 1 },
fcdeb5d9 1743 { "-insert", "--insert", 0, 1 },
edfda783
AR
1744#ifdef HAVE_NS
1745 { "-NXOpen", 0, 0, 1 },
1746 { "-NXOpenTemp", 0, 0, 1 },
1747 { "-NSOpen", 0, 0, 1 },
1748 { "-NSOpenTemp", 0, 0, 1 },
1749 { "-GSFilePath", 0, 0, 1 },
1750#endif
f2bc3538 1751 /* This should be processed after ordinary file name args and the like. */
fcdeb5d9 1752 { "-kill", "--kill", -10, 0 },
081bef73
RS
1753};
1754
1755/* Reorder the elements of ARGV (assumed to have ARGC elements)
1756 so that the highest priority ones come first.
1757 Do not change the order of elements of equal priority.
956e3c7e
RS
1758 If an option takes an argument, keep it and its argument together.
1759
1760 If an option that takes no argument appears more
1761 than once, eliminate all but one copy of it. */
081bef73
RS
1762
1763static void
dd4c5104 1764sort_args (int argc, char **argv)
081bef73 1765{
38182d90 1766 char **new = xmalloc (argc * sizeof *new);
081bef73
RS
1767 /* For each element of argv,
1768 the corresponding element of options is:
1769 0 for an option that takes no arguments,
1770 1 for an option that takes one argument, etc.
1771 -1 for an ordinary non-option argument. */
0065d054
PE
1772 int *options = xnmalloc (argc, sizeof *options);
1773 int *priority = xnmalloc (argc, sizeof *priority);
081bef73 1774 int to = 1;
956e3c7e 1775 int incoming_used = 1;
081bef73
RS
1776 int from;
1777 int i;
1778
1779 /* Categorize all the options,
1780 and figure out which argv elts are option arguments. */
1781 for (from = 1; from < argc; from++)
1782 {
1783 options[from] = -1;
fcdeb5d9 1784 priority[from] = 0;
081bef73
RS
1785 if (argv[from][0] == '-')
1786 {
0b963a93 1787 int match;
081bef73 1788
c96f26f4
RS
1789 /* If we have found "--", don't consider
1790 any more arguments as options. */
249443b6 1791 if (argv[from][1] == '-' && argv[from][2] == 0)
c96f26f4
RS
1792 {
1793 /* Leave the "--", and everything following it, at the end. */
1794 for (; from < argc; from++)
1795 {
1796 priority[from] = -100;
1797 options[from] = -1;
1798 }
1799 break;
1800 }
1801
081bef73
RS
1802 /* Look for a match with a known old-fashioned option. */
1803 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1804 if (!strcmp (argv[from], standard_args[i].name))
1805 {
1806 options[from] = standard_args[i].nargs;
1807 priority[from] = standard_args[i].priority;
fd76ec52
RS
1808 if (from + standard_args[i].nargs >= argc)
1809 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1810 from += standard_args[i].nargs;
1811 goto done;
1812 }
1813
1814 /* Look for a match with a known long option.
1815 MATCH is -1 if no match so far, -2 if two or more matches so far,
1816 >= 0 (the table index of the match) if just one match so far. */
1817 if (argv[from][1] == '-')
1818 {
0b963a93
PE
1819 char const *equals = strchr (argv[from], '=');
1820 ptrdiff_t thislen =
1821 equals ? equals - argv[from] : strlen (argv[from]);
1822
081bef73 1823 match = -1;
081bef73 1824
f609ef57
KH
1825 for (i = 0;
1826 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1827 if (standard_args[i].longname
1828 && !strncmp (argv[from], standard_args[i].longname,
1829 thislen))
081bef73
RS
1830 {
1831 if (match == -1)
1832 match = i;
1833 else
1834 match = -2;
1835 }
1836
1837 /* If we found exactly one match, use that. */
1838 if (match >= 0)
1839 {
1840 options[from] = standard_args[match].nargs;
1841 priority[from] = standard_args[match].priority;
1842 /* If --OPTION=VALUE syntax is used,
1843 this option uses just one argv element. */
1844 if (equals != 0)
1845 options[from] = 0;
fd76ec52
RS
1846 if (from + options[from] >= argc)
1847 fatal ("Option `%s' requires an argument\n", argv[from]);
081bef73
RS
1848 from += options[from];
1849 }
a09a5b5b
GM
1850 /* FIXME When match < 0, shouldn't there be some error,
1851 or at least indication to the user that there was a
1852 problem? */
081bef73
RS
1853 }
1854 done: ;
1855 }
1856 }
1857
1858 /* Copy the arguments, in order of decreasing priority, to NEW. */
1859 new[0] = argv[0];
956e3c7e 1860 while (incoming_used < argc)
081bef73
RS
1861 {
1862 int best = -1;
2c70c992 1863 int best_priority = -9999;
081bef73
RS
1864
1865 /* Find the highest priority remaining option.
1866 If several have equal priority, take the first of them. */
1867 for (from = 1; from < argc; from++)
1868 {
1869 if (argv[from] != 0 && priority[from] > best_priority)
1870 {
1871 best_priority = priority[from];
1872 best = from;
1873 }
1874 /* Skip option arguments--they are tied to the options. */
1875 if (options[from] > 0)
1876 from += options[from];
1877 }
7db35a48 1878
081bef73 1879 if (best < 0)
1088b922 1880 emacs_abort ();
081bef73 1881
956e3c7e
RS
1882 /* Copy the highest priority remaining option, with its args, to NEW.
1883 Unless it is a duplicate of the previous one. */
1884 if (! (options[best] == 0
1885 && ! strcmp (new[to - 1], argv[best])))
1886 {
1887 new[to++] = argv[best];
1888 for (i = 0; i < options[best]; i++)
1889 new[to++] = argv[best + i + 1];
1890 }
1891
1892 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
081bef73
RS
1893
1894 /* Clear out this option in ARGV. */
1895 argv[best] = 0;
1896 for (i = 0; i < options[best]; i++)
1897 argv[best + i + 1] = 0;
1898 }
1899
81b7af72
RS
1900 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1901 while (to < argc)
1902 new[to++] = 0;
1903
72af86bd 1904 memcpy (argv, new, sizeof (char *) * argc);
0bf591da 1905
68db37aa
KS
1906 xfree (options);
1907 xfree (new);
1908 xfree (priority);
081bef73
RS
1909}
1910\f
a7ca3326 1911DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
7db35a48
PJ
1912 doc: /* Exit the Emacs job and kill it.
1913If ARG is an integer, return ARG as the exit program code.
b224de9b 1914If ARG is a string, stuff it as keyboard input.
7db35a48 1915
9c524fcb 1916This function is called upon receipt of the signals SIGTERM
383ebd15 1917or SIGHUP, and upon SIGINT in batch mode.
9c524fcb 1918
7db35a48
PJ
1919The value of `kill-emacs-hook', if not void,
1920is a list of functions (of no args),
1921all of which are called before Emacs is actually killed. */)
5842a27b 1922 (Lisp_Object arg)
f927c5ae 1923{
f927c5ae 1924 struct gcpro gcpro1;
8eca8a7c 1925 int exit_code;
f927c5ae
JB
1926
1927 GCPRO1 (arg);
1928
1929 if (feof (stdin))
1930 arg = Qt;
1931
73c14218
CY
1932 /* Fsignal calls emacs_abort () if it sees that waiting_for_input is
1933 set. */
1934 waiting_for_input = 0;
1935 Frun_hooks (1, &Qkill_emacs_hook);
f927c5ae
JB
1936 UNGCPRO;
1937
1dd3c2d9
CY
1938#ifdef HAVE_X_WINDOWS
1939 /* Transfer any clipboards we own to the clipboard manager. */
1940 x_clipboard_manager_save_all ();
1941#endif
1942
1882aa38 1943 shut_down_emacs (0, STRINGP (arg) ? arg : Qnil);
40be253a 1944
204ee57f
JD
1945#ifdef HAVE_NS
1946 ns_release_autorelease_pool (ns_pool);
1947#endif
1948
58545838
KH
1949 /* If we have an auto-save list file,
1950 kill it because we are exiting Emacs deliberately (not crashing).
1951 Do it after shut_down_emacs, which does an auto-save. */
1952 if (STRINGP (Vauto_save_list_file_name))
24827db9
JB
1953 {
1954 Lisp_Object listfile;
1955 listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
1956 unlink (SSDATA (listfile));
1957 }
58545838 1958
5895d7b9
PE
1959 if (INTEGERP (arg))
1960 exit_code = (XINT (arg) < 0
1961 ? XINT (arg) | INT_MIN
1962 : XINT (arg) & INT_MAX);
d311d28c 1963 else
5895d7b9
PE
1964 exit_code = EXIT_SUCCESS;
1965 exit (exit_code);
f927c5ae 1966}
40be253a
JB
1967
1968
1969/* Perform an orderly shutdown of Emacs. Autosave any modified
1970 buffers, kill any child processes, clean up the terminal modes (if
1971 we're in the foreground), and other stuff like that. Don't perform
1972 any redisplay; this may be called when Emacs is shutting down in
1973 the background, or after its X connection has died.
1974
1975 If SIG is a signal number, print a message for it.
1976
1977 This is called by fatal signal handlers, X protocol error handlers,
1978 and Fkill_emacs. */
f7ab4e3d 1979
40be253a 1980void
1882aa38 1981shut_down_emacs (int sig, Lisp_Object stuff)
40be253a 1982{
829d872b
RS
1983 /* Prevent running of hooks from now on. */
1984 Vrun_hooks = Qnil;
1985
9db03f6c
KS
1986 /* Don't update display from now on. */
1987 Vinhibit_redisplay = Qt;
1988
7db35a48 1989 /* If we are controlling the terminal, reset terminal modes. */
a7ebc409 1990#ifndef DOS_NT
40be253a 1991 {
dd0333b6 1992 pid_t pgrp = getpgrp ();
69deda53 1993 pid_t tpgrp = tcgetpgrp (0);
12e610e8 1994 if ((tpgrp != -1) && tpgrp == pgrp)
40be253a 1995 {
28d440ab 1996 reset_all_sys_modes ();
40be253a 1997 if (sig && sig != SIGTERM)
01108e3f 1998 {
703342f8
PE
1999 static char const format[] = "Fatal error %d: ";
2000 char buf[sizeof format - 2 + INT_STRLEN_BOUND (int)];
2001 int buflen = sprintf (buf, format, sig);
aa1ba90e 2002 char const *sig_desc = safe_strsignal (sig);
4ebbdd67
PE
2003 emacs_write (STDERR_FILENO, buf, buflen);
2004 emacs_write (STDERR_FILENO, sig_desc, strlen (sig_desc));
01108e3f 2005 }
40be253a
JB
2006 }
2007 }
2008#else
2009 fflush (stdout);
0a125897 2010 reset_all_sys_modes ();
40be253a
JB
2011#endif
2012
f7ab4e3d
RS
2013 stuff_buffered_input (stuff);
2014
92d835a4 2015 inhibit_sentinels = 1;
40be253a
JB
2016 kill_buffer_processes (Qnil);
2017 Fdo_auto_save (Qt, Qnil);
2018
2019#ifdef CLASH_DETECTION
2020 unlock_all_files ();
2021#endif
2022
40be253a
JB
2023 /* There is a tendency for a SIGIO signal to arrive within exit,
2024 and cause a SIGHUP because the input descriptor is already closed. */
2025 unrequest_sigio ();
4a4bbad2 2026 ignore_sigio ();
41f339d4 2027
cd8d4168
GM
2028 /* Do this only if terminating normally, we want glyph matrices
2029 etc. in a core dump. */
200f868e 2030 if (sig == 0 || sig == SIGTERM)
cd8d4168
GM
2031 {
2032 check_glyph_memory ();
2033 check_message_stack ();
2034 }
90d920b6 2035
d546e578
EZ
2036#ifdef MSDOS
2037 dos_cleanup ();
2038#endif
edfda783
AR
2039
2040#ifdef HAVE_NS
2041 ns_term_shutdown (sig);
2042#endif
fcb901a7
LMI
2043
2044#ifdef HAVE_LIBXML2
9078ead6 2045 xml_cleanup_parser ();
fcb901a7 2046#endif
f0e5f225
EZ
2047
2048#ifdef WINDOWSNT
2049 term_ntproc (0);
2050#endif
40be253a
JB
2051}
2052
2053
f927c5ae
JB
2054\f
2055#ifndef CANNOT_DUMP
f927c5ae 2056
ce701a33 2057#include "unexec.h"
dd5ecd6b 2058
f927c5ae 2059DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
7db35a48
PJ
2060 doc: /* Dump current state of Emacs into executable file FILENAME.
2061Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2062This is used in the file `loadup.el' when building Emacs.
2063
2064You must run Emacs in batch mode in order to dump it. */)
5842a27b 2065 (Lisp_Object filename, Lisp_Object symfile)
f927c5ae 2066{
f927c5ae 2067 Lisp_Object tem;
1b7ddf4f 2068 Lisp_Object symbol;
d311d28c 2069 ptrdiff_t count = SPECPDL_INDEX ();
4fab758d
GM
2070
2071 check_pure_size ();
f927c5ae 2072
87a98b1a
RS
2073 if (! noninteractive)
2074 error ("Dumping Emacs works only in batch mode");
2075
848a925e 2076#ifdef GNU_LINUX
c339dc2e
PE
2077
2078 /* Warn if the gap between BSS end and heap start is larger than this. */
2079# define MAX_HEAP_BSS_DIFF (1024*1024)
2080
dede2792
JD
2081 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2082 {
2083 fprintf (stderr, "**************************************************\n");
2084 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
b312a492 2085 fprintf (stderr, "heap (%"pMu" bytes). This usually means that exec-shield\n",
c37caf9d
JD
2086 heap_bss_diff);
2087 fprintf (stderr, "or something similar is in effect. The dump may\n");
e79beb56 2088 fprintf (stderr, "fail because of this. See the section about\n");
c37caf9d 2089 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
dede2792
JD
2090 fprintf (stderr, "**************************************************\n");
2091 }
848a925e 2092#endif /* GNU_LINUX */
dede2792 2093
1b7ddf4f
RS
2094 /* Bind `command-line-processed' to nil before dumping,
2095 so that the dumped Emacs will process its command line
2096 and set up to work with X windows if appropriate. */
4aaa3607 2097 symbol = intern ("command-line-processed");
1b7ddf4f
RS
2098 specbind (symbol, Qnil);
2099
b7826503 2100 CHECK_STRING (filename);
c9aae259 2101 filename = Fexpand_file_name (filename, Qnil);
c556b44b 2102 filename = ENCODE_FILE (filename);
c9aae259 2103 if (!NILP (symfile))
f927c5ae 2104 {
b7826503 2105 CHECK_STRING (symfile);
d5db4077 2106 if (SCHARS (symfile))
c556b44b
EZ
2107 {
2108 symfile = Fexpand_file_name (symfile, Qnil);
2109 symfile = ENCODE_FILE (symfile);
2110 }
f927c5ae
JB
2111 }
2112
2113 tem = Vpurify_flag;
2114 Vpurify_flag = Qnil;
2115
0269dedb
RS
2116#ifdef HAVE_TZSET
2117 set_time_zone_rule (dump_tz);
2118#ifndef LOCALTIME_CACHE
2119 /* Force a tz reload, since set_time_zone_rule doesn't. */
2120 tzset ();
2121#endif
2122#endif
2123
f927c5ae 2124 fflush (stdout);
7db35a48 2125 /* Tell malloc where start of impure now is. */
f927c5ae
JB
2126 /* Also arrange for warnings when nearly out of space. */
2127#ifndef SYSTEM_MALLOC
cc5f52cb
RS
2128#ifndef WINDOWSNT
2129 /* On Windows, this was done before dumping, and that once suffices.
2130 Meanwhile, my_edata is not valid on Windows. */
c339dc2e
PE
2131 {
2132 extern char my_edata[];
2133 memory_warnings (my_edata, malloc_warning);
2134 }
cc5f52cb 2135#endif /* not WINDOWSNT */
dd5ecd6b 2136#endif /* not SYSTEM_MALLOC */
15aaf1b5
RS
2137#ifdef DOUG_LEA_MALLOC
2138 malloc_state_ptr = malloc_get_state ();
f927c5ae 2139#endif
2b7377ca 2140
a74c5ec1 2141#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2142 mmap_set_vars (0);
2143#endif
42a5b22f 2144 unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0);
a74c5ec1 2145#ifdef USE_MMAP_FOR_BUFFERS
2b7377ca
GM
2146 mmap_set_vars (1);
2147#endif
15aaf1b5
RS
2148#ifdef DOUG_LEA_MALLOC
2149 free (malloc_state_ptr);
2150#endif
f927c5ae 2151
aa15c6bb
JB
2152#ifdef WINDOWSNT
2153 Vlibrary_cache = Qnil;
2154#endif
2155#ifdef HAVE_WINDOW_SYSTEM
2156 reset_image_types ();
2157#endif
2158
f927c5ae
JB
2159 Vpurify_flag = tem;
2160
1b7ddf4f 2161 return unbind_to (count, Qnil);
f927c5ae
JB
2162}
2163
f927c5ae
JB
2164#endif /* not CANNOT_DUMP */
2165\f
68c45bf0
PE
2166#if HAVE_SETLOCALE
2167/* Recover from setlocale (LC_ALL, ""). */
2168void
d5a3eaaf 2169fixup_locale (void)
68c45bf0 2170{
68c45bf0
PE
2171 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2172 so that numbers are read and printed properly for Emacs Lisp. */
2173 setlocale (LC_NUMERIC, "C");
68c45bf0
PE
2174}
2175
0c8559bb
PE
2176/* Set system locale CATEGORY, with previous locale *PLOCALE, to
2177 DESIRED_LOCALE. */
68c45bf0 2178static void
dd4c5104 2179synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_locale)
68c45bf0 2180{
0c8559bb
PE
2181 if (! EQ (*plocale, desired_locale))
2182 {
2183 *plocale = desired_locale;
2184 setlocale (category, (STRINGP (desired_locale)
51b59d79 2185 ? SSDATA (desired_locale)
0c8559bb
PE
2186 : ""));
2187 }
68c45bf0
PE
2188}
2189
ca9c0567 2190/* Set system time locale to match Vsystem_time_locale, if possible. */
68c45bf0 2191void
d5a3eaaf 2192synchronize_system_time_locale (void)
68c45bf0 2193{
ca9c0567
PE
2194 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2195 Vsystem_time_locale);
68c45bf0
PE
2196}
2197
ca9c0567
PE
2198/* Set system messages locale to match Vsystem_messages_locale, if
2199 possible. */
68c45bf0 2200void
d5a3eaaf 2201synchronize_system_messages_locale (void)
68c45bf0
PE
2202{
2203#ifdef LC_MESSAGES
ca9c0567
PE
2204 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2205 Vsystem_messages_locale);
68c45bf0
PE
2206#endif
2207}
2208#endif /* HAVE_SETLOCALE */
2209\f
f927c5ae
JB
2210
2211Lisp_Object
17e0445b 2212decode_env_path (const char *evarname, const char *defalt, bool empty)
f927c5ae 2213{
a8fe7202 2214 const char *path, *p;
213d0b1f 2215 Lisp_Object lpath, element, tem;
17e0445b
GM
2216 /* Default is to use "." for empty path elements.
2217 But if argument EMPTY is true, use nil instead. */
2218 Lisp_Object empty_element = empty ? Qnil : build_string (".");
76151e2c 2219#ifdef WINDOWSNT
1882aa38 2220 bool defaulted = 0;
76151e2c
EZ
2221 static const char *emacs_dir_env = "%emacs_dir%/";
2222 const size_t emacs_dir_len = strlen (emacs_dir_env);
1fd201bb
EZ
2223 const char *edir = egetenv ("emacs_dir");
2224 char emacs_dir[MAX_UTF8_PATH];
2225
2226 /* egetenv looks in process-environment, which holds the variables
2227 in their original system-locale encoding. We need emacs_dir to
2228 be in UTF-8. */
e088f894
EZ
2229 if (edir)
2230 filename_from_ansi (edir, emacs_dir);
76151e2c 2231#endif
f927c5ae 2232
2447c626
JB
2233 /* It's okay to use getenv here, because this function is only used
2234 to initialize variables when Emacs starts up, and isn't called
2235 after that. */
e065a56e 2236 if (evarname != 0)
a8fe7202 2237 path = getenv (evarname);
e065a56e
JB
2238 else
2239 path = 0;
f927c5ae 2240 if (!path)
76151e2c
EZ
2241 {
2242 path = defalt;
8671676c 2243#ifdef WINDOWSNT
76151e2c 2244 defaulted = 1;
8671676c 2245#endif
76151e2c 2246 }
6a30e6d6
RS
2247#ifdef DOS_NT
2248 /* Ensure values from the environment use the proper directory separator. */
2249 if (path)
2250 {
1fd201bb
EZ
2251 char *path_copy;
2252
2253#ifdef WINDOWSNT
94ae1542
EZ
2254 char *path_utf8, *q, *d;
2255 int cnv_result;
2256
2257 /* Convert each element of PATH to UTF-8. */
2258 p = path_copy = alloca (strlen (path) + 1);
2259 strcpy (path_copy, path);
2260 d = path_utf8 = alloca (4 * strlen (path) + 1);
2261 *d = '\0';
2262 do {
2263 q = _mbschr (p, SEPCHAR);
2264 if (q)
2265 *q = '\0';
2266 cnv_result = filename_from_ansi (p, d);
2267 if (q)
2268 {
2269 *q++ = SEPCHAR;
2270 p = q;
2271 /* If conversion of this PATH elements fails, make sure
2272 destination pointer will stay put, thus effectively
2273 ignoring the offending element. */
2274 if (cnv_result == 0)
2275 {
2276 d += strlen (d);
2277 *d++ = SEPCHAR;
2278 }
2279 }
2280 else if (cnv_result != 0 && d > path_utf8)
2281 d[-1] = '\0'; /* remove last semi-colon and null-terminate PATH */
2282 } while (q);
2283 path_copy = path_utf8;
1fd201bb
EZ
2284#else /* MSDOS */
2285 path_copy = alloca (strlen (path) + 1);
a8fe7202 2286 strcpy (path_copy, path);
1fd201bb
EZ
2287#endif
2288 dostounix_filename (path_copy);
a8fe7202 2289 path = path_copy;
6a30e6d6
RS
2290 }
2291#endif
f927c5ae
JB
2292 lpath = Qnil;
2293 while (1)
2294 {
8966b757 2295 p = strchr (path, SEPCHAR);
a8fe7202
AS
2296 if (!p)
2297 p = path + strlen (path);
d0065ff1 2298 element = (p - path ? make_unibyte_string (path, p - path)
17e0445b
GM
2299 : empty_element);
2300 if (! NILP (element))
2301 {
76151e2c 2302#ifdef WINDOWSNT
17e0445b
GM
2303 /* Relative file names in the default path are interpreted as
2304 being relative to $emacs_dir. */
e088f894 2305 if (edir && defaulted
17e0445b
GM
2306 && strncmp (path, emacs_dir_env, emacs_dir_len) == 0)
2307 element = Fexpand_file_name (Fsubstring
2308 (element,
2309 make_number (emacs_dir_len),
2310 Qnil),
2311 build_unibyte_string (emacs_dir));
2312#endif
2313
2314 /* Add /: to the front of the name
2315 if it would otherwise be treated as magic. */
2316 tem = Ffind_file_name_handler (element, Qt);
2317
2318 /* However, if the handler says "I'm safe",
2319 don't bother adding /:. */
2320 if (SYMBOLP (tem))
2321 {
2322 Lisp_Object prop;
2323 prop = Fget (tem, intern ("safe-magic"));
2324 if (! NILP (prop))
2325 tem = Qnil;
2326 }
ca3df2d5 2327
17e0445b
GM
2328 if (! NILP (tem))
2329 element = concat2 (build_string ("/:"), element);
2330 } /* !NILP (element) */
213d0b1f
RS
2331
2332 lpath = Fcons (element, lpath);
f927c5ae
JB
2333 if (*p)
2334 path = p + 1;
2335 else
2336 break;
2337 }
2338 return Fnreverse (lpath);
2339}
2340
eab2ee89 2341DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
4ff029f6
DN
2342 doc: /* Return non-nil if the current emacs process is a daemon.
2343If the daemon was given a name argument, return that name. */)
5842a27b 2344 (void)
eab2ee89 2345{
fc012771 2346 if (IS_DAEMON)
4ff029f6
DN
2347 if (daemon_name)
2348 return build_string (daemon_name);
2349 else
2350 return Qt;
2351 else
2352 return Qnil;
eab2ee89
DN
2353}
2354
5790ef40 2355DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
fc012771
SM
2356 doc: /* Mark the Emacs daemon as being initialized.
2357This finishes the daemonization process by doing the other half of detaching
2358from the parent process and its tty file descriptors. */)
5842a27b 2359 (void)
5790ef40
DN
2360{
2361 int nfd;
1882aa38 2362 bool err = 0;
5790ef40 2363
fc012771 2364 if (!IS_DAEMON)
5790ef40
DN
2365 error ("This function can only be called if emacs is run as a daemon");
2366
2367 if (daemon_pipe[1] < 0)
2368 error ("The daemon has already been initialized");
2369
2370 if (NILP (Vafter_init_time))
2371 error ("This function can only be called after loading the init files");
2372
2373 /* Get rid of stdin, stdout and stderr. */
406af475 2374 nfd = emacs_open ("/dev/null", O_RDWR, 0);
dc1ca6a8
PE
2375 err |= nfd < 0;
2376 err |= dup2 (nfd, 0) < 0;
2377 err |= dup2 (nfd, 1) < 0;
2378 err |= dup2 (nfd, 2) < 0;
bacba3c2 2379 err |= emacs_close (nfd) != 0;
5790ef40 2380
fc012771
SM
2381 /* Closing the pipe will notify the parent that it can exit.
2382 FIXME: In case some other process inherited the pipe, closing it here
2383 won't notify the parent because it's still open elsewhere, so we
2384 additionally send a byte, just to make sure the parent really exits.
2385 Instead, we should probably close the pipe in start-process and
2386 call-process to make sure the pipe is never inherited by
2387 subprocesses. */
dc1ca6a8 2388 err |= write (daemon_pipe[1], "\n", 1) < 0;
bacba3c2 2389 err |= emacs_close (daemon_pipe[1]) != 0;
5790ef40
DN
2390 /* Set it to an invalid value so we know we've already run this function. */
2391 daemon_pipe[1] = -1;
dc1ca6a8
PE
2392
2393 if (err)
2394 error ("I/O error during daemon initialization");
5790ef40
DN
2395 return Qt;
2396}
2397
dfcf069d 2398void
d5a3eaaf 2399syms_of_emacs (void)
f927c5ae 2400{
cd3520a4
JB
2401 DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist");
2402 DEFSYM (Qrisky_local_variable, "risky-local-variable");
6c07aac2 2403 DEFSYM (Qkill_emacs, "kill-emacs");
73c14218 2404 DEFSYM (Qkill_emacs_hook, "kill-emacs-hook");
213d0b1f 2405
83591e66 2406#ifndef CANNOT_DUMP
f927c5ae
JB
2407 defsubr (&Sdump_emacs);
2408#endif
2409
2410 defsubr (&Skill_emacs);
2411
59653951 2412 defsubr (&Sinvocation_name);
ace40a69 2413 defsubr (&Sinvocation_directory);
eab2ee89 2414 defsubr (&Sdaemonp);
5790ef40 2415 defsubr (&Sdaemon_initialized);
59653951 2416
29208e82 2417 DEFVAR_LISP ("command-line-args", Vcommand_line_args,
2a9d2ed6
RS
2418 doc: /* Args passed by shell to Emacs, as a list of strings.
2419Many arguments are deleted from the list as they are processed. */);
f927c5ae 2420
29208e82 2421 DEFVAR_LISP ("system-type", Vsystem_type,
cf59a374 2422 doc: /* The value is a symbol indicating the type of operating system you are using.
40a8993a 2423Special values:
cf59a374
GM
2424 `gnu' compiled for a GNU Hurd system.
2425 `gnu/linux' compiled for a GNU/Linux system.
2426 `gnu/kfreebsd' compiled for a GNU system with a FreeBSD kernel.
2427 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2428 `ms-dos' compiled as an MS-DOS application.
2429 `windows-nt' compiled as a native W32 application.
2430 `cygwin' compiled using the Cygwin library.
bd6bc222
GM
2431Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix,
2432hpux, irix, usg-unix-v) indicates some sort of Unix system. */);
d67b4f80 2433 Vsystem_type = intern_c_string (SYSTEM_TYPE);
6edd2f3d 2434 /* See configure.ac (and config.nt) for the possible SYSTEM_TYPEs. */
f927c5ae 2435
29208e82 2436 DEFVAR_LISP ("system-configuration", Vsystem_configuration,
7db35a48
PJ
2437 doc: /* Value is string indicating configuration Emacs was built for.
2438On MS-Windows, the value reflects the OS flavor and version on which
2439Emacs is running. */);
f7511647 2440 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
271c7b7c 2441
29208e82 2442 DEFVAR_LISP ("system-configuration-options", Vsystem_configuration_options,
7db35a48 2443 doc: /* String containing the configuration options Emacs was built with. */);
f0fc0b1a
KH
2444 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2445
29208e82 2446 DEFVAR_BOOL ("noninteractive", noninteractive1,
7db35a48 2447 doc: /* Non-nil means Emacs is running without interactive terminal. */);
e5d77022 2448
29208e82 2449 DEFVAR_LISP ("kill-emacs-hook", Vkill_emacs_hook,
e5d9c0d1 2450 doc: /* Hook run when `kill-emacs' is called.
d77b70e5 2451Since `kill-emacs' may be invoked when the terminal is disconnected (or
7db35a48
PJ
2452in other similar situations), functions placed on this hook should not
2453expect to be able to interact with the user. To ask for confirmation,
d77b70e5
MR
2454see `kill-emacs-query-functions' instead.
2455
9c524fcb
GM
2456Before Emacs 24.1, the hook was not run in batch mode, i.e., if
2457`noninteractive' was non-nil. */);
edc8ae07 2458 Vkill_emacs_hook = Qnil;
3005da00 2459
29208e82 2460 DEFVAR_LISP ("path-separator", Vpath_separator,
c7ed3276
EZ
2461 doc: /* String containing the character that separates directories in
2462search paths, such as PATH and other similar environment variables. */);
074a066b
GV
2463 {
2464 char c = SEPCHAR;
2465 Vpath_separator = make_string (&c, 1);
2466 }
59653951 2467
29208e82 2468 DEFVAR_LISP ("invocation-name", Vinvocation_name,
7db35a48
PJ
2469 doc: /* The program name that was used to run Emacs.
2470Any directory names are omitted. */);
f67de86f 2471
29208e82 2472 DEFVAR_LISP ("invocation-directory", Vinvocation_directory,
7db35a48
PJ
2473 doc: /* The directory in which the Emacs executable was found, to run it.
2474The value is nil if that directory's name is not known. */);
f67de86f 2475
29208e82 2476 DEFVAR_LISP ("installation-directory", Vinstallation_directory,
7db35a48 2477 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
74cc8ff9
GM
2478In an installed Emacs, this is normally nil. It is non-nil if
2479both `lib-src' (on MS-DOS, `info') and `etc' directories are found
1e2c5d95
GM
2480within the variable `invocation-directory' or its parent. For example,
2481this is the case when running an uninstalled Emacs executable from its
74cc8ff9 2482build directory. */);
07f4d123 2483 Vinstallation_directory = Qnil;
68c45bf0 2484
29208e82 2485 DEFVAR_LISP ("system-messages-locale", Vsystem_messages_locale,
7db35a48 2486 doc: /* System locale for messages. */);
ca9c0567 2487 Vsystem_messages_locale = Qnil;
68c45bf0 2488
ca9c0567 2489 DEFVAR_LISP ("previous-system-messages-locale",
29208e82 2490 Vprevious_system_messages_locale,
7db35a48 2491 doc: /* Most recently used system locale for messages. */);
ca9c0567 2492 Vprevious_system_messages_locale = Qnil;
68c45bf0 2493
29208e82 2494 DEFVAR_LISP ("system-time-locale", Vsystem_time_locale,
7db35a48 2495 doc: /* System locale for time. */);
ca9c0567 2496 Vsystem_time_locale = Qnil;
68c45bf0 2497
29208e82 2498 DEFVAR_LISP ("previous-system-time-locale", Vprevious_system_time_locale,
7db35a48 2499 doc: /* Most recently used system locale for time. */);
ca9c0567 2500 Vprevious_system_time_locale = Qnil;
90503d96 2501
29208e82 2502 DEFVAR_LISP ("before-init-time", Vbefore_init_time,
90503d96
CY
2503 doc: /* Value of `current-time' before Emacs begins initialization. */);
2504 Vbefore_init_time = Qnil;
2505
29208e82 2506 DEFVAR_LISP ("after-init-time", Vafter_init_time,
90503d96
CY
2507 doc: /* Value of `current-time' after loading the init files.
2508This is nil during initialization. */);
2509 Vafter_init_time = Qnil;
fc012771 2510
29208e82 2511 DEFVAR_BOOL ("inhibit-x-resources", inhibit_x_resources,
9b68317c 2512 doc: /* If non-nil, X resources, Windows Registry settings, and NS defaults are not used. */);
8686ac71
JB
2513 inhibit_x_resources = 0;
2514
29208e82 2515 DEFVAR_LISP ("emacs-copyright", Vemacs_copyright,
8c5ff6dd
KR
2516 doc: /* Short copyright string for this version of Emacs. */);
2517 Vemacs_copyright = build_string (emacs_copyright);
2518
29208e82 2519 DEFVAR_LISP ("emacs-version", Vemacs_version,
8c5ff6dd
KR
2520 doc: /* Version numbers of this version of Emacs. */);
2521 Vemacs_version = build_string (emacs_version);
2522
29208e82 2523 DEFVAR_LISP ("dynamic-library-alist", Vdynamic_library_alist,
2e288d54
JB
2524 doc: /* Alist of dynamic libraries vs external files implementing them.
2525Each element is a list (LIBRARY FILE...), where the car is a symbol
2526representing a supported external library, and the rest are strings giving
2527alternate filenames for that library.
2528
2529Emacs tries to load the library from the files in the order they appear on
2530the list; if none is loaded, the running session of Emacs won't have access
2531to that library.
2532
2533Note that image types `pbm' and `xbm' do not need entries in this variable
2534because they do not depend on external libraries and are always available.
2535
2536Also note that this is not a generic facility for accessing external
2537libraries; only those already known by Emacs will be loaded. */);
2538 Vdynamic_library_alist = Qnil;
2539 Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
2540
aa15c6bb
JB
2541#ifdef WINDOWSNT
2542 Vlibrary_cache = Qnil;
2543 staticpro (&Vlibrary_cache);
2544#endif
2545
fc012771
SM
2546 /* Make sure IS_DAEMON starts up as false. */
2547 daemon_pipe[1] = 0;
f927c5ae 2548}