diff options
Diffstat (limited to 'nt')
-rw-r--r-- | nt/runemacs.c | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/nt/runemacs.c b/nt/runemacs.c index 720c6ca7241..fe10021e98f 100644 --- a/nt/runemacs.c +++ b/nt/runemacs.c @@ -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 + later). +*/ + +/* #define CHOOSE_NEWEST_EXE */ + #define WIN32 #include <windows.h> @@ -20,8 +35,8 @@ WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow) PROCESS_INFORMATION child; 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) +#ifdef CHOOSE_NEWEST_EXE { - 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}; + WIN32_FIND_DATA wfd; + HANDLE fh; + p = new_cmdline + strlen (new_cmdline); + strcpy (p, "\\emacs*.exe"); + fh = FindFirstFile (new_cmdline, &wfd); + if (fh == INVALID_HANDLE_VALUE) + goto error; + do + { + 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, " "); } +#else + strcat (new_cmdline, "\\emacs.exe"); +#endif + + /* 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); |