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