+ return 0;
+#elif defined(WIN32)
+ return sync_win32 ();
+#else
+#error "no known sync() API"
+#endif
+}
+
+#ifdef WIN32
+static int
+sync_win32 (void)
+{
+ DWORD n1, n2;
+
+ n1 = GetLogicalDriveStrings (0, NULL);
+ if (n1 == 0)
+ return -1;
+
+ TCHAR buffer[n1+2]; /* sic */
+ n2 = GetLogicalDriveStrings (n1, buffer);
+ if (n2 == 0)
+ return -1;
+
+ TCHAR *p = buffer;
+
+ /* The MSDN example code itself assumes that there is always one
+ * drive in the system. However we will be better than that and not
+ * make the assumption ...
+ */
+ while (*p) {
+ HANDLE drive;
+ DWORD drive_type;
+
+ if (verbose)
+ fprintf (stderr, "sync_win32: examining drive %s\n", p);
+
+ /* Ignore removable drives. */
+ drive_type = GetDriveType (p);
+ if (drive_type == DRIVE_FIXED) {
+ /* To open the volume you have to specify the volume name, not
+ * the mount point. MSDN documents use of the constant 50
+ * below.
+ */
+ TCHAR volname[50];
+ if (!GetVolumeNameForVolumeMountPoint (p, volname, 50))
+ return -1;
+
+ drive = CreateFile (volname, GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_READ|FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, 0);
+ if (drive == INVALID_HANDLE_VALUE)
+ return -1;
+ if (verbose)
+ fprintf (stderr, "sync_win32: flushing %s\n", volname);
+
+ BOOL r;
+ /* This always fails in Wine:
+ * http://bugs.winehq.org/show_bug.cgi?id=14915
+ */
+ r = FlushFileBuffers (drive);
+ CloseHandle (drive);
+ if (!r)
+ return -1;
+ }
+
+ /* Skip to next \0 character. */
+ while (*p++);
+ }
+