Follow documentation and return ZIP_ER_NOENT for non-existent file.

Bug reported by Chris Nehren <cnehren+libzip@pobox.com>.
diff --git a/lib/zip_open.c b/lib/zip_open.c
index 6e91252..30afde9 100644
--- a/lib/zip_open.c
+++ b/lib/zip_open.c
@@ -64,38 +64,42 @@
     FILE *fp;
     unsigned int flags;
     
-    if (_flags < 0) {
+    if (_flags < 0 || fn == NULL) {
         if (zep)
             *zep = ZIP_ER_INVAL;
         return NULL;
     }
     flags = (unsigned int)_flags;
-        
+
     switch (_zip_file_exists(fn, flags, zep)) {
     case -1:
 	return NULL;
+
     case 0:
+	if ((flags & ZIP_CREATE) == 0) {
+	    set_error(zep, NULL, ZIP_ER_NOENT);
+	    return NULL;
+	}
 	return _zip_allocate_new(fn, flags, zep);
+
     default:
+	if (flags & ZIP_EXCL) {
+	    set_error(zep, NULL, ZIP_ER_EXISTS);
+	    return NULL;
+	}
+
+	if ((fp = fopen(fn, "rb")) == NULL) {
+	    set_error(zep, NULL, ZIP_ER_OPEN);
+	    return NULL;
+	}
 	if (flags & ZIP_TRUNCATE) {
-	    FILE *f;
-	    
-	    if ((f = fopen(fn, "rb")) == NULL) {
-		set_error(zep, NULL, ZIP_ER_OPEN);
-		return NULL;
-	    }
-	    fclose(f);
+	    fclose(fp);
 	    return _zip_allocate_new(fn, flags, zep);
 	}
-	break;
+	/* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL,
+	   just like open() */
+	return _zip_open(fn, fp, flags, zep);
     }
-
-    if ((fp=fopen(fn, "rb")) == NULL) {
-	set_error(zep, NULL, ZIP_ER_OPEN);
-	return NULL;
-    }
-
-    return _zip_open(fn, fp, flags, zep);
 }
 
 
@@ -447,6 +451,12 @@
 }
 
 
+/*
+ * tests for file existence
+ * 1: file exists and is stat()able
+ * 0: file does not exist
+ * -1: error
+ */
 static int
 _zip_file_exists(const char *fn, unsigned int flags, int *zep)
 {
@@ -458,19 +468,12 @@
     }
     
     if (stat(fn, &st) != 0) {
-	if (flags & ZIP_CREATE)
+	if (errno == ENOENT) {
 	    return 0;
-	else {
-	    set_error(zep, NULL, ZIP_ER_OPEN);
-	    return -1;
 	}
-    }
-    else if ((flags & ZIP_EXCL)) {
-	set_error(zep, NULL, ZIP_ER_EXISTS);
+	set_error(zep, NULL, ZIP_ER_OPEN);
 	return -1;
     }
-    /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL,
-       just like open() */
 
     return 1;
 }
diff --git a/regress/open_nosuchfile.test b/regress/open_nosuchfile.test
index 647e098..6932164 100644
--- a/regress/open_nosuchfile.test
+++ b/regress/open_nosuchfile.test
@@ -2,5 +2,5 @@
 program tryopen
 args nosuchfile
 return 1
-stdout opening 'nosuchfile' returned error 11/2
+stdout opening 'nosuchfile' returned error 9
 stderr 1 errors