Commit 662463d9 authored by Richard M. Stallman's avatar Richard M. Stallman

(CHOOSE_NEWEST_EXE): New parameter macro.

Not defined by default.
(WinMain): Add conditional testing CHOOSE_NEWEST_EXE.
(WinMain): Convert backslashes to slashes in env var values.
parent 4302ef50
......@@ -5,6 +5,21 @@
use Emacs in windowing (GUI) mode, and will not want to have an extra
console window lying around. */
You may want to define this if you want to be able to install updated
emacs binaries even when other users are using the current version.
The problem with some file servers (notably Novell) is that an open
file cannot be overwritten, deleted, or even renamed. So if someone
is running emacs.exe already, you cannot install a newer version.
By defining CHOOSE_NEWEST_EXE, you can name your new emacs.exe
something else which matches "emacs*.exe", and runemacs will
automatically select the newest emacs executeable in the bin directory.
(So you'll probably be able to delete the old version some hours/days
/* #define CHOOSE_NEWEST_EXE */
#define WIN32
#include <windows.h>
......@@ -20,8 +35,8 @@ WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
int wait_for_child = FALSE;
DWORD ret_code = 0;
char * new_cmdline;
char * p;
char *new_cmdline;
char *p;
char modname[MAX_PATH];
if (!GetModuleFileName (NULL, modname, MAX_PATH))
......@@ -32,23 +47,58 @@ WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
new_cmdline = alloca (MAX_PATH + strlen (cmdline) + 1);
strcpy (new_cmdline, modname);
strcat (new_cmdline, "\\emacs.exe ");
/* append original arguments if any; first look for -wait as first
argument, and apply that ourselves */
if (strncmp (cmdline, "-wait", 5) == 0)
wait_for_child = TRUE;
cmdline += 5;
/* Silly hack to allow new versions to be installed on
server even when current version is in use. */
char * best_name = alloca (MAX_PATH + 1);
FILETIME best_time = {0,0};
p = new_cmdline + strlen (new_cmdline);
strcpy (p, "\\emacs*.exe");
fh = FindFirstFile (new_cmdline, &wfd);
goto error;
if (wfd.ftLastWriteTime.dwHighDateTime > best_time.dwHighDateTime
|| (wfd.ftLastWriteTime.dwHighDateTime == best_time.dwHighDateTime
&& wfd.ftLastWriteTime.dwLowDateTime > best_time.dwLowDateTime))
best_time = wfd.ftLastWriteTime;
strcpy (best_name, wfd.cFileName);
while (FindNextFile (fh, &wfd));
FindClose (fh);
*p++ = '\\';
strcpy (p, best_name);
strcat (p, " ");
strcat (new_cmdline, "\\emacs.exe");
/* Append original arguments if any; first look for -wait as first
argument, and apply that ourselves. */
if (strncmp (cmdline, "-wait", 5) == 0)
wait_for_child = TRUE;
cmdline += 5;
strcat (new_cmdline, cmdline);
/* set emacs_dir variable if runemacs was in "%emacs_dir%\bin" */
/* Set emacs_dir variable if runemacs was in "%emacs_dir%\bin". */
if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0)
*p = 0;
SetEnvironmentVariable ("emacs_dir", modname);
*p = 0;
for (p = modname; *p; p++)
if (*p == '\\') *p = '/';
SetEnvironmentVariable ("emacs_dir", modname);
memset (&start, 0, sizeof (start));
start.cb = sizeof (start);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment