diff options
author | Siep Kroonenberg <siepo@cybercomm.nl> | 2022-07-17 08:24:29 +0000 |
---|---|---|
committer | Siep Kroonenberg <siepo@cybercomm.nl> | 2022-07-17 08:24:29 +0000 |
commit | 0a995ebf34310a05dae9beddb282936a16f427ff (patch) | |
tree | 4e56b17839a55f06bb843bb923277399677ec09b /Master/source | |
parent | c68822b26f239424bb11fb49690994f7ea128cea (diff) |
Windows test for opening files to prevent doomed updates
git-svn-id: svn://tug.org/texlive/trunk@63917 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/source')
-rw-r--r-- | Master/source/wtestopenfiles.README | 13 | ||||
-rw-r--r-- | Master/source/wtestopenfiles.c | 72 |
2 files changed, 85 insertions, 0 deletions
diff --git a/Master/source/wtestopenfiles.README b/Master/source/wtestopenfiles.README new file mode 100644 index 00000000000..263dda584ce --- /dev/null +++ b/Master/source/wtestopenfiles.README @@ -0,0 +1,13 @@ +This program can be used to prevent doomed TeX Live update attempts +on windows by testing whether all files concerned can be opened with +exclusive read/write access. + +It reads a list of absolute filepaths from stdin and errors out if +any of them cannot be opened with exclusive read/write access. + +A -v option also produces status output on stdout. + +Cross-compiling under linux: + + i686-w64-mingw32-gcc -o wtestopenfiles.exe wtestopenfiles.c + i686-w64-mingw32-strip wtestopenfiles.exe diff --git a/Master/source/wtestopenfiles.c b/Master/source/wtestopenfiles.c new file mode 100644 index 00000000000..9570f8ccdd4 --- /dev/null +++ b/Master/source/wtestopenfiles.c @@ -0,0 +1,72 @@ +/*********************************************************** + + This program tries to prevent doomed update attempts on windows by testing + whether all files concerned can be opened with exclusive read/write access. + + This file is written in 2022 by Siep Kroonenberg and is placed + in the Public Domain. + +***********************************************************/ + +#include <windows.h> +#include <stdio.h> + +int main( int argc, char *argv[] ) { + HANDLE hf; + char buf[MAX_PATH]; + int ok = 1; + int chatty = 0; + int i; + + if( argc > 1 ) { + for( i=1;i<argc;i++ ) { + if( argv[i][1] == 'v' ) { + chatty = 1; + } else { + puts( "This program reads a list of absolute filepaths from stdin" ); + puts( "and errors out if any of them cannot be opened with" ); + puts( "exclusive read/write access." ); + puts( "A -v option produces status output on stdout." ); + exit( 1 ); + } + } + } + + while ( fgets( buf, MAX_PATH, stdin )) { + buf[strlen(buf)-1] = '\0'; + if (buf[0] != '\0') { + // buf represents a filepath + hf = CreateFile( + buf, + GENERIC_READ | GENERIC_WRITE, + 0, // not shared + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL + ); + // OPEN_ALWAYS: creates missing file + // OPEN_EXISTING: can fail with ERROR_FILE_NOT_FOUND + if( hf == INVALID_HANDLE_VALUE ) { + if( GetLastError() == ERROR_FILE_NOT_FOUND ) { + if( chatty ) printf( "%s not present, is ok\n", buf ); + continue; + } else { + ok = 0; + if( chatty ) printf( "%s present, but cannot be opened\n", buf ); + break; + } + } else { + if( chatty ) printf( "%s can be exclusively opened, is ok\n", buf ); + CloseHandle( hf ); + } + } + } + if( ok ) { + if( chatty ) puts( "ok" ); + exit(0); + } else { + if( chatty ) puts( "not ok" ); + exit( 1 ); + } +} |