--- configure.ac | 1 + plugins/file/Makefile.am | 2 ++ plugins/file/file.c | 23 ++++++++++++++++++----- TODO | 8 +++++--- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index faae1ca7..7060f445 100644 --- a/configure.ac +++ b/configure.ac @@ -322,6 +322,7 @@ AC_CHECK_HEADERS([\ stdatomic.h \ syslog.h \ sys/endian.h \ + sys/ioctl.h \ sys/mman.h \ sys/prctl.h \ sys/procctl.h \ diff --git a/plugins/file/Makefile.am b/plugins/file/Makefile.am index a067d0fc..24c443c1 100644 --- a/plugins/file/Makefile.am +++ b/plugins/file/Makefile.am @@ -43,6 +43,7 @@ nbdkit_file_plugin_la_SOURCES = \ nbdkit_file_plugin_la_CPPFLAGS = \ -I$(top_srcdir)/include \ -I$(top_srcdir)/common/include \ + -I$(top_srcdir)/common/replacements \ -I$(top_srcdir)/common/utils \ $(NULL) nbdkit_file_plugin_la_CFLAGS = $(WARNINGS_CFLAGS) @@ -52,6 +53,7 @@ nbdkit_file_plugin_la_LDFLAGS = \ $(NULL) nbdkit_file_plugin_la_LIBADD = \ $(top_builddir)/common/utils/libutils.la \ + $(top_builddir)/common/replacements/libcompat.la \ $(IMPORT_LIBRARY_ON_WINDOWS) \ $(NULL) diff --git a/plugins/file/file.c b/plugins/file/file.c index 08418194..b8c72e77 100644 --- a/plugins/file/file.c +++ b/plugins/file/file.c @@ -39,10 +39,13 @@ #include <inttypes.h> #include <fcntl.h> #include <unistd.h> +#include <errno.h> #include <sys/types.h> #include <sys/stat.h> + +#ifdef HAVE_SYS_IOCTL_H #include <sys/ioctl.h> -#include <errno.h> +#endif #include <pthread.h> @@ -59,10 +62,10 @@ #include "cleanup.h" #include "isaligned.h" - -#ifndef HAVE_FDATASYNC -#define fdatasync fsync -#endif +#include "fdatasync.h" +#include "pread.h" +#include "pwrite.h" +#include "windows-compat.h" static char *filename = NULL; static char *directory = NULL; @@ -116,6 +119,7 @@ file_config (const char *key, const char *value) if (!filename) return -1; } +#ifndef WIN32 else if (strcmp (key, "directory") == 0 || strcmp (key, "dir") == 0) { free (directory); @@ -123,6 +127,7 @@ file_config (const char *key, const char *value) if (!directory) return -1; } +#endif else if (strcmp (key, "fadvise") == 0) { /* As this is a hint, if the kernel doesn't support the feature * ignore the parameter. @@ -263,6 +268,7 @@ file_open (int readonly) int dfd = -1; if (directory) { +#ifndef WIN32 file = nbdkit_export_name (); if (strchr (file, '/')) { nbdkit_error ("exportname cannot contain /"); @@ -274,6 +280,9 @@ file_open (int readonly) nbdkit_error ("open %s: %m", directory); return NULL; } +#else + abort (); +#endif } else file = filename; @@ -290,7 +299,11 @@ file_open (int readonly) else flags |= O_RDWR; +#ifndef WIN32 h->fd = openat (dfd, file, flags); +#else + h->fd = open (file, flags); +#endif if (h->fd == -1) { nbdkit_error ("openat: %s: %m", file); if (dfd != -1) diff --git a/TODO b/TODO index c3314d37..b2b89670 100644 --- a/TODO +++ b/TODO @@ -325,9 +325,11 @@ Currently many features are missing, including: * For possible Unix domain socket support in future see: https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ -* The file plugin. The current file plugin is essentially POSIX-only. - We would like to eventually write an alternate file plugin which - uses Windows APIs. +* The current file plugin works but has limited features and doesn't + use the best native APIs. It's worth considering writing an + alternate implementation which is used for Windows and uses all + native APIs and features. Also this should be extended to allow + exporting block devices. * Many other plugins and filters. -- 2.27.0