Add userdata pointer for implementations.
diff --git a/lib/zip_source_file.h b/lib/zip_source_file.h
index dd726dc..6cf29c0 100644
--- a/lib/zip_source_file.h
+++ b/lib/zip_source_file.h
@@ -61,6 +61,7 @@
     void *fout;
 
     zip_source_file_operations_t *ops;
+    void *ops_userdata;
 };
 
 
@@ -86,4 +87,4 @@
     zip_int64_t (*write)(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len);
 };
 
-zip_source_t *zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_source_file_operations_t *ops, zip_error_t *error);
+zip_source_t *zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_source_file_operations_t *ops, void *ops_userdata, zip_error_t *error);
diff --git a/lib/zip_source_file_common.c b/lib/zip_source_file_common.c
index 845b968..0c7fe5f 100644
--- a/lib/zip_source_file_common.c
+++ b/lib/zip_source_file_common.c
@@ -50,7 +50,7 @@
 }
 
 zip_source_t *
-zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_source_file_operations_t *ops, zip_error_t *error) {
+zip_source_file_common_new(const char *fname, void *file, zip_uint64_t start, zip_int64_t len, const zip_stat_t *st, zip_source_file_operations_t *ops, void *ops_userdata, zip_error_t *error) {
     zip_source_file_context_t *ctx;
     zip_source_t *zs;
     zip_source_file_stat_t sb;
@@ -97,6 +97,7 @@
     }
 
     ctx->ops = ops;
+    ctx->ops_userdata = ops_userdata;
     ctx->fname = NULL;
     if (fname) {
 	if ((ctx->fname = ops->strdup(fname)) == NULL) {
diff --git a/lib/zip_source_file_stdio.c b/lib/zip_source_file_stdio.c
index 952629a..538797c 100644
--- a/lib/zip_source_file_stdio.c
+++ b/lib/zip_source_file_stdio.c
@@ -48,7 +48,7 @@
 #endif
 
 /* clang-format off */
-zip_source_file_operations_t ops_stdio_read = {
+static zip_source_file_operations_t ops_stdio_read = {
     _zip_stdio_op_close,
     NULL,
     NULL,
@@ -83,7 +83,7 @@
 	return NULL;
     }
 
-    return zip_source_file_common_new(NULL, file, start, length, NULL, &ops_stdio_read, error);
+    return zip_source_file_common_new(NULL, file, start, length, NULL, &ops_stdio_read, NULL, error);
 }
 
 
diff --git a/lib/zip_source_file_stdio_write.c b/lib/zip_source_file_stdio_write.c
index d6a182e..704dcb2 100644
--- a/lib/zip_source_file_stdio_write.c
+++ b/lib/zip_source_file_stdio_write.c
@@ -61,7 +61,7 @@
 static zip_int64_t _zip_stdio_op_write(zip_source_file_context_t *ctx, const void *data, zip_uint64_t len);
 
 /* clang-format off */
-zip_source_file_operations_t ops_stdio_write = {
+static zip_source_file_operations_t ops_stdio_write = {
     _zip_stdio_op_close,
     _zip_stdio_op_commit_write,
     _zip_stdio_op_create_temp_output,
@@ -98,7 +98,7 @@
 	return NULL;
     }
 
-    return zip_source_file_common_new(fname, NULL, start, length, NULL, &ops_stdio_write, error);
+    return zip_source_file_common_new(fname, NULL, start, length, NULL, &ops_stdio_write, NULL, error);
 }