Fix remaining bugs, and ensure correct calling sequences for source functions.

All tests (and all ckmame tests) pass.

--HG--
branch : HEAD
diff --git a/lib/zip_source_open.c b/lib/zip_source_open.c
index 9923bda..a279e20 100644
--- a/lib/zip_source_open.c
+++ b/lib/zip_source_open.c
@@ -42,25 +42,35 @@
 {
     zip_int64_t ret;
 
-    if (src->src == NULL)
-	return src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_OPEN);
-
-    if (zip_source_open(src->src) < 0) {
-	src->error_source = ZIP_LES_LOWER;
+    if (src->is_open) {
+	src->error_source = ZIP_LES_INVAL;
 	return -1;
     }
 
-    ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN);
-
-    if (ret < 0) {
-	(void)zip_source_close(src->src);
-
-	if (ret == ZIP_SOURCE_ERR_LOWER)
+    if (src->src == NULL) {
+	if (src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_OPEN) < 0)
+	    return -1;
+    }
+    else {
+	if (zip_source_open(src->src) < 0) {
 	    src->error_source = ZIP_LES_LOWER;
-	else
-	    src->error_source = ZIP_LES_UPPER;
-	return -1;
+	    return -1;
+	}
+
+	ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN);
+	
+	if (ret < 0) {
+	    (void)zip_source_close(src->src);
+	    
+	    if (ret == ZIP_SOURCE_ERR_LOWER)
+		src->error_source = ZIP_LES_LOWER;
+	    else
+		src->error_source = ZIP_LES_UPPER;
+	    return -1;
+	}
     }
+
+    src->is_open = 1;
     
     return 0;
 }