API cleanup (see ChangeLog)

--HG--
branch : HEAD
diff --git a/lib/zip_open.c b/lib/zip_open.c
index ee89a79..3323e11 100644
--- a/lib/zip_open.c
+++ b/lib/zip_open.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_open.c,v 1.15 2003/10/01 09:51:00 dillo Exp $
+  $NiH: zip_open.c,v 1.16 2003/10/02 14:13:31 dillo Exp $
 
   zip_open.c -- open zip file
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -46,6 +46,7 @@
 #include "zip.h"
 #include "zipint.h"
 
+static void set_error(int *errp, int err);
 static struct zip *_zip_readcdir(FILE *fp, unsigned char *buf,
 			   unsigned char *eocd, int buflen);
 static int _zip_read2(unsigned char **a);
@@ -69,7 +70,7 @@
    zipfile struct, or NULL if unsuccessful, setting zip_err. */
 
 struct zip *
-zip_open(const char *fn, int flags)
+zip_open(const char *fn, int flags, int *errp)
 {
     FILE *fp;
     unsigned char *buf, *match;
@@ -79,32 +80,34 @@
     struct stat st;
 
     if (fn == NULL) {
-	zip_err = ZERR_INVAL;
+	set_error(errp, ZERR_INVAL);
 	return NULL;
     }
     
     if (stat(fn, &st) != 0) {
 	if (flags & ZIP_CREATE) {
 	    cdir = _zip_new();
+	    /* XXX: check cdir != NULL */
 	    cdir->zn = strdup(fn);
 	    if (!cdir->zn) {
-		zip_err = ZERR_MEMORY;
+		/* XXX: free cdir */
+		set_error(errp, ZERR_MEMORY);
 		return NULL;
 	    }
 	    return cdir;
 	} else {
-	    zip_err = ZERR_NOENT;
+	    set_error(errp, ZERR_NOENT);
 	    return NULL;
 	}
     } else if ((flags & ZIP_EXCL)) {
-	zip_err = ZERR_EXISTS;
+	set_error(errp, ZERR_EXISTS);
 	return NULL;
     }
     /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL,
        just like open() */
     
     if ((fp=fopen(fn, "rb"))==NULL) {
-	zip_err = ZERR_OPEN;
+	set_error(errp, ZERR_OPEN);
 	return NULL;
     }
     
@@ -114,14 +117,16 @@
     i = fseek(fp, -(len < BUFSIZE ? len : BUFSIZE), SEEK_END);
     if (i == -1 && errno != EFBIG) {
 	/* seek before start of file on my machine */
-	zip_err = ZERR_SEEK;
+	set_error(errp, ZERR_SEEK);
 	fclose(fp);
 	return NULL;
     }
 
+    /* XXX: why not allocate statically? */
     buf = (unsigned char *)malloc(BUFSIZE);
     if (!buf) {
-	zip_err = ZERR_MEMORY;
+	set_error(errp, ZERR_MEMORY);
+	fclose(fp);
 	return NULL;
     }
 
@@ -129,7 +134,7 @@
     buflen = fread(buf, 1, BUFSIZE, fp);
 
     if (ferror(fp)) {
-	zip_err = ZERR_READ;
+	set_error(errp, ZERR_READ);
 	free(buf);
 	fclose(fp);
 	return NULL;
@@ -170,7 +175,7 @@
 
     if (best < 0) {
 	/* no consistent eocd found */
-	zip_err = ZERR_NOZIP;
+	set_error(errp, ZERR_NOZIP);
 	free(buf);
 	_zip_free(cdir);
 	fclose(fp);
@@ -181,7 +186,9 @@
 
     cdir->zn = strdup(fn);
     if (!cdir->zn) {
-	zip_err = ZERR_MEMORY;
+	set_error(errp, ZERR_MEMORY);
+	_zip_free(cdir);
+	fclose(fp);
 	return NULL;
     }
 
@@ -192,6 +199,15 @@
 
 
 
+static void
+set_error(int *errp, int err)
+{
+    if (errp)
+	*errp = err;
+}
+
+
+
 /* _zip_readcdir:
    tries to find a valid end-of-central-directory at the beginning of
    buf, and then the corresponding central directory entries.