Implement I/O abstraction layer. Finally.
diff --git a/lib/zip_discard.c b/lib/zip_discard.c
index 3fc6d8f..2ca11df 100644
--- a/lib/zip_discard.c
+++ b/lib/zip_discard.c
@@ -49,11 +49,10 @@
     if (za == NULL)
 	return;
 
-    if (za->zn)
-	free(za->zn);
-
-    if (za->zp)
-	fclose(za->zp);
+    if (za->src) {
+	zip_source_close(za->src);
+	zip_source_free(za->src);
+    }
 
     free(za->default_password);
     _zip_string_free(za->comment_orig);
@@ -65,12 +64,12 @@
 	free(za->entry);
     }
 
-    for (i=0; i<za->nsource; i++) {
-	_zip_source_filep_invalidate(za->source[i]);
+    for (i=0; i<za->nopen_source; i++) {
+	_zip_source_invalidate(za->open_source[i]);
     }
+    free(za->open_source);
 
-    _zip_error_fini(&za->error);
-    free(za->source);
+    zip_error_fini(&za->error);
     
     free(za);