Merge tag 'v2.14.2' into HEAD * Release v2.14.2 * Update README.fuchsia to new libxml2 version. * Merge via 'git merge -X theirs v2.14.2'. * Regenerate config with './autogen.sh --without-lzma' Bug: 414072443 Change-Id: If2c14c0dd12a506204d6faf837eccf1343ae1e9d Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/libxml2/+/1272071 Reviewed-by: Dzmitry Yatsushkevich <dmitryya@google.com>
diff --git a/BUILD.gn b/BUILD.gn new file mode 100644 index 0000000..ac6ecc0 --- /dev/null +++ b/BUILD.gn
@@ -0,0 +1,171 @@ +# Copyright 2017 The Fuchsia Authors. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is the configuration needed to use libxml2. +config("libxml2_config") { + include_dirs = [ "include" ] +} + +# This is the configuration used to build libxml2 itself. It should not be needed outside of this +# library. +# +# This has to be a config instead of flags directly specified on the libxml2 target so the -Wno-* +# flags are ordered after the -Werror flags from the default configs. +config("libxml2_private_config") { + visibility = [ ":*" ] + cflags = [ + "-Wno-conversion", + "-Wno-empty-body", + "-Wno-enum-compare", + "-Wno-implicit-fallthrough", + "-Wno-incompatible-pointer-types", + "-Wno-misleading-indentation", + "-Wno-missing-field-initializers", + "-Wno-self-assign", + "-Wno-sign-compare", + "-Wno-tautological-pointer-compare", + "-Wno-unused-function", + "-Wno-unused-but-set-variable", + ] + defines = [ + "HAVE_CONFIG_H", + "_REENTRANT", + ] + if (is_linux) { + defines += [ "_GNU_SOURCE" ] + } +} + +target(default_library_type, "libxml2") { + sources = [ + "HTMLparser.c", + "HTMLtree.c", + "SAX.c", + "SAX2.c", + "buf.c", + "c14n.c", + "catalog.c", + "config.h", + "chvalid.c", + "debugXML.c", + "dict.c", + "encoding.c", + "entities.c", + "error.c", + "globals.c", + "hash.c", + "include/libxml/DOCBparser.h", + "include/libxml/HTMLparser.h", + "include/libxml/HTMLtree.h", + "include/libxml/SAX.h", + "include/libxml/SAX2.h", + "include/libxml/c14n.h", + "include/libxml/catalog.h", + "include/libxml/chvalid.h", + "include/libxml/debugXML.h", + "include/libxml/dict.h", + "include/libxml/encoding.h", + "include/libxml/entities.h", + "include/libxml/globals.h", + "include/libxml/hash.h", + "include/libxml/list.h", + "include/libxml/nanoftp.h", + "include/libxml/nanohttp.h", + "include/libxml/parser.h", + "include/libxml/parserInternals.h", + "include/libxml/pattern.h", + "include/libxml/relaxng.h", + "include/libxml/schemasInternals.h", + "include/libxml/schematron.h", + "include/libxml/threads.h", + "include/libxml/tree.h", + "include/libxml/uri.h", + "include/libxml/valid.h", + "include/libxml/xinclude.h", + "include/libxml/xlink.h", + "include/libxml/xmlIO.h", + "include/libxml/xmlautomata.h", + "include/libxml/xmlerror.h", + "include/libxml/xmlexports.h", + "include/libxml/xmlmemory.h", + "include/libxml/xmlmodule.h", + "include/libxml/xmlreader.h", + "include/libxml/xmlregexp.h", + "include/libxml/xmlsave.h", + "include/libxml/xmlschemas.h", + "include/libxml/xmlschemastypes.h", + "include/libxml/xmlstring.h", + "include/libxml/xmlunicode.h", + "include/libxml/xmlversion.h", + "include/libxml/xmlwriter.h", + "include/libxml/xpath.h", + "include/libxml/xpathInternals.h", + "include/libxml/xpointer.h", + "legacy.c", + "list.c", + "nanoftp.c", + "nanohttp.c", + "parser.c", + "parserInternals.c", + "pattern.c", + "relaxng.c", + "schematron.c", + "threads.c", + "tree.c", + "uri.c", + "valid.c", + "xinclude.c", + "xlink.c", + "xmlIO.c", + "xmlmemory.c", + "xmlmodule.c", + "xmlreader.c", + "xmlregexp.c", + "xmlsave.c", + "xmlschemas.c", + "xmlschemastypes.c", + "xmlstring.c", + "xmlunicode.c", + "xmlwriter.c", + "xpath.c", + "xpointer.c", + "xzlib.c", + ] + + public_configs = [ ":libxml2_config" ] + configs -= [ "//build/config:symbol_visibility_hidden" ] + configs += [ ":libxml2_private_config" ] + + if (is_linux) { + libs = [ "dl" ] + } else if (is_mac) { + libs = [ "iconv" ] + } + + deps = [ "//third_party/zlib" ] +}
diff --git a/Makefile.am b/Makefile.am index 6f98144..cff88d4 100644 --- a/Makefile.am +++ b/Makefile.am
@@ -219,7 +219,7 @@ pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libxml-2.0.pc +nodist_pkgconfig_DATA = libxml-2.0.pc cmakedir = $(libdir)/cmake/libxml2 cmake_DATA = libxml2-config.cmake
diff --git a/OWNERS b/OWNERS new file mode 100644 index 0000000..2845e24 --- /dev/null +++ b/OWNERS
@@ -0,0 +1,2 @@ +include /src/virtualization/OWNERS +include /src/connectivity/weave/OWNERS \ No newline at end of file
diff --git a/README.fuchsia b/README.fuchsia new file mode 100644 index 0000000..9638600 --- /dev/null +++ b/README.fuchsia
@@ -0,0 +1,14 @@ +Name: libxml2 +URL: http://xmlsoft.org/ +License: MIT +License File: Copyright +Upstream Git: https://github.com/GNOME/libxml2 +Version: 2.14.2 +Description: + +This is the Fuchsia build of libxml2 based off of upstream's v2.14.2 release. + +Local Modifications: +- The 'config.h' and 'include/libxml2/xmlversion.h' files are generated via the + 'autogen.sh' script, then modified manually and included in the build. The default + configuration is used with the exception of disabling LZMA support.
diff --git a/config.h b/config.h new file mode 100644 index 0000000..b91758d --- /dev/null +++ b/config.h
@@ -0,0 +1,112 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of 'getentropy', and to 0 if you + don't. */ +#define HAVE_DECL_GETENTROPY 1 + +/* Define to 1 if you have the declaration of 'glob', and to 0 if you don't. + */ +#define HAVE_DECL_GLOB 1 + +/* Define to 1 if you have the declaration of 'mmap', and to 0 if you don't. + */ +#define HAVE_DECL_MMAP 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Have dlopen based dso */ +#define HAVE_DLOPEN /**/ + +/* Define to 1 if the system has the `destructor' function attribute */ +#define HAVE_FUNC_ATTRIBUTE_DESTRUCTOR 1 + +/* getentropy */ +#define HAVE_GETENTROPY 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if history library is available */ +/* #undef HAVE_LIBHISTORY */ + +/* Define if readline library is available */ +/* #undef HAVE_LIBREADLINE */ + +/* Define to 1 if you have the <lzma.h> header file. */ +/* #undef HAVE_LZMA_H */ + +/* Define to 1 if you have the <poll.h> header file. */ +/* #undef HAVE_POLL_H */ + +/* Define to 1 if you have the <pthread.h> header file. */ +#define HAVE_PTHREAD_H 1 + +/* Have shl_load based dso */ +/* #undef HAVE_SHLLOAD */ + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdio.h> header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the <zlib.h> header file. */ +/* #undef HAVE_ZLIB_H */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libxml2" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libxml2" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libxml2 2.14.2" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libxml2" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.14.2" + +/* Define to 1 if all of the C89 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "2.14.2" + +/* System configuration directory (/etc) */ +#define XML_SYSCONFDIR "/usr/local/etc" + +/* TLS specifier */ +/* #undef XML_THREAD_LOCAL */
diff --git a/configure.ac b/configure.ac index d21ebfe..855639f 100644 --- a/configure.ac +++ b/configure.ac
@@ -309,6 +309,10 @@ AM_CONDITIONAL(WITH_GLOB, test "$ac_cv_have_decl_glob" = "yes") +AC_CHECK_DECL([getentropy], + [AC_DEFINE([HAVE_GETENTROPY], [1], [getentropy])], [], + [#include <sys/random.h>]) + dnl dnl Checks for inet libraries dnl
diff --git a/include/libxml/xmlversion.h b/include/libxml/xmlversion.h new file mode 100644 index 0000000..7a5ecbd --- /dev/null +++ b/include/libxml/xmlversion.h
@@ -0,0 +1,332 @@ +/* + * Summary: compile-time version information + * Description: compile-time version information for the XML library + * + * Copy: See Copyright for the status of this software. + * + * Author: Daniel Veillard + */ + +#ifndef __XML_VERSION_H__ +#define __XML_VERSION_H__ + +/** + * LIBXML_DOTTED_VERSION: + * + * the version string like "1.2.3" + */ +#define LIBXML_DOTTED_VERSION "2.14.2" + +/** + * LIBXML_VERSION: + * + * the version number: 1.2.3 value is 10203 + */ +#define LIBXML_VERSION 21402 + +/** + * LIBXML_VERSION_STRING: + * + * the version number string, 1.2.3 value is "10203" + */ +#define LIBXML_VERSION_STRING "21402" + +/** + * LIBXML_VERSION_EXTRA: + * + * extra version information, used to show a git commit description + */ +#define LIBXML_VERSION_EXTRA "-GITv2.14.2-198-g5f13b6b3" + +/** + * LIBXML_TEST_VERSION: + * + * Macro to check that the libxml version in use is compatible with + * the version the software has been compiled against + */ +#define LIBXML_TEST_VERSION xmlCheckVersion(21402); + +/** + * LIBXML_THREAD_ENABLED: + * + * Whether the thread support is configured in + */ +#if 1 +#define LIBXML_THREAD_ENABLED +#endif + +/** + * LIBXML_THREAD_ALLOC_ENABLED: + * + * Whether the allocation hooks are per-thread + */ +#if 0 +#define LIBXML_THREAD_ALLOC_ENABLED +#endif + +/** + * LIBXML_TREE_ENABLED: + * + * Always enabled since 2.14.0 + */ +#define LIBXML_TREE_ENABLED + +/** + * LIBXML_OUTPUT_ENABLED: + * + * Whether the serialization/saving support is configured in + */ +#if 1 +#define LIBXML_OUTPUT_ENABLED +#endif + +/** + * LIBXML_PUSH_ENABLED: + * + * Whether the push parsing interfaces are configured in + */ +#if 1 +#define LIBXML_PUSH_ENABLED +#endif + +/** + * LIBXML_READER_ENABLED: + * + * Whether the xmlReader parsing interface is configured in + */ +#if 1 +#define LIBXML_READER_ENABLED +#endif + +/** + * LIBXML_PATTERN_ENABLED: + * + * Whether the xmlPattern node selection interface is configured in + */ +#if 1 +#define LIBXML_PATTERN_ENABLED +#endif + +/** + * LIBXML_WRITER_ENABLED: + * + * Whether the xmlWriter saving interface is configured in + */ +#if 1 +#define LIBXML_WRITER_ENABLED +#endif + +/** + * LIBXML_SAX1_ENABLED: + * + * Whether the older SAX1 interface is configured in + */ +#if 1 +#define LIBXML_SAX1_ENABLED +#endif + +/** + * LIBXML_HTTP_ENABLED: + * + * Whether the HTTP support is configured in + */ +#if 0 +#define LIBXML_HTTP_ENABLED +#endif + +/** + * LIBXML_VALID_ENABLED: + * + * Whether the DTD validation support is configured in + */ +#if 1 +#define LIBXML_VALID_ENABLED +#endif + +/** + * LIBXML_HTML_ENABLED: + * + * Whether the HTML support is configured in + */ +#if 1 +#define LIBXML_HTML_ENABLED +#endif + +/** + * LIBXML_LEGACY_ENABLED: + * + * Removed in 2.14 + */ +#undef LIBXML_LEGACY_ENABLED + +/** + * LIBXML_C14N_ENABLED: + * + * Whether the Canonicalization support is configured in + */ +#if 1 +#define LIBXML_C14N_ENABLED +#endif + +/** + * LIBXML_CATALOG_ENABLED: + * + * Whether the Catalog support is configured in + */ +#if 1 +#define LIBXML_CATALOG_ENABLED +#endif + +/** + * LIBXML_XPATH_ENABLED: + * + * Whether XPath is configured in + */ +#if 1 +#define LIBXML_XPATH_ENABLED +#endif + +/** + * LIBXML_XPTR_ENABLED: + * + * Whether XPointer is configured in + */ +#if 1 +#define LIBXML_XPTR_ENABLED +#endif + +/** + * LIBXML_XINCLUDE_ENABLED: + * + * Whether XInclude is configured in + */ +#if 1 +#define LIBXML_XINCLUDE_ENABLED +#endif + +/** + * LIBXML_ICONV_ENABLED: + * + * Whether iconv support is available + */ +#if 1 +#define LIBXML_ICONV_ENABLED +#endif + +/** + * LIBXML_ICU_ENABLED: + * + * Whether icu support is available + */ +#if 0 +#define LIBXML_ICU_ENABLED +#endif + +/** + * LIBXML_ISO8859X_ENABLED: + * + * Whether ISO-8859-* support is made available in case iconv is not + */ +#if 1 +#define LIBXML_ISO8859X_ENABLED +#endif + +/** + * LIBXML_DEBUG_ENABLED: + * + * Whether Debugging module is configured in + */ +#if 1 +#define LIBXML_DEBUG_ENABLED +#endif + +/** + * LIBXML_UNICODE_ENABLED: + * + * Removed in 2.14 + */ +#undef LIBXML_UNICODE_ENABLED + +/** + * LIBXML_REGEXP_ENABLED: + * + * Whether the regular expressions interfaces are compiled in + */ +#if 1 +#define LIBXML_REGEXP_ENABLED +#endif + +/** + * LIBXML_AUTOMATA_ENABLED: + * + * Whether the automata interfaces are compiled in + */ +#if 1 +#define LIBXML_AUTOMATA_ENABLED +#endif + +/** + * LIBXML_RELAXNG_ENABLED: + * + * Whether the RelaxNG validation interfaces are compiled in + */ +#if 1 +#define LIBXML_RELAXNG_ENABLED +#endif + +/** + * LIBXML_SCHEMAS_ENABLED: + * + * Whether the Schemas validation interfaces are compiled in + */ +#if 1 +#define LIBXML_SCHEMAS_ENABLED +#endif + +/** + * LIBXML_SCHEMATRON_ENABLED: + * + * Whether the Schematron validation interfaces are compiled in + */ +#if 1 +#define LIBXML_SCHEMATRON_ENABLED +#endif + +/** + * LIBXML_MODULES_ENABLED: + * + * Whether the module interfaces are compiled in + */ +#if 1 +#define LIBXML_MODULES_ENABLED +/** + * LIBXML_MODULE_EXTENSION: + * + * the string suffix used by dynamic modules (usually shared libraries) + */ +#define LIBXML_MODULE_EXTENSION ".so" +#endif + +/** + * LIBXML_ZLIB_ENABLED: + * + * Whether the Zlib support is compiled in + */ +#if 0 +#define LIBXML_ZLIB_ENABLED +#endif + +/** + * LIBXML_LZMA_ENABLED: + * + * Whether the Lzma support is compiled in + */ +#if 0 +#define LIBXML_LZMA_ENABLED +#endif + +#include <libxml/xmlexports.h> + +#endif + +
diff --git a/include/private/io.h b/include/private/io.h index d6af99f..13aa102 100644 --- a/include/private/io.h +++ b/include/private/io.h
@@ -35,6 +35,9 @@ XML_HIDDEN xmlParserErrors xmlInputFromFd(xmlParserInputBufferPtr buf, int fd, xmlParserInputFlags flags); +XML_HIDDEN int +xmlInputFromFd(xmlParserInputBufferPtr buf, int fd, int unzip); + #ifdef LIBXML_OUTPUT_ENABLED XML_HIDDEN void xmlOutputBufferWriteQuotedString(xmlOutputBufferPtr buf,
diff --git a/libxml.h b/libxml.h index f2fcb45..52126fb 100644 --- a/libxml.h +++ b/libxml.h
@@ -34,6 +34,7 @@ #else #define XML_HAS_ATTRIBUTE(x) 0 #endif +#include <libxml/xmlstring.h> #if __STDC_VERSION__ >= 199901L #define XML_INLINE inline
diff --git a/parser.c b/parser.c index d8d590f..bbbd4a8 100644 --- a/parser.c +++ b/parser.c
@@ -141,6 +141,8 @@ * * ************************************************************************/ +#define XML_MAX_HUGE_LENGTH 1000000000 + #define XML_PARSER_BIG_ENTITY 1000 #define XML_PARSER_LOT_ENTITY 5000 @@ -14162,6 +14164,7 @@ const char *URL, const char *encoding, int options) { xmlParserInputPtr input; + int inputFlags; if (ctxt == NULL) return(NULL);
diff --git a/parserInternals.c b/parserInternals.c index af2dfd9..c838ccb 100644 --- a/parserInternals.c +++ b/parserInternals.c
@@ -331,7 +331,7 @@ if (level == XML_ERR_WARNING) { if (ctxt->nbWarnings >= XML_MAX_ERRORS) - return; + goto done; ctxt->nbWarnings += 1; } else { /* Report at least one fatal error. */ @@ -389,6 +389,7 @@ return; } +done: if (level >= XML_ERR_ERROR) ctxt->errNo = code; if (level == XML_ERR_FATAL) { @@ -573,6 +574,9 @@ /* Don't grow memory buffers. */ if ((buf->encoder == NULL) && (buf->readcallback == NULL)) return(0); + /* Don't grow memory buffers. */ + if ((buf->encoder == NULL) && (buf->readcallback == NULL)) + return(0); if (buf->error != 0) return(-1);
diff --git a/testparser.c b/testparser.c index 85fee9b..f8f05d9 100644 --- a/testparser.c +++ b/testparser.c
@@ -317,6 +317,26 @@ } #endif +static int +testStandaloneWithEncoding(void) { + xmlDocPtr doc; + const char *str = + "<?xml version=\"1.0\" standalone=\"yes\"?>\n" + "<doc></doc>\n"; + int err = 0; + + xmlResetLastError(); + + doc = xmlReadDoc(BAD_CAST str, NULL, "UTF-8", 0); + if (doc == NULL) { + fprintf(stderr, "xmlReadDoc failed\n"); + err = 1; + } + xmlFreeDoc(doc); + + return err; +} + #ifdef LIBXML_PUSH_ENABLED static int testHugePush(void) {
diff --git a/tree.c b/tree.c index 7454b07..e425452 100644 --- a/tree.c +++ b/tree.c
@@ -4382,6 +4382,8 @@ doc->intSubset = newSubset; return(ret); error: + if (linkedSubset != 0) + xmlUnlinkNode((xmlNodePtr) doc->intSubset); xmlFreeNodeList(ret); if (newSubset != NULL) xmlFreeDtd(newSubset);
diff --git a/xinclude.c b/xinclude.c index 1508918..be5cec6 100644 --- a/xinclude.c +++ b/xinclude.c
@@ -1339,6 +1339,7 @@ done: #endif +done: ret = 0; error:
diff --git a/xmlIO.c b/xmlIO.c index 206efa7..d353426 100644 --- a/xmlIO.c +++ b/xmlIO.c
@@ -1037,6 +1037,97 @@ return(1); } +int +xmlInputFromFd(xmlParserInputBufferPtr buf, int fd, int unzip) { + int copy; + + (void) unzip; + +#ifdef LIBXML_LZMA_ENABLED + if (unzip) { + xzFile xzStream; + off_t pos; + + pos = lseek(fd, 0, SEEK_CUR); + + copy = dup(fd); + if (copy == -1) + return(xmlIOErr(0, "dup()")); + + xzStream = __libxml2_xzdopen("?", copy, "rb"); + + if (xzStream == NULL) { + close(copy); + } else { + if ((__libxml2_xzcompressed(xzStream) > 0) || + /* Try to rewind if not gzip compressed */ + (pos < 0) || + (lseek(fd, pos, SEEK_SET) < 0)) { + /* + * If a file isn't seekable, we pipe uncompressed + * input through xzlib. + */ + buf->context = xzStream; + buf->readcallback = xmlXzfileRead; + buf->closecallback = xmlXzfileClose; + buf->compressed = 1; + + return(XML_ERR_OK); + } + + xmlXzfileClose(xzStream); + } + } +#endif /* LIBXML_LZMA_ENABLED */ + +#ifdef LIBXML_ZLIB_ENABLED + if (unzip) { + gzFile gzStream; + off_t pos; + + pos = lseek(fd, 0, SEEK_CUR); + + copy = dup(fd); + if (copy == -1) + return(xmlIOErr(0, "dup()")); + + gzStream = gzdopen(copy, "rb"); + + if (gzStream == NULL) { + close(copy); + } else { + if ((gzdirect(gzStream) == 0) || + /* Try to rewind if not gzip compressed */ + (pos < 0) || + (lseek(fd, pos, SEEK_SET) < 0)) { + /* + * If a file isn't seekable, we pipe uncompressed + * input through zlib. + */ + buf->context = gzStream; + buf->readcallback = xmlGzfileRead; + buf->closecallback = xmlGzfileClose; + buf->compressed = 1; + + return(XML_ERR_OK); + } + + xmlGzfileClose(gzStream); + } + } +#endif /* LIBXML_ZLIB_ENABLED */ + + copy = dup(fd); + if (copy == -1) + return(xmlIOErr(0, "dup()")); + + buf->context = (void *) (ptrdiff_t) copy; + buf->readcallback = xmlFdRead; + buf->closecallback = xmlFdClose; + + return(XML_ERR_OK); +} + /** * xmlInputFromFd: * @buf: parser input buffer
diff --git a/xmllint.c b/xmllint.c index 19f3116..4e39511 100644 --- a/xmllint.c +++ b/xmllint.c
@@ -91,6 +91,9 @@ /* Internal parser option */ #define XML_PARSE_UNZIP (1 << 24) +/* Internal parser option */ +#define XML_PARSE_UNZIP (1 << 24) + typedef enum { XMLLINT_RETURN_OK = 0, /* No error */ XMLLINT_ERR_UNCLASS = 1, /* Unclassified */