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