small typo pointed out by Mike Hommey slightly improved the --c14n

* xmlIO.c: small typo pointed out by Mike Hommey
* doc/xmllint.xml, xmllint.html, xmllint.1: slightly improved
  the --c14n description, c.f. #144675 .
* nanohttp.c nanoftp.c: applied a first simple patch from
  Mike Hommey for $no_proxy, c.f. #133470
* parserInternals.c include/libxml/parserInternals.h
  include/libxml/xmlerror.h: cleanup to avoid 'error' identifier
  in includes #
* parser.c SAX2.c debugXML.c include/libxml/parser.h:
  first version of the inplementation of parsing within
  the context of a node in the tree #142359, new function
  xmlParseInNodeContext(), added support at the xmllint --shell
  level as the "set" function
* test/scripts/set* result/scripts/* Makefile.am: extended
  the script based regression tests to instrument the new function.
Daniel
diff --git a/ChangeLog b/ChangeLog
index ce80d68..395c8e7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,30 @@
+Mon Aug 16 02:42:30 CEST 2004 Daniel Veillard <daniel@veillard.com>
+
+	* xmlIO.c: small typo pointed out by Mike Hommey
+	* doc/xmllint.xml, xmllint.html, xmllint.1: slightly improved
+	  the --c14n description, c.f. #144675 .
+	* nanohttp.c nanoftp.c: applied a first simple patch from 
+	  Mike Hommey for $no_proxy, c.f. #133470
+	* parserInternals.c include/libxml/parserInternals.h
+	  include/libxml/xmlerror.h: cleanup to avoid 'error' identifier 
+	  in includes #
+	* parser.c SAX2.c debugXML.c include/libxml/parser.h:
+	  first version of the inplementation of parsing within
+	  the context of a node in the tree #142359, new function
+	  xmlParseInNodeContext(), added support at the xmllint --shell
+	  level as the "set" function
+	* test/scripts/set* result/scripts/* Makefile.am: extended
+	  the script based regression tests to instrument the new function.
+
 Sat Aug 14 18:53:08 MDT 2004 John Fleck <jfleck@inkstain.net>
-	* doc/xmllint.xml, xmllint.html, xmllint.1
+
+	* doc/xmllint.xml, xmllint.html, xmllint.1:
 	add c14n to man page (man, it's hard to keep up with
 	Daniel!)
 	
 Sat Aug 14 18:45:38 MDT 2004 John Fleck <jfleck@inkstain.net>
 
-	* doc/xmllint.xml, xmllint.html, xmllint.1
+	* doc/xmllint.xml, xmllint.html, xmllint.1:
 	add pattern, walker, maxmem, output and xmlout to man page
 	fixes #144675
 
diff --git a/Makefile.am b/Makefile.am
index 95e504f..29880f0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -505,14 +505,15 @@
 	  if [ -f $$xml ] ; then \
 	  if [ ! -f $(srcdir)/result/scripts/$$name ] ; then \
 	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/xmllint --shell $$xml < $$i > $(srcdir)/result/scripts/$$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --shell $$xml < $$i > $(srcdir)/result/scripts/$$name 2> $(srcdir)/result/scripts/$$name.err ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/xmllint --shell $$xml < $$i 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/xmllint --shell $$xml < $$i > result.$$name 2> result.$$name.err ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
-	      diff $(srcdir)/result/scripts/$$name result.$$name` ; \
+	      diff $(srcdir)/result/scripts/$$name result.$$name ; \
+	      diff $(srcdir)/result/scripts/$$name.err result.$$name.err` ; \
 	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
-	      rm result.$$name ; \
+	      rm result.$$name result.$$name.err ; \
 	  fi ; fi ; done)
 
 Catatests : xmlcatalog$(EXEEXT)
diff --git a/SAX2.c b/SAX2.c
index 4a1c600..c705cc3 100644
--- a/SAX2.c
+++ b/SAX2.c
@@ -2042,10 +2042,8 @@
 	}
     }
 
-    if (ctxt->myDoc->children == NULL) {
+    if ((ctxt->myDoc->children == NULL) || (parent == NULL)) {
         xmlAddChild((xmlNodePtr) ctxt->myDoc, (xmlNodePtr) ret);
-    } else if (parent == NULL) {
-        parent = ctxt->myDoc->children;
     }
     /*
      * Build the namespace list
diff --git a/debugXML.c b/debugXML.c
index 768010d..3079131 100644
--- a/debugXML.c
+++ b/debugXML.c
@@ -1733,6 +1733,51 @@
     return (0);
 }
 
+/**
+ * xmlShellSetContent:
+ * @ctxt:  the shell context
+ * @value:  the content as a string
+ * @node:  a node
+ * @node2:  unused
+ *
+ * Implements the XML shell function "dir"
+ * dumps informations about the node (namespace, attributes, content).
+ *
+ * Returns 0
+ */
+static int
+xmlShellSetContent(xmlShellCtxtPtr ctxt ATTRIBUTE_UNUSED,
+            char *value, xmlNodePtr node,
+            xmlNodePtr node2 ATTRIBUTE_UNUSED)
+{
+    xmlNodePtr results;
+    xmlParserErrors ret;
+
+    if (!ctxt)
+        return (0);
+    if (node == NULL) {
+	fprintf(ctxt->output, "NULL\n");
+	return (0);
+    }
+    if (value == NULL) {
+        fprintf(ctxt->output, "NULL\n");
+	return (0);
+    }
+
+    ret = xmlParseInNodeContext(node, value, strlen(value), 0, &results);
+    if (ret == XML_ERR_OK) {
+	if (node->children != NULL) {
+	    xmlFreeNodeList(node->children);
+	    node->children = NULL;
+	    node->last = NULL;
+	}
+	xmlAddChildList(node, results);
+    } else {
+        fprintf(ctxt->output, "failed to parse content\n");
+    }
+    return (0);
+}
+
 #ifdef LIBXML_SCHEMAS_ENABLED
 /**
  * xmlShellRNGValidate:
@@ -2358,6 +2403,8 @@
             xmlShellDu(ctxt, NULL, ctxt->node, NULL);
         } else if (!strcmp(command, "base")) {
             xmlShellBase(ctxt, NULL, ctxt->node, NULL);
+        } else if (!strcmp(command, "set")) {
+	    xmlShellSetContent(ctxt, arg, ctxt->node, NULL);
 #ifdef LIBXML_XPATH_ENABLED
         } else if (!strcmp(command, "setns")) {
             if (arg[0] == 0) {
diff --git a/doc/xmllint.1 b/doc/xmllint.1
index b687b04..ffb7a75 100644
--- a/doc/xmllint.1
+++ b/doc/xmllint.1
@@ -216,11 +216,7 @@
 
 .TP
 \fB\-\-c14n\fR
-Output canonical XML\&.
-
-.TP
-\fB\-\-nonet\fR
-Do not use the Internet to fetch DTD's or entities\&.
+Use the W3C XML Canonicalisation (C14N) to serialize the result of parsing to stdout, it keeps comments in teh result\&.
 
 .SH "SHELL"
 
diff --git a/doc/xmllint.xml b/doc/xmllint.xml
index ee5fde0..1a998e1 100644
--- a/doc/xmllint.xml
+++ b/doc/xmllint.xml
@@ -522,16 +522,12 @@
 	</listitem>
       </varlistentry>
       <varlistentry>
-	<term><option>--c14n</option></term>
-	<listitem>
-	  <simpara>Output canonical XML.</simpara>
-	</listitem>
-      </varlistentry>
-      <varlistentry>
 	<term>
-      <option>--nonet</option></term>
+      <option>--c14n</option></term>
 	<listitem>
-	  <simpara>Do not use the Internet to fetch DTD's or entities.</simpara>
+	  <simpara>Use the W3C XML Canonicalisation (C14N) to
+serialize the result of parsing to stdout, it keeps comments in
+teh result.</simpara>
 	</listitem>
       </varlistentry>
     </variablelist>
diff --git a/include/libxml/parser.h b/include/libxml/parser.h
index 2826c2b..01cf27a 100644
--- a/include/libxml/parser.h
+++ b/include/libxml/parser.h
@@ -915,6 +915,12 @@
 					 int depth,
 					 const xmlChar *string,
 					 xmlNodePtr *lst);
+XMLPUBFUN xmlParserErrors XMLCALL
+		xmlParseInNodeContext	(xmlNodePtr node,
+					 const char *data,
+					 int datalen,
+					 int options,
+					 xmlNodePtr *lst);
 XMLPUBFUN int XMLCALL          
 		xmlParseBalancedChunkMemoryRecover(xmlDocPtr doc,
                      xmlSAXHandlerPtr sax,
diff --git a/include/libxml/parserInternals.h b/include/libxml/parserInternals.h
index 7e4503d..57c4b17 100644
--- a/include/libxml/parserInternals.h
+++ b/include/libxml/parserInternals.h
@@ -286,7 +286,7 @@
 /* internal error reporting */
 XMLPUBFUN void XMLCALL
 			__xmlErrEncoding	(xmlParserCtxtPtr ctxt,
-						 xmlParserErrors error,
+						 xmlParserErrors xmlerr,
 						 const char *msg,
 						 const xmlChar * str1,
 						 const xmlChar * str2);
