diff --git a/ChangeLog b/ChangeLog
index ff2b052..d9cc904 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Tue Jun  8 21:27:03 HKT 2004 William Brack <wbrack@mmm.com.hk>
+
+	* xmllint.c: fixed missing error return code for schema
+	  validation (bug 143880), also changed over to an enum for
+	  defining the error return codes for all conditions.
+
 Tue Jun  8 14:01:14 CEST 2004 Daniel Veillard <daniel@veillard.com>
 
 	* parser.c xmlreader.c include/libxml/parser.h: fixed a serious
diff --git a/xmllint.c b/xmllint.c
index e333a39..bd502d3 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -97,6 +97,18 @@
 #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
 #endif
 
+typedef enum {
+    XMLLINT_RETURN_OK = 0,	/* No error */
+    XMLLINT_ERR_UNCLASS,	/* Unclassified */
+    XMLLINT_ERR_DTD,		/* Error in DTD */
+    XMLLINT_ERR_VALID,		/* Validation error */
+    XMLLINT_ERR_RDFILE,		/* CtxtReadFile error */
+    XMLLINT_ERR_SCHEMACOMP,	/* Schema compilation */
+    XMLLINT_ERR_OUT,		/* Error writing output */
+    XMLLINT_ERR_SCHEMAPAT,	/* Error in schema pattern */
+    XMLLINT_ERR_RDREGIS,	/* Error in Reader registration */
+    XMLLINT_ERR_MEM		/* Out of memory error */
+} xmllintReturnCode;
 #ifdef LIBXML_DEBUG_ENABLED
 static int shell = 0;
 static int debugent = 0;
@@ -148,7 +160,7 @@
 #endif
 static int dtdattrs = 0;
 static int loaddtd = 0;
-static int progresult = 0;
+static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
 static int timing = 0;
 static int generate = 0;
 static int dropdtd = 0;
@@ -181,7 +193,7 @@
 OOM(void)
 {
     fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
-    progresult = 9;
+    progresult = XMLLINT_ERR_MEM;
 }
 
 static void
@@ -744,7 +756,7 @@
 	    if (ret < 0) {
 		xmlGenericError(xmlGenericErrorContext,
 			"Relax-NG schema %s failed to compile\n", relaxng);
-		progresult = 5;
+		progresult = XMLLINT_ERR_SCHEMACOMP;
 		relaxng = NULL;
 	    }
 	    if ((timing) && (!repeat)) {
@@ -788,7 +800,7 @@
 	    if (xmlTextReaderIsValid(reader) != 1) {
 		xmlGenericError(xmlGenericErrorContext,
 			"Document %s does not validate\n", filename);
-		progresult = 3;
+		progresult = XMLLINT_ERR_VALID;
 	    }
 	}
 #endif /* LIBXML_VALID_ENABLED */
@@ -796,7 +808,7 @@
 	if (relaxng != NULL) {
 	    if (xmlTextReaderIsValid(reader) != 1) {
 		fprintf(stderr, "%s fails to validate\n", filename);
-		progresult = 3;
+		progresult = XMLLINT_ERR_VALID;
 	    } else {
 		fprintf(stderr, "%s validates\n", filename);
 	    }
@@ -808,11 +820,11 @@
 	xmlFreeTextReader(reader);
 	if (ret != 0) {
 	    fprintf(stderr, "%s : failed to parse\n", filename);
-	    progresult = 1;
+	    progresult = XMLLINT_ERR_UNCLASS;
 	}
     } else {
 	fprintf(stderr, "Unable to open %s\n", filename);
-	progresult = 1;
+	progresult = XMLLINT_ERR_UNCLASS;
     }
 #ifdef HAVE_SYS_MMAN_H
     if (memory) {
@@ -848,11 +860,11 @@
 	xmlFreeTextReader(reader);
 	if (ret != 0) {
 	    fprintf(stderr, "failed to walk through the doc\n");
-	    progresult = 1;
+	    progresult = XMLLINT_ERR_UNCLASS;
 	}
     } else {
 	fprintf(stderr, "Failed to crate a reader from the document\n");
-	progresult = 1;
+	progresult = XMLLINT_ERR_UNCLASS;
     }
 }
 #endif /* LIBXML_READER_ENABLED */
@@ -1033,7 +1045,7 @@
 		doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
 
 		if (ctxt->valid == 0)
-		    progresult = 4;
+		    progresult = XMLLINT_ERR_RDFILE;
 		if (rectxt == NULL)
 		    xmlFreeParserCtxt(ctxt);
 	    }
@@ -1050,7 +1062,7 @@
      * If we don't have a document we might as well give up.  Do we
      * want an error message here?  <sven@zen.org> */
     if (doc == NULL) {
-	progresult = 1;
+	progresult = XMLLINT_ERR_UNCLASS;
 	return;
     }
 
