texlive[63917] Master/source: Windows test for opening files to

commits+siepo at tug.org commits+siepo at tug.org
Sun Jul 17 10:24:29 CEST 2022


Revision: 63917
          http://tug.org/svn/texlive?view=revision&revision=63917
Author:   siepo
Date:     2022-07-17 10:24:29 +0200 (Sun, 17 Jul 2022)
Log Message:
-----------
Windows test for opening files to prevent doomed updates

Added Paths:
-----------
    trunk/Master/source/wtestopenfiles.README
    trunk/Master/source/wtestopenfiles.c

Added: trunk/Master/source/wtestopenfiles.README
===================================================================
--- trunk/Master/source/wtestopenfiles.README	                        (rev 0)
+++ trunk/Master/source/wtestopenfiles.README	2022-07-17 08:24:29 UTC (rev 63917)
@@ -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


Property changes on: trunk/Master/source/wtestopenfiles.README
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/source/wtestopenfiles.c
===================================================================
--- trunk/Master/source/wtestopenfiles.c	                        (rev 0)
+++ trunk/Master/source/wtestopenfiles.c	2022-07-17 08:24:29 UTC (rev 63917)
@@ -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 );
+  }
+}


Property changes on: trunk/Master/source/wtestopenfiles.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


More information about the tex-live-commits mailing list.