API and error handling cleanups

--HG--
branch : HEAD
diff --git a/lib/zip_close.c b/lib/zip_close.c
index b202288..12fd6f3 100644
--- a/lib/zip_close.c
+++ b/lib/zip_close.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_close.c,v 1.34 2003/10/03 07:58:38 dillo Exp $
+  $NiH: zip_close.c,v 1.35 2003/10/04 07:39:52 dillo Exp $
 
   zip_close.c -- close zip archive and update changes
   Copyright (C) 1999 Dieter Baron and Thomas Klausner
@@ -76,8 +76,10 @@
     struct zip *tzf;
     mode_t mask;
 
-    if (zf->changes == 0)
-	return _zip_free(zf);
+    if (zf->changes == 0) {
+	_zip_free(zf);
+	return 0;
+    }
 
     /* look if there really are any changes */
     count = survivors = 0;
@@ -91,23 +93,24 @@
     }
 
     /* no changes, all has been unchanged */
-    if (count == 0)
-	return _zip_free(zf);
+    if (count == 0) {
+	_zip_free(zf);
+	return 0;
+    }
 
     /* don't create zip files with no entries */
     if (survivors == 0) {
 	ret = 0;
 	if (zf->zn)
 	    ret = remove(zf->zn);
-	if (ret == 0)
-	    return _zip_free(zf);
 	_zip_free(zf);
+	/* XXX: inconsistent: zf freed, returned -1 */
 	return ret;
     }	       
 	
     temp = (char *)malloc(strlen(zf->zn)+8);
     if (!temp) {
-	zip_err = ZERR_MEMORY;
+	_zip_error_set(&zf->error, ZERR_MEMORY, 0);
 	return -1;
     }
 
