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