diff --git a/include/libxml/xmlerror.h b/include/libxml/xmlerror.h
index 99579f2..51d2887 100644
--- a/include/libxml/xmlerror.h
+++ b/include/libxml/xmlerror.h
@@ -707,12 +707,12 @@
 /**
  * xmlStructuredErrorFunc:
  * @userData:  user provided data for the error callback
- * @error:  the error being raised.
+ * @xmlerr:  the error being raised.
  *
  * Signature of the function to use when there is an error and
  * the module handles the new error reporting mechanism.
  */
-typedef void (*xmlStructuredErrorFunc) (void *userData, xmlErrorPtr error);
+typedef void (*xmlStructuredErrorFunc) (void *userData, xmlErrorPtr xmlerr);
 
 /*
  * Use the following function to reset the two global variables
diff --git a/nanoftp.c b/nanoftp.c
index a2ecc40..7fe2095 100644
--- a/nanoftp.c
+++ b/nanoftp.c
@@ -195,7 +195,7 @@
 
     proxyPort = 21;
     env = getenv("no_proxy");
-    if (env != NULL)
+    if (env && ((env[0] == '*' ) && (env[1] == 0)))
 	return;
     env = getenv("ftp_proxy");
     if (env != NULL) {
diff --git a/nanohttp.c b/nanohttp.c
index 23923b6..ad46b8d 100644
--- a/nanohttp.c
+++ b/nanohttp.c
@@ -223,7 +223,7 @@
     if (proxy == NULL) {
 	proxyPort = 80;
 	env = getenv("no_proxy");
-	if (env != NULL)
+	if (env && ((env[0] == '*') && (env[1] == 0)))
 	    goto done;
 	env = getenv("http_proxy");
 	if (env != NULL) {
diff --git a/parser.c b/parser.c
index 8ecf44f..f0198c6 100644
--- a/parser.c
+++ b/parser.c
@@ -10830,6 +10830,196 @@
     return(ret);
 }
 
+/**
+ * xmlParseInNodeContext:
+ * @node:  the context node
+ * @data:  the input string
+ * @datalen:  the input string length in bytes
+ * @options:  a combination of xmlParserOption
+ * @lst:  the return value for the set of parsed nodes
+ *
+ * Parse a well-balanced chunk of an XML document
+ * within the context (DTD, namespaces, etc ...) of the given node.
+ *
+ * The allowed sequence for the data is a Well Balanced Chunk defined by
+ * the content production in the XML grammar:
+ *
+ * [43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*
+ *
+ * Returns XML_ERR_OK if the chunk is well balanced, and the parser
+ * error code otherwise
+ */
+xmlParserErrors
+xmlParseInNodeContext(xmlNodePtr node, const char *data, int datalen,
+                      int options, xmlNodePtr *lst) {
+#ifdef SAX2
+    xmlParserCtxtPtr ctxt;
+    xmlDocPtr doc = NULL;
+    xmlNodePtr fake, cur;
+    int nsnr = 0;
+
+    xmlParserErrors ret = XML_ERR_OK;
+
+    /*
+     * check all input parameters, grab the document
+     */
+    if ((lst == NULL) || (node == NULL) || (data == NULL) || (datalen < 0))
+        return(XML_ERR_INTERNAL_ERROR);
+    switch (node->type) {
+        case XML_ELEMENT_NODE:
+        case XML_ATTRIBUTE_NODE:
+        case XML_TEXT_NODE:
+        case XML_CDATA_SECTION_NODE:
+        case XML_ENTITY_REF_NODE:
+        case XML_PI_NODE:
+        case XML_COMMENT_NODE:
+        case XML_DOCUMENT_NODE:
+        case XML_HTML_DOCUMENT_NODE:
+	    break;
+	default:
+	    return(XML_ERR_INTERNAL_ERROR);
+
+    }
+    while ((node != NULL) && (node->type != XML_ELEMENT_NODE) &&
+           (node->type != XML_DOCUMENT_NODE) &&
+	   (node->type != XML_HTML_DOCUMENT_NODE))
+	node = node->parent;
+    if (node == NULL)
+	return(XML_ERR_INTERNAL_ERROR);
+    if (node->type == XML_ELEMENT_NODE)
+	doc = node->doc;
+    else
+        doc = (xmlDocPtr) node;
+    if (doc == NULL)
+	return(XML_ERR_INTERNAL_ERROR);
+
+    /*
+     * allocate a context and set-up everything not related to the
+     * node position in the tree
+     */
+    if (doc->type == XML_DOCUMENT_NODE)
+	ctxt = xmlCreateMemoryParserCtxt((char *) data, datalen);
+#ifdef LIBXML_HTML_ENABLED
+    else if (doc->type == XML_HTML_DOCUMENT_NODE)
+	ctxt = htmlCreateMemoryParserCtxt((char *) data, datalen);
+#endif
+    else
+        return(XML_ERR_INTERNAL_ERROR);
+
+    if (ctxt == NULL)
+        return(XML_ERR_NO_MEMORY);
+    fake = xmlNewComment(NULL);
+    if (fake == NULL) {
+        xmlFreeParserCtxt(ctxt);
+	return(XML_ERR_NO_MEMORY);
+    }
+    xmlAddChild(node, fake);
+        
+    xmlCtxtUseOptions(ctxt, options);
+    if (doc->dict != NULL) {
+	if (ctxt->dict != NULL)
+	    xmlDictFree(ctxt->dict);
+	ctxt->dict = doc->dict;
+    }
+    xmlDetectSAX2(ctxt);
+    ctxt->myDoc = doc;
+
+    if (node->type == XML_ELEMENT_NODE) {
+	nodePush(ctxt, node);
+	/*
+	 * initialize the SAX2 namespaces stack
+	 */
+	cur = node;
+	while ((cur != NULL) && (cur->type == XML_ELEMENT_NODE)) {
+	    xmlNsPtr ns = cur->nsDef;
+	    const xmlChar *iprefix, *ihref;
+
+	    while (ns != NULL) {
+		if (ctxt->dict) {
+		    iprefix = xmlDictLookup(ctxt->dict, ns->prefix, -1);
+		    ihref = xmlDictLookup(ctxt->dict, ns->href, -1);
+		} else {
+		    iprefix = ns->prefix;
+		    ihref = ns->href;
+		}
+
+	        if (xmlGetNamespace(ctxt, iprefix) == NULL) {
+		    nsPush(ctxt, iprefix, ihref);
+		    nsnr++;
+		}
+		ns = ns->next;
+	    }
+	    cur = cur->parent;
+	}
+	ctxt->instate = XML_PARSER_CONTENT;
+    } 
+
+    if ((ctxt->validate) || (ctxt->replaceEntities != 0)) {
+	/*
+	 * ID/IDREF registration will be done in xmlValidateElement below
+	 */
+	ctxt->loadsubset |= XML_SKIP_IDS;
+    }
+
+    xmlParseContent(ctxt);
+    nsPop(ctxt, nsnr);
+    if ((RAW == '<') && (NXT(1) == '/')) {
+	xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL);
+    } else if (RAW != 0) {
+	xmlFatalErr(ctxt, XML_ERR_EXTRA_CONTENT, NULL);
+    }
+    if ((ctxt->node != NULL) && (ctxt->node != node)) {
+	xmlFatalErr(ctxt, XML_ERR_NOT_WELL_BALANCED, NULL);
+	ctxt->wellFormed = 0;
+    }
+
+    if (!ctxt->wellFormed) {
+        if (ctxt->errNo == 0)
+	    ret = XML_ERR_INTERNAL_ERROR;
+	else
+	    ret = (xmlParserErrors)ctxt->errNo;
+    } else {
+        ret = XML_ERR_OK;
+    }
+    
+    /*
+     * Return the newly created nodeset after unlinking it from
+     * the pseudo sibling.
+     */
+    
+    cur = fake->next;
+    fake->next = NULL;
+    node->last = fake;
+
+    if (cur != NULL) {
+	cur->prev = NULL;
+    }
+
+    *lst = cur;
+
+    while (cur != NULL) {
+	cur->parent = NULL;
+	cur = cur->next;
+    }
+
+    xmlUnlinkNode(fake);
+    xmlFreeNode(fake);
+
+
+    if (ret != XML_ERR_OK) {
+        xmlFreeNodeList(*lst);
+	*lst = NULL;
+    }
+	
+    ctxt->dict = NULL;
+    xmlFreeParserCtxt(ctxt);
+    
+    return(ret);
+#else /* !SAX2 */
+    return(XML_ERR_INTERNAL_ERROR);
+#endif
+}
+
 #ifdef LIBXML_SAX1_ENABLED
 /**
  * xmlParseBalancedChunkMemoryRecover:
diff --git a/parserInternals.c b/parserInternals.c
index d03e3d4..09f8bb8 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -127,7 +127,7 @@
 /**
  * __xmlErrEncoding:
  * @ctxt:  an XML parser context
- * @error:  the error number
+ * @xmlerr:  the error number
  * @msg:  the error message
  * @str1:  an string info
  * @str2:  an string info
@@ -135,16 +135,16 @@
  * Handle an encoding error
  */
 void
