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