Add zip_file_is_seekable().
diff --git a/NEWS.md b/NEWS.md
index c6a4181..0bc9fec 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,9 @@
+1.9.0 [202x-xx-xx]
+==================
+
+* Add `zip_source_is_seekable()`.
+* Improve compatibility with WinAES.
+
 1.8.0 [2021-06-18]
 ==================
 
diff --git a/developer-xcode/libzip.xcodeproj/project.pbxproj b/developer-xcode/libzip.xcodeproj/project.pbxproj
index c0c8312..acd593a 100644
--- a/developer-xcode/libzip.xcodeproj/project.pbxproj
+++ b/developer-xcode/libzip.xcodeproj/project.pbxproj
@@ -929,6 +929,20 @@
 		4BDC729915B1B2A600236D3C /* zipint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zipint.h; path = ../lib/zipint.h; sourceTree = "<group>"; };
 		4BDC729E15B1B4E900236D3C /* zipconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zipconf.h; sourceTree = SOURCE_ROOT; };
 		4BDC72A015B1B56400236D3C /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = SOURCE_ROOT; };
+		4BE3AA532719BF8300643F7C /* zip_source_win32a.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_win32a.mdoc; sourceTree = "<group>"; };
+		4BE3AA542719BF8300643F7C /* zip_encryption_method_supported.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_encryption_method_supported.mdoc; sourceTree = "<group>"; };
+		4BE3AA552719BF8300643F7C /* zip_file_attributes_init.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_attributes_init.mdoc; sourceTree = "<group>"; };
+		4BE3AA562719BF8400643F7C /* zip_compression_method_supported.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_compression_method_supported.mdoc; sourceTree = "<group>"; };
+		4BE3AA572719BF8400643F7C /* zip_source_win32w.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_win32w.mdoc; sourceTree = "<group>"; };
+		4BE3AA582719BF8400643F7C /* zip_register_cancel_callback_with_state.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_register_cancel_callback_with_state.mdoc; sourceTree = "<group>"; };
+		4BE3AA592719BF8400643F7C /* ziptool.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = ziptool.mdoc; sourceTree = "<group>"; };
+		4BE3AA5A2719BF8400643F7C /* zip_source_win32handle.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_source_win32handle.mdoc; sourceTree = "<group>"; };
+		4BE3AA5B2719BF8400643F7C /* zip_register_progress_callback_with_state.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_register_progress_callback_with_state.mdoc; sourceTree = "<group>"; };
+		4BE3AA5C2719BFAA00643F7C /* zip_file_set_encryption.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_file_set_encryption.mdoc; sourceTree = "<group>"; };
+		4BE3AA5D2719BFAA00643F7C /* zip_register_progress_callback.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_register_progress_callback.mdoc; sourceTree = "<group>"; };
+		4BE3AA5E2719BFAB00643F7C /* zip_fseek.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_fseek.mdoc; sourceTree = "<group>"; };
+		4BE3AA5F2719BFE000643F7C /* zip_libzip_version.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_libzip_version.mdoc; sourceTree = "<group>"; };
+		4BE3AA602719BFE000643F7C /* zip_ftell.mdoc */ = {isa = PBXFileReference; lastKnownFileType = text; path = zip_ftell.mdoc; sourceTree = "<group>"; };
 		4BE402AC19D94AE400298248 /* zip_source_is_deleted.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip_source_is_deleted.c; sourceTree = "<group>"; };
 		4BE92AA420345E2E00509BC8 /* libgnutls.30.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libgnutls.30.dylib; path = ../../../../../../opt/pkg/lib/libgnutls.30.dylib; sourceTree = "<group>"; };
 		4BE92AA620345E3800509BC8 /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; };
@@ -1099,9 +1113,11 @@
 				4B28A9ED15BACC3900D0C17D /* zip_add_dir.mdoc */,
 				4B28A9EE15BACC3900D0C17D /* zip_add.mdoc */,
 				4B28A9EF15BACC3900D0C17D /* zip_close.mdoc */,
+				4BE3AA562719BF8400643F7C /* zip_compression_method_supported.mdoc */,
 				4B28A9F015BACC3900D0C17D /* zip_delete.mdoc */,
 				4B28A9F115BACC3900D0C17D /* zip_dir_add.mdoc */,
 				4B28A9F215BACC3900D0C17D /* zip_discard.mdoc */,
+				4BE3AA542719BF8300643F7C /* zip_encryption_method_supported.mdoc */,
 				4B28A9F315BACC3900D0C17D /* zip_error_clear.mdoc */,
 				4B1E46E51A08CB7600A376D2 /* zip_error_code_system.mdoc */,
 				4B1E46E61A08CB7600A376D2 /* zip_error_code_zip.mdoc */,