@@ -115,12 +118,13 @@
 
     tfd = mkstemp(temp);
     if (tfd == -1) {
-	zip_err = ZERR_TMPOPEN;
+	_zip_error_set(&zf->error, ZERR_TMPOPEN, errno);
+	free(temp);
 	return -1;
     }
     
     if ((tfp=fdopen(tfd, "r+b")) == NULL) {
-	zip_err = ZERR_TMPOPEN;
+	_zip_error_set(&zf->error, ZERR_TMPOPEN, errno);
 	remove(temp);
 	free(temp);
 	close(tfd);
@@ -131,23 +135,13 @@
     tzf->zp = tfp;
     tzf->zn = temp;
     tzf->nentry = 0;
+    tzf->entry = NULL;
+    tzf->nentry_alloc = 0;
     tzf->comlen = zf->comlen;
     tzf->cd_size = tzf->cd_offset = 0;
     tzf->com = (unsigned char *)_zip_memdup(zf->com, zf->comlen);
     /* XXX: bail out if tzf->com == NULL; */
 
-    /*    tzf->entry = (struct zip_entry *)malloc(sizeof(struct
-	  zip_entry)*ALLOC_SIZE);
-	  if (!tzf->entry) {
-	  zip_err = ZERR_MEMORY;
-	  return -1;
-	  }
-
-	  tzf->nentry_alloc = ALLOC_SIZE;
-    */
-    tzf->entry = NULL;
-    tzf->nentry_alloc = 0;
-    
     count = 0;
     if (zf->entry) {
 	for (i=0; i<zf->nentry; i++) {
@@ -188,24 +182,22 @@
     
     if (fclose(tzf->zp)==0) {
 	tzf->zp = NULL;
+	if (rename(tzf->zn, zf->zn) != 0) {
+	    _zip_error_set(&zf->error, ZERR_RENAME, errno);
+	    remove(tzf->zn);
+	    _zip_free(tzf);
+	    return -1;
+	}
 	if (zf->zp) {
 	    fclose(zf->zp);
 	    zf->zp = NULL;
 	}
-	if (rename(tzf->zn, zf->zn) != 0) {
-	    zip_err = ZERR_RENAME;
-	    remove(tzf->zn);
-	    _zip_free(tzf);
-	    zf->zp = fopen(zf->zn, "rb");
-	    /* XXX: can't handle open error usefully */
-	    return -1;
-	}
 	mask = umask(0);
 	umask(mask);
 	chmod(zf->zn, 0666&~mask);
     }
+    /* XXX: handle fclose(tzf->fn) error */
 
-    /* no errors possible, since files already closed */
     _zip_free(zf);
     _zip_free(tzf);
 
@@ -227,14 +219,14 @@
 	return -1;
 
     if (_zip_writecdentry(dest->zp, ze, 1) != 0) {
-	zip_err = ZERR_WRITE;
+	_zip_error_set(&src->error, ZERR_WRITE, errno);
 	return -1;
     }
 
     if (fseek(src->zp, src->entry[entry_no].meta->local_offset
 	      + LENTRYSIZE + src->entry[entry_no].meta->lef_len
 	      + src->entry[entry_no].file_fnlen, SEEK_SET) != 0) {
-	zip_err = ZERR_SEEK;
+	_zip_error_set(&src->error, ZERR_SEEK, errno);
 	return -1;
     }
 
@@ -245,11 +237,11 @@
 	if (len > remainder)
 	    len = remainder;
 	if (fread(buf, 1, len, src->zp)!=len) {
-	    zip_err = ZERR_READ;
+	    _zip_error_set(&src->error, ZERR_READ, errno);
 	    return -1;
 	}
 	if (fwrite(buf, 1, len, dest->zp)!=len) {
-	    zip_err = ZERR_WRITE;
+	    _zip_error_set(&src->error, ZERR_WRITE, errno);
 	    return -1;
 	}
 	remainder -= len;
diff --git a/lib/zip_delete.c b/lib/zip_delete.c
index 16a663a..c430788 100644
--- a/lib/zip_delete.c
+++ b/lib/zip_delete.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_delete.c,v 1.9 2003/10/02 14:13:29 dillo Exp $
+  $NiH: zip_delete.c,v 1.10 2003/10/03 08:34:11 dillo Exp $
 
   zip_delete.c -- delete file from zip archive
   Copyright (C) 1999 Dieter Baron and Thomas Klausner
@@ -44,7 +44,7 @@
 zip_delete(struct zip *zf, int idx)
 {
     if (idx < 0 || idx >= zf->nentry) {
-	zip_err = ZERR_INVAL;
+	_zip_error_set(&zf->error, ZERR_INVAL, 0);
 	return -1;
     }
 
diff --git a/lib/zip_error.c b/lib/zip_error.c
index 2e28a8c..3d5c3e1 100644
--- a/lib/zip_error.c
+++ b/lib/zip_error.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_error.c,v 1.1 2003/10/05 16:05:22 dillo Exp $
+  $NiH: zip_error.c,v 1.2 2003/10/06 02:50:05 dillo Exp $
 
   zip_error.c -- struct zip_error helper functions
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -43,6 +43,15 @@
 
 
 void
+_zip_error_copy(struct zip_error *dst, struct zip_error *src)
+{
+    dst->zip_err = src->zip_err;
+    dst->sys_err = src->sys_err;
+}
+
+
+
+void
 _zip_error_fini(struct zip_error *err)
 {
     free(err->str);
diff --git a/lib/zip_fopen.c b/lib/zip_fopen.c
index c46d401..3c31bce 100644
--- a/lib/zip_fopen.c
+++ b/lib/zip_fopen.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_fopen.c,v 1.6 2003/10/02 14:13:29 dillo Exp $
+  $NiH: zip_fopen.c,v 1.7 2003/10/03 08:34:11 dillo Exp $
 
   zip_fopen.c -- open file in zip archvie for reading
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -41,14 +41,12 @@
 
 
 struct zip_file *
-zip_fopen(struct zip *zf, const char *fname, int case_sens)
+zip_fopen(struct zip *za, const char *fname, int flags)
 {
     int idx;
 
-    if ((idx=zip_name_locate(zf, fname, case_sens)) < 0) {
-	zip_err = ZERR_NOENT;
+    if ((idx=zip_name_locate(za, fname, flags)) < 0)
 	return NULL;
-    }
 
-    return zip_fopen_index(zf, idx);
+    return zip_fopen_index(za, idx);
 }
diff --git a/lib/zip_fopen_index.c b/lib/zip_fopen_index.c
index b9192c7..51d663a 100644
--- a/lib/zip_fopen_index.c
+++ b/lib/zip_fopen_index.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_fopen_index.c,v 1.12 2003/10/02 14:13:29 dillo Exp $
+  $NiH: zip_fopen_index.c,v 1.13 2003/10/03 11:20:16 dillo Exp $
 
   zip_fopen_index.c -- open file in zip archive for reading by index
   Copyright (C) 1999 Dieter Baron and Thomas Klausner
@@ -49,25 +49,25 @@
 zip_fopen_index(struct zip *zf, int fileno)
 {
     unsigned char buf[4];
-    int len;
+    int len, ret;
     struct zip_file *zff;
 
     if ((fileno < 0) || (fileno >= zf->nentry)) {
-	zip_err = ZERR_INVAL;
+	_zip_error_set(&zf->error, ZERR_INVAL, 0);
 	return NULL;
     }
 
 #if 0
     if (zf->entry[fileno].state != ZIP_ST_UNCHANGED
 	&& zf->entry[fileno].state != ZIP_ST_RENAMED) {
-	zip_err = ZERR_CHANGED;
+	_zip_error_set(&zf->error, ZERR_CHANGED, 0);
 	return NULL;
     }
 #endif
 
     if ((zf->entry[fileno].meta->comp_method != 0)
 	&& (zf->entry[fileno].meta->comp_method != 8)) {
-	zip_err = ZERR_COMPNOTSUPP;
+	_zip_error_set(&zf->error, ZERR_COMPNOTSUPP, 0);
 	return NULL;
     }
 
@@ -82,13 +82,13 @@
     /* go to start of actual data */
     if (fseek(zf->zp, zf->entry[fileno].meta->local_offset+LENTRYSIZE-4,
 	      SEEK_SET) < 0) {
-	zip_err = ZERR_SEEK;
+	_zip_error_set(&zf->error, ZERR_SEEK, errno);
 	zip_fclose(zff);
 	return NULL;
     }
     len = fread(buf, 1, 4, zf->zp);
     if (len != 4) {
-	zip_err = ZERR_READ;
+	_zip_error_set(&zf->error, ZERR_READ, errno);
 	zip_fclose(zff);
 	return NULL;
     }
@@ -101,19 +101,20 @@
 	return zff;
     
     if ((zff->buffer=(char *)malloc(BUFSIZE)) == NULL) {
-	zip_err = ZERR_MEMORY;
+	_zip_error_set(&zf->error, ZERR_MEMORY, 0);
 	zip_fclose(zff);
 	return NULL;
     }
 
     len = _zip_file_fillbuf (zff->buffer, BUFSIZE, zff);
     if (len <= 0) {
+	_zip_error_copy(&zf->error, &zff->error);
 	zip_fclose(zff);
 	return NULL;
     }
 
     if ((zff->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) {
-	zip_err = ZERR_MEMORY;
+	_zip_error_set(&zf->error, ZERR_MEMORY, 0);
 	zip_fclose(zff);
 	return NULL;
     }
@@ -124,8 +125,8 @@
     zff->zstr->avail_in = len;
 
     /* negative value to tell zlib that there is no header */
-    if (inflateInit2(zff->zstr, -MAX_WBITS) != Z_OK) {
-	zip_err = ZERR_ZLIB;
+    if ((ret=inflateInit2(zff->zstr, -MAX_WBITS)) != Z_OK) {
+	_zip_error_set(&zf->error, ZERR_ZLIB, ret);
 	zip_fclose(zff);
 	return NULL;
     }
@@ -174,23 +175,27 @@
 static struct zip_file *
 _zip_file_new(struct zip *zf)
 {
-    struct zip_file *zff;
-
-    if (zf->nfile >= zf->nfile_alloc-1) {
-	zf->nfile_alloc += 10;
-	zf->file = (struct zip_file **)realloc(zf->file, zf->nfile_alloc
-					       *sizeof(struct zip_file *));
-	if (zf->file == NULL) {
-	    zip_err = ZERR_MEMORY;
-	    return NULL;
-	}
-    }
+    struct zip_file *zff, file;
+    int n;
 
     if ((zff=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) {
-	zip_err = ZERR_MEMORY;
+	_zip_error_set(&zf->error, ZERR_MEMORY, 0);
 	return NULL;
     }
     
+    if (zf->nfile >= zf->nfile_alloc-1) {
+	n = zf->nfile_alloc + 10;
+	file = (struct zip_file **)realloc(zf->file,
+					   n*sizeof(struct zip_file *));
+	if (file == NULL) {
+	    _zip_error_set(&zf->error, ZERR_MEMORY, 0);
+	    free(zff);
+	    return NULL;
+	}
+	zf->nfile_alloc = n;
+	zf->file = file;
+    }
+
     zf->file[zf->nfile++] = zff;
 
     zff->zf = zf;
diff --git a/lib/zip_free.c b/lib/zip_free.c
index 86eff21..e82a539 100644
--- a/lib/zip_free.c
+++ b/lib/zip_free.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_free.c,v 1.5 2003/03/16 10:21:39 wiz Exp $
+  $NiH: zip_free.c,v 1.6 2003/10/02 14:13:30 dillo Exp $
 
   zip_free.c -- free struct zip
   Copyright (C) 1999 Dieter Baron and Thomas Klausner
@@ -43,15 +43,12 @@
 
 /* _zip_free:
    frees the space allocated to a zipfile struct, and closes the
-   corresponding file. Returns 0 if successful, the error returned
-   by fclose if not. */
+   corresponding file. */
 
-int
+void
 _zip_free(struct zip *zf)
 {
-    int i, ret;
-
-    ret = 0;
+    int i;
 
     if (zf == NULL)
 	return 0;
@@ -60,7 +57,7 @@
 	free(zf->zn);
 
     if (zf->zp)
-	ret = fclose(zf->zp);
+	fclose(zf->zp);
 
     if (zf->com)
 	free(zf->com);
@@ -82,8 +79,5 @@
     
     free(zf);
 
-    if (ret)
-	zip_err = ZERR_CLOSE;
-    
-    return ret;
+    return;
 }
diff --git a/lib/zip_get_name.c b/lib/zip_get_name.c
index 1202f47..d9a88d7 100644
--- a/lib/zip_get_name.c
+++ b/lib/zip_get_name.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_get_name.c,v 1.4 2003/10/01 09:51:00 dillo Exp $
+  $NiH: zip_get_name.c,v 1.5 2003/10/02 14:13:30 dillo Exp $
 
   zip_get_name.c -- get filename for a file in zip file
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -44,7 +44,7 @@
 zip_get_name(struct zip *zf, int idx)
 {
     if (idx < 0 || idx >= zf->nentry) {
-	zip_err = ZERR_INVAL;
+	_zip_error_set(&zf->error, ZERR_INVAL, 0);
 	return NULL;
     }
 
diff --git a/lib/zip_open.c b/lib/zip_open.c
index 3323e11..cf336c3 100644
--- a/lib/zip_open.c
+++ b/lib/zip_open.c
@@ -1,7 +1,7 @@
 /*
-  $NiH: zip_open.c,v 1.16 2003/10/02 14:13:31 dillo Exp $
+  $NiH: zip_open.c,v 1.17 2003/10/06 02:50:06 dillo Exp $
 
-  zip_open.c -- open zip file
+  zip_open.c -- open zip archive
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
 
   This file is part of libzip, a library to manipulate ZIP archives.
diff --git a/lib/zip_rename.c b/lib/zip_rename.c
index b94943e..e9c1f9b 100644
--- a/lib/zip_rename.c
+++ b/lib/zip_rename.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_rename.c,v 1.8 2003/10/02 14:13:31 dillo Exp $
+  $NiH: zip_rename.c,v 1.9 2003/10/03 23:25:31 dillo Exp $
 
   zip_rename.c -- rename file in zip archive
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -44,7 +44,7 @@
 zip_rename(struct zip *zf, int idx, const char *name)
 {
     if (idx >= zf->nentry || idx < 0) {
-	zip_err = ZERR_INVAL;
+	_zip_error_set(&zf->error, ZERR_INVAL, 0);
 	return -1;
     }
 
diff --git a/lib/zip_set_name.c b/lib/zip_set_name.c
index 78fd109..6647b01 100644
--- a/lib/zip_set_name.c
+++ b/lib/zip_set_name.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_set_name.c,v 1.8 2003/10/01 09:51:01 dillo Exp $
+  $NiH: zip_set_name.c,v 1.9 2003/10/02 14:13:32 dillo Exp $
 
   zip_set_name.c -- rename helper function
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -45,23 +45,24 @@
 int
 _zip_set_name(struct zip *zf, int idx, const char *name)
 {
+    char *s;
+    
     if (idx < 0 || idx >= zf->nentry) {
-	zip_err = ZERR_INVAL;
+	_zip_error_set(&zf->error, ZERR_INVAL, 0);
 	return -1;
     }
 
     if (name != NULL) {
+	if ((s=strdup(name)) == NULL) {
+	    _zip_error_set(&zf->error, ZERR_MEMORY, 0);
+	    return -1;
+	}
+	
 	if (zf->entry[idx].fn_old == NULL)
 	    zf->entry[idx].fn_old = zf->entry[idx].fn;
 	else
 	    free(zf->entry[idx].fn);
-	zf->entry[idx].fn = strdup(name);
-	if (zf->entry[idx].fn == NULL) {
-	    zf->entry[idx].fn = zf->entry[idx].fn_old;
-	    zf->entry[idx].fn_old = NULL;
-	    zip_err = ZERR_MEMORY;
-	    return -1;
-	}
+	zf->entry[idx].fn = s;
     }
 
     return 0;
diff --git a/lib/zip_unchange.c b/lib/zip_unchange.c
index db42e24..8b8ad25 100644
--- a/lib/zip_unchange.c
+++ b/lib/zip_unchange.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_unchange.c,v 1.9 2003/10/02 14:13:32 dillo Exp $
+  $NiH: zip_unchange.c,v 1.10 2003/10/03 08:34:11 dillo Exp $
 
   zip_unchange.c -- undo changes to file in zip archive
   Copyright (C) 1999 Dieter Baron and Thomas Klausner
@@ -47,7 +47,7 @@
     int ret;
     
     if (!zf || idx < 0 || idx >= zf->nentry) {
-	zip_err = ZERR_INVAL;
+	_zip_error_set(&zf->error, ZERR_INVAL, 0);
 	return -1;
     }
 
diff --git a/lib/zip_unchange_all.c b/lib/zip_unchange_all.c
index 157b71a..fba406d 100644
--- a/lib/zip_unchange_all.c
+++ b/lib/zip_unchange_all.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: zip_unchange_all.c,v 1.4 2003/10/02 14:13:32 dillo Exp $
+  $NiH: zip_unchange_all.c,v 1.5 2003/10/03 08:34:11 dillo Exp $
 
   zip_unchange.c -- undo changes to all files in zip archive
   Copyright (C) 1999 Dieter Baron and Thomas Klausner
@@ -42,18 +42,13 @@
 
 
 int
-zip_unchange_all(struct zip *zf)
+zip_unchange_all(struct zip *za)
 {
     int ret, i;
-    
-    if (!zf) {
-	zip_err = ZERR_INVAL;
-	return -1;
-    }
 
     ret = 0;
-    for (i=0; i<zf->nentry; i++)
-	ret |= zip_unchange(zf, i);
+    for (i=0; i<za->nentry; i++)
+	ret |= zip_unchange(za, i);
         
     return ret;
 }
diff --git a/lib/zipint.h b/lib/zipint.h
index 69fb693..fc1ccfe 100644
--- a/lib/zipint.h
+++ b/lib/zipint.h
@@ -2,7 +2,7 @@
 #define _HAD_ZIPINT_H
 
 /*
-  $NiH: zipint.h,v 1.19 2003/10/05 16:05:22 dillo Exp $
+  $NiH: zipint.h,v 1.20 2003/10/06 02:50:07 dillo Exp $
 
   zipint.h -- internal declarations.
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -115,13 +115,14 @@
 
 
 void _zip_entry_init(struct zip *, int);
-const char *_zip_error_strerror(struct zip_error *);
+void _zip_error_copy(struct zip_error *, struct zip_error *);
 void _zip_error_fini(struct zip_error *);
 void _zip_error_get(struct zip_error *, int *, int *);
 void _zip_error_init(struct zip_error *);
 void _zip_error_set(struct zip_error *, int, int);
+const char *_zip_error_strerror(struct zip_error *);
 int _zip_file_fillbuf(char *, int, struct zip_file *);
-int _zip_free(struct zip *);
+void _zip_free(struct zip *);
 int _zip_free_entry(struct zip_entry *);
 int _zip_local_header_read(struct zip *, int);
 void *_zip_memdup(const void *, int);