-__xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors error,
+__xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr,
                  const char *msg, const xmlChar * str1, const xmlChar * str2)
 {
     if ((ctxt != NULL) && (ctxt->disableSAX != 0) &&
         (ctxt->instate == XML_PARSER_EOF))
 	return;
     if (ctxt != NULL)
-        ctxt->errNo = error;
+        ctxt->errNo = xmlerr;
     __xmlRaiseError(NULL, NULL, NULL,
-                    ctxt, NULL, XML_FROM_PARSER, error, XML_ERR_FATAL,
+                    ctxt, NULL, XML_FROM_PARSER, xmlerr, XML_ERR_FATAL,
                     NULL, 0, (const char *) str1, (const char *) str2,
                     NULL, 0, 0, msg, str1, str2);
     if (ctxt != NULL) {
diff --git a/result/scripts/base.err b/result/scripts/base.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/scripts/base.err
diff --git a/result/scripts/base2.err b/result/scripts/base2.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/scripts/base2.err
diff --git a/result/scripts/set1 b/result/scripts/set1
new file mode 100644
index 0000000..b4c2c9a
--- /dev/null
+++ b/result/scripts/set1
@@ -0,0 +1,3 @@
+/ > / > <?xml version="1.0"?>
+<b/>
+/ > 
\ No newline at end of file
diff --git a/result/scripts/set1.err b/result/scripts/set1.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/scripts/set1.err
diff --git a/result/scripts/set3 b/result/scripts/set3
new file mode 100644
index 0000000..812b35f
--- /dev/null
+++ b/result/scripts/set3
@@ -0,0 +1,12 @@
+/ > a > Object is a Node Set :
+Set contains 1 nodes:
+1  ELEMENT a
+    default namespace href=bar
+a > a > Object is a Node Set :
+Set contains 2 nodes:
+1  ELEMENT a
+    default namespace href=bar
+2  ELEMENT b
+a > <?xml version="1.0"?>
+<a xmlns="bar"><b/></a>
+a > 
\ No newline at end of file
diff --git a/result/scripts/set3.err b/result/scripts/set3.err
new file mode 100644
index 0000000..18f0d69
--- /dev/null
+++ b/result/scripts/set3.err
@@ -0,0 +1,3 @@
+./test/scripts/set3.xml:1: parser warning : xmlns: URI bar is not absolute
+<a xmlns="bar">foo</a>
+              ^
diff --git a/result/scripts/set4 b/result/scripts/set4
new file mode 100644
index 0000000..19e9a58
--- /dev/null
+++ b/result/scripts/set4
@@ -0,0 +1,6 @@
+/ > b > b > Object is a Node Set :
+Set contains 1 nodes:
+1  ELEMENT a:c
+b > <?xml version="1.0"?>
+<a xmlns:a="bar"><b xmlns:a="foo"><a:c/></b></a>
+b > 
\ No newline at end of file
diff --git a/result/scripts/set4.err b/result/scripts/set4.err
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/result/scripts/set4.err
diff --git a/test/scripts/set1.script b/test/scripts/set1.script
new file mode 100644
index 0000000..e9a3e69
--- /dev/null
+++ b/test/scripts/set1.script
@@ -0,0 +1,2 @@
+set <b/>
+save -
diff --git a/test/scripts/set1.xml b/test/scripts/set1.xml
new file mode 100644
index 0000000..dcd0694
--- /dev/null
+++ b/test/scripts/set1.xml
@@ -0,0 +1 @@
+<a>foo</a>
diff --git a/test/scripts/set3.script b/test/scripts/set3.script
new file mode 100644
index 0000000..e99745a
--- /dev/null
+++ b/test/scripts/set3.script
@@ -0,0 +1,5 @@
+cd *
+xpath //*[namespace-uri()="bar"]
+set <b/>
+xpath //*[namespace-uri()="bar"]
+save -
diff --git a/test/scripts/set3.xml b/test/scripts/set3.xml
new file mode 100644
index 0000000..211b4e5
--- /dev/null
+++ b/test/scripts/set3.xml
@@ -0,0 +1 @@
+<a xmlns="bar">foo</a>
diff --git a/test/scripts/set4.script b/test/scripts/set4.script
new file mode 100644
index 0000000..39d64cb
--- /dev/null
+++ b/test/scripts/set4.script
@@ -0,0 +1,4 @@
+cd a/b
+set <a:c/>
+xpath //*[namespace-uri()="foo"]
+save -
diff --git a/test/scripts/set4.xml b/test/scripts/set4.xml
new file mode 100644
index 0000000..1ba4401
--- /dev/null
+++ b/test/scripts/set4.xml
@@ -0,0 +1 @@
+<a xmlns:a="bar"><b xmlns:a="foo"/></a>
diff --git a/valid.c b/valid.c
index ade90dd..15514d8 100644
--- a/valid.c
+++ b/valid.c
@@ -18,6 +18,7 @@
 
 #include <libxml/xmlmemory.h>
 #include <libxml/hash.h>
+#include <libxml/uri.h>
 #include <libxml/valid.h>
 #include <libxml/parser.h>
 #include <libxml/parserInternals.h>
diff --git a/xmlIO.c b/xmlIO.c
index 6f65cad..a80c583 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -182,7 +182,7 @@
     "loading error",
     "not a socket",		/* ENOTSOCK */
     "already connected",	/* EISCONN */
-    "connection refuxed",	/* ECONNREFUSED */
+    "connection refused",	/* ECONNREFUSED */
     "unreachable network",	/* ENETUNREACH */
     "adddress in use",		/* EADDRINUSE */
     "already in use",		/* EALREADY */