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