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