X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/b6f960a0ea4a19ed3dc8a6c5e34cf1d2e02b4bb9..1abfd3e85fa9b340699430cd9e15dd9f0073bdbe:/src/emacs.c
diff --git a/src/emacs.c b/src/emacs.c
index c0c230ef3d..c494dff8ca 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -27,6 +27,7 @@ along with GNU Emacs. If not, see . */
#include
#include
+#include
#include
#include "lisp.h"
@@ -40,6 +41,7 @@ along with GNU Emacs. If not, see . */
#if defined WINDOWSNT || defined HAVE_NTGUI
#include "w32select.h"
#include "w32font.h"
+#include "w32common.h"
#endif
#if defined HAVE_NTGUI && defined CYGWIN
@@ -94,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;
@@ -136,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. */
@@ -519,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
@@ -656,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
@@ -685,7 +700,7 @@ main (int argc, char **argv)
#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
@@ -701,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]);
@@ -712,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++;
@@ -769,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 */
@@ -1036,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);
}
@@ -1063,9 +1086,7 @@ 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);
@@ -1118,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 ();
@@ -1129,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 */
}
@@ -1255,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. */
@@ -1276,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. */
@@ -1295,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. */
@@ -1312,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 ();
@@ -1411,12 +1434,17 @@ 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 */
#ifdef WINDOWSNT
syms_of_ntterm ();
+ syms_of_w32notify ();
#endif /* WINDOWSNT */
syms_of_profiler ();
@@ -1814,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);
@@ -1822,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
@@ -1848,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);
@@ -1879,7 +1905,7 @@ shut_down_emacs (int sig, Lisp_Object stuff)
/* If we are controlling the terminal, reset terminal modes. */
#ifndef DOS_NT
{
- pid_t pgrp = EMACS_GETPGRP (0);
+ pid_t pgrp = getpgrp ();
pid_t tpgrp = tcgetpgrp (0);
if ((tpgrp != -1) && tpgrp == pgrp)
{
@@ -2126,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
@@ -2238,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);