@@ -1118,6 +1134,7 @@
 				4B28A9F815BACC3900D0C17D /* zip_fclose.mdoc */,
 				4B28A9F915BACC3900D0C17D /* zip_fdopen.mdoc */,
 				4B28A9FA15BACC3900D0C17D /* zip_file_add.mdoc */,
+				4BE3AA552719BF8300643F7C /* zip_file_attributes_init.mdoc */,
 				4B28A9FB15BACC3900D0C17D /* zip_file_extra_field_delete.mdoc */,
 				4B28A9FC15BACC3900D0C17D /* zip_file_extra_field_get.mdoc */,
 				4B28A9FD15BACC3900D0C17D /* zip_file_extra_field_set.mdoc */,
@@ -1127,12 +1144,15 @@
 				4B26FF151A07DF1A000E9788 /* zip_file_get_external_attributes.mdoc */,
 				4B28AA0015BACC3900D0C17D /* zip_file_rename.mdoc */,
 				4B28AA0115BACC3900D0C17D /* zip_file_set_comment.mdoc */,
+				4BE3AA5C2719BFAA00643F7C /* zip_file_set_encryption.mdoc */,
 				4B26FF161A07DF1A000E9788 /* zip_file_set_external_attributes.mdoc */,
 				4B26FF171A07DF1A000E9788 /* zip_file_set_mtime.mdoc */,
 				4B28AA0215BACC3900D0C17D /* zip_file_strerror.mdoc */,
 				4B28AA0315BACC3900D0C17D /* zip_fopen_encrypted.mdoc */,
 				4B28AA0415BACC3900D0C17D /* zip_fopen.mdoc */,
 				4B28AA0515BACC3900D0C17D /* zip_fread.mdoc */,
+				4BE3AA5E2719BFAB00643F7C /* zip_fseek.mdoc */,
+				4BE3AA602719BFE000643F7C /* zip_ftell.mdoc */,
 				4B28AA0615BACC3900D0C17D /* zip_get_archive_comment.mdoc */,
 				4B28AA0715BACC3900D0C17D /* zip_get_archive_flag.mdoc */,
 				4BC3863E1A1BE00E00CDCAAC /* zip_get_error.mdoc */,
@@ -1140,8 +1160,12 @@
 				4B28AA0915BACC3900D0C17D /* zip_get_name.mdoc */,
 				4B28AA0A15BACC3900D0C17D /* zip_get_num_entries.mdoc */,
 				4B28AA0B15BACC3900D0C17D /* zip_get_num_files.mdoc */,
+				4BE3AA5F2719BFE000643F7C /* zip_libzip_version.mdoc */,
 				4B28AA0C15BACC3900D0C17D /* zip_name_locate.mdoc */,
 				4B28AA0D15BACC3900D0C17D /* zip_open.mdoc */,
+				4BE3AA582719BF8400643F7C /* zip_register_cancel_callback_with_state.mdoc */,
+				4BE3AA5B2719BF8400643F7C /* zip_register_progress_callback_with_state.mdoc */,
+				4BE3AA5D2719BFAA00643F7C /* zip_register_progress_callback.mdoc */,
 				4B28AA0E15BACC3900D0C17D /* zip_rename.mdoc */,
 				4B28AA0F15BACC3900D0C17D /* zip_set_archive_comment.mdoc */,
 				4B28AA1015BACC3900D0C17D /* zip_set_archive_flag.mdoc */,
@@ -1171,6 +1195,9 @@
 				4BC3864C1A1BE00E00CDCAAC /* zip_source_stat.mdoc */,
 				4BC3864D1A1BE00E00CDCAAC /* zip_source_tell_write.mdoc */,
 				4BC3864E1A1BE00E00CDCAAC /* zip_source_tell.mdoc */,
+				4BE3AA532719BF8300643F7C /* zip_source_win32a.mdoc */,
+				4BE3AA5A2719BF8400643F7C /* zip_source_win32handle.mdoc */,
+				4BE3AA572719BF8400643F7C /* zip_source_win32w.mdoc */,
 				4BFBC77D267C9BD900862EC4 /* zip_source_window.mdoc */,
 				4BC3864F1A1BE00E00CDCAAC /* zip_source_write.mdoc */,
 				4B28AA1915BACC3900D0C17D /* zip_source_zip.mdoc */,
@@ -1182,6 +1209,7 @@
 				4B28AA1E15BACC3900D0C17D /* zip_unchange.mdoc */,
 				4B28AA1F15BACC3900D0C17D /* zipcmp.mdoc */,
 				4B28AA2015BACC3900D0C17D /* zipmerge.mdoc */,
