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