@@ -1171,13 +1183,13 @@
 		    }
 		    if (out != NULL) {
 			if (htmlDocDump(out, doc) < 0)
-			    progresult = 6;
+			    progresult = XMLLINT_ERR_OUT;
 
 			if (output != NULL)
 			    fclose(out);
 		    } else {
 			fprintf(stderr, "failed to open %s\n", output);
-			progresult = 6;
+			progresult = XMLLINT_ERR_OUT;
 		    }
 		}
 		if ((timing) && (!repeat)) {
@@ -1224,7 +1236,7 @@
 		if (ret < 0) {
 		    fprintf(stderr, "failed save to %s\n",
 		            output ? output : "-");
-		    progresult = 6;
+		    progresult = XMLLINT_ERR_OUT;
 		}
 	    }
 	    else if (format) {
@@ -1232,7 +1244,7 @@
 		if (ret < 0) {
 		    fprintf(stderr, "failed save to %s\n",
 		            output ? output : "-");
-		    progresult = 6;
+		    progresult = XMLLINT_ERR_OUT;
 		}
 	    }
 	    else {
@@ -1244,13 +1256,13 @@
 		}
 		if (out != NULL) {
 		    if (xmlDocDump(out, doc) < 0)
-		        progresult = 6;
+		        progresult = XMLLINT_ERR_OUT;
 
 		    if (output != NULL)
 			fclose(out);
 		} else {
 		    fprintf(stderr, "failed to open %s\n", output);
-		    progresult = 6;
+		    progresult = XMLLINT_ERR_OUT;
 		}
 	    }
 	    if ((timing) && (!repeat)) {
@@ -1271,7 +1283,7 @@
 		    fclose(out);
 	    } else {
 		fprintf(stderr, "failed to open %s\n", output);
-		progresult = 6;
+		progresult = XMLLINT_ERR_OUT;
 	    }
 	}
 #endif
@@ -1302,7 +1314,7 @@
 	    else
 		xmlGenericError(xmlGenericErrorContext,
 			"Could not parse DTD %s\n", dtdvalidfpi);
-	    progresult = 2;
+	    progresult = XMLLINT_ERR_DTD;
 	} else {
 	    xmlValidCtxtPtr cvp;
 
@@ -1327,7 +1339,7 @@
 		    xmlGenericError(xmlGenericErrorContext,
 			    "Document %s does not validate against %s\n",
 			    filename, dtdvalidfpi);
-		progresult = 3;
+		progresult = XMLLINT_ERR_VALID;
 	    }
 	    if ((timing) && (!repeat)) {
 		endTimer("Validating against DTD");
@@ -1353,7 +1365,7 @@
 	if (!xmlValidateDocument(cvp, doc)) {
 	    xmlGenericError(xmlGenericErrorContext,
 		    "Document %s does not validate\n", filename);
-	    progresult = 3;
+	    progresult = XMLLINT_ERR_VALID;
 	}
 	if ((timing) && (!repeat)) {
 	    endTimer("Validating");
@@ -1380,9 +1392,11 @@
 	    fprintf(stderr, "%s validates\n", filename);
 	} else if (ret > 0) {
 	    fprintf(stderr, "%s fails to validate\n", filename);
+	    progresult = XMLLINT_ERR_VALID;
 	} else {
 	    fprintf(stderr, "%s validation generated an internal error\n",
 		   filename);
+	    progresult = XMLLINT_ERR_VALID;
 	}
 	xmlRelaxNGFreeValidCtxt(ctxt);
 	if ((timing) && (!repeat)) {
@@ -1406,9 +1420,11 @@
 	    fprintf(stderr, "%s validates\n", filename);
 	} else if (ret > 0) {
 	    fprintf(stderr, "%s fails to validate\n", filename);
+	    progresult = XMLLINT_ERR_VALID;
 	} else {
 	    fprintf(stderr, "%s validation generated an internal error\n",
 		   filename);
+	    progresult = XMLLINT_ERR_VALID;
 	}
 	xmlSchemaFreeValidCtxt(ctxt);
 	if ((timing) && (!repeat)) {
@@ -1946,7 +1962,7 @@
 	if (relaxngschemas == NULL) {
 	    xmlGenericError(xmlGenericErrorContext,
 		    "Relax-NG schema %s failed to compile\n", relaxng);
-            progresult = 5;
+            progresult = XMLLINT_ERR_SCHEMACOMP;
 	    relaxng = NULL;
 	}
 	xmlRelaxNGFreeParserCtxt(ctxt);
@@ -1972,7 +1988,7 @@
 	if (wxschemas == NULL) {
 	    xmlGenericError(xmlGenericErrorContext,
 		    "WXS schema %s failed to compile\n", schema);
-            progresult = 5;
+            progresult = XMLLINT_ERR_SCHEMACOMP;
 	    schema = NULL;
 	}
 	xmlSchemaFreeParserCtxt(ctxt);
@@ -1987,7 +2003,7 @@
 	if (patternc == NULL) {
 	    xmlGenericError(xmlGenericErrorContext,
 		    "Pattern %s failed to compile\n", pattern);
-            progresult = 7;
+            progresult = XMLLINT_ERR_SCHEMAPAT;
 	    pattern = NULL;
 	}
     }
@@ -2071,7 +2087,7 @@
 
                 if ((chkregister) && (nbregister != 0)) {
 		    fprintf(stderr, "Registration count off: %d\n", nbregister);
-		    progresult = 8;
+		    progresult = XMLLINT_ERR_RDREGIS;
 		}
 	    }
 	    files ++;
