X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/7014794467aac02be3a935a093e1bfb8ad410c12..1bb1e03834c6755b42a6404aa3d2832c38c3981e:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index 2e3c880fb5..c494dff8ca 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1,7 +1,7 @@ /* Fully extensible Emacs, running on Unix, intended for GNU. -Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2012 - Free Software Foundation, Inc. +Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2013 Free Software +Foundation, Inc. This file is part of GNU Emacs. @@ -27,6 +27,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include #include #include "lisp.h" @@ -34,18 +35,16 @@ along with GNU Emacs. If not, see . */ #ifdef WINDOWSNT #include #include "w32.h" -#endif - -#if defined (WINDOWSNT) #include "w32heap.h" #endif -#if defined (WINDOWSNT) || defined (HAVE_NTGUI) +#if defined WINDOWSNT || defined HAVE_NTGUI #include "w32select.h" #include "w32font.h" +#include "w32common.h" #endif -#if defined (HAVE_NTGUI) && defined (CYGWIN) +#if defined HAVE_NTGUI && defined CYGWIN #include "cygw32.h" #endif @@ -97,10 +96,6 @@ extern void moncontrol (int mode); #include #endif -#ifndef O_RDWR -#define O_RDWR 2 -#endif - static const char emacs_version[] = VERSION; static const char emacs_copyright[] = COPYRIGHT; @@ -139,6 +134,7 @@ Lisp_Object Qfile_name_handler_alist; Lisp_Object Qrisky_local_variable; Lisp_Object Qkill_emacs; +static Lisp_Object Qkill_emacs_hook; /* If true, Emacs should not attempt to use a window-specific code, but instead should use the virtual terminal under which it was started. */ @@ -179,7 +175,7 @@ static uprintmax_t heap_bss_diff; We mark being in the exec'd process by a daemon name argument of form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors, NAME is the original daemon name, if any. */ -#if defined (NS_IMPL_COCOA) || (defined (HAVE_NTGUI) && defined (CYGWIN)) +#if defined NS_IMPL_COCOA || (defined HAVE_NTGUI && defined CYGWIN) # define DAEMON_MUST_EXEC #endif @@ -349,25 +345,6 @@ terminate_due_to_signal (int sig, int backtrace_limit) /* This shouldn't be executed, but it prevents a warning. */ exit (1); } - -#ifdef SIGDANGER - -/* Handler for SIGDANGER. */ -static void -handle_danger_signal (int sig) -{ - malloc_warning ("Operating system warns that virtual memory is running low.\n"); - - /* It might be unsafe to call do_auto_save now. */ - force_auto_save_soon (); -} - -static void -deliver_danger_signal (int sig) -{ - deliver_process_signal (sig, handle_danger_signal); -} -#endif /* Code for dealing with Lisp access to the Unix command line. */ @@ -541,7 +518,7 @@ DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory, #ifdef HAVE_TZSET /* A valid but unlikely value for the TZ environment value. It is OK (though a bit slower) if the user actually chooses this value. */ -static char dump_tz[] = "UtC0"; +static char const dump_tz[] = "UtC0"; #endif #ifndef ORDINARY_LINK @@ -678,6 +655,22 @@ void (*__malloc_initialize_hook) (void) EXTERNALLY_VISIBLE = malloc_initialize_h #endif /* DOUG_LEA_MALLOC */ +/* Close standard output and standard error, reporting any write + errors as best we can. This is intended for use with atexit. */ +static void +close_output_streams (void) +{ + if (close_stream (stdout) != 0) + { + fprintf (stderr, "Write error to standard output: %s\n", + strerror (errno)); + fflush (stderr); + _exit (EXIT_FAILURE); + } + + if (close_stream (stderr) != 0) + _exit (EXIT_FAILURE); +} /* ARGSUSED */ int @@ -698,16 +691,16 @@ main (int argc, char **argv) char *dname_arg = 0; #ifdef DAEMON_MUST_EXEC char dname_arg2[80]; -#endif /* DAEMON_MUST_EXEC */ +#endif char *ch_to_dir; #if GC_MARK_STACK stack_base = &dummy; #endif -#if defined (USE_GTK) && defined (G_SLICE_ALWAYS_MALLOC) +#ifdef G_SLICE_ALWAYS_MALLOC /* This is used by the Cygwin build. */ - setenv ("G_SLICE", "always-malloc", 1); + xputenv ("G_SLICE=always-malloc"); #endif #ifdef GNU_LINUX @@ -723,6 +716,13 @@ main (int argc, char **argv) } #endif +#if defined WINDOWSNT || defined HAVE_NTGUI + /* Set global variables used to detect Windows version. Do this as + early as possible. (unexw32.c calls this function as well, but + the additional call here is harmless.) */ + cache_system_info (); +#endif + #ifdef RUN_TIME_REMAP if (initialized) run_time_remap (argv[0]); @@ -734,6 +734,8 @@ main (int argc, char **argv) unexec_init_emacs_zone (); #endif + atexit (close_output_streams); + sort_args (argc, argv); argc = 0; while (argv[argc]) argc++; @@ -791,9 +793,8 @@ main (int argc, char **argv) #ifdef HAVE_PERSONALITY_LINUX32 if (dumping && ! getenv ("EMACS_HEAP_EXEC")) { - static char heapexec[] = "EMACS_HEAP_EXEC=true"; /* Set this so we only do this once. */ - putenv (heapexec); + xputenv ("EMACS_HEAP_EXEC=true"); /* A flag to turn off address randomization which is introduced in linux kernel shipped with fedora core 4 */ @@ -1058,7 +1059,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem argv[skip_args] = fdStr; - execv (argv[0], argv); + execvp (argv[0], argv); fprintf (stderr, "emacs daemon: exec failed: %d\n", errno); exit (1); } @@ -1085,28 +1086,21 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem that it is not accessible to programs started from .emacs. */ fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC); -#ifdef HAVE_SETSID setsid (); -#endif #else /* DOS_NT */ fprintf (stderr, "This platform does not support the -daemon flag.\n"); exit (1); #endif /* DOS_NT */ } +#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) if (! noninteractive) { -#if defined (USG5) && defined (INTERRUPT_INPUT) - setpgrp (); -#endif -#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) - { - extern void malloc_enable_thread (void); + extern void malloc_enable_thread (void); - malloc_enable_thread (); - } -#endif + malloc_enable_thread (); } +#endif init_signals (dumping); @@ -1145,6 +1139,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* Called before syms_of_fileio, because it sets up Qerror_condition. */ syms_of_data (); + syms_of_fns (); /* Before syms_of_charset which uses hashtables. */ syms_of_fileio (); /* Before syms_of_coding to initialize Vgc_cons_threshold. */ syms_of_alloc (); @@ -1156,7 +1151,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem init_window_once (); /* Init the window system. */ #ifdef HAVE_WINDOW_SYSTEM - init_fringe_once (); /* Swap bitmaps if necessary. */ + init_fringe_once (); /* Swap bitmaps if necessary. */ #endif /* HAVE_WINDOW_SYSTEM */ } @@ -1282,6 +1277,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef WINDOWSNT globals_of_w32 (); + globals_of_w32notify (); /* Initialize environment from registry settings. */ init_environment (argv); init_ntproc (dumping); /* must precede init_editfns. */ @@ -1303,7 +1299,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem don't pollute Vglobal_environment. */ /* Setting LANG here will defeat the startup locale processing... */ #ifdef AIX - putenv ("LANG=C"); + xputenv ("LANG=C"); #endif init_buffer (); /* Init default directory of main buffer. */ @@ -1322,6 +1318,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem } init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */ + init_fileio (); init_lread (); #ifdef WINDOWSNT /* Check to see if Emacs has been installed correctly. */ @@ -1339,7 +1336,6 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_lread (); syms_of_print (); syms_of_eval (); - syms_of_fns (); syms_of_floatfns (); syms_of_buffer (); @@ -1378,9 +1374,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef WINDOWSNT syms_of_ntproc (); #endif /* WINDOWSNT */ -#if defined (CYGWIN) && defined (HAVE_NTGUI) +#if defined CYGWIN && defined HAVE_NTGUI syms_of_cygw32 (); -#endif /* defined(CYGWIN) && defined (HAVE_NTGUI) */ +#endif syms_of_window (); syms_of_xdisp (); syms_of_font (); @@ -1415,9 +1411,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_fontset (); #endif /* HAVE_NTGUI */ -#ifdef HAVE_W32SELECT +#if defined WINDOWSNT || defined HAVE_NTGUI syms_of_w32select (); -#endif /* HAVE_W32SELECT */ +#endif #ifdef MSDOS syms_of_xmenu (); @@ -1438,6 +1434,10 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem syms_of_gnutls (); #endif +#ifdef HAVE_INOTIFY + syms_of_inotify (); +#endif /* HAVE_INOTIFY */ + #ifdef HAVE_DBUS syms_of_dbusbind (); #endif /* HAVE_DBUS */ @@ -1466,9 +1466,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem globals_of_w32menu (); #endif /* HAVE_NTGUI */ -#ifdef HAVE_W32SELECT +#if defined WINDOWSNT || defined HAVE_NTGUI globals_of_w32select (); -#endif /* HAVE_W32SELECT */ +#endif } init_charset (); @@ -1842,7 +1842,6 @@ all of which are called before Emacs is actually killed. */) (Lisp_Object arg) { struct gcpro gcpro1; - Lisp_Object hook; int exit_code; GCPRO1 (arg); @@ -1850,9 +1849,10 @@ all of which are called before Emacs is actually killed. */) if (feof (stdin)) arg = Qt; - hook = intern ("kill-emacs-hook"); - Frun_hooks (1, &hook); - + /* Fsignal calls emacs_abort () if it sees that waiting_for_input is + set. */ + waiting_for_input = 0; + Frun_hooks (1, &Qkill_emacs_hook); UNGCPRO; #ifdef HAVE_X_WINDOWS @@ -1876,8 +1876,6 @@ all of which are called before Emacs is actually killed. */) exit_code = (XINT (arg) < 0 ? XINT (arg) | INT_MIN : XINT (arg) & INT_MAX); - else if (noninteractive && (fflush (stdout) || ferror (stdout))) - exit_code = EXIT_FAILURE; else exit_code = EXIT_SUCCESS; exit (exit_code); @@ -1907,8 +1905,8 @@ shut_down_emacs (int sig, Lisp_Object stuff) /* If we are controlling the terminal, reset terminal modes. */ #ifndef DOS_NT { - int pgrp = EMACS_GETPGRP (0); - int tpgrp = tcgetpgrp (0); + pid_t pgrp = getpgrp (); + pid_t tpgrp = tcgetpgrp (0); if ((tpgrp != -1) && tpgrp == pgrp) { reset_all_sys_modes (); @@ -2154,7 +2152,7 @@ decode_env_path (const char *evarname, const char *defalt) { char *path_copy = alloca (strlen (path) + 1); strcpy (path_copy, path); - dostounix_filename (path_copy); + dostounix_filename (path_copy, 0); path = path_copy; } #endif @@ -2266,6 +2264,7 @@ syms_of_emacs (void) DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist"); DEFSYM (Qrisky_local_variable, "risky-local-variable"); DEFSYM (Qkill_emacs, "kill-emacs"); + DEFSYM (Qkill_emacs_hook, "kill-emacs-hook"); #ifndef CANNOT_DUMP defsubr (&Sdump_emacs);