+				4BE3AA592719BF8400643F7C /* ziptool.mdoc */,
 			);
 			name = man;
 			path = ../man;
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 1069cec..5ec2451 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -172,7 +172,7 @@
 endif()
 
 if(SHARED_LIB_VERSIONNING)
-  set_target_properties(zip PROPERTIES VERSION 5.4 SOVERSION 5)
+  set_target_properties(zip PROPERTIES VERSION 5.5 SOVERSION 5)
 endif()
 
 target_link_libraries(zip PRIVATE ZLIB::ZLIB)
diff --git a/lib/zip.h b/lib/zip.h
index 4b9b9e9..c211ed1 100644
--- a/lib/zip.h
+++ b/lib/zip.h
@@ -397,6 +397,7 @@
 ZIP_EXTERN const char *_Nullable zip_file_get_comment(zip_t *_Nonnull, zip_uint64_t, zip_uint32_t *_Nullable, zip_flags_t);
 ZIP_EXTERN zip_error_t *_Nonnull zip_file_get_error(zip_file_t *_Nonnull);
 ZIP_EXTERN int zip_file_get_external_attributes(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t *_Nullable, zip_uint32_t *_Nullable);
+ZIP_EXTERN int zip_file_is_seekable(zip_file_t *_Nonnull);
 ZIP_EXTERN int zip_file_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull, zip_flags_t);
 ZIP_EXTERN int zip_file_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull, zip_flags_t);
 ZIP_EXTERN int zip_file_set_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, zip_uint16_t, zip_flags_t);
diff --git a/lib/zip_fseek.c b/lib/zip_fseek.c
index 542ca07..2eeab81 100644
--- a/lib/zip_fseek.c
+++ b/lib/zip_fseek.c
@@ -49,3 +49,13 @@
 
     return 0;
 }
+
+
+ZIP_EXTERN int
+zip_file_is_seekable(zip_file_t *zfile) {
+    if (!zfile) {
+        return -1;
+    }
+    
+    return (zip_source_supports(zfile->src) & ZIP_SOURCE_SEEK) != 0;
+}
diff --git a/man/libzip.mdoc b/man/libzip.mdoc
index 8799d30..d7822d6 100644
--- a/man/libzip.mdoc
+++ b/man/libzip.mdoc
@@ -29,7 +29,7 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd April 6, 2021
+.Dd October 15, 2021
 .Dt LIBZIP 3
 .Os
 .Sh NAME
@@ -101,11 +101,12 @@
 .It
 .Xr zip_fread 3
 .It
+.Xr zip_file_is_seekable 3
+.It
 .Xr zip_fseek 3
 (uncompressed files only)
 .It
 .Xr zip_ftell 3
-(uncompressed files only)
 .It
 .Xr zip_fclose 3
 .El
diff --git a/man/zip_fseek.mdoc b/man/zip_fseek.mdoc
index 756ca27..cc88f67 100644
--- a/man/zip_fseek.mdoc
+++ b/man/zip_fseek.mdoc
@@ -29,11 +29,12 @@
 .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd December 18, 2017
+.Dd October 15, 2021
 .Dt ZIP_FSEEK 3
 .Os
 .Sh NAME
-.Nm zip_fseek
+.Nm zip_fseek ,
+.Nm zip_file_is_seekable
 .Nd seek in file
 .Sh LIBRARY
 libzip (-lzip)
@@ -41,6 +42,8 @@
 .In zip.h
 .Ft zip_int8_t
 .Fn zip_fseek "zip_file_t *file" "zip_int64_t offset" "int whence"
+.Ft int
+.Fn zip_file_is_seekable "zip_file_t *file"
 .Sh DESCRIPTION
 The
 .Fn zip_fseek
@@ -54,11 +57,19 @@
 .Nm
 only works on uncompressed (stored) data.
 When called on compressed data it will return an error.
+.Pp
+The
+.Fn zip_file_is_seekable
+function returns 1 if a file is seekable.
 .Sh RETURN VALUES
 If successful,
-.Nm
+.Fn zip_fseek
 returns 0.
 Otherwise, \-1 is returned.
+.Pp
+.Fn zip_file_is_seekable
+returns 1 if a file is seekable and 0 if not.
+On an invalid argument, it returns \-1.
 .Sh SEE ALSO
 .Xr libzip 3 ,
 .Xr zip_fclose 3 ,
@@ -68,6 +79,8 @@
 .Sh HISTORY
 .Fn zip_fseek
 was added in libzip 1.2.0.
+.Fn zip_file_is_seekable
+was added in libzip 1.9.0.
 .Sh AUTHORS
 .An -nosplit
 .An Dieter Baron Aq Mt dillo@nih.at