To: vim-dev@vim.org Subject: patch 5.4o.9 Fcc: outbox From: Bram Moolenaar ------------ This patch only applies to the DOS and Windows versions. And then only to the installation program. Patch 5.4o.9 Problem: The DOS install.exe program used the "move" program. That doesn't work on Windows NT, where "move" is internal to cmd.exe. Solution: Don't use an external program for moving the executables. Use C functions to copy the file and delete the original. Files: src/dosinst.c *** ../vim-5.4o/src/dosinst.c Sun Jul 11 20:10:44 1999 --- src/dosinst.c Fri Jul 16 16:06:19 1999 *************** *** 12,23 **** --- 12,25 ---- * Compile with Makefile.bcc or Makefile.djg. */ + #include #include #include #include #include #include #include + #include #ifdef WIN32 # include #else *************** *** 32,38 **** #define NUL 0 /* ! * Return TRUE if the the user types a 'y' or 'Y', FALSE otherwise. */ int confirm(void) --- 34,50 ---- #define NUL 0 /* ! * EMX doesn't have a global way of making open() use binary I/O. ! * Use O_BINARY for all open() calls. ! */ ! #if defined(__EMX__) || defined(__CYGWIN32__) ! # define O_EXTRA O_BINARY ! #else ! # define O_EXTRA 0 ! #endif ! ! /* ! * Return TRUE if the user types a 'y' or 'Y', FALSE otherwise. */ int confirm(void) *************** *** 291,313 **** #endif /* ! * Move a file to another directory. */ void move_file(char *fname, char *dir) { struct stat st; ! char cmd[1000]; /* if the file doesn't exist, silently skip it */ if (stat(fname, &st) < 0) return; ! sprintf(cmd, "move %s %s", fname, dir); ! system(cmd); ! if (stat(fname, &st) >= 0) printf("ERROR: Moving \"%s\" to \"%s\" failed\n", fname, dir); } /* --- 303,366 ---- #endif /* ! * Move file "fname" to directory "dir". ! * We actually copy the file and then delete the original, to avoid depending ! * on an external program. */ void move_file(char *fname, char *dir) { struct stat st; ! char new_name[256]; ! #define COPYBUFSIZE 4096 ! char *buf; ! long len; ! int fdr, fdw; ! #ifndef __MINGW32__ ! extern int _fmode; ! #endif /* if the file doesn't exist, silently skip it */ if (stat(fname, &st) < 0) return; ! buf = malloc(COPYBUFSIZE); ! if (buf == NULL) ! { ! printf("ERROR: Out of memory!\n"); ! return; ! } ! ! _fmode = O_BINARY; /* Use binary I/O */ ! ! /* make the destination file name: "dir\fname" */ ! strcpy(new_name, dir); ! if (dir[strlen(dir) - 1] != '\\' && dir[strlen(dir) - 1] != '/') ! strcat(new_name, "\\"); ! strcat(new_name, fname); ! fdr = open(fname, O_RDONLY | O_EXTRA, 0); ! if (fdr >= 0) ! { ! fdw = open(new_name, O_WRONLY|O_CREAT|O_TRUNC|O_EXTRA, 0777); ! if (fdw >= 0) ! { ! /* copy the file. */ ! while ((len = read(fdr, buf, COPYBUFSIZE)) > 0) ! if (write(fdw, buf, len) != len) ! break; ! close(fdw); ! } ! close(fdr); ! } ! if (fdr < 0 || fdw < 0 || len > 0 || len < 0) printf("ERROR: Moving \"%s\" to \"%s\" failed\n", fname, dir); + else + { + printf("%s moved to %s\n", fname, new_name); + unlink(fname); + } + free(buf); } /* *************** *** 422,427 **** --- 475,488 ---- int i; char *p; int vimdirend; + + #ifdef DJGPP + /* + * Use Long File Names by default, if $LFN not set. + */ + if (getenv("LFN") == NULL) + putenv("LFN=y"); + #endif printf("This program sets up the installation of Vim %s\n\n", VIM_VERSION_MEDIUM); -- hundred-and-one symptoms of being an internet addict: 127. You bring your laptop and cellular phone to church. --/-/---- Bram Moolenaar ---- Bram@moolenaar.net ---- Bram@vim.org ---\-\-- \ \ www.vim.org/iccf www.moolenaar.net www.vim.org / /