Close source zips after target zip is written.

--HG--
branch : HEAD
diff --git a/src/zipmerge.c b/src/zipmerge.c
index a842400..03af58a 100644
--- a/src/zipmerge.c
+++ b/src/zipmerge.c
@@ -1,6 +1,6 @@
 /*
   zipmerge.c -- merge zip archives
-  Copyright (C) 2004-2007 Dieter Baron and Thomas Klausner
+  Copyright (C) 2004-2008 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
   The authors can be contacted at <libzip@nih.at>
@@ -70,7 +70,7 @@
 Report bugs to <libizp@nih.at>.\n";
 
 char version_string[] = PROGRAM " (" PACKAGE " " VERSION ")\n\
-Copyright (C) 2007 Dieter Baron and Thomas Klausner\n\
+Copyright (C) 2008 Dieter Baron and Thomas Klausner\n\
 " PACKAGE " comes with ABSOLUTELY NO WARRANTY, to the extent permitted by law.\n";
 
 #define OPTIONS "hVDiIsS"
@@ -85,7 +85,7 @@
 
 static int confirm_replace(struct zip *, const char *, int,
 			   struct zip *, const char *, int);
-static int merge_zip(struct zip *za, const char *, const char *);
+static int merge_zip(struct zip *za, const char *, const char *, struct zip **);
 
 
 
@@ -93,7 +93,8 @@
 main(int argc, char *argv[])
 {
     struct zip *za;
-    int c, err;
+    struct zip **zs;
+    int c, err, i;
     char errstr[1024], *tname;
 
     prg = argv[0];
@@ -142,6 +143,12 @@
     }
 
     tname = argv[optind++];
+
+    if ((zs=malloc(sizeof(zs[0])*(argc-optind))) == NULL) {
+	fprintf(stderr, "%s: out of memory\n", prg);
+	exit(1);
+    }
+
     if ((za=zip_open(tname, ZIP_CREATE, &err)) == NULL) {
 	zip_error_to_str(errstr, sizeof(errstr), err, errno);
 	fprintf(stderr, "%s: cannot open zip archive `%s': %s\n",
@@ -149,8 +156,8 @@
 	exit(1);
     }
 
-    while (optind<argc) {
-	if (merge_zip(za, tname, argv[optind++]) < 0)
+    for (i=0; i<argc-optind; i++) {
+	if (merge_zip(za, tname, argv[optind+i], zs+i) < 0)
 	    exit(1);
     }
 
@@ -160,6 +167,9 @@
 	exit(1);
     }
 
+    for (i=0; i<argc-optind; i++)
+	zip_close(zs[i]);
+
     exit(0);
 }
 
@@ -216,7 +226,8 @@
 
 
 static int
-merge_zip(struct zip *za, const char *tname, const char *sname)
+merge_zip(struct zip *za, const char *tname, const char *sname,
+	  struct zip **zsp)
 {
     struct zip *zs;
     struct zip_source *source;
@@ -275,6 +286,6 @@
 	}
     }
 
-    zip_close(zs);
+    *zsp = zs;
     return 0;
 }