# HG changeset patch # User Richard M. Stallman # Date 833816672 0 # Node ID b76f57d4320b5531c3ae61edafb883d17e07175c # Parent 4dbee658e623b97643d82e521b12df4767a972e6 (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. diff -r 4dbee658e623 -r b76f57d4320b nt/runemacs.c --- a/nt/runemacs.c Mon Jun 03 14:39:17 1996 +0000 +++ b/nt/runemacs.c Mon Jun 03 15:44:32 1996 +0000 @@ -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 @@ -20,8 +35,8 @@ 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 @@ new_cmdline = alloca (MAX_PATH + strlen (cmdline) + 1); strcpy (new_cmdline, modname); - strcat (new_cmdline, "\\emacs.exe "); + +#ifdef CHOOSE_NEWEST_EXE + { + /* Silly hack to allow new versions to be installed on + server even when current version is in use. */ - /* append original arguments if any; first look for -wait as first - argument, and apply that ourselves */ + 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; - } + { + 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);